1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef C_CODEC_CONFIG_H_ 18*ec779b8eSAndroid Build Coastguard Worker #define C_CODEC_CONFIG_H_ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <map> 21*ec779b8eSAndroid Build Coastguard Worker #include <memory> 22*ec779b8eSAndroid Build Coastguard Worker #include <set> 23*ec779b8eSAndroid Build Coastguard Worker #include <vector> 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker #include <C2Component.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <C2Config.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <C2Debug.h> 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/client.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker #include "InputSurfaceWrapper.h" 33*ec779b8eSAndroid Build Coastguard Worker #include "ReflectedParamUpdater.h" 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker namespace android { 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker struct AMessage; 38*ec779b8eSAndroid Build Coastguard Worker struct CodecParameterDescriptor; 39*ec779b8eSAndroid Build Coastguard Worker class NativeHandle; 40*ec779b8eSAndroid Build Coastguard Worker struct StandardParams; 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker /** 43*ec779b8eSAndroid Build Coastguard Worker * Struct managing the codec configuration for CCodec. 44*ec779b8eSAndroid Build Coastguard Worker */ 45*ec779b8eSAndroid Build Coastguard Worker struct CCodecConfig { 46*ec779b8eSAndroid Build Coastguard Worker /** 47*ec779b8eSAndroid Build Coastguard Worker * Domain consists of a bitmask divided into fields, and specifiers work by excluding other 48*ec779b8eSAndroid Build Coastguard Worker * values in those domains. 49*ec779b8eSAndroid Build Coastguard Worker * 50*ec779b8eSAndroid Build Coastguard Worker * Component domains are composed by or-ing the individual IS_ constants, e.g. 51*ec779b8eSAndroid Build Coastguard Worker * IS_DECODER | IS_AUDIO. 52*ec779b8eSAndroid Build Coastguard Worker * 53*ec779b8eSAndroid Build Coastguard Worker * Config specifiers are composed by or-ing the individual mask constants, and 54*ec779b8eSAndroid Build Coastguard Worker * and-ing these groups: e.g. (DECODER | ENCODER) & AUDIO. 55*ec779b8eSAndroid Build Coastguard Worker * 56*ec779b8eSAndroid Build Coastguard Worker * The naming of these constants was to limit the length of mask names as these are used more 57*ec779b8eSAndroid Build Coastguard Worker * commonly as masks. 58*ec779b8eSAndroid Build Coastguard Worker */ 59*ec779b8eSAndroid Build Coastguard Worker enum Domain : uint32_t { 60*ec779b8eSAndroid Build Coastguard Worker // component domain (domain & kind) 61*ec779b8eSAndroid Build Coastguard Worker GUARD_BIT = (1 << 1), ///< this is to prevent against accidental && or || usage 62*ec779b8eSAndroid Build Coastguard Worker IS_AUDIO = (1 << 2), ///< for audio codecs 63*ec779b8eSAndroid Build Coastguard Worker IS_VIDEO = (1 << 3), ///< for video codecs 64*ec779b8eSAndroid Build Coastguard Worker IS_IMAGE = (1 << 4), ///< for image codecs 65*ec779b8eSAndroid Build Coastguard Worker OTHER_DOMAIN = (1 << 5), ///< for other domains 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker IS_ENCODER = (1 << 6), ///< for encoders 68*ec779b8eSAndroid Build Coastguard Worker IS_DECODER = (1 << 7), ///< for decoders 69*ec779b8eSAndroid Build Coastguard Worker OTHER_KIND = (1 << 8), ///< for other domains 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker // config domain 72*ec779b8eSAndroid Build Coastguard Worker IS_PARAM = (1 << 9), ///< for setParameter 73*ec779b8eSAndroid Build Coastguard Worker IS_CONFIG = (1 << 10), ///< for configure 74*ec779b8eSAndroid Build Coastguard Worker IS_READ = (1 << 11), ///< for getFormat 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker // port domain 77*ec779b8eSAndroid Build Coastguard Worker IS_INPUT = (1 << 12), ///< for input port (getFormat) 78*ec779b8eSAndroid Build Coastguard Worker IS_OUTPUT = (1 << 13), ///< for output port (getFormat) 79*ec779b8eSAndroid Build Coastguard Worker IS_RAW = (1 << 14), ///< for raw port (input-encoder, output-decoder) 80*ec779b8eSAndroid Build Coastguard Worker IS_CODED = (1 << 15), ///< for coded port (input-decoder, output-encoder) 81*ec779b8eSAndroid Build Coastguard Worker 82*ec779b8eSAndroid Build Coastguard Worker ALL = ~0U, 83*ec779b8eSAndroid Build Coastguard Worker NONE = 0, 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker AUDIO = ~(IS_IMAGE | IS_VIDEO | OTHER_DOMAIN), 86*ec779b8eSAndroid Build Coastguard Worker VIDEO = ~(IS_AUDIO | IS_IMAGE | OTHER_DOMAIN), 87*ec779b8eSAndroid Build Coastguard Worker IMAGE = ~(IS_AUDIO | IS_VIDEO | OTHER_DOMAIN), 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker DECODER = ~(IS_ENCODER | OTHER_KIND), 90*ec779b8eSAndroid Build Coastguard Worker ENCODER = ~(IS_DECODER | OTHER_KIND), 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker PARAM = ~(IS_CONFIG | IS_READ), 93*ec779b8eSAndroid Build Coastguard Worker CONFIG = ~(IS_PARAM | IS_READ), 94*ec779b8eSAndroid Build Coastguard Worker READ = ~(IS_CONFIG | IS_PARAM), 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker INPUT = ~(IS_OUTPUT | IS_RAW | IS_CODED), 97*ec779b8eSAndroid Build Coastguard Worker OUTPUT = ~(IS_INPUT | IS_RAW | IS_CODED), 98*ec779b8eSAndroid Build Coastguard Worker RAW = ~(IS_INPUT | IS_OUTPUT | IS_CODED), 99*ec779b8eSAndroid Build Coastguard Worker CODED = ~(IS_INPUT | IS_RAW | IS_OUTPUT), 100*ec779b8eSAndroid Build Coastguard Worker }; 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker // things required to manage formats 103*ec779b8eSAndroid Build Coastguard Worker std::vector<std::shared_ptr<C2ParamDescriptor>> mParamDescs; 104*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2ParamReflector> mReflector; 105*ec779b8eSAndroid Build Coastguard Worker 106*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ReflectedParamUpdater> mParamUpdater; 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker Domain mDomain; // component domain 109*ec779b8eSAndroid Build Coastguard Worker Domain mInputDomain; // input port domain 110*ec779b8eSAndroid Build Coastguard Worker Domain mOutputDomain; // output port domain 111*ec779b8eSAndroid Build Coastguard Worker std::string mCodingMediaType; // media type of the coded stream 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker // standard MediaCodec to Codec 2.0 params mapping 114*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<StandardParams> mStandardParams; 115*ec779b8eSAndroid Build Coastguard Worker 116*ec779b8eSAndroid Build Coastguard Worker std::set<C2Param::Index> mSupportedIndices; ///< indices supported by the component 117*ec779b8eSAndroid Build Coastguard Worker std::set<C2Param::Index> mSubscribedIndices; ///< indices to subscribe to 118*ec779b8eSAndroid Build Coastguard Worker size_t mSubscribedIndicesSize; ///< count of currently subscribed indices 119*ec779b8eSAndroid Build Coastguard Worker 120*ec779b8eSAndroid Build Coastguard Worker sp<AMessage> mInputFormat; 121*ec779b8eSAndroid Build Coastguard Worker sp<AMessage> mOutputFormat; 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker bool mUsingSurface; ///< using input or output surface 124*ec779b8eSAndroid Build Coastguard Worker bool mBuffersBoundToCodec; ///< whether buffers are bound to codecs or not. 125*ec779b8eSAndroid Build Coastguard Worker 126*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<InputSurfaceWrapper> mInputSurface; 127*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<InputSurfaceWrapper::Config> mISConfig; 128*ec779b8eSAndroid Build Coastguard Worker android_dataspace mInputSurfaceDataspace; 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker /// the current configuration. Updated after configure() and based on configUpdate in 131*ec779b8eSAndroid Build Coastguard Worker /// onWorkDone 132*ec779b8eSAndroid Build Coastguard Worker std::map<C2Param::Index, std::unique_ptr<C2Param>> mCurrentConfig; 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker typedef std::function<c2_status_t(std::unique_ptr<C2Param>&)> LocalParamValidator; 135*ec779b8eSAndroid Build Coastguard Worker 136*ec779b8eSAndroid Build Coastguard Worker /// Parameter indices tracked in current config that are not supported by the component. 137*ec779b8eSAndroid Build Coastguard Worker /// these are provided so that optional parameters can remain in the current configuration. 138*ec779b8eSAndroid Build Coastguard Worker /// as such, these parameters have no dependencies. TODO: use C2InterfaceHelper for this. 139*ec779b8eSAndroid Build Coastguard Worker /// For now support a validation function. 140*ec779b8eSAndroid Build Coastguard Worker std::map<C2Param::Index, LocalParamValidator> mLocalParams; 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker /// Vendor field name -> desc map. 143*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, std::shared_ptr<C2ParamDescriptor>> mVendorParams; 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mLastConfig; 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker /// Tunneled codecs 148*ec779b8eSAndroid Build Coastguard Worker bool mTunneled; 149*ec779b8eSAndroid Build Coastguard Worker sp<NativeHandle> mSidebandHandle; 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker bool mPushBlankBuffersOnStop; 152*ec779b8eSAndroid Build Coastguard Worker 153*ec779b8eSAndroid Build Coastguard Worker CCodecConfig(); 154*ec779b8eSAndroid Build Coastguard Worker 155*ec779b8eSAndroid Build Coastguard Worker /// initializes the members required to manage the format: descriptors, reflector, 156*ec779b8eSAndroid Build Coastguard Worker /// reflected param helper, domain, standard params, and subscribes to standard 157*ec779b8eSAndroid Build Coastguard Worker /// indices. 158*ec779b8eSAndroid Build Coastguard Worker status_t initialize( 159*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2ParamReflector> &client, 160*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Configurable> &configurable); 161*ec779b8eSAndroid Build Coastguard Worker 162*ec779b8eSAndroid Build Coastguard Worker /** 163*ec779b8eSAndroid Build Coastguard Worker * Adds a locally maintained parameter. This is used for output configuration that can be 164*ec779b8eSAndroid Build Coastguard Worker * appended to the output buffers in case it is not supported by the component. 165*ec779b8eSAndroid Build Coastguard Worker */ 166*ec779b8eSAndroid Build Coastguard Worker template<typename T> 167*ec779b8eSAndroid Build Coastguard Worker bool addLocalParam( 168*ec779b8eSAndroid Build Coastguard Worker const std::string &name, 169*ec779b8eSAndroid Build Coastguard Worker C2ParamDescriptor::attrib_t attrib = C2ParamDescriptor::IS_READ_ONLY, 170*ec779b8eSAndroid Build Coastguard Worker std::function<c2_status_t(std::unique_ptr<T>&)> validator_ = 171*ec779b8eSAndroid Build Coastguard Worker std::function<c2_status_t(std::unique_ptr<T>&)>()) { 172*ec779b8eSAndroid Build Coastguard Worker C2Param::Index index = T::PARAM_TYPE; 173*ec779b8eSAndroid Build Coastguard Worker if (mSupportedIndices.count(index) || mLocalParams.count(index)) { 174*ec779b8eSAndroid Build Coastguard Worker if (mSupportedIndices.count(index)) { 175*ec779b8eSAndroid Build Coastguard Worker mSubscribedIndices.emplace(index); 176*ec779b8eSAndroid Build Coastguard Worker } 177*ec779b8eSAndroid Build Coastguard Worker ALOGD("ignoring local param %s (%#x) as it is already %s", 178*ec779b8eSAndroid Build Coastguard Worker name.c_str(), (uint32_t)index, mSupportedIndices.count(index) ? "supported" : "local"); 179*ec779b8eSAndroid Build Coastguard Worker return false; // already supported by the component or already added 180*ec779b8eSAndroid Build Coastguard Worker } 181*ec779b8eSAndroid Build Coastguard Worker 182*ec779b8eSAndroid Build Coastguard Worker // wrap typed validator into untyped validator 183*ec779b8eSAndroid Build Coastguard Worker LocalParamValidator validator; 184*ec779b8eSAndroid Build Coastguard Worker if (validator_) { 185*ec779b8eSAndroid Build Coastguard Worker validator = [validator_](std::unique_ptr<C2Param>& p){ 186*ec779b8eSAndroid Build Coastguard Worker c2_status_t res = C2_BAD_VALUE; 187*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<T> typed(static_cast<T*>(p.release())); 188*ec779b8eSAndroid Build Coastguard Worker // if parameter is correctly typed 189*ec779b8eSAndroid Build Coastguard Worker if (T::From(typed.get())) { 190*ec779b8eSAndroid Build Coastguard Worker res = validator_(typed); 191*ec779b8eSAndroid Build Coastguard Worker p.reset(typed.release()); 192*ec779b8eSAndroid Build Coastguard Worker } 193*ec779b8eSAndroid Build Coastguard Worker return res; 194*ec779b8eSAndroid Build Coastguard Worker }; 195*ec779b8eSAndroid Build Coastguard Worker } 196*ec779b8eSAndroid Build Coastguard Worker 197*ec779b8eSAndroid Build Coastguard Worker mLocalParams.emplace(index, validator); 198*ec779b8eSAndroid Build Coastguard Worker mParamUpdater->addStandardParam<T>(name, attrib); 199*ec779b8eSAndroid Build Coastguard Worker return true; 200*ec779b8eSAndroid Build Coastguard Worker } 201*ec779b8eSAndroid Build Coastguard Worker 202*ec779b8eSAndroid Build Coastguard Worker /** 203*ec779b8eSAndroid Build Coastguard Worker * Adds a locally maintained parameter with a default value. 204*ec779b8eSAndroid Build Coastguard Worker */ 205*ec779b8eSAndroid Build Coastguard Worker template<typename T> 206*ec779b8eSAndroid Build Coastguard Worker bool addLocalParam( 207*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<T> default_, 208*ec779b8eSAndroid Build Coastguard Worker const std::string &name, 209*ec779b8eSAndroid Build Coastguard Worker C2ParamDescriptor::attrib_t attrib = C2ParamDescriptor::IS_READ_ONLY, 210*ec779b8eSAndroid Build Coastguard Worker std::function<c2_status_t(std::unique_ptr<T>&)> validator_ = 211*ec779b8eSAndroid Build Coastguard Worker std::function<c2_status_t(std::unique_ptr<T>&)>()) { 212*ec779b8eSAndroid Build Coastguard Worker if (addLocalParam<T>(name, attrib, validator_)) { 213*ec779b8eSAndroid Build Coastguard Worker if (validator_) { 214*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = validator_(default_); 215*ec779b8eSAndroid Build Coastguard Worker if (err != C2_OK) { 216*ec779b8eSAndroid Build Coastguard Worker ALOGD("default value for %s is invalid => %s", name.c_str(), asString(err)); 217*ec779b8eSAndroid Build Coastguard Worker return false; 218*ec779b8eSAndroid Build Coastguard Worker } 219*ec779b8eSAndroid Build Coastguard Worker } 220*ec779b8eSAndroid Build Coastguard Worker mCurrentConfig[T::PARAM_TYPE] = std::move(default_); 221*ec779b8eSAndroid Build Coastguard Worker return true; 222*ec779b8eSAndroid Build Coastguard Worker } 223*ec779b8eSAndroid Build Coastguard Worker return false; 224*ec779b8eSAndroid Build Coastguard Worker } 225*ec779b8eSAndroid Build Coastguard Worker 226*ec779b8eSAndroid Build Coastguard Worker template<typename T> 227*ec779b8eSAndroid Build Coastguard Worker bool addLocalParam( 228*ec779b8eSAndroid Build Coastguard Worker T *default_, const std::string &name, 229*ec779b8eSAndroid Build Coastguard Worker C2ParamDescriptor::attrib_t attrib = C2ParamDescriptor::IS_READ_ONLY, 230*ec779b8eSAndroid Build Coastguard Worker std::function<c2_status_t(std::unique_ptr<T>&)> validator_ = 231*ec779b8eSAndroid Build Coastguard Worker std::function<c2_status_t(std::unique_ptr<T>&)>()) { 232*ec779b8eSAndroid Build Coastguard Worker return addLocalParam(std::unique_ptr<T>(default_), name, attrib, validator_); 233*ec779b8eSAndroid Build Coastguard Worker } 234*ec779b8eSAndroid Build Coastguard Worker 235*ec779b8eSAndroid Build Coastguard Worker /// Applies configuration updates, and updates format in the specific domain. 236*ec779b8eSAndroid Build Coastguard Worker /// Returns true if formats were updated 237*ec779b8eSAndroid Build Coastguard Worker /// \param domain input/output bitmask 238*ec779b8eSAndroid Build Coastguard Worker bool updateConfiguration( 239*ec779b8eSAndroid Build Coastguard Worker std::vector<std::unique_ptr<C2Param>> &configUpdate, Domain domain); 240*ec779b8eSAndroid Build Coastguard Worker 241*ec779b8eSAndroid Build Coastguard Worker /// Updates formats in the specific domain. Returns true if any of the formats have changed. 242*ec779b8eSAndroid Build Coastguard Worker /// \param domain input/output bitmask 243*ec779b8eSAndroid Build Coastguard Worker bool updateFormats(Domain domain); 244*ec779b8eSAndroid Build Coastguard Worker 245*ec779b8eSAndroid Build Coastguard Worker /** 246*ec779b8eSAndroid Build Coastguard Worker * Applies SDK configurations in a specific configuration domain. 247*ec779b8eSAndroid Build Coastguard Worker * Updates relevant input/output formats and subscribes to parameters specified in the 248*ec779b8eSAndroid Build Coastguard Worker * configuration. 249*ec779b8eSAndroid Build Coastguard Worker * \param domain config/setParam bitmask 250*ec779b8eSAndroid Build Coastguard Worker * \param blocking blocking mode to use with the component 251*ec779b8eSAndroid Build Coastguard Worker */ 252*ec779b8eSAndroid Build Coastguard Worker status_t getConfigUpdateFromSdkParams( 253*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<Codec2Client::Configurable> configurable, 254*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &sdkParams, Domain domain, 255*ec779b8eSAndroid Build Coastguard Worker c2_blocking_t blocking, 256*ec779b8eSAndroid Build Coastguard Worker std::vector<std::unique_ptr<C2Param>> *configUpdate) const; 257*ec779b8eSAndroid Build Coastguard Worker 258*ec779b8eSAndroid Build Coastguard Worker /** 259*ec779b8eSAndroid Build Coastguard Worker * Applies a configuration update to the component. 260*ec779b8eSAndroid Build Coastguard Worker * Updates relevant input/output formats and subscribes to parameters specified in the 261*ec779b8eSAndroid Build Coastguard Worker * configuration. 262*ec779b8eSAndroid Build Coastguard Worker * \param blocking blocking mode to use with the component 263*ec779b8eSAndroid Build Coastguard Worker */ 264*ec779b8eSAndroid Build Coastguard Worker status_t setParameters( 265*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<Codec2Client::Configurable> configurable, 266*ec779b8eSAndroid Build Coastguard Worker std::vector<std::unique_ptr<C2Param>> &configUpdate, 267*ec779b8eSAndroid Build Coastguard Worker c2_blocking_t blocking); 268*ec779b8eSAndroid Build Coastguard Worker 269*ec779b8eSAndroid Build Coastguard Worker /// Queries subscribed indices (which contains all SDK-exposed values) and updates 270*ec779b8eSAndroid Build Coastguard Worker /// input/output formats. 271*ec779b8eSAndroid Build Coastguard Worker status_t queryConfiguration( 272*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Configurable> &configurable); 273*ec779b8eSAndroid Build Coastguard Worker 274*ec779b8eSAndroid Build Coastguard Worker /// Queries a configuration parameter value. Returns nullptr if the parameter is not 275*ec779b8eSAndroid Build Coastguard Worker /// part of the current configuration 276*ec779b8eSAndroid Build Coastguard Worker const C2Param *getConfigParameterValue(C2Param::Index index) const; 277*ec779b8eSAndroid Build Coastguard Worker 278*ec779b8eSAndroid Build Coastguard Worker /// Subscribe to all vendor parameters. 279*ec779b8eSAndroid Build Coastguard Worker status_t subscribeToAllVendorParams( 280*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Configurable> &configurable, 281*ec779b8eSAndroid Build Coastguard Worker c2_blocking_t blocking); 282*ec779b8eSAndroid Build Coastguard Worker 283*ec779b8eSAndroid Build Coastguard Worker /** 284*ec779b8eSAndroid Build Coastguard Worker * Object that can be used to access configuration parameters and if they change. 285*ec779b8eSAndroid Build Coastguard Worker */ 286*ec779b8eSAndroid Build Coastguard Worker template<typename T> 287*ec779b8eSAndroid Build Coastguard Worker struct Watcher { 288*ec779b8eSAndroid Build Coastguard Worker ~Watcher() = default; 289*ec779b8eSAndroid Build Coastguard Worker 290*ec779b8eSAndroid Build Coastguard Worker /// returns true if the value of this configuration has changed hasChangedCCodecConfig::Watcher291*ec779b8eSAndroid Build Coastguard Worker bool hasChanged() const { 292*ec779b8eSAndroid Build Coastguard Worker const C2Param *value = mParent->getConfigParameterValue(mIndex); 293*ec779b8eSAndroid Build Coastguard Worker if (value && mValue) { 294*ec779b8eSAndroid Build Coastguard Worker return *value != *mValue; 295*ec779b8eSAndroid Build Coastguard Worker } else { 296*ec779b8eSAndroid Build Coastguard Worker return value != mValue.get(); 297*ec779b8eSAndroid Build Coastguard Worker } 298*ec779b8eSAndroid Build Coastguard Worker } 299*ec779b8eSAndroid Build Coastguard Worker 300*ec779b8eSAndroid Build Coastguard Worker /// updates the current value and returns it updateCCodecConfig::Watcher301*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<const T> update() { 302*ec779b8eSAndroid Build Coastguard Worker const C2Param *value = mParent->getConfigParameterValue(mIndex); 303*ec779b8eSAndroid Build Coastguard Worker if (value) { 304*ec779b8eSAndroid Build Coastguard Worker mValue = std::shared_ptr<const T>(T::From(C2Param::Copy(*value).release())); 305*ec779b8eSAndroid Build Coastguard Worker } 306*ec779b8eSAndroid Build Coastguard Worker return mValue; 307*ec779b8eSAndroid Build Coastguard Worker } 308*ec779b8eSAndroid Build Coastguard Worker 309*ec779b8eSAndroid Build Coastguard Worker private: WatcherCCodecConfig::Watcher310*ec779b8eSAndroid Build Coastguard Worker Watcher(C2Param::Index index, const CCodecConfig *parent) 311*ec779b8eSAndroid Build Coastguard Worker : mParent(parent), mIndex(index) { 312*ec779b8eSAndroid Build Coastguard Worker update(); 313*ec779b8eSAndroid Build Coastguard Worker } 314*ec779b8eSAndroid Build Coastguard Worker 315*ec779b8eSAndroid Build Coastguard Worker friend struct CCodecConfig; 316*ec779b8eSAndroid Build Coastguard Worker 317*ec779b8eSAndroid Build Coastguard Worker const CCodecConfig *mParent; 318*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<const T> mValue; 319*ec779b8eSAndroid Build Coastguard Worker C2Param::Index mIndex; 320*ec779b8eSAndroid Build Coastguard Worker }; 321*ec779b8eSAndroid Build Coastguard Worker 322*ec779b8eSAndroid Build Coastguard Worker /** 323*ec779b8eSAndroid Build Coastguard Worker * Returns a watcher object for a parameter. 324*ec779b8eSAndroid Build Coastguard Worker */ 325*ec779b8eSAndroid Build Coastguard Worker template<typename T> 326*ec779b8eSAndroid Build Coastguard Worker Watcher<T> watch(C2Param::Index index = T::PARAM_TYPE) const { 327*ec779b8eSAndroid Build Coastguard Worker if (index.type() != T::PARAM_TYPE) { 328*ec779b8eSAndroid Build Coastguard Worker __builtin_trap(); 329*ec779b8eSAndroid Build Coastguard Worker } 330*ec779b8eSAndroid Build Coastguard Worker return Watcher<T>(index, this); 331*ec779b8eSAndroid Build Coastguard Worker } 332*ec779b8eSAndroid Build Coastguard Worker 333*ec779b8eSAndroid Build Coastguard Worker /** 334*ec779b8eSAndroid Build Coastguard Worker * Queries supported parameters and put the keys to |names|. 335*ec779b8eSAndroid Build Coastguard Worker * TODO: currently this method queries vendor parameter keys only. 336*ec779b8eSAndroid Build Coastguard Worker * 337*ec779b8eSAndroid Build Coastguard Worker * \return OK if successful. 338*ec779b8eSAndroid Build Coastguard Worker * BAD_VALUE if |names| is nullptr. 339*ec779b8eSAndroid Build Coastguard Worker */ 340*ec779b8eSAndroid Build Coastguard Worker status_t querySupportedParameters(std::vector<std::string> *names); 341*ec779b8eSAndroid Build Coastguard Worker 342*ec779b8eSAndroid Build Coastguard Worker /** 343*ec779b8eSAndroid Build Coastguard Worker * Describe the parameter with |name|, filling the information into |desc| 344*ec779b8eSAndroid Build Coastguard Worker * TODO: currently this method works only for vendor parameters. 345*ec779b8eSAndroid Build Coastguard Worker * 346*ec779b8eSAndroid Build Coastguard Worker * \return OK if successful. 347*ec779b8eSAndroid Build Coastguard Worker * BAD_VALUE if |desc| is nullptr. 348*ec779b8eSAndroid Build Coastguard Worker * NAME_NOT_FOUND if |name| is not a recognized parameter name. 349*ec779b8eSAndroid Build Coastguard Worker */ 350*ec779b8eSAndroid Build Coastguard Worker status_t describe(const std::string &name, CodecParameterDescriptor *desc); 351*ec779b8eSAndroid Build Coastguard Worker 352*ec779b8eSAndroid Build Coastguard Worker /** 353*ec779b8eSAndroid Build Coastguard Worker * Find corresponding indices for |names| and subscribe to them. 354*ec779b8eSAndroid Build Coastguard Worker */ 355*ec779b8eSAndroid Build Coastguard Worker status_t subscribeToVendorConfigUpdate( 356*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Configurable> &configurable, 357*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::string> &names, 358*ec779b8eSAndroid Build Coastguard Worker c2_blocking_t blocking = C2_DONT_BLOCK); 359*ec779b8eSAndroid Build Coastguard Worker 360*ec779b8eSAndroid Build Coastguard Worker /** 361*ec779b8eSAndroid Build Coastguard Worker * Find corresponding indices for |names| and unsubscribe from them. 362*ec779b8eSAndroid Build Coastguard Worker */ 363*ec779b8eSAndroid Build Coastguard Worker status_t unsubscribeFromVendorConfigUpdate( 364*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Configurable> &configurable, 365*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::string> &names, 366*ec779b8eSAndroid Build Coastguard Worker c2_blocking_t blocking = C2_DONT_BLOCK); 367*ec779b8eSAndroid Build Coastguard Worker 368*ec779b8eSAndroid Build Coastguard Worker /// Adds indices to the subscribed indices, and updated subscription to component 369*ec779b8eSAndroid Build Coastguard Worker /// \param blocking blocking mode to use with the component 370*ec779b8eSAndroid Build Coastguard Worker status_t subscribeToConfigUpdate( 371*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Configurable> &configurable, 372*ec779b8eSAndroid Build Coastguard Worker const std::vector<C2Param::Index> &indices, 373*ec779b8eSAndroid Build Coastguard Worker c2_blocking_t blocking = C2_DONT_BLOCK); 374*ec779b8eSAndroid Build Coastguard Worker 375*ec779b8eSAndroid Build Coastguard Worker private: 376*ec779b8eSAndroid Build Coastguard Worker 377*ec779b8eSAndroid Build Coastguard Worker /// initializes the standard MediaCodec to Codec 2.0 params mapping 378*ec779b8eSAndroid Build Coastguard Worker void initializeStandardParams(); 379*ec779b8eSAndroid Build Coastguard Worker 380*ec779b8eSAndroid Build Coastguard Worker /// Gets SDK format from codec 2.0 reflected configuration 381*ec779b8eSAndroid Build Coastguard Worker /// \param domain input/output bitmask 382*ec779b8eSAndroid Build Coastguard Worker sp<AMessage> getFormatForDomain( 383*ec779b8eSAndroid Build Coastguard Worker const ReflectedParamUpdater::Dict &reflected, 384*ec779b8eSAndroid Build Coastguard Worker Domain domain) const; 385*ec779b8eSAndroid Build Coastguard Worker 386*ec779b8eSAndroid Build Coastguard Worker /** 387*ec779b8eSAndroid Build Coastguard Worker * Converts a set of configuration parameters in an AMessage to a list of path-based Codec 388*ec779b8eSAndroid Build Coastguard Worker * 2.0 configuration parameters. 389*ec779b8eSAndroid Build Coastguard Worker * 390*ec779b8eSAndroid Build Coastguard Worker * \param domain config/setParam bitmask 391*ec779b8eSAndroid Build Coastguard Worker */ 392*ec779b8eSAndroid Build Coastguard Worker ReflectedParamUpdater::Dict getReflectedFormat( 393*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &config, Domain domain) const; 394*ec779b8eSAndroid Build Coastguard Worker }; 395*ec779b8eSAndroid Build Coastguard Worker 396*ec779b8eSAndroid Build Coastguard Worker DEFINE_ENUM_OPERATORS(CCodecConfig::Domain) 397*ec779b8eSAndroid Build Coastguard Worker 398*ec779b8eSAndroid Build Coastguard Worker } // namespace android 399*ec779b8eSAndroid Build Coastguard Worker 400*ec779b8eSAndroid Build Coastguard Worker #endif // C_CODEC_H_ 401