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