• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Shenzhen Kaihong DID Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "codec_component_manager_stub.h"
16 #include <dlfcn.h>
17 #include <hdf_device_desc.h>
18 #include <hdf_device_object.h>
19 #include <osal_mem.h>
20 #include <securec.h>
21 #include "codec_component_capability_config.h"
22 #include "codec_component_manager_service.h"
23 #include "codec_util.h"
24 #include "codec_log_wrapper.h"
25 
26 #define CODEC_SERVICE_IMPL "libcodec_hdi_omx_service_impl"
27 typedef void (*SERVICE_CONSTRUCT_FUNC)(struct OmxComponentManager *);
SerStubGetComponentNum(struct CodecComponentManager * serviceImpl,struct HdfSBuf * data,struct HdfSBuf * reply)28 static int32_t SerStubGetComponentNum(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data,
29                                       struct HdfSBuf *reply)
30 {
31     if (serviceImpl == NULL) {
32         CODEC_LOGE("invalid parameter");
33         return HDF_ERR_INVALID_PARAM;
34     }
35     int32_t num = serviceImpl->GetComponentNum();
36     if (!HdfSbufWriteInt32(reply, num)) {
37         CODEC_LOGE("write num failed!");
38         return HDF_ERR_INVALID_PARAM;
39     }
40     return HDF_SUCCESS;
41 }
42 
SerStubGetComponentCapablityList(struct CodecComponentManager * serviceImpl,struct HdfSBuf * data,struct HdfSBuf * reply)43 static int32_t SerStubGetComponentCapablityList(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data,
44                                                 struct HdfSBuf *reply)
45 {
46     if (serviceImpl == NULL) {
47         CODEC_LOGE("invalid parameter");
48         return HDF_ERR_INVALID_PARAM;
49     }
50     int32_t count = 0;
51     int32_t err = HDF_SUCCESS;
52     CodecCompCapability *caps = NULL;
53     if (!HdfSbufReadInt32(data, &count) || (count <= 0)) {
54         CODEC_LOGE("read count failed!");
55         return HDF_ERR_INVALID_PARAM;
56     }
57     if (count > serviceImpl->GetComponentNum()) {
58         CODEC_LOGE("count exceed componentNum");
59         return HDF_ERR_INVALID_PARAM;
60     }
61     caps = (CodecCompCapability *)OsalMemCalloc(sizeof(CodecCompCapability) * (count));
62     if (caps == NULL) {
63         CODEC_LOGE("alloc caps failed!");
64         return HDF_ERR_INVALID_PARAM;
65     }
66     err = serviceImpl->GetComponentCapabilityList(caps, count);
67     if (err != HDF_SUCCESS) {
68         OsalMemFree(caps);
69         CODEC_LOGE("call GetComponentCapabilityList function failed!");
70         return err;
71     }
72 
73     for (int32_t i = 0; i < count; i++) {
74         if (!CodecCompCapabilityBlockMarshalling(reply, &caps[i])) {
75             CODEC_LOGE("call CodecCompCapabilityBlockMarshalling function failed!");
76             err = HDF_ERR_INVALID_PARAM;
77             break;
78         }
79     }
80     OsalMemFree(caps);
81     return err;
82 }
83 
ReadParamsForCreateComponent(struct HdfSBuf * data,char ** compName,int64_t * appData,struct CodecCallbackType ** callback)84 static int32_t ReadParamsForCreateComponent(struct HdfSBuf *data, char **compName, int64_t *appData,
85                                             struct CodecCallbackType **callback)
86 {
87     const char *compNameCp = HdfSbufReadString(data);
88     if (compNameCp == NULL) {
89         CODEC_LOGE("read compNameCp failed!");
90         return HDF_ERR_INVALID_PARAM;
91     }
92 
93     if (!HdfSbufReadInt64(data, appData)) {
94         CODEC_LOGE("read appData failed!");
95         return HDF_ERR_INVALID_PARAM;
96     }
97     *compName = strdup(compNameCp);
98 
99     struct HdfRemoteService *callbackRemote = HdfSbufReadRemoteService(data);
100     if (callbackRemote == NULL) {
101         CODEC_LOGE("read callbackRemote failed!");
102         return HDF_ERR_INVALID_PARAM;
103     }
104     *callback = CodecCallbackTypeGet(callbackRemote);
105 
106     return HDF_SUCCESS;
107 }
108 
SerStubCreateComponent(struct CodecComponentManager * serviceImpl,struct HdfSBuf * data,struct HdfSBuf * reply)109 static int32_t SerStubCreateComponent(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data,
110                                       struct HdfSBuf *reply)
111 {
112     if (serviceImpl == NULL) {
113         CODEC_LOGE("invalid paramter");
114         return HDF_ERR_INVALID_PARAM;
115     }
116     int32_t ret = HDF_SUCCESS;
117     struct CodecComponentType *component = NULL;
118     uint32_t componentId = 0;
119     int64_t appData = 0;
120     struct CodecCallbackType *callback = NULL;
121     char *compName = NULL;
122 
123     ret = ReadParamsForCreateComponent(data, &compName, &appData, &callback);
124     if (ret != HDF_SUCCESS) {
125         if (compName != NULL) {
126             OsalMemFree(compName);
127             compName = NULL;
128         }
129         return ret;
130     }
131     ret = serviceImpl->CreateComponent(&component, &componentId, compName, appData, callback);
132     if (component == NULL) {
133         CODEC_LOGE("fail to create component");
134         if (compName != NULL) {
135             OsalMemFree(compName);
136             compName = NULL;
137         }
138         return ret;
139     }
140     if (compName != NULL) {
141         OsalMemFree(compName);
142         compName = NULL;
143     }
144     if (ret != HDF_SUCCESS) {
145         CODEC_LOGE("call CreateComponent function failed!");
146         return ret;
147     }
148 
149     if (HdfSbufWriteRemoteService(reply, component->AsObject(component)) != 0) {
150         CODEC_LOGE("write component failed!");
151         return HDF_ERR_INVALID_PARAM;
152     }
153     if (!HdfSbufWriteUint32(reply, componentId)) {
154         CODEC_LOGE("write componentId failed!");
155         return HDF_ERR_INVALID_PARAM;
156     }
157 #ifdef CONFIG_USE_JEMALLOC_DFX_INTF
158     ReleaseCodecCache();
159 #endif
160     return ret;
161 }
162 
SerStubDestroyComponent(struct CodecComponentManager * serviceImpl,struct HdfSBuf * data,struct HdfSBuf * reply)163 static int32_t SerStubDestroyComponent(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data,
164                                        struct HdfSBuf *reply)
165 {
166     if (serviceImpl == NULL) {
167         CODEC_LOGE("invalid parameter");
168         return HDF_ERR_INVALID_PARAM;
169     }
170     uint32_t componentId = 0;
171     if (!HdfSbufReadUint32(data, &componentId)) {
172         CODEC_LOGE("read componentId failed!");
173         return HDF_ERR_INVALID_PARAM;
174     }
175     int32_t ret = serviceImpl->DestroyComponent(componentId);
176     if (ret != HDF_SUCCESS) {
177         CODEC_LOGE("call DestroyComponent function failed!");
178     }
179 #ifdef CONFIG_USE_JEMALLOC_DFX_INTF
180     ReleaseCodecCache();
181 #endif
182     return ret;
183 }
184 
CodecComponentManagerServiceOnRemoteRequest(struct CodecComponentManager * serviceImpl,int32_t cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)185 static int32_t CodecComponentManagerServiceOnRemoteRequest(struct CodecComponentManager *serviceImpl, int32_t cmdId,
186                                                            struct HdfSBuf *data, struct HdfSBuf *reply)
187 {
188     switch (cmdId) {
189         case CMD_CODEC_GET_COMPONENT_NUM:
190             return SerStubGetComponentNum(serviceImpl, data, reply);
191         case CMD_CODEC_GET_COMPONENT_CAPABILITY_LIST:
192             return SerStubGetComponentCapablityList(serviceImpl, data, reply);
193         case CMD_CREATE_COMPONENT:
194             return SerStubCreateComponent(serviceImpl, data, reply);
195         case CMD_DESTROY_COMPONENT:
196             return SerStubDestroyComponent(serviceImpl, data, reply);
197         default:
198             CODEC_LOGE("not support cmd %{public}d", cmdId);
199             return HDF_ERR_INVALID_PARAM;
200     }
201 }
202 
CodecComponentManagerStubAsObject(struct CodecComponentManager * self)203 static struct HdfRemoteService *CodecComponentManagerStubAsObject(struct CodecComponentManager *self)
204 {
205     return NULL;
206 }
207 
CodecComponentManagerStubConstruct(struct CodecComponentManagerStub * stub)208 bool CodecComponentManagerStubConstruct(struct CodecComponentManagerStub *stub)
209 {
210     if (stub == NULL) {
211         CODEC_LOGE("stub is null!");
212         return false;
213     }
214 
215     stub->OnRemoteRequest = CodecComponentManagerServiceOnRemoteRequest;
216     stub->interface.AsObject = CodecComponentManagerStubAsObject;
217     return true;
218 }