• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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