1 /*
2 * Copyright (c) 2022 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 "common_msgproc.h"
16 #include <buffer_handle_utils.h>
17 #include <hdf_log.h>
18
19 #define HDF_LOG_TAG codec_hdi_bufferhandle
20
PackBufferHandle(struct HdfSBuf * data,BufferHandle * handle)21 bool PackBufferHandle(struct HdfSBuf *data, BufferHandle *handle)
22 {
23 if (handle == NULL) {
24 HDF_LOGE("%{public}s: handle is NULL!", __func__);
25 return false;
26 }
27
28 uint8_t validFd = 0;
29 if (!HdfSbufWriteUint32(data, handle->reserveFds) || !HdfSbufWriteUint32(data, handle->reserveInts) ||
30 !HdfSbufWriteInt32(data, handle->width) || !HdfSbufWriteInt32(data, handle->stride) ||
31 !HdfSbufWriteInt32(data, handle->height) || !HdfSbufWriteInt32(data, handle->size) ||
32 !HdfSbufWriteInt32(data, handle->format) || !HdfSbufWriteInt64(data, handle->usage) ||
33 !HdfSbufWriteUint64(data, handle->phyAddr) || !HdfSbufWriteInt32(data, handle->key)) {
34 HDF_LOGE("%{public}s: write handle failed!", __func__);
35 return false;
36 }
37
38 validFd = (handle->fd >= 0);
39 if (!HdfSbufWriteUint8(data, validFd)) {
40 HDF_LOGE("%{public}s: write uint8_t failed!", __func__);
41 return false;
42 }
43 if (validFd && !HdfSbufWriteFileDescriptor(data, handle->fd)) {
44 HDF_LOGE("%{public}s: write fd failed!", __func__);
45 return false;
46 }
47
48 for (uint32_t i = 0; i < handle->reserveFds; i++) {
49 if (!HdfSbufWriteFileDescriptor(data, handle->reserve[i])) {
50 HDF_LOGE("%{public}s: write handle->reserve[%{public}d] failed!", __func__, i);
51 return false;
52 }
53 }
54
55 for (uint32_t i = 0; i < handle->reserveInts; i++) {
56 if (!HdfSbufWriteInt32(data, handle->reserve[i + handle->reserveFds])) {
57 HDF_LOGE("%{public}s: write handle->reserve[%{public}d] failed!", __func__, i + handle->reserveFds);
58 return false;
59 }
60 }
61
62 return true;
63 }
64
ParseBufferHandle(struct HdfSBuf * data,BufferHandle ** handle)65 bool ParseBufferHandle(struct HdfSBuf *data, BufferHandle **handle)
66 {
67 uint8_t validFd = 0;
68 uint32_t reserveFds = 0;
69 uint32_t reserveInts = 0;
70 if (!HdfSbufReadUint32(data, &reserveFds) || !HdfSbufReadUint32(data, &reserveInts)) {
71 HDF_LOGE("%{public}s: read reserveFds or reserveInts failed!", __func__);
72 return false;
73 }
74
75 BufferHandle *tmpHandle = AllocateBufferHandle(reserveFds, reserveInts);
76 if (tmpHandle == NULL) {
77 HDF_LOGE("%{public}s: allocate buffer handle failed!", __func__);
78 return false;
79 }
80
81 if (!HdfSbufReadInt32(data, &tmpHandle->width) || !HdfSbufReadInt32(data, &tmpHandle->stride) ||
82 !HdfSbufReadInt32(data, &tmpHandle->height) || !HdfSbufReadInt32(data, &tmpHandle->size) ||
83 !HdfSbufReadInt32(data, &tmpHandle->format) || !HdfSbufReadUint64(data, &tmpHandle->usage) ||
84 !HdfSbufReadUint64(data, &tmpHandle->phyAddr) || !HdfSbufReadInt32(data, &tmpHandle->key)) {
85 HDF_LOGE("%{public}s: read handle failed!", __func__);
86 FreeBufferHandle(tmpHandle);
87 return false;
88 }
89
90 if (!HdfSbufReadUint8(data, &validFd)) {
91 HDF_LOGE("%{public}s: read handle bool value failed!", __func__);
92 FreeBufferHandle(tmpHandle);
93 return false;
94 }
95
96 if (validFd != 0) {
97 tmpHandle->fd = HdfSbufReadFileDescriptor(data);
98 }
99
100 for (uint32_t i = 0; i < tmpHandle->reserveFds; i++) {
101 tmpHandle->reserve[i] = HdfSbufReadFileDescriptor(data);
102 }
103
104 for (uint32_t i = 0; i < tmpHandle->reserveInts; i++) {
105 if (!HdfSbufReadInt32(data, &tmpHandle->reserve[tmpHandle->reserveFds + i])) {
106 HDF_LOGE("%{public}s: read reserve bool value failed!", __func__);
107 FreeBufferHandle(tmpHandle);
108 return false;
109 }
110 }
111 *handle = tmpHandle;
112 return true;
113 }
114