blob: 438df95fa6ecadfe9c722fdee2d1241717191947 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//#define LOG_NDEBUG 0
#define LOG_TAG "VendorAllocatorLoader"
#include <v4l2_codec2/plugin_store/VendorAllocatorLoader.h>
#include <dlfcn.h>
#include <log/log.h>
namespace android {
namespace {
const char* kLibPath = "libv4l2_codec2_vendor_allocator.so";
const char* kCreateAllocatorFuncName = "CreateAllocator";
} // namespace
// static
std::unique_ptr<VendorAllocatorLoader> VendorAllocatorLoader::Create() {
ALOGV("%s()", __func__);
void* libHandle = dlopen(kLibPath, RTLD_NOW | RTLD_NODELETE);
if (!libHandle) {
ALOGI("%s(): Failed to load library: %s", __func__, kLibPath);
return nullptr;
}
auto createAllocatorFunc = (CreateAllocatorFunc)dlsym(libHandle, kCreateAllocatorFuncName);
if (!createAllocatorFunc) {
ALOGE("%s(): Failed to load functions: %s", __func__, kCreateAllocatorFuncName);
dlclose(libHandle);
return nullptr;
}
return std::unique_ptr<VendorAllocatorLoader>(
new VendorAllocatorLoader(libHandle, createAllocatorFunc));
}
VendorAllocatorLoader::VendorAllocatorLoader(void* libHandle,
CreateAllocatorFunc createAllocatorFunc)
: mLibHandle(libHandle), mCreateAllocatorFunc(createAllocatorFunc) {
ALOGV("%s()", __func__);
}
VendorAllocatorLoader::~VendorAllocatorLoader() {
ALOGV("%s()", __func__);
dlclose(mLibHandle);
}
C2Allocator* VendorAllocatorLoader::createAllocator(C2Allocator::id_t allocatorId) {
ALOGV("%s(%d)", __func__, allocatorId);
return mCreateAllocatorFunc(allocatorId);
}
} // namespace android