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*> ¶ms, 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