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::SurfaceBuffer * surfaceBuffer,const std::shared_ptr<OHOS::Surface> & surface,const std::shared_ptr<IBuffer> & buffer)20 RetCode BufferAdapter::SurfaceBufferToCameraBuffer(const OHOS::SurfaceBuffer* surfaceBuffer,
21     const std::shared_ptr<OHOS::Surface>& surface,
22     const std::shared_ptr<IBuffer>& buffer)
23 {
24     CHECK_IF_EQUAL_RETURN_VALUE(buffer == nullptr || surfaceBuffer == nullptr, true, RC_ERROR);
25     CHECK_IF_NOT_EQUAL_RETURN_VALUE(buffer->GetSourceType(),
26         CAMERA_BUFFER_SOURCE_TYPE_EXTERNAL, RC_ERROR);
27 
28     buffer->SetPhyAddress(surfaceBuffer->GetPhyAddr());
29     buffer->SetStride(surface->GetStride());
30     buffer->SetWidth(surface->GetWidth());
31     buffer->SetHeight(surface->GetHeight());
32     int32_t format = static_cast<int32_t>(PixelFormatToCameraFormat(surface->GetFormat()));
33     buffer->SetFormat(format);
34     buffer->SetUsage(CameraUsageToGrallocUsage(surface->GetUsage()));
35     buffer->SetSize(static_cast<uint32_t>(surfaceBuffer->GetSize()));
36     if (surfaceBuffer->GetVirAddr() != nullptr) {
37         buffer->SetVirAddress(surfaceBuffer->GetVirAddr());
38     }
39 
40     return RC_OK;
41 }
42 
SetExtInfoToSurfaceBuffer(const std::shared_ptr<IBuffer> & buffer,const std::shared_ptr<OHOS::SurfaceBuffer> & surfaceBuffer)43 RetCode BufferAdapter::SetExtInfoToSurfaceBuffer(const std::shared_ptr<IBuffer>& buffer,
44     const std::shared_ptr<OHOS::SurfaceBuffer>& surfaceBuffer)
45 {
46     CHECK_IF_EQUAL_RETURN_VALUE(buffer == nullptr || surfaceBuffer == nullptr, true, RC_ERROR);
47     CHECK_IF_NOT_EQUAL_RETURN_VALUE(buffer->GetSourceType(),
48         CAMERA_BUFFER_SOURCE_TYPE_EXTERNAL, RC_ERROR);
49 
50     EsFrameInfo info = buffer->GetEsFrameInfo();
51     if (info.size != -1) {
52         surfaceBuffer->SetInt32(FRAME_SIZE_TAG_UINT32, info.size);
53     }
54     return RC_OK;
55 }
56 
PixelFormatToCameraFormat(const uint32_t format)57 uint32_t BufferAdapter::PixelFormatToCameraFormat(const uint32_t format)
58 {
59     uint32_t cameraFormat = CAMERA_FORMAT_INVALID;
60     switch (format) {
61         case IMAGE_PIXEL_FORMAT_RGB565:
62             cameraFormat = CAMERA_FORMAT_RGB_565;
63             break;
64         case IMAGE_PIXEL_FORMAT_ARGB1555:
65             cameraFormat = CAMERA_FORMAT_RGBA_5551;
66             break;
67         case IMAGE_PIXEL_FORMAT_ARGB8888:
68             cameraFormat = CAMERA_FORMAT_RGBA_8888;
69             break;
70         case IMAGE_PIXEL_FORMAT_NV12:
71             cameraFormat = CAMERA_FORMAT_YCBCR_420_SP;
72             break;
73         case IMAGE_PIXEL_FORMAT_NV21:
74             cameraFormat = CAMERA_FORMAT_YCRCB_420_SP;
75             break;
76         case IMAGE_PIXEL_FORMAT_YUV420:
77             cameraFormat = CAMERA_FORMAT_YCBCR_420_P;
78             break;
79         case IMAGE_PIXEL_FORMAT_YVU420:
80             cameraFormat = CAMERA_FORMAT_YCRCB_420_P;
81             break;
82         default:
83             cameraFormat = CAMERA_FORMAT_INVALID;
84     }
85 
86     return cameraFormat;
87 }
88 
CameraFormatToPixelFormat(const uint32_t cameraFormat)89 uint32_t BufferAdapter::CameraFormatToPixelFormat(const uint32_t cameraFormat)
90 {
91     uint32_t format = IMAGE_PIXEL_FORMAT_NONE;
92     switch (cameraFormat) {
93         case CAMERA_FORMAT_RGB_565:
94             format = IMAGE_PIXEL_FORMAT_RGB565;
95             break;
96         case CAMERA_FORMAT_RGBA_5551:
97             format = IMAGE_PIXEL_FORMAT_ARGB1555;
98             break;
99         case CAMERA_FORMAT_RGBA_8888:
100             format = IMAGE_PIXEL_FORMAT_ARGB8888;
101             break;
102         case CAMERA_FORMAT_YCBCR_420_SP:
103             format = IMAGE_PIXEL_FORMAT_NV12;
104             break;
105         case CAMERA_FORMAT_YCRCB_420_SP:
106             format = IMAGE_PIXEL_FORMAT_NV21;
107             break;
108         case CAMERA_FORMAT_YCBCR_420_P:
109             format = IMAGE_PIXEL_FORMAT_YUV420;
110             break;
111         case CAMERA_FORMAT_YCRCB_420_P:
112             format = IMAGE_PIXEL_FORMAT_YVU420;
113             break;
114         default:
115             format = IMAGE_PIXEL_FORMAT_NONE;
116             break;
117     }
118 
119     return format;
120 }
121 
CameraUsageToGrallocUsage(const uint64_t cameraUsage)122 uint64_t BufferAdapter::CameraUsageToGrallocUsage(const uint64_t cameraUsage)
123 {
124     uint64_t grallocUsage = 0;
125     uint64_t test = 1;
126     const uint32_t bitsPerByte = 8; // 8 bits per byte
127     for (uint32_t i = 0; i < sizeof(cameraUsage) * bitsPerByte; i++) {
128         switch (cameraUsage & (test << i)) {
129             case CAMERA_USAGE_MEM_SHARE:
130                 grallocUsage |= BUFFER_CONSUMER_USAGE_SORTWARE;
131                 break;
132             case CAMERA_USAGE_MEM_MMZ:
133                 grallocUsage |= BUFFER_CONSUMER_USAGE_HARDWARE_PRODUCER_CACHE;
134                 break;
135             case CAMERA_USAGE_MEM_MMZ_CACHE:
136                 grallocUsage |= BUFFER_CONSUMER_USAGE_HARDWARE_CONSUMER_CACHE;
137                 break;
138             default:
139                 break;
140         }
141     }
142 
143     return grallocUsage;
144 }
145 
GrallocUsageToCameraUsage(const uint64_t usage)146 uint64_t BufferAdapter::GrallocUsageToCameraUsage(const uint64_t usage)
147 {
148     uint64_t cameraUsage = 0;
149     uint64_t test = 1;
150     const uint32_t bitsPerByte = 8; // 8 bits per byte
151     for (uint32_t i = 0; i < sizeof(usage) * bitsPerByte; i++) {
152         switch (usage & (test << i)) {
153             case BUFFER_CONSUMER_USAGE_SORTWARE:
154                 cameraUsage |= CAMERA_USAGE_MEM_SHARE;
155                 break;
156             case BUFFER_CONSUMER_USAGE_HARDWARE:
157             case BUFFER_CONSUMER_USAGE_HARDWARE_PRODUCER_CACHE:
158                 cameraUsage |= CAMERA_USAGE_MEM_MMZ;
159                 break;
160             case BUFFER_CONSUMER_USAGE_HARDWARE_CONSUMER_CACHE:
161                 cameraUsage |= CAMERA_USAGE_MEM_MMZ_CACHE;
162                 break;
163             default:
164                 break;
165         }
166     }
167 
168     return cameraUsage;
169 }
170 } // namespace OHOS::Camera
171