xref: /aosp_15_r20/frameworks/av/media/module/codecserviceregistrant/CodecServiceRegistrant.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright 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 //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "CodecServiceRegistrant"
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <android/api-level.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <android-base/logging.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <android-base/properties.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include <C2Component.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <C2PlatformSupport.h>
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker #include <android/hidl/manager/1.2/IServiceManager.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/1.0/ComponentStore.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/1.1/ComponentStore.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/1.2/ComponentStore.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/1.2/Configurable.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/1.2/types.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <hidl/HidlSupport.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <hidl/HidlTransportSupport.h>
36*ec779b8eSAndroid Build Coastguard Worker 
37*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_interface_utils.h>
38*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
39*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_process.h>
40*ec779b8eSAndroid Build Coastguard Worker #include <codec2/aidl/ComponentStore.h>
41*ec779b8eSAndroid Build Coastguard Worker #include <codec2/aidl/ParamTypes.h>
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker #include <codecserviceregistrant/CodecServiceRegistrant.h>
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker namespace /* unnamed */ {
46*ec779b8eSAndroid Build Coastguard Worker 
47*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
48*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
49*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::Return;
50*ec779b8eSAndroid Build Coastguard Worker using ::android::sp;
51*ec779b8eSAndroid Build Coastguard Worker using ::ndk::ScopedAStatus;
52*ec779b8eSAndroid Build Coastguard Worker namespace c2_hidl_V1_0 = ::android::hardware::media::c2::V1_0;
53*ec779b8eSAndroid Build Coastguard Worker namespace c2_hidl = ::android::hardware::media::c2::V1_2;
54*ec779b8eSAndroid Build Coastguard Worker namespace c2_aidl = ::aidl::android::hardware::media::c2;
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker constexpr c2_status_t C2_TRANSACTION_FAILED = C2_CORRUPTED;
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker // Converter from IComponentStore to C2ComponentStore.
59*ec779b8eSAndroid Build Coastguard Worker class H2C2ComponentStore : public C2ComponentStore {
60*ec779b8eSAndroid Build Coastguard Worker protected:
61*ec779b8eSAndroid Build Coastguard Worker     using HidlComponentStore =
62*ec779b8eSAndroid Build Coastguard Worker         ::android::hardware::media::c2::V1_0::IComponentStore;
63*ec779b8eSAndroid Build Coastguard Worker     using HidlConfigurable =
64*ec779b8eSAndroid Build Coastguard Worker         ::android::hardware::media::c2::V1_0::IConfigurable;
65*ec779b8eSAndroid Build Coastguard Worker     sp<HidlComponentStore> mHidlStore;
66*ec779b8eSAndroid Build Coastguard Worker     sp<HidlConfigurable> mHidlConfigurable;
67*ec779b8eSAndroid Build Coastguard Worker 
68*ec779b8eSAndroid Build Coastguard Worker     using AidlComponentStore =
69*ec779b8eSAndroid Build Coastguard Worker         ::aidl::android::hardware::media::c2::IComponentStore;
70*ec779b8eSAndroid Build Coastguard Worker     using AidlConfigurable =
71*ec779b8eSAndroid Build Coastguard Worker         ::aidl::android::hardware::media::c2::IConfigurable;
72*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<AidlComponentStore> mAidlStore;
73*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<AidlConfigurable> mAidlConfigurable;
74*ec779b8eSAndroid Build Coastguard Worker public:
H2C2ComponentStore(nullptr_t)75*ec779b8eSAndroid Build Coastguard Worker     explicit H2C2ComponentStore(nullptr_t) {
76*ec779b8eSAndroid Build Coastguard Worker     }
77*ec779b8eSAndroid Build Coastguard Worker 
H2C2ComponentStore(sp<HidlComponentStore> const & store)78*ec779b8eSAndroid Build Coastguard Worker     explicit H2C2ComponentStore(sp<HidlComponentStore> const& store)
79*ec779b8eSAndroid Build Coastguard Worker           : mHidlStore{store},
__anon6b3826d30202() 80*ec779b8eSAndroid Build Coastguard Worker             mHidlConfigurable{[store]() -> sp<HidlConfigurable>{
81*ec779b8eSAndroid Build Coastguard Worker                 if (!store) {
82*ec779b8eSAndroid Build Coastguard Worker                     return nullptr;
83*ec779b8eSAndroid Build Coastguard Worker                 }
84*ec779b8eSAndroid Build Coastguard Worker                 Return<sp<HidlConfigurable>> transResult =
85*ec779b8eSAndroid Build Coastguard Worker                     store->getConfigurable();
86*ec779b8eSAndroid Build Coastguard Worker                 return transResult.isOk() ?
87*ec779b8eSAndroid Build Coastguard Worker                         static_cast<sp<HidlConfigurable>>(transResult) :
88*ec779b8eSAndroid Build Coastguard Worker                         nullptr;
89*ec779b8eSAndroid Build Coastguard Worker             }()} {
90*ec779b8eSAndroid Build Coastguard Worker         if (!mHidlConfigurable) {
91*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "Preferred store is corrupted.";
92*ec779b8eSAndroid Build Coastguard Worker         }
93*ec779b8eSAndroid Build Coastguard Worker     }
94*ec779b8eSAndroid Build Coastguard Worker 
H2C2ComponentStore(std::shared_ptr<AidlComponentStore> const & store)95*ec779b8eSAndroid Build Coastguard Worker     explicit H2C2ComponentStore(std::shared_ptr<AidlComponentStore> const& store)
96*ec779b8eSAndroid Build Coastguard Worker           : mAidlStore{store},
__anon6b3826d30302() 97*ec779b8eSAndroid Build Coastguard Worker             mAidlConfigurable{[store]() -> std::shared_ptr<AidlConfigurable>{
98*ec779b8eSAndroid Build Coastguard Worker                 if (!store) {
99*ec779b8eSAndroid Build Coastguard Worker                     return nullptr;
100*ec779b8eSAndroid Build Coastguard Worker                 }
101*ec779b8eSAndroid Build Coastguard Worker                 std::shared_ptr<AidlConfigurable> configurable;
102*ec779b8eSAndroid Build Coastguard Worker                 ScopedAStatus status = store->getConfigurable(&configurable);
103*ec779b8eSAndroid Build Coastguard Worker                 if (!status.isOk()) {
104*ec779b8eSAndroid Build Coastguard Worker                     return nullptr;
105*ec779b8eSAndroid Build Coastguard Worker                 }
106*ec779b8eSAndroid Build Coastguard Worker                 return configurable;
107*ec779b8eSAndroid Build Coastguard Worker             }()} {
108*ec779b8eSAndroid Build Coastguard Worker         if (!mAidlConfigurable) {
109*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "Preferred store is corrupted.";
110*ec779b8eSAndroid Build Coastguard Worker         }
111*ec779b8eSAndroid Build Coastguard Worker     }
112*ec779b8eSAndroid Build Coastguard Worker 
113*ec779b8eSAndroid Build Coastguard Worker     virtual ~H2C2ComponentStore() override = default;
114*ec779b8eSAndroid Build Coastguard Worker 
config_sm(std::vector<C2Param * > const & params,std::vector<std::unique_ptr<C2SettingResult>> * const failures)115*ec779b8eSAndroid Build Coastguard Worker     c2_status_t config_sm(
116*ec779b8eSAndroid Build Coastguard Worker             std::vector<C2Param*> const &params,
117*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2SettingResult>>* const failures
118*ec779b8eSAndroid Build Coastguard Worker             ) override {
119*ec779b8eSAndroid Build Coastguard Worker         if (mAidlStore) {
120*ec779b8eSAndroid Build Coastguard Worker             return config_sm_aidl(params, failures);
121*ec779b8eSAndroid Build Coastguard Worker         } else if (mHidlStore) {
122*ec779b8eSAndroid Build Coastguard Worker             return config_sm_hidl(params, failures);
123*ec779b8eSAndroid Build Coastguard Worker         } else {
124*ec779b8eSAndroid Build Coastguard Worker             return C2_OMITTED;
125*ec779b8eSAndroid Build Coastguard Worker         }
126*ec779b8eSAndroid Build Coastguard Worker     }
127*ec779b8eSAndroid Build Coastguard Worker 
config_sm_aidl(std::vector<C2Param * > const & params,std::vector<std::unique_ptr<C2SettingResult>> * const failures)128*ec779b8eSAndroid Build Coastguard Worker     c2_status_t config_sm_aidl(
129*ec779b8eSAndroid Build Coastguard Worker             std::vector<C2Param*> const &params,
130*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2SettingResult>>* const failures
131*ec779b8eSAndroid Build Coastguard Worker             ) {
132*ec779b8eSAndroid Build Coastguard Worker         c2_aidl::Params aidlParams;
133*ec779b8eSAndroid Build Coastguard Worker         if (!c2_aidl::utils::CreateParamsBlob(&aidlParams, params)) {
134*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "config -- bad input.";
135*ec779b8eSAndroid Build Coastguard Worker             return C2_TRANSACTION_FAILED;
136*ec779b8eSAndroid Build Coastguard Worker         }
137*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status = C2_OK;
138*ec779b8eSAndroid Build Coastguard Worker         c2_aidl::IConfigurable::ConfigResult configResult;
139*ec779b8eSAndroid Build Coastguard Worker         ScopedAStatus transResult = mAidlConfigurable->config(
140*ec779b8eSAndroid Build Coastguard Worker                 aidlParams, true, &configResult);
141*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
142*ec779b8eSAndroid Build Coastguard Worker             if (transResult.getExceptionCode() == EX_SERVICE_SPECIFIC) {
143*ec779b8eSAndroid Build Coastguard Worker                 status = c2_status_t(transResult.getServiceSpecificError());
144*ec779b8eSAndroid Build Coastguard Worker                 if (status != C2_BAD_INDEX) {
145*ec779b8eSAndroid Build Coastguard Worker                     LOG(DEBUG) << "config -- call failed: "
146*ec779b8eSAndroid Build Coastguard Worker                                << status << ".";
147*ec779b8eSAndroid Build Coastguard Worker                 }
148*ec779b8eSAndroid Build Coastguard Worker             } else {
149*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "config -- transaction failed.";
150*ec779b8eSAndroid Build Coastguard Worker                 return C2_TRANSACTION_FAILED;
151*ec779b8eSAndroid Build Coastguard Worker             }
152*ec779b8eSAndroid Build Coastguard Worker         }
153*ec779b8eSAndroid Build Coastguard Worker         status = static_cast<c2_status_t>(configResult.status.status);
154*ec779b8eSAndroid Build Coastguard Worker         if (status != C2_BAD_INDEX) {
155*ec779b8eSAndroid Build Coastguard Worker             LOG(DEBUG) << "config -- call failed: "
156*ec779b8eSAndroid Build Coastguard Worker                        << status << ".";
157*ec779b8eSAndroid Build Coastguard Worker         }
158*ec779b8eSAndroid Build Coastguard Worker         size_t i = failures->size();
159*ec779b8eSAndroid Build Coastguard Worker         failures->resize(i + configResult.failures.size());
160*ec779b8eSAndroid Build Coastguard Worker         for (const c2_aidl::SettingResult& sf : configResult.failures) {
161*ec779b8eSAndroid Build Coastguard Worker             if (!c2_aidl::utils::FromAidl(&(*failures)[i++], sf)) {
162*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "config -- "
163*ec779b8eSAndroid Build Coastguard Worker                            << "invalid SettingResult returned.";
164*ec779b8eSAndroid Build Coastguard Worker                 status = C2_CORRUPTED;
165*ec779b8eSAndroid Build Coastguard Worker             }
166*ec779b8eSAndroid Build Coastguard Worker         }
167*ec779b8eSAndroid Build Coastguard Worker         if (!c2_aidl::utils::UpdateParamsFromBlob(params, configResult.params)) {
168*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "config -- "
169*ec779b8eSAndroid Build Coastguard Worker                        << "failed to parse returned params.";
170*ec779b8eSAndroid Build Coastguard Worker             status = C2_CORRUPTED;
171*ec779b8eSAndroid Build Coastguard Worker         }
172*ec779b8eSAndroid Build Coastguard Worker         return status;
173*ec779b8eSAndroid Build Coastguard Worker     };
174*ec779b8eSAndroid Build Coastguard Worker 
config_sm_hidl(std::vector<C2Param * > const & params,std::vector<std::unique_ptr<C2SettingResult>> * const failures)175*ec779b8eSAndroid Build Coastguard Worker     c2_status_t config_sm_hidl(
176*ec779b8eSAndroid Build Coastguard Worker             std::vector<C2Param*> const &params,
177*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2SettingResult>>* const failures
178*ec779b8eSAndroid Build Coastguard Worker             ) {
179*ec779b8eSAndroid Build Coastguard Worker         c2_hidl::Params hidlParams;
180*ec779b8eSAndroid Build Coastguard Worker         if (!c2_hidl::utils::createParamsBlob(&hidlParams, params)) {
181*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "config -- bad input.";
182*ec779b8eSAndroid Build Coastguard Worker             return C2_TRANSACTION_FAILED;
183*ec779b8eSAndroid Build Coastguard Worker         }
184*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status{};
185*ec779b8eSAndroid Build Coastguard Worker         Return<void> transResult = mHidlConfigurable->config(
186*ec779b8eSAndroid Build Coastguard Worker                 hidlParams,
187*ec779b8eSAndroid Build Coastguard Worker                 true,
188*ec779b8eSAndroid Build Coastguard Worker                 [&status, &params, failures](
189*ec779b8eSAndroid Build Coastguard Worker                         c2_hidl::Status s,
190*ec779b8eSAndroid Build Coastguard Worker                         const hidl_vec<c2_hidl::SettingResult> f,
191*ec779b8eSAndroid Build Coastguard Worker                         const c2_hidl::Params& o) {
192*ec779b8eSAndroid Build Coastguard Worker                     status = static_cast<c2_status_t>(s);
193*ec779b8eSAndroid Build Coastguard Worker                     if (status != C2_OK && status != C2_BAD_INDEX) {
194*ec779b8eSAndroid Build Coastguard Worker                         LOG(DEBUG) << "config -- call failed: "
195*ec779b8eSAndroid Build Coastguard Worker                                    << status << ".";
196*ec779b8eSAndroid Build Coastguard Worker                     }
197*ec779b8eSAndroid Build Coastguard Worker                     size_t i = failures->size();
198*ec779b8eSAndroid Build Coastguard Worker                     failures->resize(i + f.size());
199*ec779b8eSAndroid Build Coastguard Worker                     for (const c2_hidl::SettingResult& sf : f) {
200*ec779b8eSAndroid Build Coastguard Worker                         if (!c2_hidl::utils::objcpy(&(*failures)[i++], sf)) {
201*ec779b8eSAndroid Build Coastguard Worker                             LOG(ERROR) << "config -- "
202*ec779b8eSAndroid Build Coastguard Worker                                        << "invalid SettingResult returned.";
203*ec779b8eSAndroid Build Coastguard Worker                             return;
204*ec779b8eSAndroid Build Coastguard Worker                         }
205*ec779b8eSAndroid Build Coastguard Worker                     }
206*ec779b8eSAndroid Build Coastguard Worker                     if (!c2_hidl::utils::updateParamsFromBlob(params, o)) {
207*ec779b8eSAndroid Build Coastguard Worker                         LOG(ERROR) << "config -- "
208*ec779b8eSAndroid Build Coastguard Worker                                    << "failed to parse returned params.";
209*ec779b8eSAndroid Build Coastguard Worker                         status = C2_CORRUPTED;
210*ec779b8eSAndroid Build Coastguard Worker                     }
211*ec779b8eSAndroid Build Coastguard Worker                 });
212*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
213*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "config -- transaction failed.";
214*ec779b8eSAndroid Build Coastguard Worker             return C2_TRANSACTION_FAILED;
215*ec779b8eSAndroid Build Coastguard Worker         }
216*ec779b8eSAndroid Build Coastguard Worker         return status;
217*ec779b8eSAndroid Build Coastguard Worker     };
218*ec779b8eSAndroid Build Coastguard Worker 
copyBuffer(std::shared_ptr<C2GraphicBuffer>,std::shared_ptr<C2GraphicBuffer>)219*ec779b8eSAndroid Build Coastguard Worker     c2_status_t copyBuffer(
220*ec779b8eSAndroid Build Coastguard Worker             std::shared_ptr<C2GraphicBuffer>,
221*ec779b8eSAndroid Build Coastguard Worker             std::shared_ptr<C2GraphicBuffer>) override {
222*ec779b8eSAndroid Build Coastguard Worker         LOG(ERROR) << "copyBuffer -- not supported.";
223*ec779b8eSAndroid Build Coastguard Worker         return C2_OMITTED;
224*ec779b8eSAndroid Build Coastguard Worker     }
225*ec779b8eSAndroid Build Coastguard Worker 
createComponent(C2String,std::shared_ptr<C2Component> * const component)226*ec779b8eSAndroid Build Coastguard Worker     c2_status_t createComponent(
227*ec779b8eSAndroid Build Coastguard Worker             C2String, std::shared_ptr<C2Component> *const component) override {
228*ec779b8eSAndroid Build Coastguard Worker         component->reset();
229*ec779b8eSAndroid Build Coastguard Worker         LOG(ERROR) << "createComponent -- not supported.";
230*ec779b8eSAndroid Build Coastguard Worker         return C2_OMITTED;
231*ec779b8eSAndroid Build Coastguard Worker     }
232*ec779b8eSAndroid Build Coastguard Worker 
createInterface(C2String,std::shared_ptr<C2ComponentInterface> * const interface)233*ec779b8eSAndroid Build Coastguard Worker     c2_status_t createInterface(
234*ec779b8eSAndroid Build Coastguard Worker             C2String, std::shared_ptr<C2ComponentInterface> *const interface) override {
235*ec779b8eSAndroid Build Coastguard Worker         interface->reset();
236*ec779b8eSAndroid Build Coastguard Worker         LOG(ERROR) << "createInterface -- not supported.";
237*ec779b8eSAndroid Build Coastguard Worker         return C2_OMITTED;
238*ec779b8eSAndroid Build Coastguard Worker     }
239*ec779b8eSAndroid Build Coastguard Worker 
query_sm(const std::vector<C2Param * > & stackParams,const std::vector<C2Param::Index> & heapParamIndices,std::vector<std::unique_ptr<C2Param>> * const heapParams) const240*ec779b8eSAndroid Build Coastguard Worker     c2_status_t query_sm(
241*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param *> &stackParams,
242*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param::Index> &heapParamIndices,
243*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2Param>> *const heapParams) const override {
244*ec779b8eSAndroid Build Coastguard Worker         if (mAidlStore) {
245*ec779b8eSAndroid Build Coastguard Worker             return query_sm_aidl(stackParams, heapParamIndices, heapParams);
246*ec779b8eSAndroid Build Coastguard Worker         } else if (mHidlStore) {
247*ec779b8eSAndroid Build Coastguard Worker             return query_sm_hidl(stackParams, heapParamIndices, heapParams);
248*ec779b8eSAndroid Build Coastguard Worker         } else {
249*ec779b8eSAndroid Build Coastguard Worker             return C2_OMITTED;
250*ec779b8eSAndroid Build Coastguard Worker         }
251*ec779b8eSAndroid Build Coastguard Worker     }
252*ec779b8eSAndroid Build Coastguard Worker 
UpdateQueryResult(const std::vector<C2Param * > & paramPointers,size_t numStackIndices,const std::vector<C2Param * > & stackParams,std::vector<std::unique_ptr<C2Param>> * const heapParams)253*ec779b8eSAndroid Build Coastguard Worker     static c2_status_t UpdateQueryResult(
254*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param *> &paramPointers,
255*ec779b8eSAndroid Build Coastguard Worker             size_t numStackIndices,
256*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param *> &stackParams,
257*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2Param>> *const heapParams) {
258*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status = C2_OK;
259*ec779b8eSAndroid Build Coastguard Worker         size_t i = 0;
260*ec779b8eSAndroid Build Coastguard Worker         for (auto it = paramPointers.begin(); it != paramPointers.end(); ) {
261*ec779b8eSAndroid Build Coastguard Worker             C2Param* paramPointer = *it;
262*ec779b8eSAndroid Build Coastguard Worker             if (numStackIndices > 0) {
263*ec779b8eSAndroid Build Coastguard Worker                 --numStackIndices;
264*ec779b8eSAndroid Build Coastguard Worker                 if (!paramPointer) {
265*ec779b8eSAndroid Build Coastguard Worker                     LOG(WARNING) << "query -- null stack param.";
266*ec779b8eSAndroid Build Coastguard Worker                     ++it;
267*ec779b8eSAndroid Build Coastguard Worker                     continue;
268*ec779b8eSAndroid Build Coastguard Worker                 }
269*ec779b8eSAndroid Build Coastguard Worker                 for (; i < stackParams.size() && !stackParams[i]; ) {
270*ec779b8eSAndroid Build Coastguard Worker                     ++i;
271*ec779b8eSAndroid Build Coastguard Worker                 }
272*ec779b8eSAndroid Build Coastguard Worker                 if (i >= stackParams.size()) {
273*ec779b8eSAndroid Build Coastguard Worker                     LOG(ERROR) << "query -- unexpected error.";
274*ec779b8eSAndroid Build Coastguard Worker                     status = C2_CORRUPTED;
275*ec779b8eSAndroid Build Coastguard Worker                     break;
276*ec779b8eSAndroid Build Coastguard Worker                 }
277*ec779b8eSAndroid Build Coastguard Worker                 if (stackParams[i]->index() != paramPointer->index()) {
278*ec779b8eSAndroid Build Coastguard Worker                     LOG(WARNING) << "query -- param skipped: "
279*ec779b8eSAndroid Build Coastguard Worker                                     "index = "
280*ec779b8eSAndroid Build Coastguard Worker                                  << stackParams[i]->index() << ".";
281*ec779b8eSAndroid Build Coastguard Worker                     stackParams[i++]->invalidate();
282*ec779b8eSAndroid Build Coastguard Worker                     continue;
283*ec779b8eSAndroid Build Coastguard Worker                 }
284*ec779b8eSAndroid Build Coastguard Worker                 if (!stackParams[i++]->updateFrom(*paramPointer)) {
285*ec779b8eSAndroid Build Coastguard Worker                     LOG(WARNING) << "query -- param update failed: "
286*ec779b8eSAndroid Build Coastguard Worker                                     "index = "
287*ec779b8eSAndroid Build Coastguard Worker                                  << paramPointer->index() << ".";
288*ec779b8eSAndroid Build Coastguard Worker                 }
289*ec779b8eSAndroid Build Coastguard Worker             } else {
290*ec779b8eSAndroid Build Coastguard Worker                 if (!paramPointer) {
291*ec779b8eSAndroid Build Coastguard Worker                     LOG(WARNING) << "query -- null heap param.";
292*ec779b8eSAndroid Build Coastguard Worker                     ++it;
293*ec779b8eSAndroid Build Coastguard Worker                     continue;
294*ec779b8eSAndroid Build Coastguard Worker                 }
295*ec779b8eSAndroid Build Coastguard Worker                 if (!heapParams) {
296*ec779b8eSAndroid Build Coastguard Worker                     LOG(WARNING) << "query -- "
297*ec779b8eSAndroid Build Coastguard Worker                                     "unexpected extra stack param.";
298*ec779b8eSAndroid Build Coastguard Worker                 } else {
299*ec779b8eSAndroid Build Coastguard Worker                     heapParams->emplace_back(
300*ec779b8eSAndroid Build Coastguard Worker                             C2Param::Copy(*paramPointer));
301*ec779b8eSAndroid Build Coastguard Worker                 }
302*ec779b8eSAndroid Build Coastguard Worker             }
303*ec779b8eSAndroid Build Coastguard Worker             ++it;
304*ec779b8eSAndroid Build Coastguard Worker         }
305*ec779b8eSAndroid Build Coastguard Worker         return status;
306*ec779b8eSAndroid Build Coastguard Worker     }
307*ec779b8eSAndroid Build Coastguard Worker 
query_sm_aidl(const std::vector<C2Param * > & stackParams,const std::vector<C2Param::Index> & heapParamIndices,std::vector<std::unique_ptr<C2Param>> * const heapParams) const308*ec779b8eSAndroid Build Coastguard Worker     c2_status_t query_sm_aidl(
309*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param *> &stackParams,
310*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param::Index> &heapParamIndices,
311*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2Param>> *const heapParams) const {
312*ec779b8eSAndroid Build Coastguard Worker         std::vector<int32_t> indices;
313*ec779b8eSAndroid Build Coastguard Worker         size_t numIndices = 0;
314*ec779b8eSAndroid Build Coastguard Worker         for (C2Param* const& stackParam : stackParams) {
315*ec779b8eSAndroid Build Coastguard Worker             if (!stackParam) {
316*ec779b8eSAndroid Build Coastguard Worker                 LOG(WARNING) << "query -- null stack param encountered.";
317*ec779b8eSAndroid Build Coastguard Worker                 continue;
318*ec779b8eSAndroid Build Coastguard Worker             }
319*ec779b8eSAndroid Build Coastguard Worker             indices[numIndices++] = stackParam->index();
320*ec779b8eSAndroid Build Coastguard Worker         }
321*ec779b8eSAndroid Build Coastguard Worker         size_t numStackIndices = numIndices;
322*ec779b8eSAndroid Build Coastguard Worker         for (const C2Param::Index& index : heapParamIndices) {
323*ec779b8eSAndroid Build Coastguard Worker             indices[numIndices++] = static_cast<uint32_t>(index);
324*ec779b8eSAndroid Build Coastguard Worker         }
325*ec779b8eSAndroid Build Coastguard Worker         indices.resize(numIndices);
326*ec779b8eSAndroid Build Coastguard Worker         if (heapParams) {
327*ec779b8eSAndroid Build Coastguard Worker             heapParams->reserve(heapParams->size() + numIndices);
328*ec779b8eSAndroid Build Coastguard Worker         }
329*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status = C2_OK;
330*ec779b8eSAndroid Build Coastguard Worker         c2_aidl::IConfigurable::QueryResult aidlResult;
331*ec779b8eSAndroid Build Coastguard Worker         ScopedAStatus transResult = mAidlConfigurable->query(indices, true, &aidlResult);
332*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
333*ec779b8eSAndroid Build Coastguard Worker             if (transResult.getExceptionCode() == EX_SERVICE_SPECIFIC) {
334*ec779b8eSAndroid Build Coastguard Worker                 status = c2_status_t(transResult.getServiceSpecificError());
335*ec779b8eSAndroid Build Coastguard Worker                 LOG(DEBUG) << "query -- call failed: " << status << ".";
336*ec779b8eSAndroid Build Coastguard Worker                 return status;
337*ec779b8eSAndroid Build Coastguard Worker             } else {
338*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "query -- transaction failed.";
339*ec779b8eSAndroid Build Coastguard Worker                 return C2_TRANSACTION_FAILED;
340*ec779b8eSAndroid Build Coastguard Worker             }
341*ec779b8eSAndroid Build Coastguard Worker         }
342*ec779b8eSAndroid Build Coastguard Worker         status = static_cast<c2_status_t>(aidlResult.status.status);
343*ec779b8eSAndroid Build Coastguard Worker         if (status != C2_OK) {
344*ec779b8eSAndroid Build Coastguard Worker             LOG(DEBUG) << "query -- call failed: " << status << ".";
345*ec779b8eSAndroid Build Coastguard Worker         }
346*ec779b8eSAndroid Build Coastguard Worker         std::vector<C2Param*> paramPointers;
347*ec779b8eSAndroid Build Coastguard Worker         if (!c2_aidl::utils::ParseParamsBlob(&paramPointers, aidlResult.params)) {
348*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "query -- error while parsing params.";
349*ec779b8eSAndroid Build Coastguard Worker             return C2_CORRUPTED;
350*ec779b8eSAndroid Build Coastguard Worker         }
351*ec779b8eSAndroid Build Coastguard Worker         return UpdateQueryResult(paramPointers, numStackIndices, stackParams, heapParams);
352*ec779b8eSAndroid Build Coastguard Worker     }
353*ec779b8eSAndroid Build Coastguard Worker 
query_sm_hidl(const std::vector<C2Param * > & stackParams,const std::vector<C2Param::Index> & heapParamIndices,std::vector<std::unique_ptr<C2Param>> * const heapParams) const354*ec779b8eSAndroid Build Coastguard Worker     c2_status_t query_sm_hidl(
355*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param *> &stackParams,
356*ec779b8eSAndroid Build Coastguard Worker             const std::vector<C2Param::Index> &heapParamIndices,
357*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::unique_ptr<C2Param>> *const heapParams) const {
358*ec779b8eSAndroid Build Coastguard Worker         hidl_vec<c2_hidl::ParamIndex> indices(
359*ec779b8eSAndroid Build Coastguard Worker                 stackParams.size() + heapParamIndices.size());
360*ec779b8eSAndroid Build Coastguard Worker         size_t numIndices = 0;
361*ec779b8eSAndroid Build Coastguard Worker         for (C2Param* const& stackParam : stackParams) {
362*ec779b8eSAndroid Build Coastguard Worker             if (!stackParam) {
363*ec779b8eSAndroid Build Coastguard Worker                 LOG(WARNING) << "query -- null stack param encountered.";
364*ec779b8eSAndroid Build Coastguard Worker                 continue;
365*ec779b8eSAndroid Build Coastguard Worker             }
366*ec779b8eSAndroid Build Coastguard Worker             indices[numIndices++] = static_cast<c2_hidl::ParamIndex>(stackParam->index());
367*ec779b8eSAndroid Build Coastguard Worker         }
368*ec779b8eSAndroid Build Coastguard Worker         size_t numStackIndices = numIndices;
369*ec779b8eSAndroid Build Coastguard Worker         for (const C2Param::Index& index : heapParamIndices) {
370*ec779b8eSAndroid Build Coastguard Worker             indices[numIndices++] =
371*ec779b8eSAndroid Build Coastguard Worker                     static_cast<c2_hidl::ParamIndex>(static_cast<uint32_t>(index));
372*ec779b8eSAndroid Build Coastguard Worker         }
373*ec779b8eSAndroid Build Coastguard Worker         indices.resize(numIndices);
374*ec779b8eSAndroid Build Coastguard Worker         if (heapParams) {
375*ec779b8eSAndroid Build Coastguard Worker             heapParams->reserve(heapParams->size() + numIndices);
376*ec779b8eSAndroid Build Coastguard Worker         }
377*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status;
378*ec779b8eSAndroid Build Coastguard Worker         Return<void> transResult = mHidlConfigurable->query(
379*ec779b8eSAndroid Build Coastguard Worker                 indices,
380*ec779b8eSAndroid Build Coastguard Worker                 true,
381*ec779b8eSAndroid Build Coastguard Worker                 [&status, &numStackIndices, &stackParams, heapParams](
382*ec779b8eSAndroid Build Coastguard Worker                         c2_hidl::Status s, const c2_hidl::Params& p) {
383*ec779b8eSAndroid Build Coastguard Worker                     status = static_cast<c2_status_t>(s);
384*ec779b8eSAndroid Build Coastguard Worker                     if (status != C2_OK && status != C2_BAD_INDEX) {
385*ec779b8eSAndroid Build Coastguard Worker                         LOG(DEBUG) << "query -- call failed: "
386*ec779b8eSAndroid Build Coastguard Worker                                    << status << ".";
387*ec779b8eSAndroid Build Coastguard Worker                         return;
388*ec779b8eSAndroid Build Coastguard Worker                     }
389*ec779b8eSAndroid Build Coastguard Worker                     std::vector<C2Param*> paramPointers;
390*ec779b8eSAndroid Build Coastguard Worker                     if (!c2_hidl::utils::parseParamsBlob(&paramPointers, p)) {
391*ec779b8eSAndroid Build Coastguard Worker                         LOG(ERROR) << "query -- error while parsing params.";
392*ec779b8eSAndroid Build Coastguard Worker                         status = C2_CORRUPTED;
393*ec779b8eSAndroid Build Coastguard Worker                         return;
394*ec779b8eSAndroid Build Coastguard Worker                     }
395*ec779b8eSAndroid Build Coastguard Worker                     status = UpdateQueryResult(
396*ec779b8eSAndroid Build Coastguard Worker                             paramPointers, numStackIndices, stackParams, heapParams);
397*ec779b8eSAndroid Build Coastguard Worker                 });
398*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
399*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "query -- transaction failed.";
400*ec779b8eSAndroid Build Coastguard Worker             return C2_TRANSACTION_FAILED;
401*ec779b8eSAndroid Build Coastguard Worker         }
402*ec779b8eSAndroid Build Coastguard Worker         return status;
403*ec779b8eSAndroid Build Coastguard Worker     }
404*ec779b8eSAndroid Build Coastguard Worker 
querySupportedParams_nb(std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const405*ec779b8eSAndroid Build Coastguard Worker     c2_status_t querySupportedParams_nb(
406*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const override {
407*ec779b8eSAndroid Build Coastguard Worker         if (mAidlStore) {
408*ec779b8eSAndroid Build Coastguard Worker             return querySupportedParams_nb_aidl(params);
409*ec779b8eSAndroid Build Coastguard Worker         } else if (mHidlStore) {
410*ec779b8eSAndroid Build Coastguard Worker             return querySupportedParams_nb_hidl(params);
411*ec779b8eSAndroid Build Coastguard Worker         } else {
412*ec779b8eSAndroid Build Coastguard Worker             return C2_OMITTED;
413*ec779b8eSAndroid Build Coastguard Worker         }
414*ec779b8eSAndroid Build Coastguard Worker     }
415*ec779b8eSAndroid Build Coastguard Worker 
querySupportedParams_nb_aidl(std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const416*ec779b8eSAndroid Build Coastguard Worker     c2_status_t querySupportedParams_nb_aidl(
417*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
418*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status = C2_OK;
419*ec779b8eSAndroid Build Coastguard Worker         std::vector<c2_aidl::ParamDescriptor> aidlParams;
420*ec779b8eSAndroid Build Coastguard Worker         ScopedAStatus transResult = mAidlConfigurable->querySupportedParams(
421*ec779b8eSAndroid Build Coastguard Worker                 std::numeric_limits<uint32_t>::min(),
422*ec779b8eSAndroid Build Coastguard Worker                 std::numeric_limits<uint32_t>::max(),
423*ec779b8eSAndroid Build Coastguard Worker                 &aidlParams);
424*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
425*ec779b8eSAndroid Build Coastguard Worker             if (transResult.getExceptionCode() == EX_SERVICE_SPECIFIC) {
426*ec779b8eSAndroid Build Coastguard Worker                 status = c2_status_t(transResult.getServiceSpecificError());
427*ec779b8eSAndroid Build Coastguard Worker                 LOG(DEBUG) << "querySupportedParams -- call failed: "
428*ec779b8eSAndroid Build Coastguard Worker                            << status << ".";
429*ec779b8eSAndroid Build Coastguard Worker                 return status;
430*ec779b8eSAndroid Build Coastguard Worker             } else {
431*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "querySupportedParams -- transaction failed.";
432*ec779b8eSAndroid Build Coastguard Worker                 return C2_TRANSACTION_FAILED;
433*ec779b8eSAndroid Build Coastguard Worker             }
434*ec779b8eSAndroid Build Coastguard Worker         }
435*ec779b8eSAndroid Build Coastguard Worker 
436*ec779b8eSAndroid Build Coastguard Worker         size_t i = params->size();
437*ec779b8eSAndroid Build Coastguard Worker         params->resize(i + aidlParams.size());
438*ec779b8eSAndroid Build Coastguard Worker         for (const c2_aidl::ParamDescriptor& sp : aidlParams) {
439*ec779b8eSAndroid Build Coastguard Worker             if (!c2_aidl::utils::FromAidl(&(*params)[i++], sp)) {
440*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "querySupportedParams -- "
441*ec779b8eSAndroid Build Coastguard Worker                            << "invalid returned ParamDescriptor.";
442*ec779b8eSAndroid Build Coastguard Worker                 break;
443*ec779b8eSAndroid Build Coastguard Worker             }
444*ec779b8eSAndroid Build Coastguard Worker         }
445*ec779b8eSAndroid Build Coastguard Worker         return status;
446*ec779b8eSAndroid Build Coastguard Worker     }
447*ec779b8eSAndroid Build Coastguard Worker 
querySupportedParams_nb_hidl(std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const448*ec779b8eSAndroid Build Coastguard Worker     c2_status_t querySupportedParams_nb_hidl(
449*ec779b8eSAndroid Build Coastguard Worker             std::vector<std::shared_ptr<C2ParamDescriptor>> *const params) const {
450*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status;
451*ec779b8eSAndroid Build Coastguard Worker         Return<void> transResult = mHidlConfigurable->querySupportedParams(
452*ec779b8eSAndroid Build Coastguard Worker                 std::numeric_limits<uint32_t>::min(),
453*ec779b8eSAndroid Build Coastguard Worker                 std::numeric_limits<uint32_t>::max(),
454*ec779b8eSAndroid Build Coastguard Worker                 [&status, params](
455*ec779b8eSAndroid Build Coastguard Worker                         c2_hidl::Status s,
456*ec779b8eSAndroid Build Coastguard Worker                         const hidl_vec<c2_hidl::ParamDescriptor>& p) {
457*ec779b8eSAndroid Build Coastguard Worker                     status = static_cast<c2_status_t>(s);
458*ec779b8eSAndroid Build Coastguard Worker                     if (status != C2_OK) {
459*ec779b8eSAndroid Build Coastguard Worker                         LOG(DEBUG) << "querySupportedParams -- call failed: "
460*ec779b8eSAndroid Build Coastguard Worker                                    << status << ".";
461*ec779b8eSAndroid Build Coastguard Worker                         return;
462*ec779b8eSAndroid Build Coastguard Worker                     }
463*ec779b8eSAndroid Build Coastguard Worker                     size_t i = params->size();
464*ec779b8eSAndroid Build Coastguard Worker                     params->resize(i + p.size());
465*ec779b8eSAndroid Build Coastguard Worker                     for (const c2_hidl::ParamDescriptor& sp : p) {
466*ec779b8eSAndroid Build Coastguard Worker                         if (!c2_hidl::utils::objcpy(&(*params)[i++], sp)) {
467*ec779b8eSAndroid Build Coastguard Worker                             LOG(ERROR) << "querySupportedParams -- "
468*ec779b8eSAndroid Build Coastguard Worker                                        << "invalid returned ParamDescriptor.";
469*ec779b8eSAndroid Build Coastguard Worker                             return;
470*ec779b8eSAndroid Build Coastguard Worker                         }
471*ec779b8eSAndroid Build Coastguard Worker                     }
472*ec779b8eSAndroid Build Coastguard Worker                 });
473*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
474*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "querySupportedParams -- transaction failed.";
475*ec779b8eSAndroid Build Coastguard Worker             return C2_TRANSACTION_FAILED;
476*ec779b8eSAndroid Build Coastguard Worker         }
477*ec779b8eSAndroid Build Coastguard Worker         return status;
478*ec779b8eSAndroid Build Coastguard Worker     }
479*ec779b8eSAndroid Build Coastguard Worker 
querySupportedValues_sm(std::vector<C2FieldSupportedValuesQuery> & fields) const480*ec779b8eSAndroid Build Coastguard Worker     c2_status_t querySupportedValues_sm(
481*ec779b8eSAndroid Build Coastguard Worker             std::vector<C2FieldSupportedValuesQuery> &fields) const override {
482*ec779b8eSAndroid Build Coastguard Worker         if (mAidlStore) {
483*ec779b8eSAndroid Build Coastguard Worker             return querySupportedValues_sm_aidl(fields);
484*ec779b8eSAndroid Build Coastguard Worker         } else if (mHidlStore) {
485*ec779b8eSAndroid Build Coastguard Worker             return querySupportedValues_sm_hidl(fields);
486*ec779b8eSAndroid Build Coastguard Worker         } else {
487*ec779b8eSAndroid Build Coastguard Worker             return C2_OMITTED;
488*ec779b8eSAndroid Build Coastguard Worker         }
489*ec779b8eSAndroid Build Coastguard Worker     }
490*ec779b8eSAndroid Build Coastguard Worker 
querySupportedValues_sm_aidl(std::vector<C2FieldSupportedValuesQuery> & fields) const491*ec779b8eSAndroid Build Coastguard Worker     c2_status_t querySupportedValues_sm_aidl(
492*ec779b8eSAndroid Build Coastguard Worker             std::vector<C2FieldSupportedValuesQuery> &fields) const {
493*ec779b8eSAndroid Build Coastguard Worker         std::vector<c2_aidl::FieldSupportedValuesQuery> aidlFields(fields.size());
494*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < fields.size(); ++i) {
495*ec779b8eSAndroid Build Coastguard Worker             if (!c2_aidl::utils::ToAidl(&aidlFields[i], fields[i])) {
496*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "querySupportedValues -- bad input";
497*ec779b8eSAndroid Build Coastguard Worker                 return C2_TRANSACTION_FAILED;
498*ec779b8eSAndroid Build Coastguard Worker             }
499*ec779b8eSAndroid Build Coastguard Worker         }
500*ec779b8eSAndroid Build Coastguard Worker 
501*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status = C2_OK;
502*ec779b8eSAndroid Build Coastguard Worker         c2_aidl::IConfigurable::QuerySupportedValuesResult queryResult;
503*ec779b8eSAndroid Build Coastguard Worker         ScopedAStatus transResult = mAidlConfigurable->querySupportedValues(
504*ec779b8eSAndroid Build Coastguard Worker                 aidlFields, true, &queryResult);
505*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
506*ec779b8eSAndroid Build Coastguard Worker             if (transResult.getExceptionCode() == EX_SERVICE_SPECIFIC) {
507*ec779b8eSAndroid Build Coastguard Worker                 status = c2_status_t(transResult.getServiceSpecificError());
508*ec779b8eSAndroid Build Coastguard Worker                 LOG(DEBUG) << "querySupportedValues -- call failed: "
509*ec779b8eSAndroid Build Coastguard Worker                            << status << ".";
510*ec779b8eSAndroid Build Coastguard Worker                 return status;
511*ec779b8eSAndroid Build Coastguard Worker             } else {
512*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "querySupportedValues -- transaction failed.";
513*ec779b8eSAndroid Build Coastguard Worker                 return C2_TRANSACTION_FAILED;
514*ec779b8eSAndroid Build Coastguard Worker             }
515*ec779b8eSAndroid Build Coastguard Worker         }
516*ec779b8eSAndroid Build Coastguard Worker         status = static_cast<c2_status_t>(queryResult.status.status);
517*ec779b8eSAndroid Build Coastguard Worker         if (status != C2_OK) {
518*ec779b8eSAndroid Build Coastguard Worker             LOG(DEBUG) << "querySupportedValues -- call failed: "
519*ec779b8eSAndroid Build Coastguard Worker                        << status << ".";
520*ec779b8eSAndroid Build Coastguard Worker         }
521*ec779b8eSAndroid Build Coastguard Worker         if (queryResult.values.size() != fields.size()) {
522*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "querySupportedValues -- "
523*ec779b8eSAndroid Build Coastguard Worker                           "input and output lists "
524*ec779b8eSAndroid Build Coastguard Worker                           "have different sizes.";
525*ec779b8eSAndroid Build Coastguard Worker             return C2_CORRUPTED;
526*ec779b8eSAndroid Build Coastguard Worker         }
527*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < fields.size(); ++i) {
528*ec779b8eSAndroid Build Coastguard Worker             if (!c2_aidl::utils::FromAidl(&fields[i], aidlFields[i], queryResult.values[i])) {
529*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "querySupportedValues -- "
530*ec779b8eSAndroid Build Coastguard Worker                               "invalid returned value.";
531*ec779b8eSAndroid Build Coastguard Worker                 return C2_CORRUPTED;
532*ec779b8eSAndroid Build Coastguard Worker             }
533*ec779b8eSAndroid Build Coastguard Worker         }
534*ec779b8eSAndroid Build Coastguard Worker         return status;
535*ec779b8eSAndroid Build Coastguard Worker     }
536*ec779b8eSAndroid Build Coastguard Worker 
querySupportedValues_sm_hidl(std::vector<C2FieldSupportedValuesQuery> & fields) const537*ec779b8eSAndroid Build Coastguard Worker     c2_status_t querySupportedValues_sm_hidl(
538*ec779b8eSAndroid Build Coastguard Worker             std::vector<C2FieldSupportedValuesQuery> &fields) const {
539*ec779b8eSAndroid Build Coastguard Worker         hidl_vec<c2_hidl::FieldSupportedValuesQuery> inFields(fields.size());
540*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < fields.size(); ++i) {
541*ec779b8eSAndroid Build Coastguard Worker             if (!c2_hidl::utils::objcpy(&inFields[i], fields[i])) {
542*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "querySupportedValues -- bad input";
543*ec779b8eSAndroid Build Coastguard Worker                 return C2_TRANSACTION_FAILED;
544*ec779b8eSAndroid Build Coastguard Worker             }
545*ec779b8eSAndroid Build Coastguard Worker         }
546*ec779b8eSAndroid Build Coastguard Worker 
547*ec779b8eSAndroid Build Coastguard Worker         c2_status_t status;
548*ec779b8eSAndroid Build Coastguard Worker         Return<void> transResult = mHidlConfigurable->querySupportedValues(
549*ec779b8eSAndroid Build Coastguard Worker                 inFields,
550*ec779b8eSAndroid Build Coastguard Worker                 true,
551*ec779b8eSAndroid Build Coastguard Worker                 [&status, &inFields, &fields](
552*ec779b8eSAndroid Build Coastguard Worker                         c2_hidl::Status s,
553*ec779b8eSAndroid Build Coastguard Worker                         const hidl_vec<c2_hidl::FieldSupportedValuesQueryResult>& r) {
554*ec779b8eSAndroid Build Coastguard Worker                     status = static_cast<c2_status_t>(s);
555*ec779b8eSAndroid Build Coastguard Worker                     if (status != C2_OK) {
556*ec779b8eSAndroid Build Coastguard Worker                         LOG(DEBUG) << "querySupportedValues -- call failed: "
557*ec779b8eSAndroid Build Coastguard Worker                                    << status << ".";
558*ec779b8eSAndroid Build Coastguard Worker                         return;
559*ec779b8eSAndroid Build Coastguard Worker                     }
560*ec779b8eSAndroid Build Coastguard Worker                     if (r.size() != fields.size()) {
561*ec779b8eSAndroid Build Coastguard Worker                         LOG(ERROR) << "querySupportedValues -- "
562*ec779b8eSAndroid Build Coastguard Worker                                       "input and output lists "
563*ec779b8eSAndroid Build Coastguard Worker                                       "have different sizes.";
564*ec779b8eSAndroid Build Coastguard Worker                         status = C2_CORRUPTED;
565*ec779b8eSAndroid Build Coastguard Worker                         return;
566*ec779b8eSAndroid Build Coastguard Worker                     }
567*ec779b8eSAndroid Build Coastguard Worker                     for (size_t i = 0; i < fields.size(); ++i) {
568*ec779b8eSAndroid Build Coastguard Worker                         if (!c2_hidl::utils::objcpy(&fields[i], inFields[i], r[i])) {
569*ec779b8eSAndroid Build Coastguard Worker                             LOG(ERROR) << "querySupportedValues -- "
570*ec779b8eSAndroid Build Coastguard Worker                                           "invalid returned value.";
571*ec779b8eSAndroid Build Coastguard Worker                             status = C2_CORRUPTED;
572*ec779b8eSAndroid Build Coastguard Worker                             return;
573*ec779b8eSAndroid Build Coastguard Worker                         }
574*ec779b8eSAndroid Build Coastguard Worker                     }
575*ec779b8eSAndroid Build Coastguard Worker                 });
576*ec779b8eSAndroid Build Coastguard Worker         if (!transResult.isOk()) {
577*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "querySupportedValues -- transaction failed.";
578*ec779b8eSAndroid Build Coastguard Worker             return C2_TRANSACTION_FAILED;
579*ec779b8eSAndroid Build Coastguard Worker         }
580*ec779b8eSAndroid Build Coastguard Worker         return status;
581*ec779b8eSAndroid Build Coastguard Worker     }
582*ec779b8eSAndroid Build Coastguard Worker 
getName() const583*ec779b8eSAndroid Build Coastguard Worker     C2String getName() const override {
584*ec779b8eSAndroid Build Coastguard Worker         C2String outName = "(unknown)";
585*ec779b8eSAndroid Build Coastguard Worker         if (mAidlStore) {
586*ec779b8eSAndroid Build Coastguard Worker             ScopedAStatus transResult = mAidlConfigurable->getName(&outName);
587*ec779b8eSAndroid Build Coastguard Worker             if (!transResult.isOk()) {
588*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "getName -- transaction failed.";
589*ec779b8eSAndroid Build Coastguard Worker             }
590*ec779b8eSAndroid Build Coastguard Worker         } else if (mHidlStore) {
591*ec779b8eSAndroid Build Coastguard Worker             Return<void> transResult = mHidlConfigurable->getName(
592*ec779b8eSAndroid Build Coastguard Worker                     [&outName](const hidl_string& name) {
593*ec779b8eSAndroid Build Coastguard Worker                         outName = name.c_str();
594*ec779b8eSAndroid Build Coastguard Worker                     });
595*ec779b8eSAndroid Build Coastguard Worker             if (!transResult.isOk()) {
596*ec779b8eSAndroid Build Coastguard Worker                 LOG(ERROR) << "getName -- transaction failed.";
597*ec779b8eSAndroid Build Coastguard Worker             }
598*ec779b8eSAndroid Build Coastguard Worker         }
599*ec779b8eSAndroid Build Coastguard Worker         return outName;
600*ec779b8eSAndroid Build Coastguard Worker     }
601*ec779b8eSAndroid Build Coastguard Worker 
getParamReflector() const602*ec779b8eSAndroid Build Coastguard Worker     virtual std::shared_ptr<C2ParamReflector> getParamReflector() const override {
603*ec779b8eSAndroid Build Coastguard Worker         struct SimpleParamReflector : public C2ParamReflector {
604*ec779b8eSAndroid Build Coastguard Worker             std::unique_ptr<C2StructDescriptor> describe(
605*ec779b8eSAndroid Build Coastguard Worker                     C2Param::CoreIndex coreIndex) const override {
606*ec779b8eSAndroid Build Coastguard Worker                 if (mAidlBase) {
607*ec779b8eSAndroid Build Coastguard Worker                     return describe_aidl(coreIndex);
608*ec779b8eSAndroid Build Coastguard Worker                 } else if (mHidlBase) {
609*ec779b8eSAndroid Build Coastguard Worker                     return describe_hidl(coreIndex);
610*ec779b8eSAndroid Build Coastguard Worker                 } else {
611*ec779b8eSAndroid Build Coastguard Worker                     return nullptr;
612*ec779b8eSAndroid Build Coastguard Worker                 }
613*ec779b8eSAndroid Build Coastguard Worker             }
614*ec779b8eSAndroid Build Coastguard Worker 
615*ec779b8eSAndroid Build Coastguard Worker             std::unique_ptr<C2StructDescriptor> describe_aidl(
616*ec779b8eSAndroid Build Coastguard Worker                     C2Param::CoreIndex coreIndex) const {
617*ec779b8eSAndroid Build Coastguard Worker                 std::vector<int32_t> indices(1);
618*ec779b8eSAndroid Build Coastguard Worker                 indices[0] = coreIndex.coreIndex();
619*ec779b8eSAndroid Build Coastguard Worker                 std::unique_ptr<C2StructDescriptor> descriptor;
620*ec779b8eSAndroid Build Coastguard Worker                 std::vector<c2_aidl::StructDescriptor> aidlDescs;
621*ec779b8eSAndroid Build Coastguard Worker                 ScopedAStatus transResult = mAidlBase->getStructDescriptors(
622*ec779b8eSAndroid Build Coastguard Worker                         indices, &aidlDescs);
623*ec779b8eSAndroid Build Coastguard Worker                 if (!transResult.isOk()) {
624*ec779b8eSAndroid Build Coastguard Worker                     c2_status_t status = C2_TRANSACTION_FAILED;
625*ec779b8eSAndroid Build Coastguard Worker                     if (transResult.getExceptionCode() == EX_SERVICE_SPECIFIC) {
626*ec779b8eSAndroid Build Coastguard Worker                         status = c2_status_t(transResult.getServiceSpecificError());
627*ec779b8eSAndroid Build Coastguard Worker                         LOG(DEBUG) << "SimpleParamReflector -- "
628*ec779b8eSAndroid Build Coastguard Worker                                       "getStructDescriptors() failed: "
629*ec779b8eSAndroid Build Coastguard Worker                                    << status << ".";
630*ec779b8eSAndroid Build Coastguard Worker                         return nullptr;
631*ec779b8eSAndroid Build Coastguard Worker                     }
632*ec779b8eSAndroid Build Coastguard Worker                 }
633*ec779b8eSAndroid Build Coastguard Worker                 if (aidlDescs.size() != 1) {
634*ec779b8eSAndroid Build Coastguard Worker                     LOG(DEBUG) << "SimpleParamReflector -- "
635*ec779b8eSAndroid Build Coastguard Worker                                   "getStructDescriptors() "
636*ec779b8eSAndroid Build Coastguard Worker                                   "returned vector of size "
637*ec779b8eSAndroid Build Coastguard Worker                                << aidlDescs.size() << ". "
638*ec779b8eSAndroid Build Coastguard Worker                                   "It should be 1.";
639*ec779b8eSAndroid Build Coastguard Worker                     return nullptr;
640*ec779b8eSAndroid Build Coastguard Worker                 }
641*ec779b8eSAndroid Build Coastguard Worker                 if (!c2_aidl::utils::FromAidl(&descriptor, aidlDescs[0])) {
642*ec779b8eSAndroid Build Coastguard Worker                     LOG(DEBUG) << "SimpleParamReflector -- "
643*ec779b8eSAndroid Build Coastguard Worker                                   "getStructDescriptors() returned "
644*ec779b8eSAndroid Build Coastguard Worker                                   "corrupted data.";
645*ec779b8eSAndroid Build Coastguard Worker                     return nullptr;
646*ec779b8eSAndroid Build Coastguard Worker                 }
647*ec779b8eSAndroid Build Coastguard Worker                 return descriptor;
648*ec779b8eSAndroid Build Coastguard Worker             }
649*ec779b8eSAndroid Build Coastguard Worker 
650*ec779b8eSAndroid Build Coastguard Worker             std::unique_ptr<C2StructDescriptor> describe_hidl(
651*ec779b8eSAndroid Build Coastguard Worker                     C2Param::CoreIndex coreIndex) const {
652*ec779b8eSAndroid Build Coastguard Worker                 hidl_vec<c2_hidl::ParamIndex> indices(1);
653*ec779b8eSAndroid Build Coastguard Worker                 indices[0] = static_cast<c2_hidl::ParamIndex>(coreIndex.coreIndex());
654*ec779b8eSAndroid Build Coastguard Worker                 std::unique_ptr<C2StructDescriptor> descriptor;
655*ec779b8eSAndroid Build Coastguard Worker                 Return<void> transResult = mHidlBase->getStructDescriptors(
656*ec779b8eSAndroid Build Coastguard Worker                         indices,
657*ec779b8eSAndroid Build Coastguard Worker                         [&descriptor](
658*ec779b8eSAndroid Build Coastguard Worker                                 c2_hidl::Status s,
659*ec779b8eSAndroid Build Coastguard Worker                                 const hidl_vec<c2_hidl::StructDescriptor>& sd) {
660*ec779b8eSAndroid Build Coastguard Worker                             c2_status_t status = static_cast<c2_status_t>(s);
661*ec779b8eSAndroid Build Coastguard Worker                             if (status != C2_OK) {
662*ec779b8eSAndroid Build Coastguard Worker                                 LOG(DEBUG) << "SimpleParamReflector -- "
663*ec779b8eSAndroid Build Coastguard Worker                                               "getStructDescriptors() failed: "
664*ec779b8eSAndroid Build Coastguard Worker                                            << status << ".";
665*ec779b8eSAndroid Build Coastguard Worker                                 descriptor.reset();
666*ec779b8eSAndroid Build Coastguard Worker                                 return;
667*ec779b8eSAndroid Build Coastguard Worker                             }
668*ec779b8eSAndroid Build Coastguard Worker                             if (sd.size() != 1) {
669*ec779b8eSAndroid Build Coastguard Worker                                 LOG(DEBUG) << "SimpleParamReflector -- "
670*ec779b8eSAndroid Build Coastguard Worker                                               "getStructDescriptors() "
671*ec779b8eSAndroid Build Coastguard Worker                                               "returned vector of size "
672*ec779b8eSAndroid Build Coastguard Worker                                            << sd.size() << ". "
673*ec779b8eSAndroid Build Coastguard Worker                                               "It should be 1.";
674*ec779b8eSAndroid Build Coastguard Worker                                 descriptor.reset();
675*ec779b8eSAndroid Build Coastguard Worker                                 return;
676*ec779b8eSAndroid Build Coastguard Worker                             }
677*ec779b8eSAndroid Build Coastguard Worker                             if (!c2_hidl::utils::objcpy(&descriptor, sd[0])) {
678*ec779b8eSAndroid Build Coastguard Worker                                 LOG(DEBUG) << "SimpleParamReflector -- "
679*ec779b8eSAndroid Build Coastguard Worker                                               "getStructDescriptors() returned "
680*ec779b8eSAndroid Build Coastguard Worker                                               "corrupted data.";
681*ec779b8eSAndroid Build Coastguard Worker                                 descriptor.reset();
682*ec779b8eSAndroid Build Coastguard Worker                                 return;
683*ec779b8eSAndroid Build Coastguard Worker                             }
684*ec779b8eSAndroid Build Coastguard Worker                         });
685*ec779b8eSAndroid Build Coastguard Worker                 return descriptor;
686*ec779b8eSAndroid Build Coastguard Worker             }
687*ec779b8eSAndroid Build Coastguard Worker 
688*ec779b8eSAndroid Build Coastguard Worker             explicit SimpleParamReflector(const sp<HidlComponentStore> &base)
689*ec779b8eSAndroid Build Coastguard Worker                 : mHidlBase(base) { }
690*ec779b8eSAndroid Build Coastguard Worker 
691*ec779b8eSAndroid Build Coastguard Worker             explicit SimpleParamReflector(const std::shared_ptr<AidlComponentStore> &base)
692*ec779b8eSAndroid Build Coastguard Worker                 : mAidlBase(base) { }
693*ec779b8eSAndroid Build Coastguard Worker 
694*ec779b8eSAndroid Build Coastguard Worker             std::shared_ptr<AidlComponentStore> mAidlBase;
695*ec779b8eSAndroid Build Coastguard Worker             sp<HidlComponentStore> mHidlBase;
696*ec779b8eSAndroid Build Coastguard Worker         };
697*ec779b8eSAndroid Build Coastguard Worker 
698*ec779b8eSAndroid Build Coastguard Worker         if (mAidlStore) {
699*ec779b8eSAndroid Build Coastguard Worker             return std::make_shared<SimpleParamReflector>(mAidlStore);
700*ec779b8eSAndroid Build Coastguard Worker         } else if (mHidlStore) {
701*ec779b8eSAndroid Build Coastguard Worker             return std::make_shared<SimpleParamReflector>(mHidlStore);
702*ec779b8eSAndroid Build Coastguard Worker         } else {
703*ec779b8eSAndroid Build Coastguard Worker             return nullptr;
704*ec779b8eSAndroid Build Coastguard Worker         }
705*ec779b8eSAndroid Build Coastguard Worker     }
706*ec779b8eSAndroid Build Coastguard Worker 
707*ec779b8eSAndroid Build Coastguard Worker     virtual std::vector<std::shared_ptr<const C2Component::Traits>>
listComponents()708*ec779b8eSAndroid Build Coastguard Worker             listComponents() override {
709*ec779b8eSAndroid Build Coastguard Worker         LOG(ERROR) << "listComponents -- not supported.";
710*ec779b8eSAndroid Build Coastguard Worker         return {};
711*ec779b8eSAndroid Build Coastguard Worker     }
712*ec779b8eSAndroid Build Coastguard Worker };
713*ec779b8eSAndroid Build Coastguard Worker 
ionPropertiesDefined()714*ec779b8eSAndroid Build Coastguard Worker bool ionPropertiesDefined() {
715*ec779b8eSAndroid Build Coastguard Worker     using namespace ::android::base;
716*ec779b8eSAndroid Build Coastguard Worker     std::string heapMask =
717*ec779b8eSAndroid Build Coastguard Worker         GetProperty("ro.com.android.media.swcodec.ion.heapmask", "undefined");
718*ec779b8eSAndroid Build Coastguard Worker     std::string flags =
719*ec779b8eSAndroid Build Coastguard Worker         GetProperty("ro.com.android.media.swcodec.ion.flags", "undefined");
720*ec779b8eSAndroid Build Coastguard Worker     std::string align =
721*ec779b8eSAndroid Build Coastguard Worker         GetProperty("ro.com.android.media.swcodec.ion.align", "undefined");
722*ec779b8eSAndroid Build Coastguard Worker     if (heapMask != "undefined" ||
723*ec779b8eSAndroid Build Coastguard Worker             flags != "undefined" ||
724*ec779b8eSAndroid Build Coastguard Worker             align != "undefined") {
725*ec779b8eSAndroid Build Coastguard Worker         LOG(INFO)
726*ec779b8eSAndroid Build Coastguard Worker                 << "Some system properties for mediaswcodec ION usage are set: "
727*ec779b8eSAndroid Build Coastguard Worker                 << "heapmask = " << heapMask << ", "
728*ec779b8eSAndroid Build Coastguard Worker                 << "flags = " << flags << ", "
729*ec779b8eSAndroid Build Coastguard Worker                 << "align = " << align << ". "
730*ec779b8eSAndroid Build Coastguard Worker                 << "Preferred Codec2 store is defaulted to \"software\".";
731*ec779b8eSAndroid Build Coastguard Worker         return true;
732*ec779b8eSAndroid Build Coastguard Worker     }
733*ec779b8eSAndroid Build Coastguard Worker     return false;
734*ec779b8eSAndroid Build Coastguard Worker }
735*ec779b8eSAndroid Build Coastguard Worker 
736*ec779b8eSAndroid Build Coastguard Worker } // unnamed namespace
737*ec779b8eSAndroid Build Coastguard Worker 
getDeclaredHidlSwcodec(const std::shared_ptr<C2ComponentStore> & store)738*ec779b8eSAndroid Build Coastguard Worker static android::sp<c2_hidl_V1_0::IComponentStore> getDeclaredHidlSwcodec(
739*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<C2ComponentStore>& store) {
740*ec779b8eSAndroid Build Coastguard Worker     using ::android::hidl::manager::V1_2::IServiceManager;
741*ec779b8eSAndroid Build Coastguard Worker     using namespace ::android::hardware::media::c2;
742*ec779b8eSAndroid Build Coastguard Worker 
743*ec779b8eSAndroid Build Coastguard Worker     int platformVersion = android_get_device_api_level();
744*ec779b8eSAndroid Build Coastguard Worker     // STOPSHIP: Remove code name checking once platform version bumps up to 35.
745*ec779b8eSAndroid Build Coastguard Worker     std::string codeName = android::base::GetProperty("ro.build.version.codename", "");
746*ec779b8eSAndroid Build Coastguard Worker 
747*ec779b8eSAndroid Build Coastguard Worker     if (codeName == "VanillaIceCream") {
748*ec779b8eSAndroid Build Coastguard Worker         platformVersion = __ANDROID_API_V__;
749*ec779b8eSAndroid Build Coastguard Worker     }
750*ec779b8eSAndroid Build Coastguard Worker     IServiceManager::Transport transport =
751*ec779b8eSAndroid Build Coastguard Worker             android::hardware::defaultServiceManager1_2()->getTransport(
752*ec779b8eSAndroid Build Coastguard Worker                     V1_2::IComponentStore::descriptor, "software");
753*ec779b8eSAndroid Build Coastguard Worker     if (transport == IServiceManager::Transport::HWBINDER) {
754*ec779b8eSAndroid Build Coastguard Worker         if (platformVersion < __ANDROID_API_S__) {
755*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "We don't expect V1.2::IComponentStore to be declared on this device";
756*ec779b8eSAndroid Build Coastguard Worker         }
757*ec779b8eSAndroid Build Coastguard Worker         return ::android::sp<V1_2::utils::ComponentStore>::make(store);
758*ec779b8eSAndroid Build Coastguard Worker     }
759*ec779b8eSAndroid Build Coastguard Worker     transport = android::hardware::defaultServiceManager1_2()->getTransport(
760*ec779b8eSAndroid Build Coastguard Worker             V1_1::IComponentStore::descriptor, "software");
761*ec779b8eSAndroid Build Coastguard Worker     if (transport == IServiceManager::Transport::HWBINDER) {
762*ec779b8eSAndroid Build Coastguard Worker         if (platformVersion != __ANDROID_API_R__) {
763*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "We don't expect V1.1::IComponentStore to be declared on this device";
764*ec779b8eSAndroid Build Coastguard Worker         }
765*ec779b8eSAndroid Build Coastguard Worker         return ::android::sp<V1_1::utils::ComponentStore>::make(store);
766*ec779b8eSAndroid Build Coastguard Worker     }
767*ec779b8eSAndroid Build Coastguard Worker     transport = android::hardware::defaultServiceManager1_2()->getTransport(
768*ec779b8eSAndroid Build Coastguard Worker             V1_0::IComponentStore::descriptor, "software");
769*ec779b8eSAndroid Build Coastguard Worker     if (transport == IServiceManager::Transport::HWBINDER) {
770*ec779b8eSAndroid Build Coastguard Worker         if (platformVersion != __ANDROID_API_Q__) {
771*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "We don't expect V1.0::IComponentStore to be declared on this device";
772*ec779b8eSAndroid Build Coastguard Worker         }
773*ec779b8eSAndroid Build Coastguard Worker         return ::android::sp<V1_0::utils::ComponentStore>::make(store);
774*ec779b8eSAndroid Build Coastguard Worker     }
775*ec779b8eSAndroid Build Coastguard Worker     return nullptr;
776*ec779b8eSAndroid Build Coastguard Worker }
777*ec779b8eSAndroid Build Coastguard Worker 
778*ec779b8eSAndroid Build Coastguard Worker /**
779*ec779b8eSAndroid Build Coastguard Worker  * This function encapsulates the core logic required to register codec services,
780*ec779b8eSAndroid Build Coastguard Worker  * separated from threadpool management to avoid timeouts when called by the fuzzer.
781*ec779b8eSAndroid Build Coastguard Worker  */
RegisterCodecServicesWithExistingThreadpool()782*ec779b8eSAndroid Build Coastguard Worker static void RegisterCodecServicesWithExistingThreadpool() {
783*ec779b8eSAndroid Build Coastguard Worker     const bool aidlSelected = c2_aidl::utils::IsSelected();
784*ec779b8eSAndroid Build Coastguard Worker     LOG(INFO) << "Creating software Codec2 service...";
785*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<C2ComponentStore> store =
786*ec779b8eSAndroid Build Coastguard Worker         android::GetCodec2PlatformComponentStore();
787*ec779b8eSAndroid Build Coastguard Worker     if (!store) {
788*ec779b8eSAndroid Build Coastguard Worker         LOG(ERROR) << "Failed to create Codec2 service.";
789*ec779b8eSAndroid Build Coastguard Worker         return;
790*ec779b8eSAndroid Build Coastguard Worker     }
791*ec779b8eSAndroid Build Coastguard Worker 
792*ec779b8eSAndroid Build Coastguard Worker     using namespace ::android::hardware::media::c2;
793*ec779b8eSAndroid Build Coastguard Worker     bool registered = false;
794*ec779b8eSAndroid Build Coastguard Worker     const std::string aidlServiceName =
795*ec779b8eSAndroid Build Coastguard Worker         std::string(c2_aidl::IComponentStore::descriptor) + "/software";
796*ec779b8eSAndroid Build Coastguard Worker     if (__builtin_available(android __ANDROID_API_S__, *)) {
797*ec779b8eSAndroid Build Coastguard Worker         if (AServiceManager_isDeclared(aidlServiceName.c_str())) {
798*ec779b8eSAndroid Build Coastguard Worker             std::shared_ptr<c2_aidl::IComponentStore> aidlStore;
799*ec779b8eSAndroid Build Coastguard Worker             if (aidlSelected) {
800*ec779b8eSAndroid Build Coastguard Worker                 aidlStore = ::ndk::SharedRefBase::make<c2_aidl::utils::ComponentStore>(store);
801*ec779b8eSAndroid Build Coastguard Worker             } else {
802*ec779b8eSAndroid Build Coastguard Worker                 aidlStore = ::ndk::SharedRefBase::make<c2_aidl::utils::ComponentStore>(
803*ec779b8eSAndroid Build Coastguard Worker                         std::make_shared<H2C2ComponentStore>(nullptr));
804*ec779b8eSAndroid Build Coastguard Worker             }
805*ec779b8eSAndroid Build Coastguard Worker             binder_exception_t ex = AServiceManager_addService(
806*ec779b8eSAndroid Build Coastguard Worker                     aidlStore->asBinder().get(), aidlServiceName.c_str());
807*ec779b8eSAndroid Build Coastguard Worker             if (ex == EX_NONE) {
808*ec779b8eSAndroid Build Coastguard Worker                 registered = true;
809*ec779b8eSAndroid Build Coastguard Worker             } else {
810*ec779b8eSAndroid Build Coastguard Worker                 LOG(WARNING) << "Cannot register software Codec2 AIDL service. Exception: " << ex;
811*ec779b8eSAndroid Build Coastguard Worker             }
812*ec779b8eSAndroid Build Coastguard Worker         }
813*ec779b8eSAndroid Build Coastguard Worker     }
814*ec779b8eSAndroid Build Coastguard Worker 
815*ec779b8eSAndroid Build Coastguard Worker     android::sp<V1_0::IComponentStore> hidlStore = getDeclaredHidlSwcodec(store);
816*ec779b8eSAndroid Build Coastguard Worker     // If the software component store isn't declared in the manifest, we don't
817*ec779b8eSAndroid Build Coastguard Worker     // need to create the service and register it.
818*ec779b8eSAndroid Build Coastguard Worker     if (hidlStore) {
819*ec779b8eSAndroid Build Coastguard Worker         if (registered && aidlSelected) {
820*ec779b8eSAndroid Build Coastguard Worker             LOG(INFO) << "Both HIDL and AIDL software codecs are declared in the vintf "
821*ec779b8eSAndroid Build Coastguard Worker                       << "manifest, but AIDL was selected. "
822*ec779b8eSAndroid Build Coastguard Worker                       << "Creating a null HIDL service so it's not accidentally "
823*ec779b8eSAndroid Build Coastguard Worker                       << "used. The AIDL software codec is already registered.";
824*ec779b8eSAndroid Build Coastguard Worker             hidlStore = ::android::sp<V1_2::utils::ComponentStore>::make(
825*ec779b8eSAndroid Build Coastguard Worker                     std::make_shared<H2C2ComponentStore>(nullptr));
826*ec779b8eSAndroid Build Coastguard Worker         }
827*ec779b8eSAndroid Build Coastguard Worker         if (hidlStore->registerAsService("software") == android::OK) {
828*ec779b8eSAndroid Build Coastguard Worker             registered = true;
829*ec779b8eSAndroid Build Coastguard Worker         } else {
830*ec779b8eSAndroid Build Coastguard Worker             LOG(ERROR) << "Cannot register software Codec2 " << hidlStore->descriptor
831*ec779b8eSAndroid Build Coastguard Worker                        << " service.";
832*ec779b8eSAndroid Build Coastguard Worker         }
833*ec779b8eSAndroid Build Coastguard Worker     } else {
834*ec779b8eSAndroid Build Coastguard Worker         LOG(INFO) << "The HIDL software Codec2 service is deprecated"
835*ec779b8eSAndroid Build Coastguard Worker                      " so it is not being registered with hwservicemanager.";
836*ec779b8eSAndroid Build Coastguard Worker     }
837*ec779b8eSAndroid Build Coastguard Worker 
838*ec779b8eSAndroid Build Coastguard Worker     // Preferred store must be set after the store is registered to ensure that
839*ec779b8eSAndroid Build Coastguard Worker     // the correct preferred store is set.
840*ec779b8eSAndroid Build Coastguard Worker     if (!ionPropertiesDefined()) {
841*ec779b8eSAndroid Build Coastguard Worker         using IComponentStore =
842*ec779b8eSAndroid Build Coastguard Worker             ::android::hardware::media::c2::V1_0::IComponentStore;
843*ec779b8eSAndroid Build Coastguard Worker         std::string const preferredStoreName = "default";
844*ec779b8eSAndroid Build Coastguard Worker         if (aidlSelected) {
845*ec779b8eSAndroid Build Coastguard Worker             std::shared_ptr<c2_aidl::IComponentStore> preferredStore;
846*ec779b8eSAndroid Build Coastguard Worker             if (__builtin_available(android __ANDROID_API_S__, *)) {
847*ec779b8eSAndroid Build Coastguard Worker                 std::string instanceName = ::android::base::StringPrintf(
848*ec779b8eSAndroid Build Coastguard Worker                         "%s/%s", c2_aidl::IComponentStore::descriptor, preferredStoreName.c_str());
849*ec779b8eSAndroid Build Coastguard Worker                 if (AServiceManager_isDeclared(instanceName.c_str())) {
850*ec779b8eSAndroid Build Coastguard Worker                     preferredStore = c2_aidl::IComponentStore::fromBinder(::ndk::SpAIBinder(
851*ec779b8eSAndroid Build Coastguard Worker                             AServiceManager_waitForService(instanceName.c_str())));
852*ec779b8eSAndroid Build Coastguard Worker                 }
853*ec779b8eSAndroid Build Coastguard Worker             }
854*ec779b8eSAndroid Build Coastguard Worker             if (preferredStore) {
855*ec779b8eSAndroid Build Coastguard Worker                 ::android::SetPreferredCodec2ComponentStore(
856*ec779b8eSAndroid Build Coastguard Worker                         std::make_shared<H2C2ComponentStore>(preferredStore));
857*ec779b8eSAndroid Build Coastguard Worker                 LOG(INFO) <<
858*ec779b8eSAndroid Build Coastguard Worker                         "Preferred Codec2 AIDL store is set to \"" <<
859*ec779b8eSAndroid Build Coastguard Worker                         preferredStoreName << "\".";
860*ec779b8eSAndroid Build Coastguard Worker             } else {
861*ec779b8eSAndroid Build Coastguard Worker                 LOG(INFO) <<
862*ec779b8eSAndroid Build Coastguard Worker                         "Preferred Codec2 AIDL store is defaulted to \"software\".";
863*ec779b8eSAndroid Build Coastguard Worker             }
864*ec779b8eSAndroid Build Coastguard Worker         } else {
865*ec779b8eSAndroid Build Coastguard Worker             sp<IComponentStore> preferredStore =
866*ec779b8eSAndroid Build Coastguard Worker                 IComponentStore::getService(preferredStoreName.c_str());
867*ec779b8eSAndroid Build Coastguard Worker             if (preferredStore) {
868*ec779b8eSAndroid Build Coastguard Worker                 ::android::SetPreferredCodec2ComponentStore(
869*ec779b8eSAndroid Build Coastguard Worker                         std::make_shared<H2C2ComponentStore>(preferredStore));
870*ec779b8eSAndroid Build Coastguard Worker                 LOG(INFO) <<
871*ec779b8eSAndroid Build Coastguard Worker                         "Preferred Codec2 HIDL store is set to \"" <<
872*ec779b8eSAndroid Build Coastguard Worker                         preferredStoreName << "\".";
873*ec779b8eSAndroid Build Coastguard Worker             } else {
874*ec779b8eSAndroid Build Coastguard Worker                 LOG(INFO) <<
875*ec779b8eSAndroid Build Coastguard Worker                         "Preferred Codec2 HIDL store is defaulted to \"software\".";
876*ec779b8eSAndroid Build Coastguard Worker             }
877*ec779b8eSAndroid Build Coastguard Worker         }
878*ec779b8eSAndroid Build Coastguard Worker     }
879*ec779b8eSAndroid Build Coastguard Worker 
880*ec779b8eSAndroid Build Coastguard Worker     if (registered) {
881*ec779b8eSAndroid Build Coastguard Worker         LOG(INFO) << "Software Codec2 service created and registered.";
882*ec779b8eSAndroid Build Coastguard Worker     }
883*ec779b8eSAndroid Build Coastguard Worker }
884*ec779b8eSAndroid Build Coastguard Worker 
RegisterCodecServices()885*ec779b8eSAndroid Build Coastguard Worker extern "C" void RegisterCodecServices() {
886*ec779b8eSAndroid Build Coastguard Worker     constexpr int kThreadCount = 64;
887*ec779b8eSAndroid Build Coastguard Worker     ABinderProcess_setThreadPoolMaxThreadCount(kThreadCount);
888*ec779b8eSAndroid Build Coastguard Worker     ABinderProcess_startThreadPool();
889*ec779b8eSAndroid Build Coastguard Worker     ::android::hardware::configureRpcThreadpool(kThreadCount, false);
890*ec779b8eSAndroid Build Coastguard Worker 
891*ec779b8eSAndroid Build Coastguard Worker     RegisterCodecServicesWithExistingThreadpool();
892*ec779b8eSAndroid Build Coastguard Worker 
893*ec779b8eSAndroid Build Coastguard Worker     ABinderProcess_joinThreadPool();
894*ec779b8eSAndroid Build Coastguard Worker     ::android::hardware::joinRpcThreadpool();
895*ec779b8eSAndroid Build Coastguard Worker }
896