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