ComponentStore.cpp revision c3d20aa9415c8f02e568f203560685eaf12c3e2d
1c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa/*
2c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * Copyright (C) 2018 The Android Open Source Project
3c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa *
4c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * Licensed under the Apache License, Version 2.0 (the "License");
5c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * you may not use this file except in compliance with the License.
6c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * You may obtain a copy of the License at
7c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa *
8c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa *      http://www.apache.org/licenses/LICENSE-2.0
9c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa *
10c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * Unless required by applicable law or agreed to in writing, software
11c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * distributed under the License is distributed on an "AS IS" BASIS,
12c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * See the License for the specific language governing permissions and
14c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa * limitations under the License.
15c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa */
16c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
17c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa//#define LOG_NDEBUG 0
18c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#define LOG_TAG "Codec2-ComponentStore"
19c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <log/log.h>
20c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
21c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <codec2/hidl/1.0/ComponentStore.h>
22c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <codec2/hidl/1.0/InputSurface.h>
23c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <codec2/hidl/1.0/Component.h>
24c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <codec2/hidl/1.0/ConfigurableC2Intf.h>
25c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <codec2/hidl/1.0/types.h>
26c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
27c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
28c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <media/stagefright/bqhelper/GraphicBufferSource.h>
29c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
30c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <utils/Errors.h>
31c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
32c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace hardware {
33c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace google {
34c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace media {
35c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace c2 {
36c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace V1_0 {
37c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace utils {
38c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
39c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasausing namespace ::android;
40c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasausing ::android::GraphicBufferSource;
4189eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasausing namespace ::android::hardware::media::bufferpool::V1_0::implementation;
42c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
43c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace /* unnamed */ {
44c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
45c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasastruct StoreIntf : public ConfigurableC2Intf {
46c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    StoreIntf(const std::shared_ptr<C2ComponentStore>& store) :
47c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        ConfigurableC2Intf(store ? store->getName() : ""),
48c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        mStore(store) {
49c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
50c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
51c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t config(
52c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            const std::vector<C2Param*> &params,
53c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            c2_blocking_t mayBlock,
54c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<std::unique_ptr<C2SettingResult>> *const failures
55c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            ) override {
56c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // Assume all params are blocking
57c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // TODO: Filter for supported params
58c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (mayBlock == C2_DONT_BLOCK && params.size() != 0) {
59c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            return C2_BLOCKING;
60c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
61c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->config_sm(params, failures);
62c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
63c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
64c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t query(
65c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            const std::vector<C2Param::Index> &indices,
66c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            c2_blocking_t mayBlock,
67c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<std::unique_ptr<C2Param>> *const params) const override {
68c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // Assume all params are blocking
69c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // TODO: Filter for supported params
70c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (mayBlock == C2_DONT_BLOCK && indices.size() != 0) {
71c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            return C2_BLOCKING;
72c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
73c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->query_sm({}, indices, params);
74c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
75c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
76c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t querySupportedParams(
77c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<std::shared_ptr<C2ParamDescriptor>> *const params
78c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            ) const override {
79c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->querySupportedParams_nb(params);
80c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
81c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
82c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t querySupportedValues(
83c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<C2FieldSupportedValuesQuery> &fields,
84c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            c2_blocking_t mayBlock) const override {
85c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // Assume all params are blocking
86c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // TODO: Filter for supported params
87c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (mayBlock == C2_DONT_BLOCK && fields.size() != 0) {
88c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            return C2_BLOCKING;
89c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
90c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->querySupportedValues_sm(fields);
91c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
92c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
93c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasaprotected:
94c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::shared_ptr<C2ComponentStore> mStore;
95c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa};
96c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
97c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // unnamed namespace
98c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
99c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaComponentStore::ComponentStore(const std::shared_ptr<C2ComponentStore>& store) :
100c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    Configurable(new CachedConfigurable(std::make_unique<StoreIntf>(store))),
101c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mStore(store) {
102c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    // Retrieve struct descriptors
103c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mParamReflector = mStore->getParamReflector();
104c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
105c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    // Retrieve supported parameters from store
106c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mInit = init(this);
107c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
108c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
109c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasac2_status_t ComponentStore::validateSupportedParams(
110c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const std::vector<std::shared_ptr<C2ParamDescriptor>>& params) {
111c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t res = C2_OK;
112c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
113c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    for (const std::shared_ptr<C2ParamDescriptor> &desc : params) {
114c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (!desc) {
115c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            // All descriptors should be valid
116c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            res = res ? res : C2_BAD_VALUE;
117c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            continue;
118c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
119c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        C2Param::CoreIndex coreIndex = desc->index().coreIndex();
120c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
121c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        auto it = mStructDescriptors.find(coreIndex);
122c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (it == mStructDescriptors.end()) {
123c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::shared_ptr<C2StructDescriptor> structDesc =
124c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                    mParamReflector->describe(coreIndex);
125c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            if (!structDesc) {
126c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                // All supported params must be described
127c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                res = C2_BAD_INDEX;
128c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            }
129c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            mStructDescriptors.insert({ coreIndex, structDesc });
130c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
131c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
132c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return res;
133c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
134c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
135c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa// Methods from ::android::hardware::media::c2::V1_0::IComponentStore
136c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::createComponent(
137c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const hidl_string& name,
138c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const sp<IComponentListener>& listener,
13989eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa        const sp<IClientManager>& pool,
140c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        createComponent_cb _hidl_cb) {
141c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
142c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    sp<Component> component;
143c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::shared_ptr<C2Component> c2component;
144c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    Status status = static_cast<Status>(
145c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            mStore->createComponent(name, &c2component));
146c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
147c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (status == Status::OK) {
14889eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa        component = new Component(c2component, listener, this, pool);
149c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (!component) {
150c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            status = Status::CORRUPTED;
15189eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa        } else if (component->status() != C2_OK) {
15289eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa            status = static_cast<Status>(component->status());
153c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        } else {
15489eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa            component->initListener(component);
15589eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa            if (component->status() != C2_OK) {
15689eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa                status = static_cast<Status>(component->status());
1570f04c4d93761015d0a138aff8a468b1583d684e4Pawin Vongmasa            } else {
15889eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa                std::lock_guard<std::mutex> lock(mComponentRosterMutex);
159c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa                component->setLocalId(
160c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa                        mComponentRoster.emplace(component, c2component)
161c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa                        .first);
1620f04c4d93761015d0a138aff8a468b1583d684e4Pawin Vongmasa            }
163c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
164c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
165c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb(status, component);
166c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
167c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
168c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
169c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::createInterface(
170c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const hidl_string& name,
171c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        createInterface_cb _hidl_cb) {
172c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::shared_ptr<C2ComponentInterface> c2interface;
173c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t res = mStore->createInterface(name, &c2interface);
174c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    sp<IComponentInterface> interface;
175c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (res == C2_OK) {
176c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        interface = new ComponentInterface(c2interface, this);
177c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
178c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb((Status)res, interface);
179c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
180c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
181c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
182c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::listComponents(listComponents_cb _hidl_cb) {
183c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::vector<std::shared_ptr<const C2Component::Traits>> c2traits =
184c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            mStore->listComponents();
185c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    hidl_vec<IComponentStore::ComponentTraits> traits(c2traits.size());
186c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    size_t ix = 0;
187c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    for (const std::shared_ptr<const C2Component::Traits> &c2trait : c2traits) {
188c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (c2trait) {
189c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            objcpy(&traits[ix++], *c2trait);
190c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
191c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
192c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    traits.resize(ix);
193c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb(traits);
194c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
195c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
196c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
197c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<sp<IInputSurface>> ComponentStore::createInputSurface() {
198c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    sp<GraphicBufferSource> source = new GraphicBufferSource();
199c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (source->initCheck() != OK) {
200c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return nullptr;
201c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
202c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    typedef ::android::hardware::graphics::bufferqueue::V1_0::
203c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            IGraphicBufferProducer HGBP;
204c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    typedef ::android::TWGraphicBufferProducer<HGBP> B2HGBP;
205c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return new InputSurface(
206c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            this,
207c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            new B2HGBP(source->getIGraphicBufferProducer()),
208c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            source);
209c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
210c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
211c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::getStructDescriptors(
212c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const hidl_vec<uint32_t>& indices,
213c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        getStructDescriptors_cb _hidl_cb) {
214c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    hidl_vec<StructDescriptor> descriptors(indices.size());
215c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    size_t dstIx = 0;
216e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    Status res = Status::OK;
217c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    for (size_t srcIx = 0; srcIx < indices.size(); ++srcIx) {
218c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
219c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const auto item = mStructDescriptors.find(
220c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                C2Param::CoreIndex(indices[srcIx]).coreIndex());
221c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (item == mStructDescriptors.end()) {
222c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            res = Status::NOT_FOUND;
223c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        } else if (item->second) {
224c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            objcpy(&descriptors[dstIx++], *item->second);
225c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        } else {
226c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            res = Status::NO_MEMORY;
227c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
228c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
229c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    descriptors.resize(dstIx);
230c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb(res, descriptors);
231c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
232c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
233c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
234c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<sp<IClientManager>> ComponentStore::getPoolClientManager() {
23589eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa    return ClientManager::getInstance();
236c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
237c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
238c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<Status> ComponentStore::copyBuffer(const Buffer& src, const Buffer& dst) {
239c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    // TODO implement
240c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    (void)src;
241c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    (void)dst;
242c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Status::OMITTED;
243c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
244c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
245c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasavoid ComponentStore::reportComponentDeath(
246c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const Component::LocalId& componentLocalId) {
247c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::lock_guard<std::mutex> lock(mComponentRosterMutex);
248c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mComponentRoster.erase(componentLocalId);
249c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
250c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
251c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasastd::shared_ptr<C2Component> ComponentStore::findC2Component(
252c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa        const wp<IComponent>& component) const {
253c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::lock_guard<std::mutex> lock(mComponentRosterMutex);
254c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa    Component::LocalId it = mComponentRoster.find(component);
255c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (it == mComponentRoster.end()) {
256c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return std::shared_ptr<C2Component>();
257c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
258c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return it->second.lock();
259c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
260c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
261c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace utils
262c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace V1_0
263c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace c2
264c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace media
265c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace google
266c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace hardware
267