• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device 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_stub.h"
16 #include <hdf_device_object.h>
17 #include <hdf_log.h>
18 #include <osal_mem.h>
19 #include "codec_callback_proxy.h"
20 #include "codec_config_parser.h"
21 #include "codec_interface.h"
22 #include "codec_service.h"
23 #include "icodec.h"
24 #include "stub_msgproc.h"
25 
26 #define HDF_LOG_TAG codec_hdi_stub
27 #define HDF_CODEC_NAME_LEN 50
28 
SerCodecInit(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)29 static int32_t SerCodecInit(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
30 {
31     int32_t errNum = CodecInit();
32     if (errNum != HDF_SUCCESS) {
33         HDF_LOGE("%{public}s: call CodecInit fuc failed!", __func__);
34         return errNum;
35     }
36     if (!HdfSbufWriteUint32(reply, errNum)) {
37         HDF_LOGE("%{public}s: write errNum failed!", __func__);
38         return HDF_ERR_INVALID_PARAM;
39     }
40     return errNum;
41 }
42 
SerCodecDeinit(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)43 static int32_t SerCodecDeinit(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
44 {
45     int32_t errNum = CodecDeinit();
46     if (errNum != HDF_SUCCESS) {
47         HDF_LOGE("%{public}s: call CodecDeinit fuc failed!", __func__);
48         return errNum;
49     }
50     if (!HdfSbufWriteUint32(reply, errNum)) {
51         HDF_LOGE("%{public}s: write errNum failed!", __func__);
52         return HDF_ERR_INVALID_PARAM;
53     }
54     return errNum;
55 }
56 
SerCodecEnumerateCapability(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)57 static int32_t SerCodecEnumerateCapability(struct HdfDeviceIoClient *client, struct HdfSBuf *data,
58     struct HdfSBuf *reply)
59 {
60     uint32_t index;
61     CodecCapability capability;
62 
63     if (!HdfSbufReadUint32(data, &index)) {
64         HDF_LOGE("%{public}s: read index failed!", __func__);
65         return HDF_FAILURE;
66     }
67     if (!CodecCapablitesInited()) {
68         HDF_LOGE("%{public}s: codec capabilities not inited!", __func__);
69         return HDF_FAILURE;
70     }
71     if (CodecEnumerateCapability(index, &capability) != HDF_SUCCESS) {
72         HDF_LOGE("%{public}s: EnumrateCapablity - no more capability to Enumrate!", __func__);
73         return HDF_FAILURE;
74     }
75     if (capability.mime == MEDIA_MIMETYPE_INVALID) {
76         HDF_LOGE("%{public}s: Capability invalid, discard!", __func__);
77         return HDF_FAILURE;
78     }
79     if (CodecSerPackCapability(reply, &capability) != HDF_SUCCESS) {
80         HDF_LOGE("%{public}s: write capability to sbuf failed!", __func__);
81         return HDF_FAILURE;
82     }
83     return HDF_SUCCESS;
84 }
85 
SerCodecGetCapability(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)86 static int32_t SerCodecGetCapability(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
87 {
88     uint32_t flags;
89     AvCodecMime mime;
90     CodecType type;
91     CodecCapability capability;
92 
93     if (!HdfSbufReadUint32(data, (uint32_t*)&mime)) {
94         HDF_LOGE("%{public}s: read input mime failed!", __func__);
95         return HDF_ERR_INVALID_PARAM;
96     }
97     if (!HdfSbufReadUint32(data, (uint32_t*)&type)) {
98         HDF_LOGE("%{public}s: read input type failed!", __func__);
99         return HDF_ERR_INVALID_PARAM;
100     }
101     if (!HdfSbufReadUint32(data, &flags)) {
102         HDF_LOGE("%{public}s: read input flags failed!", __func__);
103         return HDF_ERR_INVALID_PARAM;
104     }
105     if (CodecGetCapability(mime, type, flags, &capability) != HDF_SUCCESS) {
106         HDF_LOGE("%{public}s: GetCapability - got nothing!", __func__);
107         return HDF_FAILURE;
108     }
109     if (CodecSerPackCapability(reply, &capability) != HDF_SUCCESS) {
110         HDF_LOGE("%{public}s: write capability to sbuf failed!", __func__);
111         return HDF_FAILURE;
112     }
113     return HDF_SUCCESS;
114 }
115 
SerCodecCreate(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)116 static int32_t SerCodecCreate(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
117 {
118     int32_t errNum;
119     uint64_t handle = 0;
120     const char *name = NULL;
121 
122     name = HdfSbufReadString(data);
123     if (name == NULL) {
124         HDF_LOGE("%{public}s: Read name failed!", __func__);
125         return HDF_ERR_INVALID_PARAM;
126     }
127     errNum = CodecCreate(name, (CODEC_HANDLETYPE *)&handle);
128     if (errNum != HDF_SUCCESS) {
129         HDF_LOGE("%{public}s: call CodecCreate fuc failed! errNum:%{public}d", __func__, errNum);
130         return errNum;
131     }
132     if (!HdfSbufWriteUint64(reply, handle)) {
133         HDF_LOGE("%{public}s: write handle failed!", __func__);
134         return HDF_ERR_INVALID_PARAM;
135     }
136     return errNum;
137 }
138 
SerCodecCreateByType(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)139 static int32_t SerCodecCreateByType(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
140 {
141     (void)client;
142     int32_t errNum;
143     CodecType type;
144     AvCodecMime mime;
145     uint64_t handle = 0;
146 
147     if (!HdfSbufReadUint32(data, (uint32_t*)&type)) {
148         HDF_LOGE("%{public}s: read input type failed!", __func__);
149         return HDF_ERR_INVALID_PARAM;
150     }
151     if (!HdfSbufReadUint32(data, (uint32_t*)&mime)) {
152         HDF_LOGE("%{public}s: read input mime failed!", __func__);
153         return HDF_ERR_INVALID_PARAM;
154     }
155     errNum = CodecCreateByType(type, mime, (CODEC_HANDLETYPE *)&handle);
156     if (errNum != HDF_SUCCESS) {
157         HDF_LOGE("%{public}s: call CodecCreateByType fuc failed! errNum:%{public}d", __func__, errNum);
158         return errNum;
159     }
160     if (!HdfSbufWriteUint64(reply, handle)) {
161         HDF_LOGE("%{public}s: write handle failed!", __func__);
162         return HDF_ERR_INVALID_PARAM;
163     }
164     return errNum;
165 }
166 
SerCodecDestroy(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)167 static int32_t SerCodecDestroy(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
168 {
169     int32_t errNum;
170     uint64_t handle = 0;
171     if (!HdfSbufReadUint64(data, &handle)) {
172         HDF_LOGE("%{public}s: Read size failed!", __func__);
173         return HDF_ERR_INVALID_PARAM;
174     }
175     errNum = CodecDestroy((CODEC_HANDLETYPE)(uintptr_t)handle);
176     if (errNum != HDF_SUCCESS) {
177         HDF_LOGE("%{public}s: call CodecDestroy fuc failed!", __func__);
178         return errNum;
179     }
180     return errNum;
181 }
182 
SerCodecSetPortMode(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)183 static int32_t SerCodecSetPortMode(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
184 {
185     int32_t errNum;
186     uint64_t handle = 0;
187     DirectionType direct;
188     AllocateBufferMode mode;
189     BufferType type;
190 
191     if (!HdfSbufReadUint64(data, &handle)) {
192         HDF_LOGE("%{public}s: Read handle failed!", __func__);
193         return HDF_ERR_INVALID_PARAM;
194     }
195     if (!HdfSbufReadUint32(data, (uint32_t*)&direct)) {
196         HDF_LOGE("%{public}s: Read DirectionType failed!", __func__);
197         return HDF_ERR_INVALID_PARAM;
198     }
199     if (!HdfSbufReadUint32(data, (uint32_t*)&mode)) {
200         HDF_LOGE("%{public}s: Read AllocateBufferMode failed!", __func__);
201         return HDF_ERR_INVALID_PARAM;
202     }
203     if (!HdfSbufReadUint32(data, (uint32_t*)&type)) {
204         HDF_LOGE("%{public}s: Read BufferType failed!", __func__);
205         return HDF_ERR_INVALID_PARAM;
206     }
207     errNum = CodecSetPortMode((CODEC_HANDLETYPE)(uintptr_t)handle, direct, mode, type);
208     if (errNum != HDF_SUCCESS) {
209         HDF_LOGE("%{public}s: call CodecSetPortMode fuc failed!", __func__);
210         return errNum;
211     }
212     return errNum;
213 }
214 
SerCodecGetPortMode(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)215 static int32_t SerCodecGetPortMode(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
216 {
217     int32_t errNum;
218     uint64_t handle = 0;
219     DirectionType direct;
220     AllocateBufferMode mode;
221     BufferType type;
222 
223     if (!HdfSbufReadUint64(data, &handle)) {
224         HDF_LOGE("%{public}s: Read handle failed!", __func__);
225         return HDF_ERR_INVALID_PARAM;
226     }
227     if (!HdfSbufReadUint32(data, (uint32_t*)&direct)) {
228         HDF_LOGE("%{public}s: Read DirectionType failed!", __func__);
229         return HDF_ERR_INVALID_PARAM;
230     }
231     errNum = CodecGetPortMode((CODEC_HANDLETYPE)(uintptr_t)handle, direct, &mode, &type);
232     if (errNum != HDF_SUCCESS) {
233         HDF_LOGE("%{public}s: call CodecSetPortMode fuc failed!", __func__);
234         return errNum;
235     }
236     if (!HdfSbufWriteUint32(reply, (uint32_t)mode)) {
237         HDF_LOGE("%{public}s: write AllocateBufferMode failed!", __func__);
238         return HDF_ERR_INVALID_PARAM;
239     }
240     if (!HdfSbufWriteUint32(reply, (uint32_t)type)) {
241         HDF_LOGE("%{public}s: write BufferType failed!", __func__);
242         return HDF_ERR_INVALID_PARAM;
243     }
244     return HDF_SUCCESS;
245 }
246 
FreeParams(Param * params,int32_t paramCnt)247 static void FreeParams(Param *params, int32_t paramCnt)
248 {
249     if (params == NULL || paramCnt <= 0) {
250         HDF_LOGE("%{public}s: params is null or invalid count!", __func__);
251         return;
252     }
253     for (int32_t j = 0; j < paramCnt; j++) {
254         if (params[j].val != NULL && params[j].size > 0) {
255             OsalMemFree(params[j].val);
256             params[j].val = NULL;
257         }
258     }
259     OsalMemFree(params);
260 }
261 
SerCodecSetParameter(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)262 static int32_t SerCodecSetParameter(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
263 {
264     int32_t errNum;
265     int32_t paramCnt = 0;
266     uint64_t handle = 0;
267     Param *params = NULL;
268 
269     if (!HdfSbufReadUint64(data, &handle)) {
270         HDF_LOGE("%{public}s: Read handle failed!", __func__);
271         return HDF_ERR_INVALID_PARAM;
272     }
273     if (!HdfSbufReadInt32(data, &paramCnt)) {
274         HDF_LOGE("%{public}s: Read paramCnt failed!", __func__);
275         return HDF_ERR_INVALID_PARAM;
276     }
277     if (paramCnt <= 0) {
278         HDF_LOGE("%{public}s: Param paramCnt err!", __func__);
279         return HDF_ERR_INVALID_PARAM;
280     }
281     params = (Param *)OsalMemAlloc(sizeof(Param)*paramCnt);
282     if (params == NULL) {
283         HDF_LOGE("%{public}s: OsalMemAlloc failed!", __func__);
284         return HDF_ERR_INVALID_PARAM;
285     }
286     for (int32_t i = 0; i < paramCnt; i++) {
287         if (CodecSerParseParam(data, &params[i]) != HDF_SUCCESS) {
288             HDF_LOGE("%{public}s: Read params failed!", __func__);
289             FreeParams(params, paramCnt);
290             return HDF_FAILURE;
291         }
292     }
293     errNum = CodecSetParameter((CODEC_HANDLETYPE)(uintptr_t)handle, params, paramCnt);
294     if (errNum != HDF_SUCCESS) {
295         HDF_LOGE("%{public}s: call CodecSetParameter fuc failed!", __func__);
296     }
297 
298     FreeParams(params, paramCnt);
299     return errNum;
300 }
301 
SerCodecGetParameter(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)302 static int32_t SerCodecGetParameter(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
303 {
304     int32_t errNum;
305     int32_t paramCnt = 0;
306     uint64_t handle = 0;
307     Param *params = NULL;
308 
309     if (!HdfSbufReadUint64(data, &handle)) {
310         HDF_LOGE("%{public}s: Read handle failed!", __func__);
311         return HDF_ERR_INVALID_PARAM;
312     }
313     if (!HdfSbufReadInt32(data, &paramCnt)) {
314         HDF_LOGE("%{public}s: Read paramCnt failed!", __func__);
315         return HDF_ERR_INVALID_PARAM;
316     }
317     if (paramCnt <= 0) {
318         HDF_LOGE("%{public}s: Param paramCnt err!", __func__);
319         return HDF_ERR_INVALID_PARAM;
320     }
321     params = (Param *)OsalMemAlloc(sizeof(Param)*paramCnt);
322     if (params == NULL) {
323         HDF_LOGE("%{public}s: OsalMemAlloc failed!", __func__);
324         return HDF_ERR_INVALID_PARAM;
325     }
326     for (int32_t i = 0; i < paramCnt; i++) {
327         if (CodecSerParseParam(data, &params[i]) != HDF_SUCCESS) {
328             HDF_LOGE("%{public}s: Read params failed!", __func__);
329             FreeParams(params, paramCnt);
330             return HDF_FAILURE;
331         }
332     }
333     errNum = CodecGetParameter((CODEC_HANDLETYPE)(uintptr_t)handle, params, paramCnt);
334     if (errNum != HDF_SUCCESS) {
335         HDF_LOGE("%{public}s: call CodecGetParameter fuc failed!", __func__);
336         FreeParams(params, paramCnt);
337         return errNum;
338     }
339     for (int32_t i = 0; i < paramCnt; i++) {
340         if (CodecSerPackParam(reply, &params[i]) != HDF_SUCCESS) {
341             HDF_LOGE("%{public}s: CodecSerPackParam err!", __func__);
342             FreeParams(params, paramCnt);
343             return HDF_FAILURE;
344         }
345     }
346 
347     FreeParams(params, paramCnt);
348     return errNum;
349 }
350 
SerCodecStart(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)351 static int32_t SerCodecStart(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
352 {
353     int32_t errNum;
354     uint64_t handle = 0;
355 
356     if (!HdfSbufReadUint64(data, &handle)) {
357         HDF_LOGE("%{public}s: Read handle failed!", __func__);
358         return HDF_ERR_INVALID_PARAM;
359     }
360     errNum = CodecStart((CODEC_HANDLETYPE)(uintptr_t)handle);
361     if (errNum != HDF_SUCCESS) {
362         HDF_LOGE("%{public}s: call SerCodecStart fuc failed!", __func__);
363         return errNum;
364     }
365     return errNum;
366 }
367 
SerCodecStop(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)368 static int32_t SerCodecStop(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
369 {
370     uint64_t handle = 0;
371     if (!HdfSbufReadUint64(data, &handle)) {
372         HDF_LOGE("%{public}s: read handle data failed!", __func__);
373         return HDF_ERR_INVALID_PARAM;
374     }
375     int32_t errNum = CodecStop((CODEC_HANDLETYPE)(uintptr_t)handle);
376     if (errNum != HDF_SUCCESS) {
377         HDF_LOGE("%{public}s: call CodecStop fuc failed!", __func__);
378         return errNum;
379     }
380     return errNum;
381 }
382 
SerCodecReset(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)383 static int32_t SerCodecReset(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
384 {
385     (void)client;
386     (void)reply;
387     uint64_t handle = 0;
388     if (!HdfSbufReadUint64(data, &handle)) {
389         HDF_LOGE("%{public}s: read handle data failed!", __func__);
390         return HDF_ERR_INVALID_PARAM;
391     }
392     int32_t errNum = CodecReset((CODEC_HANDLETYPE)(uintptr_t)handle);
393     if (errNum != HDF_SUCCESS) {
394         HDF_LOGE("%{public}s: call CodecStop fuc failed!", __func__);
395         return errNum;
396     }
397     return errNum;
398 }
399 
SerCodecFlush(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)400 static int32_t SerCodecFlush(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
401 {
402     uint64_t handle = 0;
403     uint32_t directType = 0;
404     if (!HdfSbufReadUint64(data, &handle)) {
405         HDF_LOGE("%{public}s: read handle data failed!", __func__);
406         return HDF_ERR_INVALID_PARAM;
407     }
408     if (!HdfSbufReadUint32(data, &directType)) {
409         HDF_LOGE("%{public}s: read directType data failed!", __func__);
410         return HDF_ERR_INVALID_PARAM;
411     }
412     int32_t errNum = CodecFlush((CODEC_HANDLETYPE)(uintptr_t)handle, (DirectionType)directType);
413     if (errNum != HDF_SUCCESS) {
414         HDF_LOGE("%{public}s: call CodecFlush fuc failed!", __func__);
415         return errNum;
416     }
417     return errNum;
418 }
419 
SerCodecQueueInput(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)420 static int32_t SerCodecQueueInput(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
421 {
422     uint32_t timeoutMs = 0;
423     int releaseFenceFd = -1;
424     uint64_t handle = 0;
425     uint32_t bufCnt = 0;
426     CodecBuffer *inputData = NULL;
427     if (!HdfSbufReadUint64(data, &handle)) {
428         HDF_LOGE("%{public}s: read handle data failed!", __func__);
429         return HDF_ERR_INVALID_PARAM;
430     }
431     if (!HdfSbufReadUint32(data, &bufCnt)) {
432         HDF_LOGE("%{public}s: read bufferCnt failed!", __func__);
433         return HDF_ERR_INVALID_PARAM;
434     }
435     if (bufCnt == 0) {
436         HDF_LOGE("%{public}s: Param bufCnt err!", __func__);
437         return HDF_ERR_INVALID_PARAM;
438     }
439     inputData = (CodecBuffer *)OsalMemAlloc(sizeof(CodecBuffer) + sizeof(CodecBufferInfo) * bufCnt);
440     if (inputData == NULL) {
441         HDF_LOGE("%{public}s: OsalMemAlloc failed!", __func__);
442         return HDF_ERR_MALLOC_FAIL;
443     }
444     inputData->bufferCnt = bufCnt;
445     if (CodecSerParseCodecBuffer(data, inputData)) {
446         HDF_LOGE("%{public}s: read inputData failed!", __func__);
447         OsalMemFree(inputData);
448         return HDF_ERR_INVALID_PARAM;
449     }
450     if (!HdfSbufReadUint32(data, &timeoutMs)) {
451         HDF_LOGE("%{public}s: read timeoutMs data failed!", __func__);
452         OsalMemFree(inputData);
453         return HDF_ERR_INVALID_PARAM;
454     }
455     if (CodecSerParseFenceFd(data, &releaseFenceFd) != HDF_SUCCESS) {
456         HDF_LOGE("%{public}s: read releaseFenceFd failed!", __func__);
457         OsalMemFree(inputData);
458         return HDF_ERR_INVALID_PARAM;
459     }
460     int32_t errNum = CodecQueueInput((CODEC_HANDLETYPE)(uintptr_t)handle, inputData, timeoutMs, releaseFenceFd);
461     if (errNum != HDF_SUCCESS) {
462         HDF_LOGE("%{public}s: call CodecQueueInput fuc failed!", __func__);
463         OsalMemFree(inputData);
464         return errNum;
465     }
466 
467     OsalMemFree(inputData);
468     return HDF_SUCCESS;
469 }
470 
SerCodecDequeueInput(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)471 static int32_t SerCodecDequeueInput(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
472 {
473     uint32_t timeoutMs = 0;
474     uint64_t handle = 0;
475     uint32_t bufCnt = 0;
476     int32_t acquireFd = 0;
477     CodecBuffer *inputData = NULL;
478     if (!HdfSbufReadUint64(data, &handle)) {
479         HDF_LOGE("%{public}s: read handle data failed!", __func__);
480         return HDF_ERR_INVALID_PARAM;
481     }
482     if (!HdfSbufReadUint32(data, &timeoutMs)) {
483         HDF_LOGE("%{public}s: read timeoutMs data failed!", __func__);
484         return HDF_ERR_INVALID_PARAM;
485     }
486     if (!HdfSbufReadUint32(data, &bufCnt)) {
487         HDF_LOGE("%{public}s: read bufferCnt failed!", __func__);
488         return HDF_ERR_INVALID_PARAM;
489     }
490     if (bufCnt == 0) {
491         HDF_LOGE("%{public}s: Param bufCnt err!", __func__);
492         return HDF_ERR_INVALID_PARAM;
493     }
494     inputData = (CodecBuffer *)OsalMemAlloc(sizeof(CodecBuffer) + sizeof(CodecBufferInfo) * bufCnt);
495     if (inputData == NULL) {
496         HDF_LOGE("%{public}s: OsalMemAlloc failed!", __func__);
497         return HDF_ERR_MALLOC_FAIL;
498     }
499     inputData->bufferCnt = bufCnt;
500     int32_t errNum = CodecDequeueInput((CODEC_HANDLETYPE)(uintptr_t)handle, timeoutMs, &acquireFd, inputData);
501     if (errNum != HDF_SUCCESS) {
502         if (errNum != HDF_ERR_TIMEOUT) {
503             HDF_LOGE("%{public}s: call CodecDequeInput fuc failed!", __func__);
504         }
505         OsalMemFree(inputData);
506         return errNum;
507     }
508     if (CodecSerPackFenceFd(reply, acquireFd) != HDF_SUCCESS) {
509         HDF_LOGE("%{public}s: write acquireFd failed!", __func__);
510         OsalMemFree(inputData);
511         return HDF_ERR_INVALID_PARAM;
512     }
513     if (CodecSerPackCodecBuffer(reply, inputData)) {
514         HDF_LOGE("%{public}s: struct inputData write failed!", __func__);
515         OsalMemFree(inputData);
516         return HDF_ERR_INVALID_PARAM;
517     }
518     OsalMemFree(inputData);
519     return HDF_SUCCESS;
520 }
521 
SerCodecQueueOutput(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)522 static int32_t SerCodecQueueOutput(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
523 {
524     uint32_t timeoutMs = 0;
525     int releaseFenceFd = -1;
526     uint64_t handle = 0;
527     uint32_t bufCnt = 0;
528     CodecBuffer *outInfo = NULL;
529     if (!HdfSbufReadUint64(data, &handle)) {
530         HDF_LOGE("%{public}s: read handle data failed!", __func__);
531         return HDF_ERR_INVALID_PARAM;
532     }
533     if (!HdfSbufReadUint32(data, &bufCnt)) {
534         HDF_LOGE("%{public}s: read bufferCnt failed!", __func__);
535         return HDF_ERR_INVALID_PARAM;
536     }
537     if (bufCnt == 0) {
538         HDF_LOGE("%{public}s: Param bufCnt err!", __func__);
539         return HDF_ERR_INVALID_PARAM;
540     }
541     outInfo = (CodecBuffer *)OsalMemAlloc(sizeof(CodecBuffer) + sizeof(CodecBufferInfo) * bufCnt);
542     if (outInfo == NULL) {
543         HDF_LOGE("%{public}s: OsalMemAlloc failed!", __func__);
544         return HDF_ERR_MALLOC_FAIL;
545     }
546     outInfo->bufferCnt = bufCnt;
547     if (CodecSerParseCodecBuffer(data, outInfo)) {
548         HDF_LOGE("%{public}s: read struct data failed!", __func__);
549         OsalMemFree(outInfo);
550         return HDF_ERR_INVALID_PARAM;
551     }
552     if (!HdfSbufReadUint32(data, &timeoutMs)) {
553         HDF_LOGE("%{public}s: read timeoutMs data failed!", __func__);
554         OsalMemFree(outInfo);
555         return HDF_ERR_INVALID_PARAM;
556     }
557     if (CodecSerParseFenceFd(data, &releaseFenceFd) != HDF_SUCCESS) {
558         HDF_LOGE("%{public}s: read releaseFenceFd failed!", __func__);
559         OsalMemFree(outInfo);
560         return HDF_ERR_INVALID_PARAM;
561     }
562     int32_t errNum = CodecQueueOutput((CODEC_HANDLETYPE)(uintptr_t)handle, outInfo, timeoutMs, releaseFenceFd);
563     if (errNum != HDF_SUCCESS) {
564         HDF_LOGE("%{public}s: call CodecQueueOutput fuc failed!", __func__);
565         OsalMemFree(outInfo);
566         return errNum;
567     }
568 
569     OsalMemFree(outInfo);
570     return HDF_SUCCESS;
571 }
572 
SerCodecDequeueOutput(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)573 static int32_t SerCodecDequeueOutput(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
574 {
575     uint32_t timeoutMs = 0;
576     int32_t acquireFd = 0;
577     uint64_t handle = 0;
578     uint32_t bufCnt = 0;
579     CodecBuffer *outInfo = NULL;
580     if (!HdfSbufReadUint64(data, &handle)) {
581         HDF_LOGE("%{public}s: read handle data failed!", __func__);
582         return HDF_ERR_INVALID_PARAM;
583     }
584     if (!HdfSbufReadUint32(data, &timeoutMs)) {
585         HDF_LOGE("%{public}s: read timeoutMs data failed!", __func__);
586         return HDF_ERR_INVALID_PARAM;
587     }
588     if (!HdfSbufReadUint32(data, &bufCnt)) {
589         HDF_LOGE("%{public}s: read bufferCnt failed!", __func__);
590         return HDF_ERR_INVALID_PARAM;
591     }
592     if (bufCnt == 0) {
593         HDF_LOGE("%{public}s: Param bufCnt err!", __func__);
594         return HDF_ERR_INVALID_PARAM;
595     }
596     outInfo = (CodecBuffer *)OsalMemAlloc(sizeof(CodecBuffer) + sizeof(CodecBufferInfo) * bufCnt);
597     if (outInfo == NULL) {
598         HDF_LOGE("%{public}s: OsalMemAlloc failed!", __func__);
599         return HDF_ERR_MALLOC_FAIL;
600     }
601     outInfo->bufferCnt = bufCnt;
602 
603     int32_t errNum = CodecDequeueOutput((CODEC_HANDLETYPE)(uintptr_t)handle, timeoutMs, &acquireFd, outInfo);
604     if (errNum != HDF_SUCCESS) {
605         if (errNum != HDF_ERR_TIMEOUT) {
606             HDF_LOGE("%{public}s: call CodecDequeueOutput fuc failed!", __func__);
607         }
608         OsalMemFree(outInfo);
609         return errNum;
610     }
611     if (CodecSerPackFenceFd(reply, acquireFd) != HDF_SUCCESS) {
612         HDF_LOGE("%{public}s: write acquireFd failed!", __func__);
613         OsalMemFree(outInfo);
614         return HDF_ERR_INVALID_PARAM;
615     }
616     if (CodecSerPackCodecBuffer(reply, outInfo)) {
617         HDF_LOGE("%{public}s: write outInfo buffer failed!", __func__);
618         OsalMemFree(outInfo);
619         return HDF_ERR_INVALID_PARAM;
620     }
621     OsalMemFree(outInfo);
622     return HDF_SUCCESS;
623 }
624 
SerCodecSetCallback(struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)625 static int32_t SerCodecSetCallback(struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
626 {
627     uint64_t handle = 0;
628     UINTPTR instance;
629     struct ICodecCallback *cb = NULL;
630     if (!HdfSbufReadUint64(data, &handle)) {
631         HDF_LOGE("%{public}s: read handle data failed!", __func__);
632         return HDF_ERR_INVALID_PARAM;
633     }
634     struct HdfRemoteService *cbRemote = HdfSbufReadRemoteService(data);
635     if (cbRemote == NULL) {
636         HDF_LOGE("%{public}s: read cbRemote failed!", __func__);
637         return HDF_ERR_INVALID_PARAM;
638     }
639     cb = CodecProxyCallbackObtain(cbRemote);
640     if (!HdfSbufReadUint32(data, (uint32_t *)&instance)) {
641         HDF_LOGE("%{public}s: read instance data failed!", __func__);
642         return HDF_ERR_INVALID_PARAM;
643     }
644     int32_t errNum = CodecSetCallback((CODEC_HANDLETYPE)(uintptr_t)handle, &cb->callback, instance);
645     if (errNum != HDF_SUCCESS) {
646         HDF_LOGE("%{public}s: call CodecSetCallback fuc failed!", __func__);
647         return errNum;
648     }
649     return errNum;
650 }
651 
HandleRequestCmdExt(struct HdfDeviceIoClient * client,int cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)652 static int32_t HandleRequestCmdExt(struct HdfDeviceIoClient *client, int cmdId,
653     struct HdfSBuf *data, struct HdfSBuf *reply)
654 {
655     switch (cmdId) {
656         case CMD_CODEC_QUEQUE_INPUT:
657             return SerCodecQueueInput(client, data, reply);
658         case CMD_CODEC_DEQUEQUE_INPUT:
659             return SerCodecDequeueInput(client, data, reply);
660         case CMD_CODEC_QUEQUE_OUTPUT:
661             return SerCodecQueueOutput(client, data, reply);
662         case CMD_CODEC_DEQUEQUE_OUTPUT:
663             return SerCodecDequeueOutput(client, data, reply);
664         case CMD_CODEC_SET_CBK:
665             return SerCodecSetCallback(client, data, reply);
666         default: {
667             HDF_LOGE("%{public}s: not support cmd %{public}d", __func__, cmdId);
668             return HDF_ERR_INVALID_PARAM;
669         }
670     }
671 }
672 
HandleRequestCmd(struct HdfDeviceIoClient * client,int cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)673 static int32_t HandleRequestCmd(struct HdfDeviceIoClient *client, int cmdId,
674     struct HdfSBuf *data, struct HdfSBuf *reply)
675 {
676     switch (cmdId) {
677         case CMD_CODEC_INIT:
678             return SerCodecInit(client, data, reply);
679         case CMD_CODEC_DEINIT:
680             return SerCodecDeinit(client, data, reply);
681         case CMD_CODEC_ENUM_CAP:
682             return SerCodecEnumerateCapability(client, data, reply);
683         case CMD_CODEC_GET_CAP:
684             return SerCodecGetCapability(client, data, reply);
685         case CMD_CODEC_CREATE:
686             return SerCodecCreate(client, data, reply);
687         case CMD_CODEC_CREATE_BY_TYPE:
688             return SerCodecCreateByType(client, data, reply);
689         case CMD_CODEC_DESTROY:
690             return SerCodecDestroy(client, data, reply);
691         case CMD_CODEC_SET_MODE:
692             return SerCodecSetPortMode(client, data, reply);
693         case CMD_CODEC_GET_MODE:
694             return SerCodecGetPortMode(client, data, reply);
695         case CMD_CODEC_SET_PARAMS:
696             return SerCodecSetParameter(client, data, reply);
697         case CMD_CODEC_GET_PARAMS:
698             return SerCodecGetParameter(client, data, reply);
699         case CMD_CODEC_START:
700             return SerCodecStart(client, data, reply);
701         case CMD_CODEC_STOP:
702             return SerCodecStop(client, data, reply);
703         case CMD_CODEC_RESET:
704             return SerCodecReset(client, data, reply);
705         case CMD_CODEC_FLUSH:
706             return SerCodecFlush(client, data, reply);
707         default: {
708             return HandleRequestCmdExt(client, cmdId, data, reply);
709         }
710     }
711 }
712 
CodecServiceOnRemoteRequest(struct HdfDeviceIoClient * client,int cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)713 int32_t CodecServiceOnRemoteRequest(struct HdfDeviceIoClient *client, int cmdId,
714     struct HdfSBuf *data, struct HdfSBuf *reply)
715 {
716     if (!HdfDeviceObjectCheckInterfaceDesc(client->device, data)) {
717         HDF_LOGE("check interface token failed");
718         return HDF_ERR_INVALID_PARAM;
719     }
720     if ((cmdId == CMD_CODEC_ENUM_CAP) || (cmdId == CMD_CODEC_GET_CAP)) {
721         if (!CodecCapablitesInited()) {
722             ReloadCapabilities();
723         }
724     }
725     return HandleRequestCmd(client, cmdId, data, reply);
726 }
727