C2Store.cpp revision 4344f091aebaf3aee3ff062a95a05273bd2b1c57
14344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim/*
24344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Copyright (C) 2017 The Android Open Source Project
34344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
44344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
54344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * you may not use this file except in compliance with the License.
64344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * You may obtain a copy of the License at
74344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
84344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
94344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * Unless required by applicable law or agreed to in writing, software
114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * See the License for the specific language governing permissions and
144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * limitations under the License.
154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim */
164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2AllocatorGralloc.h>
184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2AllocatorIon.h>
194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2BufferPriv.h>
204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2Component.h>
214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <C2PlatformSupport.h>
224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#define LOG_TAG "C2Store"
244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#define LOG_NDEBUG 0
254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <utils/Log.h>
264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <dlfcn.h>
284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <map>
304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <memory>
314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim#include <mutex>
324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimnamespace android {
344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim/**
364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * The platform allocator store provides basic allocator-types for the framework based on ion and
374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * gralloc. Allocators are not meant to be updatable.
384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim *
394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * \todo Provide allocator based on ashmem
404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * \todo Move ion allocation into its HIDL or provide some mapping from memory usage to ion flags
414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim * \todo Make this allocator store extendable
424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim */
434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimclass C2PlatformAllocatorStoreImpl : public C2PlatformAllocatorStore {
444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimpublic:
454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    C2PlatformAllocatorStoreImpl(
464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        /* ionmapper */
474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    );
484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t fetchAllocator(
504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            id_t id, std::shared_ptr<C2Allocator> *const allocator) override;
514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual std::vector<std::shared_ptr<const C2Allocator::Traits>> listAllocators_nb()
534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            const override {
544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return std::vector<std::shared_ptr<const C2Allocator::Traits>>(); /// \todo
554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
564344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual C2String getName() const override {
584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return "android.allocator-store";
594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimprivate:
624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    /// returns a shared-singleton ion allocator
634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2Allocator> fetchIonAllocator();
644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    /// returns a shared-singleton gralloc allocator
664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2Allocator> fetchGrallocAllocator();
674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim};
684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik KimC2PlatformAllocatorStoreImpl::C2PlatformAllocatorStoreImpl() {
704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformAllocatorStoreImpl::fetchAllocator(
734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        id_t id, std::shared_ptr<C2Allocator> *const allocator) {
744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    allocator->reset();
754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    switch (id) {
764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // TODO: should we implement a generic registry for all, and use that?
774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2PlatformAllocatorStore::ION:
784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2AllocatorStore::DEFAULT_LINEAR:
794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        *allocator = fetchIonAllocator();
804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2PlatformAllocatorStore::GRALLOC:
834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2AllocatorStore::DEFAULT_GRAPHIC:
844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        *allocator = fetchGrallocAllocator();
854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
874344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    default:
884344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2_NOT_FOUND;
894344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
904344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (*allocator == nullptr) {
914344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2_NO_MEMORY;
924344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
934344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return C2_OK;
944344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
954344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
964344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::shared_ptr<C2Allocator> C2PlatformAllocatorStoreImpl::fetchIonAllocator() {
974344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::mutex mutex;
984344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::weak_ptr<C2Allocator> ionAllocator;
994344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::lock_guard<std::mutex> lock(mutex);
1004344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2Allocator> allocator = ionAllocator.lock();
1014344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (allocator == nullptr) {
1024344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        allocator = std::make_shared<C2AllocatorIon>(C2PlatformAllocatorStore::ION);
1034344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        ionAllocator = allocator;
1044344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
1054344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return allocator;
1064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
1074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::shared_ptr<C2Allocator> C2PlatformAllocatorStoreImpl::fetchGrallocAllocator() {
1094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::mutex mutex;
1104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::weak_ptr<C2Allocator> grallocAllocator;
1114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::lock_guard<std::mutex> lock(mutex);
1124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2Allocator> allocator = grallocAllocator.lock();
1134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (allocator == nullptr) {
1144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        allocator = std::make_shared<C2AllocatorGralloc>(C2PlatformAllocatorStore::GRALLOC);
1154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        grallocAllocator = allocator;
1164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
1174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return allocator;
1184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
1194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::shared_ptr<C2AllocatorStore> GetCodec2PlatformAllocatorStore() {
1214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return std::make_shared<C2PlatformAllocatorStoreImpl>();
1224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
1234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t GetCodec2BlockPool(
1254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2BlockPool::local_id_t id, std::shared_ptr<const C2Component> component,
1264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<C2BlockPool> *pool) {
1274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    pool->reset();
1284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (!component) {
1294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2_BAD_VALUE;
1304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
1314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // TODO support pre-registered block pools
1324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2AllocatorStore> allocatorStore = GetCodec2PlatformAllocatorStore();
1334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2Allocator> allocator;
1344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t res = C2_NOT_FOUND;
1354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    switch (id) {
1374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2BlockPool::BASIC_LINEAR:
1384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        res = allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &allocator);
1394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res == C2_OK) {
1404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            *pool = std::make_shared<C2BasicLinearBlockPool>(allocator);
1414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
1424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
1434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2BlockPool::BASIC_GRAPHIC:
1444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        res = allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_GRAPHIC, &allocator);
1454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res == C2_OK) {
1464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            *pool = std::make_shared<C2BasicGraphicBlockPool>(allocator);
1474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
1484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
1494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    default:
1504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
1514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
1524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return res;
1534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
1544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t CreateCodec2BlockPool(
1564344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2PlatformAllocatorStore::id_t allocatorId,
1574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<const C2Component> component,
1584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<C2BlockPool> *pool) {
1594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    pool->reset();
1604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (!component) {
1614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2_BAD_VALUE;
1624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
1634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // TODO: support caching block pool along with GetCodec2BlockPool.
1644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::atomic_int sBlockPoolId(C2BlockPool::PLATFORM_START);
1654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2AllocatorStore> allocatorStore = GetCodec2PlatformAllocatorStore();
1664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2Allocator> allocator;
1674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t res = C2_NOT_FOUND;
1684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    switch (allocatorId) {
1704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2PlatformAllocatorStore::ION:
1714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        res = allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &allocator);
1724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res == C2_OK) {
1734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            *pool = std::make_shared<C2PooledBlockPool>(allocator, sBlockPoolId++);
1744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            if (!*pool) {
1754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                res = C2_NO_MEMORY;
1764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            }
1774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
1784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
1794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    case C2PlatformAllocatorStore::GRALLOC:
1804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        // TODO: support gralloc
1814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
1824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    default:
1834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        break;
1844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
1854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return res;
1864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
1874344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
1884344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimclass C2PlatformComponentStore : public C2ComponentStore {
1894344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimpublic:
1904344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual std::vector<std::shared_ptr<const C2Component::Traits>> listComponents() override;
1914344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual std::shared_ptr<C2ParamReflector> getParamReflector() const override;
1924344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual C2String getName() const override;
1934344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t querySupportedValues_sm(
1944344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::vector<C2FieldSupportedValuesQuery> &fields) const override;
1954344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t querySupportedParams_nb(
1964344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const override;
1974344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t query_sm(
1984344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            const std::vector<C2Param*> &stackParams,
1994344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            const std::vector<C2Param::Index> &heapParamIndices,
2004344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::vector<std::unique_ptr<C2Param>> *const heapParams) const override;
2014344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t createInterface(
2024344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            C2String name, std::shared_ptr<C2ComponentInterface> *const interface) override;
2034344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t createComponent(
2044344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            C2String name, std::shared_ptr<C2Component> *const component) override;
2054344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t copyBuffer(
2064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::shared_ptr<C2GraphicBuffer> src, std::shared_ptr<C2GraphicBuffer> dst) override;
2074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual c2_status_t config_sm(
2084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            const std::vector<C2Param*> &params,
2094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::vector<std::unique_ptr<C2SettingResult>> *const failures) override;
2104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    C2PlatformComponentStore();
2114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    virtual ~C2PlatformComponentStore() override = default;
2134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimprivate:
2154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    /**
2174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * An object encapsulating a loaded component module.
2184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *
2194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \todo provide a way to add traits to known components here to avoid loading the .so-s
2204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * for listComponents
2214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     */
2224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    struct ComponentModule : public C2ComponentFactory,
2234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            public std::enable_shared_from_this<ComponentModule> {
2244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        virtual c2_status_t createComponent(
2254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                c2_node_id_t id, std::shared_ptr<C2Component> *component,
2264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                ComponentDeleter deleter = std::default_delete<C2Component>()) override;
2274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        virtual c2_status_t createInterface(
2284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                c2_node_id_t id, std::shared_ptr<C2ComponentInterface> *interface,
2294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                InterfaceDeleter deleter = std::default_delete<C2ComponentInterface>()) override;
2304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        /**
2324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \returns the traits of the component in this module.
2334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         */
2344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<const C2Component::Traits> getTraits();
2354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        /**
2374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * Creates an uninitialized component module.
2384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \param name[in]  component name.
2404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \note Only used by ComponentLoader.
2424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         */
2434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        ComponentModule()
2444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            : mInit(C2_NO_INIT),
2454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim              mLibHandle(nullptr),
2464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim              createFactory(nullptr),
2474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim              destroyFactory(nullptr),
2484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim              mComponentFactory(nullptr) {
2494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
2504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        /**
2524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * Initializes a component module with a given library path. Must be called exactly once.
2534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \note Only used by ComponentLoader.
2554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2564344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \param libPath[in] library path (or name)
2574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_OK        the component module has been successfully loaded
2594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_NO_MEMORY not enough memory to loading the component module
2604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_NOT_FOUND could not locate the component module
2614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_CORRUPTED the component module could not be loaded (unexpected)
2624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_REFUSED   permission denied to load the component module (unexpected)
2634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_TIMED_OUT could not load the module within the time limit (unexpected)
2644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         */
2654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_status_t init(std::string libPath);
2664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        virtual ~ComponentModule() override;
2684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    protected:
2704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::recursive_mutex mLock; ///< lock protecting mTraits
2714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<C2Component::Traits> mTraits; ///< cached component traits
2724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_status_t mInit; ///< initialization result
2744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        void *mLibHandle; ///< loaded library handle
2764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2ComponentFactory::CreateCodec2FactoryFunc createFactory; ///< loaded create function
2774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2ComponentFactory::DestroyCodec2FactoryFunc destroyFactory; ///< loaded destroy function
2784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2ComponentFactory *mComponentFactory; ///< loaded/created component factory
2794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    };
2804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
2814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    /**
2824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * An object encapsulating a loadable component module.
2834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *
2844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \todo make this also work for enumerations
2854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     */
2864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    struct ComponentLoader {
2874344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        /**
2884344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * Load the component module.
2894344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2904344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * This method simply returns the component module if it is already currently loaded, or
2914344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * attempts to load it if it is not.
2924344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2934344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \param module[out] pointer to the shared pointer where the loaded module shall be stored.
2944344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *                    This will be nullptr on error.
2954344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         *
2964344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_OK        the component module has been successfully loaded
2974344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_NO_MEMORY not enough memory to loading the component module
2984344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_NOT_FOUND could not locate the component module
2994344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_CORRUPTED the component module could not be loaded
3004344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * \retval C2_REFUSED   permission denied to load the component module
3014344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         */
3024344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_status_t fetchModule(std::shared_ptr<ComponentModule> *module) {
3034344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            c2_status_t res = C2_OK;
3044344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::lock_guard<std::mutex> lock(mMutex);
3054344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::shared_ptr<ComponentModule> localModule = mModule.lock();
3064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            if (localModule == nullptr) {
3074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                localModule = std::make_shared<ComponentModule>();
3084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                res = localModule->init(mLibPath);
3094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                if (res == C2_OK) {
3104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                    mModule = localModule;
3114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                }
3124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            }
3134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            *module = localModule;
3144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            return res;
3154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
3164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        /**
3184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         * Creates a component loader for a specific library path (or name).
3194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim         */
3204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        ComponentLoader(std::string libPath)
3214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            : mLibPath(libPath) {}
3224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    private:
3244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::mutex mMutex; ///< mutex guarding the module
3254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::weak_ptr<ComponentModule> mModule; ///< weak reference to the loaded module
3264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::string mLibPath; ///< library path (or name)
3274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    };
3284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    /**
3304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * Retrieves the component loader for a component.
3314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *
3324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \return a non-ref-holding pointer to the component loader.
3334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *
3344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \retval C2_OK        the component loader has been successfully retrieved
3354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \retval C2_NO_MEMORY not enough memory to locate the component loader
3364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \retval C2_NOT_FOUND could not locate the component to be loaded
3374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \retval C2_CORRUPTED the component loader could not be identified due to some modules being
3384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *                      corrupted (this can happen if the name does not refer to an already
3394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *                      identified component but some components could not be loaded due to
3404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *                      bad library)
3414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     * \retval C2_REFUSED   permission denied to find the component loader for the named component
3424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *                      (this can happen if the name does not refer to an already identified
3434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *                      component but some components could not be loaded due to lack of
3444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     *                      permissions)
3454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim     */
3464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t findComponent(C2String name, ComponentLoader **loader);
3474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::map<C2String, ComponentLoader> mComponents; ///< list of components
3494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim};
3504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::ComponentModule::init(std::string libPath) {
3524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    ALOGV("in %s", __func__);
3534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    ALOGV("loading dll");
3544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mLibHandle = dlopen(libPath.c_str(), RTLD_NOW|RTLD_NODELETE);
3554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (mLibHandle == nullptr) {
3564344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        // could be access/symbol or simply not being there
3574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        ALOGD("could not dlopen %s: %s", libPath.c_str(), dlerror());
3584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        mInit = C2_CORRUPTED;
3594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    } else {
3604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        createFactory =
3614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            (C2ComponentFactory::CreateCodec2FactoryFunc)dlsym(mLibHandle, "CreateCodec2Factory");
3624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        destroyFactory =
3634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            (C2ComponentFactory::DestroyCodec2FactoryFunc)dlsym(mLibHandle, "DestroyCodec2Factory");
3644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        mComponentFactory = createFactory();
3664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (mComponentFactory == nullptr) {
3674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            ALOGD("could not create factory in %s", libPath.c_str());
3684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            mInit = C2_NO_MEMORY;
3694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        } else {
3704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            mInit = C2_OK;
3714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
3724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
3734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return mInit;
3744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
3754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik KimC2PlatformComponentStore::ComponentModule::~ComponentModule() {
3774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    ALOGV("in %s", __func__);
3784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (destroyFactory && mComponentFactory) {
3794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        destroyFactory(mComponentFactory);
3804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
3814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (mLibHandle) {
3824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        ALOGV("unloading dll");
3834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        dlclose(mLibHandle);
3844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
3854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
3864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
3874344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::ComponentModule::createInterface(
3884344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_node_id_t id, std::shared_ptr<C2ComponentInterface> *interface,
3894344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::function<void(::C2ComponentInterface*)> deleter) {
3904344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    interface->reset();
3914344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (mInit != C2_OK) {
3924344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return mInit;
3934344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
3944344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<ComponentModule> module = shared_from_this();
3954344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t res = mComponentFactory->createInterface(
3964344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            id, interface, [module, deleter](C2ComponentInterface *p) mutable {
3974344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                // capture module so that we ensure we still have it while deleting interface
3984344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                deleter(p); // delete interface first
3994344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                module.reset(); // remove module ref (not technically needed)
4004344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    });
4014344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return res;
4024344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
4034344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
4044344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::ComponentModule::createComponent(
4054344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_node_id_t id, std::shared_ptr<C2Component> *component,
4064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::function<void(::C2Component*)> deleter) {
4074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    component->reset();
4084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (mInit != C2_OK) {
4094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return mInit;
4104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
4114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<ComponentModule> module = shared_from_this();
4124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t res = mComponentFactory->createComponent(
4134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            id, component, [module, deleter](C2Component *p) mutable {
4144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                // capture module so that we ensure we still have it while deleting component
4154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                deleter(p); // delete component first
4164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                module.reset(); // remove module ref (not technically needed)
4174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    });
4184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return res;
4194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
4204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
4214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::shared_ptr<const C2Component::Traits> C2PlatformComponentStore::ComponentModule::getTraits() {
4224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::unique_lock<std::recursive_mutex> lock(mLock);
4234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (!mTraits) {
4244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<C2ComponentInterface> intf;
4254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_status_t res = createInterface(0, &intf);
4264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res != C2_OK) {
4274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            ALOGD("failed to create interface: %d", res);
4284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            return nullptr;
4294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
4304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
4314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<C2Component::Traits> traits(new (std::nothrow) C2Component::Traits);
4324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (traits) {
4334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            traits->name = intf->getName();
4344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            // TODO: get this from interface properly.
4354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            bool encoder = (traits->name.find("encoder") != std::string::npos);
4364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            uint32_t mediaTypeIndex = encoder ? C2PortMimeConfig::output::PARAM_TYPE
4374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                    : C2PortMimeConfig::input::PARAM_TYPE;
4384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::vector<std::unique_ptr<C2Param>> params;
4394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            res = intf->query_vb({}, { mediaTypeIndex }, C2_MAY_BLOCK, &params);
4404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            if (res != C2_OK) {
4414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                ALOGD("failed to query interface: %d", res);
4424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                return nullptr;
4434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            }
4444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            if (params.size() != 1u) {
4454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                ALOGD("failed to query interface: unexpected vector size: %zu", params.size());
4464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                return nullptr;
4474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            }
4484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            C2PortMimeConfig *mediaTypeConfig = (C2PortMimeConfig *)(params[0].get());
4494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            if (mediaTypeConfig == nullptr) {
4504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                ALOGD("failed to query media type");
4514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                return nullptr;
4524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            }
4534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            traits->mediaType = mediaTypeConfig->m.value;
4544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            // TODO: get this properly.
4554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            traits->rank = 0x200;
4564344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
4574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
4584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        mTraits = traits;
4594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
4604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return mTraits;
4614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
4624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
4634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik KimC2PlatformComponentStore::C2PlatformComponentStore() {
4644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // TODO: move this also into a .so so it can be updated
4654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.avc.decoder", "libstagefright_soft_c2avcdec.so");
4664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.avc.encoder", "libstagefright_soft_c2avcenc.so");
4674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.aac.decoder", "libstagefright_soft_c2aacdec.so");
4684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.aac.encoder", "libstagefright_soft_c2aacenc.so");
4694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.amrnb.decoder", "libstagefright_soft_c2amrnbdec.so");
4704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.amrnb.encoder", "libstagefright_soft_c2amrnbenc.so");
4714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.amrwb.decoder", "libstagefright_soft_c2amrwbdec.so");
4724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.amrwb.encoder", "libstagefright_soft_c2amrwbenc.so");
4734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.hevc.decoder", "libstagefright_soft_c2hevcdec.so");
4744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.g711.alaw.decoder", "libstagefright_soft_c2g711alawdec.so");
4754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.g711.mlaw.decoder", "libstagefright_soft_c2g711mlawdec.so");
4764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.mpeg2.decoder", "libstagefright_soft_c2mpeg2dec.so");
4774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.h263.decoder", "libstagefright_soft_c2h263dec.so");
4784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.h263.encoder", "libstagefright_soft_c2h263enc.so");
4794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.mpeg4.decoder", "libstagefright_soft_c2mpeg4dec.so");
4804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.mpeg4.encoder", "libstagefright_soft_c2mpeg4enc.so");
4814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.mp3.decoder", "libstagefright_soft_c2mp3dec.so");
4824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.vorbis.decoder", "libstagefright_soft_c2vorbisdec.so");
4834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.opus.decoder", "libstagefright_soft_c2opusdec.so");
4844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.vp8.decoder", "libstagefright_soft_c2vp8dec.so");
4854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.vp9.decoder", "libstagefright_soft_c2vp9dec.so");
4864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.vp8.encoder", "libstagefright_soft_c2vp8enc.so");
4874344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.vp9.encoder", "libstagefright_soft_c2vp9enc.so");
4884344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.raw.decoder", "libstagefright_soft_c2rawdec.so");
4894344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.flac.decoder", "libstagefright_soft_c2flacdec.so");
4904344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.flac.encoder", "libstagefright_soft_c2flacenc.so");
4914344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    mComponents.emplace("c2.google.gsm.decoder", "libstagefright_soft_c2gsmdec.so");
4924344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
4934344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
4944344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::copyBuffer(
4954344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<C2GraphicBuffer> src, std::shared_ptr<C2GraphicBuffer> dst) {
4964344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    (void)src;
4974344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    (void)dst;
4984344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return C2_OMITTED;
4994344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5004344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5014344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::query_sm(
5024344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        const std::vector<C2Param*> &stackParams,
5034344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        const std::vector<C2Param::Index> &heapParamIndices,
5044344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::vector<std::unique_ptr<C2Param>> *const heapParams) const {
5054344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // there are no supported configs
5064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    (void)heapParams;
5074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return stackParams.empty() && heapParamIndices.empty() ? C2_OK : C2_BAD_INDEX;
5084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::config_sm(
5114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        const std::vector<C2Param*> &params,
5124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::vector<std::unique_ptr<C2SettingResult>> *const failures) {
5134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // there are no supported configs
5144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    (void)failures;
5154344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return params.empty() ? C2_OK : C2_BAD_INDEX;
5164344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5174344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5184344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::vector<std::shared_ptr<const C2Component::Traits>> C2PlatformComponentStore::listComponents() {
5194344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // This method SHALL return within 500ms.
5204344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::vector<std::shared_ptr<const C2Component::Traits>> list;
5214344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    for (auto &it : mComponents) {
5224344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        ComponentLoader &loader = it.second;
5234344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<ComponentModule> module;
5244344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        c2_status_t res = loader.fetchModule(&module);
5254344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res == C2_OK) {
5264344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            std::shared_ptr<const C2Component::Traits> traits = module->getTraits();
5274344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            if (traits) {
5284344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim                list.push_back(traits);
5294344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            }
5304344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
5314344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
5324344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return list;
5334344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5344344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5354344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::findComponent(C2String name, ComponentLoader **loader) {
5364344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    *loader = nullptr;
5374344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    auto pos = mComponents.find(name);
5384344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // TODO: check aliases
5394344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (pos == mComponents.end()) {
5404344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        return C2_NOT_FOUND;
5414344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
5424344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    *loader = &pos->second;
5434344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return C2_OK;
5444344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5454344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5464344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::createComponent(
5474344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2String name, std::shared_ptr<C2Component> *const component) {
5484344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // This method SHALL return within 100ms.
5494344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    component->reset();
5504344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    ComponentLoader *loader;
5514344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t res = findComponent(name, &loader);
5524344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (res == C2_OK) {
5534344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<ComponentModule> module;
5544344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        res = loader->fetchModule(&module);
5554344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res == C2_OK) {
5564344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            // TODO: get a unique node ID
5574344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            res = module->createComponent(0, component);
5584344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
5594344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
5604344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return res;
5614344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5624344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5634344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::createInterface(
5644344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        C2String name, std::shared_ptr<C2ComponentInterface> *const interface) {
5654344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // This method SHALL return within 100ms.
5664344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    interface->reset();
5674344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    ComponentLoader *loader;
5684344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    c2_status_t res = findComponent(name, &loader);
5694344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (res == C2_OK) {
5704344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::shared_ptr<ComponentModule> module;
5714344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        res = loader->fetchModule(&module);
5724344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        if (res == C2_OK) {
5734344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            // TODO: get a unique node ID
5744344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim            res = module->createInterface(0, interface);
5754344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        }
5764344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
5774344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return res;
5784344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5794344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5804344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::querySupportedParams_nb(
5814344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
5824344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // there are no supported config params
5834344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    (void)params;
5844344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return C2_OK;
5854344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5864344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5874344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimc2_status_t C2PlatformComponentStore::querySupportedValues_sm(
5884344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        std::vector<C2FieldSupportedValuesQuery> &fields) const {
5894344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // there are no supported config params
5904344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return fields.empty() ? C2_OK : C2_BAD_INDEX;
5914344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5924344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5934344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik KimC2String C2PlatformComponentStore::getName() const {
5944344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return "android.componentStore.platform";
5954344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
5964344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
5974344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::shared_ptr<C2ParamReflector> C2PlatformComponentStore::getParamReflector() const {
5984344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    // TODO
5994344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return nullptr;
6004344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
6014344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
6024344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kimstd::shared_ptr<C2ComponentStore> GetCodec2PlatformComponentStore() {
6034344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::mutex mutex;
6044344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    static std::weak_ptr<C2ComponentStore> platformStore;
6054344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::lock_guard<std::mutex> lock(mutex);
6064344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    std::shared_ptr<C2ComponentStore> store = platformStore.lock();
6074344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    if (store == nullptr) {
6084344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        store = std::make_shared<C2PlatformComponentStore>();
6094344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim        platformStore = store;
6104344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    }
6114344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim    return store;
6124344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim}
6134344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim
6144344f091aebaf3aee3ff062a95a05273bd2b1c57Wonsik Kim} // namespace android
615