1
2 /*
3 * Copyright (c) 2021 Huawei Device Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "buffer_adapter.h"
18
19 namespace OHOS::Camera {
SurfaceBufferToCameraBuffer(const OHOS::sptr<OHOS::SurfaceBuffer> & surfaceBuffer,const std::shared_ptr<IBuffer> & buffer)20 RetCode BufferAdapter::SurfaceBufferToCameraBuffer(const OHOS::sptr<OHOS::SurfaceBuffer>& surfaceBuffer,
21 const std::shared_ptr<IBuffer>& buffer)
22 {
23 CHECK_IF_EQUAL_RETURN_VALUE(buffer == nullptr || surfaceBuffer == nullptr, true, RC_ERROR);
24 CHECK_IF_NOT_EQUAL_RETURN_VALUE(buffer->GetSourceType(),
25 CAMERA_BUFFER_SOURCE_TYPE_EXTERNAL, RC_ERROR);
26 BufferHandle* bufHandle = surfaceBuffer->GetBufferHandle();
27 if (bufHandle == nullptr) {
28 CAMERA_LOGE("bufHandle is null cannot convert");
29 return RC_ERROR;
30 }
31
32 buffer->SetPhyAddress(bufHandle->phyAddr);
33 buffer->SetFileDescriptor(bufHandle->fd);
34 buffer->SetStride(bufHandle->stride);
35 buffer->SetWidth(bufHandle->width);
36 buffer->SetHeight(bufHandle->height);
37 int32_t format = static_cast<int32_t>(PixelFormatToCameraFormat(static_cast<PixelFormat>(bufHandle->format)));
38 buffer->SetFormat(format);
39 buffer->SetUsage(CameraUsageToGrallocUsage(bufHandle->usage));
40 buffer->SetSize(static_cast<uint32_t>(bufHandle->size));
41 if (bufHandle->virAddr != nullptr) {
42 buffer->SetVirAddress(bufHandle->virAddr);
43 }
44
45 return RC_OK;
46 }
47
CameraBufferToSurfaceBuffer(const std::shared_ptr<IBuffer> & buffer,const OHOS::sptr<OHOS::SurfaceBuffer> & surfaceBuffer)48 RetCode BufferAdapter::CameraBufferToSurfaceBuffer(const std::shared_ptr<IBuffer>& buffer,
49 const OHOS::sptr<OHOS::SurfaceBuffer>& surfaceBuffer)
50 {
51 CHECK_IF_EQUAL_RETURN_VALUE(buffer == nullptr || surfaceBuffer == nullptr, true, RC_ERROR);
52 CHECK_IF_NOT_EQUAL_RETURN_VALUE(buffer->GetSourceType(),
53 CAMERA_BUFFER_SOURCE_TYPE_EXTERNAL, RC_ERROR);
54
55 BufferHandle* pHandle = surfaceBuffer->GetBufferHandle();
56 if (pHandle == nullptr) {
57 CAMERA_LOGE("pHandle is null cannot convert");
58 return RC_ERROR;
59 }
60 pHandle->phyAddr = buffer->GetPhyAddress();
61 pHandle->fd = buffer->GetFileDescriptor();
62 pHandle->stride = static_cast<int32_t>(buffer->GetStride());
63 pHandle->width = static_cast<int32_t>(buffer->GetWidth());
64 pHandle->height = static_cast<int32_t>(buffer->GetHeight());
65 pHandle->format = CameraFormatToPixelFormat(buffer->GetFormat());
66 pHandle->usage =
67 static_cast<uint64_t>(GrallocUsageToCameraUsage(buffer->GetUsage()));
68 pHandle->virAddr = buffer->GetVirAddress();
69 pHandle->size = static_cast<int32_t>(buffer->GetSize());
70
71 return RC_OK;
72 }
73
SetExtInfoToSurfaceBuffer(const std::shared_ptr<IBuffer> & buffer,const OHOS::sptr<OHOS::SurfaceBuffer> & surfaceBuffer)74 RetCode BufferAdapter::SetExtInfoToSurfaceBuffer(const std::shared_ptr<IBuffer>& buffer,
75 const OHOS::sptr<OHOS::SurfaceBuffer>& surfaceBuffer)
76 {
77 CHECK_IF_EQUAL_RETURN_VALUE(buffer == nullptr || surfaceBuffer == nullptr, true, RC_ERROR);
78 CHECK_IF_NOT_EQUAL_RETURN_VALUE(buffer->GetSourceType(),
79 CAMERA_BUFFER_SOURCE_TYPE_EXTERNAL, RC_ERROR);
80
81 EsFrameInfo info = buffer->GetEsFrameInfo();
82 if (info.size != -1) {
83 surfaceBuffer->SetInt32(FRAME_SIZE_TAG, info.size);
84 }
85 return RC_OK;
86 }
87
PixelFormatToCameraFormat(const PixelFormat format)88 uint32_t BufferAdapter::PixelFormatToCameraFormat(const PixelFormat format)
89 {
90 uint32_t cameraFormat = CAMERA_FORMAT_INVALID;
91 switch (format) {
92 case PIXEL_FMT_YUV_422_I:
93 cameraFormat = CAMERA_FORMAT_YUV_422_I;
94 break;
95 case PIXEL_FMT_YCBCR_422_SP:
96 cameraFormat = CAMERA_FORMAT_YCBCR_422_SP;
97 break;
98 case PIXEL_FMT_YCRCB_422_SP:
99 cameraFormat = CAMERA_FORMAT_YCBCR_422_SP;
100 break;
101 case PIXEL_FMT_YCBCR_420_SP:
102 cameraFormat = CAMERA_FORMAT_YCBCR_420_SP;
103 break;
104 case PIXEL_FMT_YCRCB_420_SP:
105 cameraFormat = CAMERA_FORMAT_YCRCB_420_SP;
106 break;
107 case PIXEL_FMT_YCBCR_422_P:
108 cameraFormat = CAMERA_FORMAT_YCBCR_422_P;
109 break;
110 case PIXEL_FMT_YCRCB_422_P:
111 cameraFormat = CAMERA_FORMAT_YCRCB_422_P;
112 break;
113 case PIXEL_FMT_YCBCR_420_P:
114 cameraFormat = CAMERA_FORMAT_YCBCR_420_P;
115 break;
116 case PIXEL_FMT_YCRCB_420_P:
117 cameraFormat = CAMERA_FORMAT_YCRCB_420_P;
118 break;
119 case PIXEL_FMT_YUYV_422_PKG:
120 cameraFormat = CAMERA_FORMAT_YCBCR_422_SP;
121 break;
122 case PIXEL_FMT_UYVY_422_PKG:
123 cameraFormat = CAMERA_FORMAT_UYVY_422_PKG;
124 break;
125 case PIXEL_FMT_YVYU_422_PKG:
126 cameraFormat = CAMERA_FORMAT_YVYU_422_PKG;
127 break;
128 case PIXEL_FMT_VYUY_422_PKG:
129 cameraFormat = CAMERA_FORMAT_VYUY_422_PKG;
130 break;
131 case PIXEL_FMT_RGBA_8888:
132 cameraFormat = CAMERA_FORMAT_RGBA_8888;
133 break;
134 default:
135 cameraFormat = CAMERA_FORMAT_INVALID;
136 break;
137 }
138
139 return cameraFormat;
140 }
141
CameraFormatToPixelFormat(const uint32_t cameraFormat)142 PixelFormat BufferAdapter::CameraFormatToPixelFormat(const uint32_t cameraFormat)
143 {
144 PixelFormat format = PIXEL_FMT_BUTT;
145 switch (cameraFormat) {
146 case CAMERA_FORMAT_YUV_422_I:
147 format = PIXEL_FMT_YUV_422_I;
148 break;
149 case CAMERA_FORMAT_YCBCR_422_SP:
150 format = PIXEL_FMT_YCBCR_422_SP;
151 break;
152 case CAMERA_FORMAT_YCRCB_422_SP:
153 format = PIXEL_FMT_YCRCB_422_SP;
154 break;
155 case CAMERA_FORMAT_YCBCR_420_SP:
156 format = PIXEL_FMT_YCBCR_420_SP;
157 break;
158 case CAMERA_FORMAT_YCRCB_420_SP:
159 format = PIXEL_FMT_YCRCB_420_SP;
160 break;
161 case CAMERA_FORMAT_YCBCR_422_P:
162 format = PIXEL_FMT_YCBCR_422_P;
163 break;
164 case CAMERA_FORMAT_YCRCB_422_P:
165 format = PIXEL_FMT_YCRCB_422_P;
166 break;
167 case CAMERA_FORMAT_YCBCR_420_P:
168 format = PIXEL_FMT_YCBCR_420_P;
169 break;
170 case CAMERA_FORMAT_YCRCB_420_P:
171 format = PIXEL_FMT_YCRCB_420_P;
172 break;
173 case CAMERA_FORMAT_YUYV_422_PKG:
174 format = PIXEL_FMT_YUYV_422_PKG;
175 break;
176 case CAMERA_FORMAT_UYVY_422_PKG:
177 format = PIXEL_FMT_UYVY_422_PKG;
178 break;
179 case CAMERA_FORMAT_YVYU_422_PKG:
180 format = PIXEL_FMT_YVYU_422_PKG;
181 break;
182 case CAMERA_FORMAT_VYUY_422_PKG:
183 format = PIXEL_FMT_VYUY_422_PKG;
184 break;
185 case CAMERA_FORMAT_RGBA_8888:
186 format = PIXEL_FMT_RGBA_8888;
187 break;
188 default:
189 format = PIXEL_FMT_BUTT;
190 break;
191 }
192
193 return format;
194 }
195
CameraUsageToGrallocUsage(const uint64_t cameraUsage)196 uint64_t BufferAdapter::CameraUsageToGrallocUsage(const uint64_t cameraUsage)
197 {
198 uint64_t grallocUsage = 0;
199 uint64_t test = 1;
200 const uint32_t BYTE = 8; // 8 bits per byte
201 for (uint32_t i = 0; i < sizeof(cameraUsage) * BYTE; i++) {
202 switch (cameraUsage & (test << i)) {
203 case CAMERA_USAGE_SW_READ_OFTEN:
204 grallocUsage |= HBM_USE_CPU_READ;
205 break;
206 case CAMERA_USAGE_SW_WRITE_OFTEN:
207 grallocUsage |= HBM_USE_CPU_WRITE;
208 break;
209 case CAMERA_USAGE_MEM_DMA:
210 grallocUsage |= HBM_USE_MEM_DMA;
211 break;
212 default:
213 break;
214 }
215 }
216
217 return grallocUsage;
218 }
219
GrallocUsageToCameraUsage(const uint64_t usage)220 uint64_t BufferAdapter::GrallocUsageToCameraUsage(const uint64_t usage)
221 {
222 uint64_t cameraUsage = 0;
223 uint64_t test = 1;
224 const uint32_t BYTE = 8; // 8 bits per byte
225 for (uint32_t i = 0; i < sizeof(usage) * BYTE; i++) {
226 switch (usage & (test << i)) {
227 case HBM_USE_CPU_READ:
228 cameraUsage |= CAMERA_USAGE_SW_READ_OFTEN;
229 break;
230 case HBM_USE_CPU_WRITE:
231 cameraUsage |= CAMERA_USAGE_SW_WRITE_OFTEN;
232 break;
233 case HBM_USE_MEM_DMA:
234 cameraUsage |= CAMERA_USAGE_MEM_DMA;
235 break;
236 default:
237 break;
238 }
239 }
240
241 return cameraUsage;
242 }
243 } // namespace OHOS::Camera
244