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 REFLECTED_PARAM_BUILDER_H_ 18*ec779b8eSAndroid Build Coastguard Worker #define REFLECTED_PARAM_BUILDER_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 23*ec779b8eSAndroid Build Coastguard Worker #include <C2.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <C2Param.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ABuffer.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AData.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AMessage.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AString.h> 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace android { 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker /** 34*ec779b8eSAndroid Build Coastguard Worker * Utility class to query and update Codec 2.0 configuration values. Use custom dictionary as 35*ec779b8eSAndroid Build Coastguard Worker * AMessage cannot represent all types of Codec 2.0 parameters and C2Value cannot represent 36*ec779b8eSAndroid Build Coastguard Worker * all types of SDK values. We want to be precise when setting standard parameters (use C2Value 37*ec779b8eSAndroid Build Coastguard Worker * for arithmetic values), but also support int32 and int64 for SDK values specifically for 38*ec779b8eSAndroid Build Coastguard Worker * vendor parameters (as SDK API does not allow specifying proper type.) When querying fields, 39*ec779b8eSAndroid Build Coastguard Worker * we can use C2Values as they are defined. 40*ec779b8eSAndroid Build Coastguard Worker * 41*ec779b8eSAndroid Build Coastguard Worker * Item => Codec 2.0 value mappings: 42*ec779b8eSAndroid Build Coastguard Worker * CValue::type => type 43*ec779b8eSAndroid Build Coastguard Worker * int32 => int32, ctr32 or uint32 44*ec779b8eSAndroid Build Coastguard Worker * int64 => int64, ctr64 or uint64 45*ec779b8eSAndroid Build Coastguard Worker * AString => string 46*ec779b8eSAndroid Build Coastguard Worker * ABuffer => blob 47*ec779b8eSAndroid Build Coastguard Worker * 'Rect' => C2RectStruct (not exposed in SDK as a rectangle) 48*ec779b8eSAndroid Build Coastguard Worker */ 49*ec779b8eSAndroid Build Coastguard Worker class ReflectedParamUpdater { 50*ec779b8eSAndroid Build Coastguard Worker public: 51*ec779b8eSAndroid Build Coastguard Worker ReflectedParamUpdater() = default; 52*ec779b8eSAndroid Build Coastguard Worker ~ReflectedParamUpdater() = default; 53*ec779b8eSAndroid Build Coastguard Worker 54*ec779b8eSAndroid Build Coastguard Worker /** 55*ec779b8eSAndroid Build Coastguard Worker * Element for values 56*ec779b8eSAndroid Build Coastguard Worker */ 57*ec779b8eSAndroid Build Coastguard Worker struct Value : public AData<C2Value, int32_t, int64_t, AString, sp<ABuffer>>::Basic { 58*ec779b8eSAndroid Build Coastguard Worker // allow construction from base types 59*ec779b8eSAndroid Build Coastguard Worker Value() = default; ValueValue60*ec779b8eSAndroid Build Coastguard Worker explicit Value(C2Value i) { set(i); } ValueValue61*ec779b8eSAndroid Build Coastguard Worker explicit Value(int32_t i) { set(i); } ValueValue62*ec779b8eSAndroid Build Coastguard Worker explicit Value(int64_t i) { set(i); } ValueValue63*ec779b8eSAndroid Build Coastguard Worker explicit Value(const AString &i) { set(i); } ValueValue64*ec779b8eSAndroid Build Coastguard Worker explicit Value(const sp<ABuffer> &i) { set(i); } 65*ec779b8eSAndroid Build Coastguard Worker }; 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker struct Dict : public std::map<std::string, Value> { 68*ec779b8eSAndroid Build Coastguard Worker Dict() = default; 69*ec779b8eSAndroid Build Coastguard Worker std::string debugString(size_t indent = 0) const; 70*ec779b8eSAndroid Build Coastguard Worker }; 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker /** 73*ec779b8eSAndroid Build Coastguard Worker * Enumerates all fields of the parameter descriptors supplied, so that this opbject can later 74*ec779b8eSAndroid Build Coastguard Worker * query and update these. 75*ec779b8eSAndroid Build Coastguard Worker * 76*ec779b8eSAndroid Build Coastguard Worker * For now only first-level fields are supported. Also, array fields are not supported. 77*ec779b8eSAndroid Build Coastguard Worker * 78*ec779b8eSAndroid Build Coastguard Worker * \param reflector C2ParamReflector object for C2Param reflection. 79*ec779b8eSAndroid Build Coastguard Worker * \param paramDescs vector of C2ParamDescriptor objects that this object 80*ec779b8eSAndroid Build Coastguard Worker * would recognize when building params. 81*ec779b8eSAndroid Build Coastguard Worker */ 82*ec779b8eSAndroid Build Coastguard Worker void addParamDesc( 83*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2ParamReflector> &reflector, 84*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::shared_ptr<C2ParamDescriptor>> ¶mDescs); 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker /** 87*ec779b8eSAndroid Build Coastguard Worker * Adds fields of a standard parameter (that may not be supported by the parameter reflector 88*ec779b8eSAndroid Build Coastguard Worker * or may not be listed as a supported value by the component). If the parameter name is 89*ec779b8eSAndroid Build Coastguard Worker * used for another parameter, this operation is a no-op. (Technically, this is by fields). 90*ec779b8eSAndroid Build Coastguard Worker * 91*ec779b8eSAndroid Build Coastguard Worker * \param T standard parameter type 92*ec779b8eSAndroid Build Coastguard Worker * \param name parameter name 93*ec779b8eSAndroid Build Coastguard Worker */ 94*ec779b8eSAndroid Build Coastguard Worker template<typename T> 95*ec779b8eSAndroid Build Coastguard Worker void addStandardParam(const std::string &name, C2ParamDescriptor::attrib_t attrib = 96*ec779b8eSAndroid Build Coastguard Worker C2ParamDescriptor::IS_READ_ONLY) { 97*ec779b8eSAndroid Build Coastguard Worker addParamDesc(std::make_shared<C2ParamDescriptor>( 98*ec779b8eSAndroid Build Coastguard Worker C2Param::Index(T::PARAM_TYPE), attrib, name.c_str()), 99*ec779b8eSAndroid Build Coastguard Worker C2StructDescriptor((T*)nullptr), nullptr /* descriptor */); 100*ec779b8eSAndroid Build Coastguard Worker } 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker /** 103*ec779b8eSAndroid Build Coastguard Worker * Adds fields of a structure (or a parameater) described by the struct descriptor. If 104*ec779b8eSAndroid Build Coastguard Worker * reflector is provided, fields of sub-structures are also added. Otherwise, only top-level 105*ec779b8eSAndroid Build Coastguard Worker * fundamental typed fields (arithmetic, string and blob) are added. 106*ec779b8eSAndroid Build Coastguard Worker * 107*ec779b8eSAndroid Build Coastguard Worker * \param paramDesc parameter descriptor 108*ec779b8eSAndroid Build Coastguard Worker * \param fieldDesc field descriptor 109*ec779b8eSAndroid Build Coastguard Worker * \param path path/name of the structure (field or parent parameter) 110*ec779b8eSAndroid Build Coastguard Worker * \param offset offset of the structure in the parameter 111*ec779b8eSAndroid Build Coastguard Worker * \param reflector C2ParamReflector object for C2Param reflection (may be null) 112*ec779b8eSAndroid Build Coastguard Worker */ 113*ec779b8eSAndroid Build Coastguard Worker void addParamStructDesc( 114*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2ParamDescriptor> paramDesc, C2String path, size_t offset, 115*ec779b8eSAndroid Build Coastguard Worker const C2StructDescriptor &structDesc, 116*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2ParamReflector> &reflector); 117*ec779b8eSAndroid Build Coastguard Worker 118*ec779b8eSAndroid Build Coastguard Worker /** 119*ec779b8eSAndroid Build Coastguard Worker * Adds fields of a parameter described by the struct descriptor. If reflector is provided, 120*ec779b8eSAndroid Build Coastguard Worker * fields of sub-structures are also added. Otherwise, only top-level fundamental typed fields 121*ec779b8eSAndroid Build Coastguard Worker * (arithmetic, string and blob) are added. 122*ec779b8eSAndroid Build Coastguard Worker * 123*ec779b8eSAndroid Build Coastguard Worker * \param paramDesc parameter descriptor 124*ec779b8eSAndroid Build Coastguard Worker * \param fieldDesc field descriptor 125*ec779b8eSAndroid Build Coastguard Worker * \param reflector C2ParamReflector object for C2Param reflection (may be null) 126*ec779b8eSAndroid Build Coastguard Worker * \param markVendor TEMP if true, prefix vendor parameter names with "vendor." 127*ec779b8eSAndroid Build Coastguard Worker */ 128*ec779b8eSAndroid Build Coastguard Worker void addParamDesc( 129*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2ParamDescriptor> paramDesc, const C2StructDescriptor &structDesc, 130*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2ParamReflector> &reflector, 131*ec779b8eSAndroid Build Coastguard Worker bool markVendor = true); 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker /** 134*ec779b8eSAndroid Build Coastguard Worker * Add support for setting a parameter as a binary blob. 135*ec779b8eSAndroid Build Coastguard Worker * 136*ec779b8eSAndroid Build Coastguard Worker * \param name name of the parameter 137*ec779b8eSAndroid Build Coastguard Worker * \param coreIndex parameter (core) index 138*ec779b8eSAndroid Build Coastguard Worker */ 139*ec779b8eSAndroid Build Coastguard Worker void supportWholeParam(std::string name, C2Param::CoreIndex coreIndex); 140*ec779b8eSAndroid Build Coastguard Worker 141*ec779b8eSAndroid Build Coastguard Worker /** 142*ec779b8eSAndroid Build Coastguard Worker * Returns the name of the parameter for an index. 143*ec779b8eSAndroid Build Coastguard Worker */ 144*ec779b8eSAndroid Build Coastguard Worker std::string getParamName(C2Param::Index index) const; 145*ec779b8eSAndroid Build Coastguard Worker 146*ec779b8eSAndroid Build Coastguard Worker /** 147*ec779b8eSAndroid Build Coastguard Worker * Get list of param indices from field names and values in AMessage object. 148*ec779b8eSAndroid Build Coastguard Worker * 149*ec779b8eSAndroid Build Coastguard Worker * TODO: This should be in the order that they are listed by the component. 150*ec779b8eSAndroid Build Coastguard Worker * 151*ec779b8eSAndroid Build Coastguard Worker * \param params[in] Dict object with field name to value pairs. 152*ec779b8eSAndroid Build Coastguard Worker * \param vec[out] vector to store the indices from |params|. 153*ec779b8eSAndroid Build Coastguard Worker */ 154*ec779b8eSAndroid Build Coastguard Worker void getParamIndicesFromMessage( 155*ec779b8eSAndroid Build Coastguard Worker const Dict ¶ms, 156*ec779b8eSAndroid Build Coastguard Worker std::vector<C2Param::Index> *vec /* nonnull */) const; 157*ec779b8eSAndroid Build Coastguard Worker 158*ec779b8eSAndroid Build Coastguard Worker /** 159*ec779b8eSAndroid Build Coastguard Worker * Get list of param indices from field names (only) in AMessage object. 160*ec779b8eSAndroid Build Coastguard Worker * 161*ec779b8eSAndroid Build Coastguard Worker * \param params[in] Vector object with field names. 162*ec779b8eSAndroid Build Coastguard Worker * \param vec[out] vector to store the indices from |params|. 163*ec779b8eSAndroid Build Coastguard Worker */ 164*ec779b8eSAndroid Build Coastguard Worker void getParamIndicesForKeys( 165*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::string> &keys, 166*ec779b8eSAndroid Build Coastguard Worker std::vector<C2Param::Index> *vec /* nonnull */) const; 167*ec779b8eSAndroid Build Coastguard Worker 168*ec779b8eSAndroid Build Coastguard Worker /** 169*ec779b8eSAndroid Build Coastguard Worker * Get list of field names for the given param index. 170*ec779b8eSAndroid Build Coastguard Worker * 171*ec779b8eSAndroid Build Coastguard Worker * \param index[in] param index 172*ec779b8eSAndroid Build Coastguard Worker * \param keys[out] vector to store the field names 173*ec779b8eSAndroid Build Coastguard Worker */ 174*ec779b8eSAndroid Build Coastguard Worker void getKeysForParamIndex( 175*ec779b8eSAndroid Build Coastguard Worker const C2Param::Index &index, 176*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> *keys /* nonnull */) const; 177*ec779b8eSAndroid Build Coastguard Worker 178*ec779b8eSAndroid Build Coastguard Worker /** 179*ec779b8eSAndroid Build Coastguard Worker * Get field type for the given name 180*ec779b8eSAndroid Build Coastguard Worker * 181*ec779b8eSAndroid Build Coastguard Worker * \param key[in] field name 182*ec779b8eSAndroid Build Coastguard Worker * \return type of the field, or type_t(~0) if not found. 183*ec779b8eSAndroid Build Coastguard Worker */ 184*ec779b8eSAndroid Build Coastguard Worker C2FieldDescriptor::type_t getTypeForKey(const std::string &name) const; 185*ec779b8eSAndroid Build Coastguard Worker 186*ec779b8eSAndroid Build Coastguard Worker /** 187*ec779b8eSAndroid Build Coastguard Worker * Update C2Param objects from field name and value in AMessage object. 188*ec779b8eSAndroid Build Coastguard Worker * 189*ec779b8eSAndroid Build Coastguard Worker * \param params[in] Dict object with field name to value pairs. 190*ec779b8eSAndroid Build Coastguard Worker * \param vec[in,out] vector of the C2Param objects to be updated. 191*ec779b8eSAndroid Build Coastguard Worker */ 192*ec779b8eSAndroid Build Coastguard Worker void updateParamsFromMessage( 193*ec779b8eSAndroid Build Coastguard Worker const Dict ¶ms, 194*ec779b8eSAndroid Build Coastguard Worker std::vector<std::unique_ptr<C2Param>> *vec /* nonnull */) const; 195*ec779b8eSAndroid Build Coastguard Worker 196*ec779b8eSAndroid Build Coastguard Worker /** 197*ec779b8eSAndroid Build Coastguard Worker * Get fields from C2Param objects in AMessage object. 198*ec779b8eSAndroid Build Coastguard Worker * 199*ec779b8eSAndroid Build Coastguard Worker * \param params[in] vector of the C2Param objects to be queried 200*ec779b8eSAndroid Build Coastguard Worker * \return a Dict object containing the known parameters 201*ec779b8eSAndroid Build Coastguard Worker */ 202*ec779b8eSAndroid Build Coastguard Worker Dict getParams( 203*ec779b8eSAndroid Build Coastguard Worker const std::vector<C2Param*> ¶ms /* nonnull */) const; 204*ec779b8eSAndroid Build Coastguard Worker 205*ec779b8eSAndroid Build Coastguard Worker Dict getParams( 206*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::unique_ptr<C2Param>> ¶ms /* nonnull */) const; 207*ec779b8eSAndroid Build Coastguard Worker 208*ec779b8eSAndroid Build Coastguard Worker /** 209*ec779b8eSAndroid Build Coastguard Worker * Clear param descriptors in this object. 210*ec779b8eSAndroid Build Coastguard Worker */ 211*ec779b8eSAndroid Build Coastguard Worker void clear(); 212*ec779b8eSAndroid Build Coastguard Worker 213*ec779b8eSAndroid Build Coastguard Worker private: 214*ec779b8eSAndroid Build Coastguard Worker struct FieldDesc { 215*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2ParamDescriptor> paramDesc; 216*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<C2FieldDescriptor> fieldDesc; 217*ec779b8eSAndroid Build Coastguard Worker size_t offset; 218*ec779b8eSAndroid Build Coastguard Worker }; 219*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, FieldDesc> mMap; 220*ec779b8eSAndroid Build Coastguard Worker std::map<C2Param::Index, std::string> mParamNames; 221*ec779b8eSAndroid Build Coastguard Worker std::map<std::string, C2Param::CoreIndex> mWholeParams; 222*ec779b8eSAndroid Build Coastguard Worker 223*ec779b8eSAndroid Build Coastguard Worker void parseMessageAndDoWork( 224*ec779b8eSAndroid Build Coastguard Worker const Dict ¶ms, 225*ec779b8eSAndroid Build Coastguard Worker std::function<void(const std::string &, const FieldDesc &, const void *, size_t)> work) const; 226*ec779b8eSAndroid Build Coastguard Worker 227*ec779b8eSAndroid Build Coastguard Worker C2_DO_NOT_COPY(ReflectedParamUpdater); 228*ec779b8eSAndroid Build Coastguard Worker }; 229*ec779b8eSAndroid Build Coastguard Worker 230*ec779b8eSAndroid Build Coastguard Worker } // namespace android 231*ec779b8eSAndroid Build Coastguard Worker 232*ec779b8eSAndroid Build Coastguard Worker #endif // REFLECTED_PARAM_BUILDER_H_ 233