1 /*
2 * Copyright (c) 2023-2024 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
16 #include <buffer_handle.h>
17 #include <cstdlib>
18 #include <securec.h>
19 #include <stdint.h>
20 #include <unistd.h>
21
22 #include "camera_log.h"
23
24
25 namespace OHOS {
26 namespace CameraStandard {
27 #define BUFFER_HANDLE_RESERVE_MAX_SIZE 1024
28
CameraAllocateBufferHandle(uint32_t reserveFds,uint32_t reserveInts)29 BufferHandle *CameraAllocateBufferHandle(uint32_t reserveFds, uint32_t reserveInts)
30 {
31 CHECK_ERROR_RETURN_RET_LOG(reserveFds > BUFFER_HANDLE_RESERVE_MAX_SIZE || reserveInts >
32 BUFFER_HANDLE_RESERVE_MAX_SIZE, nullptr, "CameraAllocateBufferHandle reserveFds or reserveInts too lager");
33 size_t handleSize = sizeof(BufferHandle) + (sizeof(int32_t) * (reserveFds + reserveInts));
34 BufferHandle *handle = static_cast<BufferHandle *>(malloc(handleSize));
35 if (handle != nullptr) {
36 (void)memset_s(handle, handleSize, 0, handleSize);
37 handle->fd = -1;
38 for (uint32_t i = 0; i < reserveFds; i++) {
39 handle->reserve[i] = -1;
40 }
41 handle->reserveFds = reserveFds;
42 handle->reserveInts = reserveInts;
43 } else {
44 MEDIA_ERR_LOG("InitBufferHandle malloc %zu failed", handleSize);
45 }
46 return handle;
47 }
48
CameraFreeBufferHandle(BufferHandle * handle)49 int32_t CameraFreeBufferHandle(BufferHandle *handle)
50 {
51 CHECK_ERROR_RETURN_RET_LOG(handle == nullptr, 0, "CameraFreeBufferHandle with nullptr handle");
52 if (handle->fd >= 0) {
53 close(handle->fd);
54 handle->fd = -1;
55 }
56 const uint32_t reserveFds = handle->reserveFds;
57 for (uint32_t i = 0; i < reserveFds; i++) {
58 if (handle->reserve[i] >= 0) {
59 close(handle->reserve[i]);
60 handle->reserve[i] = -1;
61 }
62 }
63 free(handle);
64 return 0;
65 }
66
CameraCloneBufferHandle(const BufferHandle * handle)67 BufferHandle *CameraCloneBufferHandle(const BufferHandle *handle)
68 {
69 CHECK_ERROR_RETURN_RET_LOG(handle == nullptr, nullptr, "%{public}s handle is nullptr", __func__);
70 BufferHandle *newHandle = CameraAllocateBufferHandle(handle->reserveFds, handle->reserveInts);
71 CHECK_ERROR_RETURN_RET_LOG(newHandle == nullptr, nullptr,
72 "%{public}s CameraAllocateBufferHandle failed, newHandle is nullptr", __func__);
73
74 if (handle->fd == -1) {
75 newHandle->fd = handle->fd;
76 } else {
77 newHandle->fd = dup(handle->fd);
78 if (newHandle->fd == -1) {
79 MEDIA_ERR_LOG("CameraCloneBufferHandle dup failed");
80 CameraFreeBufferHandle(newHandle);
81 return nullptr;
82 }
83 }
84 newHandle->width = handle->width;
85 newHandle->stride = handle->stride;
86 newHandle->height = handle->height;
87 newHandle->size = handle->size;
88 newHandle->format = handle->format;
89 newHandle->usage = handle->usage;
90 newHandle->phyAddr = handle->phyAddr;
91
92 // 此处当前缺乏reserveFds中各个fd的dup,原因在于surfacebuffer中reserveFds fd不合法。且相机流程中reserveFds暂时无用
93
94 if (handle->reserveInts == 0) {
95 MEDIA_INFO_LOG("There is no reserved integer value in old handle, no need to copy");
96 return newHandle;
97 }
98
99 if (memcpy_s(&newHandle->reserve[newHandle->reserveFds], sizeof(int32_t) * newHandle->reserveInts,
100 &handle->reserve[handle->reserveFds], sizeof(int32_t) * handle->reserveInts) != EOK) {
101 MEDIA_ERR_LOG("CameraCloneBufferHandle memcpy_s failed");
102 CameraFreeBufferHandle(newHandle);
103 return nullptr;
104 }
105 return newHandle;
106 }
107
108 } // namespace CameraStandard
109 } // namespace OHOS
110