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
30493e8165262315157bea75dcea642b30c916a2a7Lajos Molnar#include <C2PlatformSupport.h>
31493e8165262315157bea75dcea642b30c916a2a7Lajos Molnar
32c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa#include <utils/Errors.h>
33c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
34cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#include <android-base/file.h>
35cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
36cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#ifdef LOG
37cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#undef LOG
38cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#endif
39cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
40cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#ifdef PLOG
41cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#undef PLOG
42cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#endif
43cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
44cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#include <android-base/logging.h>
45cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
46cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#include <ostream>
47cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#include <sstream>
48cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa#include <iomanip>
49cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
50c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace hardware {
51c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace google {
52c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace media {
53c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace c2 {
54c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace V1_0 {
55c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace utils {
56c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
57c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasausing namespace ::android;
58c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasausing ::android::GraphicBufferSource;
5989eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasausing namespace ::android::hardware::media::bufferpool::V1_0::implementation;
60c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
61c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasanamespace /* unnamed */ {
62c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
63c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasastruct StoreIntf : public ConfigurableC2Intf {
64c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    StoreIntf(const std::shared_ptr<C2ComponentStore>& store) :
65c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        ConfigurableC2Intf(store ? store->getName() : ""),
66c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        mStore(store) {
67c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
68c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
69c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t config(
70c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            const std::vector<C2Param*> &params,
71c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            c2_blocking_t mayBlock,
72c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<std::unique_ptr<C2SettingResult>> *const failures
73c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            ) override {
74c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // Assume all params are blocking
75c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // TODO: Filter for supported params
76c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (mayBlock == C2_DONT_BLOCK && params.size() != 0) {
77c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            return C2_BLOCKING;
78c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
79c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->config_sm(params, failures);
80c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
81c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
82c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t query(
83c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            const std::vector<C2Param::Index> &indices,
84c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            c2_blocking_t mayBlock,
85c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<std::unique_ptr<C2Param>> *const params) const override {
86c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // Assume all params are blocking
87c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // TODO: Filter for supported params
88c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (mayBlock == C2_DONT_BLOCK && indices.size() != 0) {
89c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            return C2_BLOCKING;
90c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
91c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->query_sm({}, indices, params);
92c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
93c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
94c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t querySupportedParams(
95c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<std::shared_ptr<C2ParamDescriptor>> *const params
96c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            ) const override {
97c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->querySupportedParams_nb(params);
98c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
99c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
100c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t querySupportedValues(
101c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::vector<C2FieldSupportedValuesQuery> &fields,
102c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            c2_blocking_t mayBlock) const override {
103c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // Assume all params are blocking
104c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        // TODO: Filter for supported params
105c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (mayBlock == C2_DONT_BLOCK && fields.size() != 0) {
106c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            return C2_BLOCKING;
107c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
108c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return mStore->querySupportedValues_sm(fields);
109c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
110c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
111c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasaprotected:
112c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::shared_ptr<C2ComponentStore> mStore;
113c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa};
114c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
115c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // unnamed namespace
116c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
117c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaComponentStore::ComponentStore(const std::shared_ptr<C2ComponentStore>& store) :
118c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    Configurable(new CachedConfigurable(std::make_unique<StoreIntf>(store))),
119c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mStore(store) {
120493e8165262315157bea75dcea642b30c916a2a7Lajos Molnar
121493e8165262315157bea75dcea642b30c916a2a7Lajos Molnar    std::shared_ptr<C2ComponentStore> platformStore = android::GetCodec2PlatformComponentStore();
122493e8165262315157bea75dcea642b30c916a2a7Lajos Molnar    SetPreferredCodec2ComponentStore(store);
123493e8165262315157bea75dcea642b30c916a2a7Lajos Molnar
124c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    // Retrieve struct descriptors
125c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mParamReflector = mStore->getParamReflector();
126c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
127c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    // Retrieve supported parameters from store
128c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mInit = init(this);
129c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
130c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
131c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasac2_status_t ComponentStore::validateSupportedParams(
132c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const std::vector<std::shared_ptr<C2ParamDescriptor>>& params) {
133c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t res = C2_OK;
134c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
135c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    for (const std::shared_ptr<C2ParamDescriptor> &desc : params) {
136c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (!desc) {
137c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            // All descriptors should be valid
138c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            res = res ? res : C2_BAD_VALUE;
139c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            continue;
140c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
141c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        C2Param::CoreIndex coreIndex = desc->index().coreIndex();
142c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
143c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        auto it = mStructDescriptors.find(coreIndex);
144c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (it == mStructDescriptors.end()) {
145c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            std::shared_ptr<C2StructDescriptor> structDesc =
146c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                    mParamReflector->describe(coreIndex);
147c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            if (!structDesc) {
148c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                // All supported params must be described
149c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa                res = C2_BAD_INDEX;
150c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            }
151c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            mStructDescriptors.insert({ coreIndex, structDesc });
152c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
153c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
154c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return res;
155c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
156c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
157c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa// Methods from ::android::hardware::media::c2::V1_0::IComponentStore
158c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::createComponent(
159c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const hidl_string& name,
160c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const sp<IComponentListener>& listener,
16189eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa        const sp<IClientManager>& pool,
162c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        createComponent_cb _hidl_cb) {
163c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
164c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    sp<Component> component;
165c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::shared_ptr<C2Component> c2component;
166c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    Status status = static_cast<Status>(
167c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            mStore->createComponent(name, &c2component));
168c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
169c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (status == Status::OK) {
1705f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar        onInterfaceLoaded(c2component->intf());
17189eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa        component = new Component(c2component, listener, this, pool);
172c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (!component) {
173c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            status = Status::CORRUPTED;
17489eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa        } else if (component->status() != C2_OK) {
17589eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa            status = static_cast<Status>(component->status());
176c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        } else {
17789eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa            component->initListener(component);
17889eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa            if (component->status() != C2_OK) {
17989eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa                status = static_cast<Status>(component->status());
1800f04c4d93761015d0a138aff8a468b1583d684e4Pawin Vongmasa            } else {
18189eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa                std::lock_guard<std::mutex> lock(mComponentRosterMutex);
182c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa                component->setLocalId(
1838ef413471c159d064aa4ad7c42c337dfbc79ea28Pawin Vongmasa                        mComponentRoster.emplace(
18442dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa                            Component::InterfaceKey(component),
18542dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa                            c2component)
186c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa                        .first);
1870f04c4d93761015d0a138aff8a468b1583d684e4Pawin Vongmasa            }
188c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
189c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
190c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb(status, component);
191c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
192c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
193c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
194c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::createInterface(
195c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const hidl_string& name,
196c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        createInterface_cb _hidl_cb) {
197c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::shared_ptr<C2ComponentInterface> c2interface;
198c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    c2_status_t res = mStore->createInterface(name, &c2interface);
199c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    sp<IComponentInterface> interface;
200c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (res == C2_OK) {
2015f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar        onInterfaceLoaded(c2interface);
202c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        interface = new ComponentInterface(c2interface, this);
203c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
204c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb((Status)res, interface);
205c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
206c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
207c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
208c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::listComponents(listComponents_cb _hidl_cb) {
209c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::vector<std::shared_ptr<const C2Component::Traits>> c2traits =
210c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            mStore->listComponents();
211c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    hidl_vec<IComponentStore::ComponentTraits> traits(c2traits.size());
212c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    size_t ix = 0;
213c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    for (const std::shared_ptr<const C2Component::Traits> &c2trait : c2traits) {
214c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (c2trait) {
215c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            objcpy(&traits[ix++], *c2trait);
216c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
217c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
218c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    traits.resize(ix);
219c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb(traits);
220c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
221c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
222c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
223c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<sp<IInputSurface>> ComponentStore::createInputSurface() {
224c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    sp<GraphicBufferSource> source = new GraphicBufferSource();
225c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (source->initCheck() != OK) {
226c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return nullptr;
227c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
228c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    typedef ::android::hardware::graphics::bufferqueue::V1_0::
229c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            IGraphicBufferProducer HGBP;
230c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    typedef ::android::TWGraphicBufferProducer<HGBP> B2HGBP;
231c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return new InputSurface(
232c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            this,
233c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            new B2HGBP(source->getIGraphicBufferProducer()),
234c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            source);
235c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
236c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
2375f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnarvoid ComponentStore::onInterfaceLoaded(const std::shared_ptr<C2ComponentInterface> &intf) {
2385f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar    // invalidate unsupported struct descriptors if a new interface is loaded as it may have
2395f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar    // exposed new descriptors
2405f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar    std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
2415f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar    if (!mLoadedInterfaces.count(intf->getName())) {
2425f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar        mUnsupportedStructDescriptors.clear();
2435f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar        mLoadedInterfaces.emplace(intf->getName());
2445f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar    }
2455f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar}
2465f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar
247c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::getStructDescriptors(
248c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const hidl_vec<uint32_t>& indices,
249c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        getStructDescriptors_cb _hidl_cb) {
250c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    hidl_vec<StructDescriptor> descriptors(indices.size());
251c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    size_t dstIx = 0;
252e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar    Status res = Status::OK;
253c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    for (size_t srcIx = 0; srcIx < indices.size(); ++srcIx) {
254c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        std::lock_guard<std::mutex> lock(mStructDescriptorsMutex);
2555f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar        const C2Param::CoreIndex coreIndex = C2Param::CoreIndex(indices[srcIx]).coreIndex();
2565f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar        const auto item = mStructDescriptors.find(coreIndex);
257c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        if (item == mStructDescriptors.end()) {
2585f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar            // not in the cache, and not known to be unsupported, query local reflector
2595f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar            if (!mUnsupportedStructDescriptors.count(coreIndex)) {
2605f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                std::shared_ptr<C2StructDescriptor> structDesc =
2615f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                    mParamReflector->describe(coreIndex);
2625f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                if (!structDesc) {
2635f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                    mUnsupportedStructDescriptors.emplace(coreIndex);
2645f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                } else {
2655f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                    mStructDescriptors.insert({ coreIndex, structDesc });
2665f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                    objcpy(&descriptors[dstIx++], *structDesc);
2675f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                    continue;
2685f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar                }
2695f00946d285364c5f0ca051fab31e22319f08cd4Lajos Molnar            }
270c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            res = Status::NOT_FOUND;
271c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        } else if (item->second) {
272c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            objcpy(&descriptors[dstIx++], *item->second);
273c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        } else {
274c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa            res = Status::NO_MEMORY;
275c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        }
276c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
277c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    descriptors.resize(dstIx);
278c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    _hidl_cb(res, descriptors);
279c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Void();
280c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
281c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
282c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<sp<IClientManager>> ComponentStore::getPoolClientManager() {
28389eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa    return ClientManager::getInstance();
284c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
285c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
286c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<Status> ComponentStore::copyBuffer(const Buffer& src, const Buffer& dst) {
287c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    // TODO implement
288c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    (void)src;
289c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    (void)dst;
290c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return Status::OMITTED;
291c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
292c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
293c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasavoid ComponentStore::reportComponentDeath(
294c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        const Component::LocalId& componentLocalId) {
295c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::lock_guard<std::mutex> lock(mComponentRosterMutex);
296c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    mComponentRoster.erase(componentLocalId);
297c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
298c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
299c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasastd::shared_ptr<C2Component> ComponentStore::findC2Component(
30042dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa        const sp<IComponent>& component) const {
301c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    std::lock_guard<std::mutex> lock(mComponentRosterMutex);
30242dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa    Component::LocalId it = mComponentRoster.find(
30342dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa            Component::InterfaceKey(component));
304c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    if (it == mComponentRoster.end()) {
305c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa        return std::shared_ptr<C2Component>();
306c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    }
307c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa    return it->second.lock();
308c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}
309c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa
310cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa// Debug dump
311cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
312cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasanamespace /* unnamed */ {
313cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
314cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa// Dump component traits
315cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasastd::ostream& dump(
316cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        std::ostream& out,
317cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        const std::shared_ptr<const C2Component::Traits>& comp) {
318cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
319cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    constexpr const char indent[] = "    ";
320cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
321cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "name: " << comp->name << std::endl;
322cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "domain: " << comp->domain << std::endl;
323cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "kind: " << comp->kind << std::endl;
324cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "rank: " << comp->rank << std::endl;
325cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "mediaType: " << comp->mediaType << std::endl;
326cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "aliases:";
327cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    for (const auto& alias : comp->aliases) {
328cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        out << ' ' << alias;
329cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    }
330cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << std::endl;
331cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
332cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    return out;
333cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa}
334cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
335cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa// Dump component
336cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasastd::ostream& dump(
337cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        std::ostream& out,
338cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        const std::shared_ptr<C2Component>& comp) {
339cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
340cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    constexpr const char indent[] = "    ";
341cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
342cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    std::shared_ptr<C2ComponentInterface> intf = comp->intf();
343cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    if (!intf) {
344cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        out << indent << "Unknown -- null interface" << std::endl;
345cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        return out;
346cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    }
347cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "name: " << intf->getName() << std::endl;
348cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    out << indent << "id: " << intf->getId() << std::endl;
349cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa    return out;
350cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa}
351cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
352cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa} // unnamed namespace
353cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
354cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin VongmasaReturn<void> ComponentStore::debug(
355cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        const hidl_handle& handle,
356cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        const hidl_vec<hidl_string>& /* args */) {
357cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   LOG(INFO) << "debug -- dumping...";
358cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   const native_handle_t *h = handle.getNativeHandle();
359cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   if (!h || h->numFds != 1) {
360cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa      LOG(ERROR) << "debug -- dumping failed -- "
361cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa              "invalid file descriptor to dump to";
362cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa      return Void();
363cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   }
364cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   std::ostringstream out;
365cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
366cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   { // Populate "out".
367cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
368cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        constexpr const char indent[] = "  ";
369cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
370cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        // Show name.
371cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        out << "Beginning of dump -- C2ComponentStore: "
372cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                << mStore->getName() << std::endl << std::endl;
373cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
374cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        // Retrieve the list of supported components.
375cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        std::vector<std::shared_ptr<const C2Component::Traits>> traitsList =
376cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                mStore->listComponents();
377cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
378cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        // Dump the traits of supported components.
379cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        out << indent << "Supported components:" << std::endl << std::endl;
380cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        if (traitsList.size() == 0) {
381cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            out << indent << indent << "NONE" << std::endl << std::endl;
382cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        } else {
383cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            for (const auto& traits : traitsList) {
384cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                dump(out, traits) << std::endl;
385cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            }
386cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        }
387cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
388cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        // Retrieve the list of active components.
389cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        std::list<std::shared_ptr<C2Component>> activeComps;
390cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        {
391cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            std::lock_guard<std::mutex> lock(mComponentRosterMutex);
392cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            auto i = mComponentRoster.begin();
393cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            while (i != mComponentRoster.end()) {
394cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                std::shared_ptr<C2Component> c2comp = i->second.lock();
39542dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa                if (!c2comp) {
396cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                    auto j = i;
397cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                    ++i;
398cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                    mComponentRoster.erase(j);
399cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                } else {
400cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                    ++i;
401cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                    activeComps.emplace_back(c2comp);
402cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                }
403cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            }
404cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        }
405cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
406cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        // Dump active components.
407cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        out << indent << "Active components:" << std::endl << std::endl;
408cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        if (activeComps.size() == 0) {
409cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            out << indent << indent << "NONE" << std::endl << std::endl;
410cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        } else {
411cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            for (const std::shared_ptr<C2Component>& c2comp : activeComps) {
412cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                dump(out, c2comp) << std::endl;
413cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa            }
414cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        }
415cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
416cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa        out << "End of dump -- C2ComponentStore: "
417cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa                << mStore->getName() << std::endl;
418cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   }
419cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
420cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   if (!android::base::WriteStringToFd(out.str(), h->data[0])) {
421cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa       PLOG(WARNING) << "debug -- dumping failed -- write()";
422cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   } else {
423cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa       LOG(INFO) << "debug -- dumping succeeded";
424cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   }
425cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa   return Void();
426cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa}
427cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
428cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa
429c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace utils
430c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace V1_0
431c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace c2
432c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace media
433c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace google
434c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa}  // namespace hardware
435