xref: /aosp_15_r20/frameworks/av/media/codec2/sfplugin/ReflectedParamUpdater.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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>> &paramDescs);
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 &params,
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 &params,
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*> &params /* 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>> &params /* 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 &params,
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