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, ¶mCnt)) {
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, ¶ms[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, ¶mCnt)) {
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, ¶ms[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, ¶ms[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