• 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 "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