ComponentStore.cpp revision 42dfcaac7836c6b457753de5013a1124905fc0df
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) { 17089eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa component = new Component(c2component, listener, this, pool); 171c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa if (!component) { 172c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa status = Status::CORRUPTED; 17389eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa } else if (component->status() != C2_OK) { 17489eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa status = static_cast<Status>(component->status()); 175c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } else { 17689eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa component->initListener(component); 17789eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa if (component->status() != C2_OK) { 17889eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa status = static_cast<Status>(component->status()); 1790f04c4d93761015d0a138aff8a468b1583d684e4Pawin Vongmasa } else { 18089eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa std::lock_guard<std::mutex> lock(mComponentRosterMutex); 181c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa component->setLocalId( 1828ef413471c159d064aa4ad7c42c337dfbc79ea28Pawin Vongmasa mComponentRoster.emplace( 18342dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa Component::InterfaceKey(component), 18442dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa c2component) 185c3d20aa9415c8f02e568f203560685eaf12c3e2dPawin Vongmasa .first); 1860f04c4d93761015d0a138aff8a468b1583d684e4Pawin Vongmasa } 187c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 188c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 189c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa _hidl_cb(status, component); 190c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return Void(); 191c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 192c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 193c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::createInterface( 194c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa const hidl_string& name, 195c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa createInterface_cb _hidl_cb) { 196c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa std::shared_ptr<C2ComponentInterface> c2interface; 197c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa c2_status_t res = mStore->createInterface(name, &c2interface); 198c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa sp<IComponentInterface> interface; 199c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa if (res == C2_OK) { 200c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa interface = new ComponentInterface(c2interface, this); 201c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 202c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa _hidl_cb((Status)res, interface); 203c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return Void(); 204c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 205c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 206c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::listComponents(listComponents_cb _hidl_cb) { 207c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa std::vector<std::shared_ptr<const C2Component::Traits>> c2traits = 208c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa mStore->listComponents(); 209c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa hidl_vec<IComponentStore::ComponentTraits> traits(c2traits.size()); 210c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa size_t ix = 0; 211c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa for (const std::shared_ptr<const C2Component::Traits> &c2trait : c2traits) { 212c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa if (c2trait) { 213c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa objcpy(&traits[ix++], *c2trait); 214c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 215c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 216c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa traits.resize(ix); 217c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa _hidl_cb(traits); 218c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return Void(); 219c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 220c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 221c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<sp<IInputSurface>> ComponentStore::createInputSurface() { 222c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa sp<GraphicBufferSource> source = new GraphicBufferSource(); 223c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa if (source->initCheck() != OK) { 224c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return nullptr; 225c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 226c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa typedef ::android::hardware::graphics::bufferqueue::V1_0:: 227c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa IGraphicBufferProducer HGBP; 228c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa typedef ::android::TWGraphicBufferProducer<HGBP> B2HGBP; 229c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return new InputSurface( 230c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa this, 231c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa new B2HGBP(source->getIGraphicBufferProducer()), 232c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa source); 233c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 234c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 235c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<void> ComponentStore::getStructDescriptors( 236c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa const hidl_vec<uint32_t>& indices, 237c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa getStructDescriptors_cb _hidl_cb) { 238c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa hidl_vec<StructDescriptor> descriptors(indices.size()); 239c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa size_t dstIx = 0; 240e1769037aea395c60e88cb882f2fd14d88036d24Lajos Molnar Status res = Status::OK; 241c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa for (size_t srcIx = 0; srcIx < indices.size(); ++srcIx) { 242c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa std::lock_guard<std::mutex> lock(mStructDescriptorsMutex); 243c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa const auto item = mStructDescriptors.find( 244c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa C2Param::CoreIndex(indices[srcIx]).coreIndex()); 245c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa if (item == mStructDescriptors.end()) { 246c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa res = Status::NOT_FOUND; 247c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } else if (item->second) { 248c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa objcpy(&descriptors[dstIx++], *item->second); 249c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } else { 250c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa res = Status::NO_MEMORY; 251c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 252c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 253c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa descriptors.resize(dstIx); 254c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa _hidl_cb(res, descriptors); 255c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return Void(); 256c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 257c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 258c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<sp<IClientManager>> ComponentStore::getPoolClientManager() { 25989eabf0d6b92d93eced043ce4abd2ac527c0374aPawin Vongmasa return ClientManager::getInstance(); 260c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 261c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 262c470281b28a572f8e3331341a3855344608d0f72Pawin VongmasaReturn<Status> ComponentStore::copyBuffer(const Buffer& src, const Buffer& dst) { 263c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa // TODO implement 264c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa (void)src; 265c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa (void)dst; 266c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return Status::OMITTED; 267c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 268c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 269c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasavoid ComponentStore::reportComponentDeath( 270c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa const Component::LocalId& componentLocalId) { 271c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa std::lock_guard<std::mutex> lock(mComponentRosterMutex); 272c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa mComponentRoster.erase(componentLocalId); 273c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 274c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 275c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasastd::shared_ptr<C2Component> ComponentStore::findC2Component( 27642dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa const sp<IComponent>& component) const { 277c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa std::lock_guard<std::mutex> lock(mComponentRosterMutex); 27842dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa Component::LocalId it = mComponentRoster.find( 27942dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa Component::InterfaceKey(component)); 280c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa if (it == mComponentRoster.end()) { 281c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return std::shared_ptr<C2Component>(); 282c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa } 283c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa return it->second.lock(); 284c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} 285c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa 286cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa// Debug dump 287cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 288cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasanamespace /* unnamed */ { 289cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 290cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa// Dump component traits 291cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasastd::ostream& dump( 292cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::ostream& out, 293cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa const std::shared_ptr<const C2Component::Traits>& comp) { 294cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 295cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa constexpr const char indent[] = " "; 296cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 297cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "name: " << comp->name << std::endl; 298cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "domain: " << comp->domain << std::endl; 299cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "kind: " << comp->kind << std::endl; 300cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "rank: " << comp->rank << std::endl; 301cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "mediaType: " << comp->mediaType << std::endl; 302cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "aliases:"; 303cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa for (const auto& alias : comp->aliases) { 304cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << ' ' << alias; 305cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 306cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << std::endl; 307cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 308cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa return out; 309cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa} 310cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 311cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa// Dump component 312cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasastd::ostream& dump( 313cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::ostream& out, 314cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa const std::shared_ptr<C2Component>& comp) { 315cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 316cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa constexpr const char indent[] = " "; 317cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 318cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::shared_ptr<C2ComponentInterface> intf = comp->intf(); 319cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa if (!intf) { 320cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "Unknown -- null interface" << std::endl; 321cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa return out; 322cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 323cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "name: " << intf->getName() << std::endl; 324cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "id: " << intf->getId() << std::endl; 325cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa return out; 326cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa} 327cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 328cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa} // unnamed namespace 329cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 330cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin VongmasaReturn<void> ComponentStore::debug( 331cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa const hidl_handle& handle, 332cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa const hidl_vec<hidl_string>& /* args */) { 333cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa LOG(INFO) << "debug -- dumping..."; 334cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa const native_handle_t *h = handle.getNativeHandle(); 335cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa if (!h || h->numFds != 1) { 336cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa LOG(ERROR) << "debug -- dumping failed -- " 337cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa "invalid file descriptor to dump to"; 338cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa return Void(); 339cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 340cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::ostringstream out; 341cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 342cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa { // Populate "out". 343cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 344cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa constexpr const char indent[] = " "; 345cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 346cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa // Show name. 347cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << "Beginning of dump -- C2ComponentStore: " 348cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa << mStore->getName() << std::endl << std::endl; 349cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 350cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa // Retrieve the list of supported components. 351cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::vector<std::shared_ptr<const C2Component::Traits>> traitsList = 352cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa mStore->listComponents(); 353cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 354cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa // Dump the traits of supported components. 355cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "Supported components:" << std::endl << std::endl; 356cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa if (traitsList.size() == 0) { 357cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << indent << "NONE" << std::endl << std::endl; 358cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } else { 359cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa for (const auto& traits : traitsList) { 360cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa dump(out, traits) << std::endl; 361cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 362cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 363cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 364cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa // Retrieve the list of active components. 365cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::list<std::shared_ptr<C2Component>> activeComps; 366cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa { 367cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::lock_guard<std::mutex> lock(mComponentRosterMutex); 368cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa auto i = mComponentRoster.begin(); 369cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa while (i != mComponentRoster.end()) { 370cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa std::shared_ptr<C2Component> c2comp = i->second.lock(); 37142dfcaac7836c6b457753de5013a1124905fc0dfPawin Vongmasa if (!c2comp) { 372cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa auto j = i; 373cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa ++i; 374cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa mComponentRoster.erase(j); 375cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } else { 376cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa ++i; 377cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa activeComps.emplace_back(c2comp); 378cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 379cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 380cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 381cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 382cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa // Dump active components. 383cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << "Active components:" << std::endl << std::endl; 384cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa if (activeComps.size() == 0) { 385cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << indent << indent << "NONE" << std::endl << std::endl; 386cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } else { 387cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa for (const std::shared_ptr<C2Component>& c2comp : activeComps) { 388cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa dump(out, c2comp) << std::endl; 389cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 390cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 391cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 392cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa out << "End of dump -- C2ComponentStore: " 393cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa << mStore->getName() << std::endl; 394cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 395cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 396cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa if (!android::base::WriteStringToFd(out.str(), h->data[0])) { 397cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa PLOG(WARNING) << "debug -- dumping failed -- write()"; 398cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } else { 399cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa LOG(INFO) << "debug -- dumping succeeded"; 400cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa } 401cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa return Void(); 402cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa} 403cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 404cca84781c8478fe85b2c5aa78f27d5888b325a79Pawin Vongmasa 405c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // namespace utils 406c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // namespace V1_0 407c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // namespace c2 408c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // namespace media 409c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // namespace google 410c470281b28a572f8e3331341a3855344608d0f72Pawin Vongmasa} // namespace hardware 411