• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_RETURN_RET_ELOG(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_RETURN_RET_ELOG(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_RETURN_RET_ELOG(handle == nullptr, nullptr, "%{public}s handle is nullptr", __func__);
70     BufferHandle *newHandle = CameraAllocateBufferHandle(handle->reserveFds, handle->reserveInts);
71     CHECK_RETURN_RET_ELOG(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->stride = handle->stride;
85     newHandle->width = handle->width;
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