blob: 6f6bf8c59c44fa4e6a9a7f64b048ead88c5d0b07 [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 <cinttypes>
#include <log/log.h>
namespace android {
namespace {
const char* kLibPath = "libv4l2_codec2_vendor_allocator.so";
const char* kCreateAllocatorFuncName = "CreateAllocator";
const char* kCreateBlockPoolFuncName = "CreateBlockPool";
} // 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) {
ALOGW("%s(): Failed to load functions: %s", __func__, kCreateAllocatorFuncName);
}
auto crateBlockPoolFunc = (CreateBlockPoolFunc)dlsym(libHandle, kCreateBlockPoolFuncName);
if (!crateBlockPoolFunc) {
ALOGW("%s(): Failed to load functions: %s", __func__, kCreateAllocatorFuncName);
}
return std::unique_ptr<VendorAllocatorLoader>(
new VendorAllocatorLoader(libHandle, createAllocatorFunc, crateBlockPoolFunc));
}
VendorAllocatorLoader::VendorAllocatorLoader(void* libHandle,
CreateAllocatorFunc createAllocatorFunc,
CreateBlockPoolFunc createBlockPoolFunc)
: mLibHandle(libHandle),
mCreateAllocatorFunc(createAllocatorFunc),
mCreateBlockPoolFunc(createBlockPoolFunc) {
ALOGV("%s()", __func__);
}
VendorAllocatorLoader::~VendorAllocatorLoader() {
ALOGV("%s()", __func__);
dlclose(mLibHandle);
}
C2Allocator* VendorAllocatorLoader::createAllocator(C2Allocator::id_t allocatorId) {
ALOGV("%s(%d)", __func__, allocatorId);
if (!mCreateAllocatorFunc) {
return nullptr;
}
return mCreateAllocatorFunc(allocatorId);
}
C2BlockPool* VendorAllocatorLoader::createBlockPool(C2Allocator::id_t allocatorId,
C2BlockPool::local_id_t poolId) {
ALOGV("%s(allocatorId=%d, poolId=%" PRIu64 " )", __func__, allocatorId, poolId);
if (!mCreateBlockPoolFunc) {
return nullptr;
}
return mCreateBlockPoolFunc(allocatorId, poolId);
}
} // namespace android