1 /*
2 * Copyright (c) 2022 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 "native_image.h"
17 #include "surface.h"
18 #include "surface_image.h"
19 #include "window.h"
20 #include "surface_utils.h"
21
22 using namespace OHOS;
23
24 struct OH_NativeImage {
25 OHOS::sptr<OHOS::SurfaceImage> consumer = nullptr;
26 OHOS::sptr<OHOS::IBufferProducer> producer = nullptr;
27 OHOS::sptr<OHOS::Surface> pSurface = nullptr;
28 struct NativeWindow* nativeWindow = nullptr;
29 };
30
OH_NativeImage_Create(uint32_t textureId,uint32_t textureTarget)31 OH_NativeImage* OH_NativeImage_Create(uint32_t textureId, uint32_t textureTarget)
32 {
33 OHOS::sptr<OHOS::SurfaceImage> surfaceImage = new SurfaceImage(textureId, textureTarget);
34 sptr<OHOS::IBufferProducer> producer = surfaceImage->GetProducer();
35 OH_NativeImage* nativeImage = new OH_NativeImage();
36 nativeImage->consumer = surfaceImage;
37 nativeImage->producer = producer;
38 sptr<IBufferConsumerListener> listener = new SurfaceImageListener(surfaceImage);
39 nativeImage->consumer->RegisterConsumerListener(listener);
40 return nativeImage;
41 }
42
OH_ConsumerSurface_Create()43 OH_NativeImage* OH_ConsumerSurface_Create()
44 {
45 OHOS::sptr<OHOS::SurfaceImage> surfaceImage = new SurfaceImage();
46 sptr<OHOS::IBufferProducer> producer = surfaceImage->GetProducer();
47 OH_NativeImage* nativeImage = new OH_NativeImage();
48 nativeImage->consumer = surfaceImage;
49 nativeImage->producer = producer;
50 sptr<IBufferConsumerListener> listener = new SurfaceImageListener(surfaceImage);
51 nativeImage->consumer->RegisterConsumerListener(listener);
52 return nativeImage;
53 }
54
OH_NativeImage_AcquireNativeWindow(OH_NativeImage * image)55 OHNativeWindow* OH_NativeImage_AcquireNativeWindow(OH_NativeImage* image)
56 {
57 if (image == nullptr) {
58 BLOGE("parameter error");
59 return nullptr;
60 }
61
62 if (image->nativeWindow == nullptr) {
63 if (image->pSurface == nullptr) {
64 image->pSurface = Surface::CreateSurfaceAsProducer(image->producer);
65 }
66 BLOGE_CHECK_AND_RETURN_RET(image->pSurface != nullptr, nullptr, "pSurface is null");
67 image->nativeWindow = CreateNativeWindowFromSurface(&(image->pSurface));
68 }
69
70 return image->nativeWindow;
71 }
72
OH_NativeImage_AttachContext(OH_NativeImage * image,uint32_t textureId)73 int32_t OH_NativeImage_AttachContext(OH_NativeImage* image, uint32_t textureId)
74 {
75 if (image == nullptr || image->consumer == nullptr) {
76 BLOGE("parameter error");
77 return SURFACE_ERROR_INVALID_PARAM;
78 }
79 return image->consumer->AttachContext(textureId);
80 }
81
OH_NativeImage_DetachContext(OH_NativeImage * image)82 int32_t OH_NativeImage_DetachContext(OH_NativeImage* image)
83 {
84 if (image == nullptr || image->consumer == nullptr) {
85 BLOGE("parameter error");
86 return SURFACE_ERROR_INVALID_PARAM;
87 }
88 return image->consumer->DetachContext();
89 }
90
OH_NativeImage_UpdateSurfaceImage(OH_NativeImage * image)91 int32_t OH_NativeImage_UpdateSurfaceImage(OH_NativeImage* image)
92 {
93 if (image == nullptr || image->consumer == nullptr) {
94 BLOGE("parameter error");
95 return SURFACE_ERROR_INVALID_PARAM;
96 }
97 return image->consumer->UpdateSurfaceImage();
98 }
99
OH_NativeImage_GetTimestamp(OH_NativeImage * image)100 int64_t OH_NativeImage_GetTimestamp(OH_NativeImage* image)
101 {
102 if (image == nullptr || image->consumer == nullptr) {
103 BLOGE("parameter error");
104 return -1;
105 }
106 return image->consumer->GetTimeStamp();
107 }
108
OH_NativeImage_GetTransformMatrix(OH_NativeImage * image,float matrix[16])109 int32_t OH_NativeImage_GetTransformMatrix(OH_NativeImage* image, float matrix[16])
110 {
111 if (image == nullptr || image->consumer == nullptr || matrix == nullptr) {
112 BLOGE("parameter error");
113 return SURFACE_ERROR_INVALID_PARAM;
114 }
115 return image->consumer->GetTransformMatrix(matrix);
116 }
117
OH_NativeImage_GetTransformMatrixV2(OH_NativeImage * image,float matrix[16])118 int32_t OH_NativeImage_GetTransformMatrixV2(OH_NativeImage* image, float matrix[16])
119 {
120 if (image == nullptr || image->consumer == nullptr || matrix == nullptr) {
121 BLOGE("parameter error");
122 return SURFACE_ERROR_INVALID_PARAM;
123 }
124 return image->consumer->GetTransformMatrixV2(matrix);
125 }
126
OH_NativeImage_GetBufferMatrix(OH_NativeImage * image,float matrix[16])127 int32_t OH_NativeImage_GetBufferMatrix(OH_NativeImage* image, float matrix[16])
128 {
129 if (image == nullptr || image->consumer == nullptr || matrix == nullptr) {
130 BLOGE("parameter error");
131 return SURFACE_ERROR_INVALID_PARAM;
132 }
133 return image->consumer->GetBufferMatrix(matrix);
134 }
135
OH_NativeImage_GetSurfaceId(OH_NativeImage * image,uint64_t * surfaceId)136 int32_t OH_NativeImage_GetSurfaceId(OH_NativeImage* image, uint64_t* surfaceId)
137 {
138 if (image == nullptr || surfaceId == nullptr || image->consumer == nullptr) {
139 BLOGE("parameter error");
140 return SURFACE_ERROR_INVALID_PARAM;
141 }
142 *surfaceId = image->consumer->GetUniqueId();
143
144 if (image->pSurface == nullptr) {
145 image->pSurface = Surface::CreateSurfaceAsProducer(image->producer);
146 }
147 BLOGE_CHECK_AND_RETURN_RET(image->pSurface != nullptr, SURFACE_ERROR_UNKOWN, "pSurface is null");
148 return SURFACE_ERROR_OK;
149 }
150
OH_NativeImage_SetOnFrameAvailableListener(OH_NativeImage * image,OH_OnFrameAvailableListener listener)151 int32_t OH_NativeImage_SetOnFrameAvailableListener(OH_NativeImage* image, OH_OnFrameAvailableListener listener)
152 {
153 if (image == nullptr || image->consumer == nullptr) {
154 BLOGE("parameter error");
155 return SURFACE_ERROR_INVALID_PARAM;
156 }
157 return image->consumer->SetOnBufferAvailableListener(listener.context, listener.onFrameAvailable);
158 }
159
OH_NativeImage_UnsetOnFrameAvailableListener(OH_NativeImage * image)160 int32_t OH_NativeImage_UnsetOnFrameAvailableListener(OH_NativeImage* image)
161 {
162 if (image == nullptr || image->consumer == nullptr) {
163 BLOGE("parameter error");
164 return SURFACE_ERROR_INVALID_PARAM;
165 }
166 return image->consumer->UnsetOnBufferAvailableListener();
167 }
168
OH_NativeImage_Destroy(OH_NativeImage ** image)169 void OH_NativeImage_Destroy(OH_NativeImage** image)
170 {
171 if (image == nullptr || *image == nullptr) {
172 BLOGE("parameter error");
173 return;
174 }
175 if ((*image)->consumer != nullptr) {
176 (void)(*image)->consumer->UnsetOnBufferAvailableListener();
177 }
178
179 if ((*image)->nativeWindow != nullptr) {
180 DestoryNativeWindow((*image)->nativeWindow);
181 (*image)->nativeWindow = nullptr;
182 }
183
184 delete *image;
185 *image = nullptr;
186 }
187
OH_NativeImage_AcquireNativeWindowBuffer(OH_NativeImage * image,OHNativeWindowBuffer ** nativeWindowBuffer,int32_t * fenceFd)188 int32_t OH_NativeImage_AcquireNativeWindowBuffer(OH_NativeImage* image,
189 OHNativeWindowBuffer** nativeWindowBuffer, int32_t* fenceFd)
190 {
191 if (image == nullptr || image->consumer == nullptr) {
192 BLOGE("parameter error");
193 return SURFACE_ERROR_INVALID_PARAM;
194 }
195 return image->consumer->AcquireNativeWindowBuffer(nativeWindowBuffer, fenceFd);
196 }
197
OH_NativeImage_ReleaseNativeWindowBuffer(OH_NativeImage * image,OHNativeWindowBuffer * nativeWindowBuffer,int32_t fenceFd)198 int32_t OH_NativeImage_ReleaseNativeWindowBuffer(OH_NativeImage* image,
199 OHNativeWindowBuffer* nativeWindowBuffer, int32_t fenceFd)
200 {
201 if (image == nullptr || image->consumer == nullptr) {
202 if (fenceFd >= 0) {
203 close(fenceFd);
204 }
205 BLOGE("parameter error");
206 return SURFACE_ERROR_INVALID_PARAM;
207 }
208 return image->consumer->ReleaseNativeWindowBuffer(nativeWindowBuffer, fenceFd);
209 }
210
211
OH_ConsumerSurface_SetDefaultUsage(OH_NativeImage * image,uint64_t usage)212 int32_t OH_ConsumerSurface_SetDefaultUsage(OH_NativeImage* image, uint64_t usage)
213 {
214 if (image == nullptr || image->consumer == nullptr) {
215 BLOGE("parameter error");
216 return SURFACE_ERROR_INVALID_PARAM;
217 }
218 return image->consumer->SetDefaultUsage(usage);
219 }
220
OH_ConsumerSurface_SetDefaultSize(OH_NativeImage * image,int32_t width,int32_t height)221 int32_t OH_ConsumerSurface_SetDefaultSize(OH_NativeImage* image, int32_t width, int32_t height)
222 {
223 if (image == nullptr || image->consumer == nullptr || width <= 0 || height <= 0) {
224 BLOGE("parameter error");
225 return SURFACE_ERROR_INVALID_PARAM;
226 }
227 return image->consumer->SetDefaultSize(width, height);
228 }
229
OH_NativeImage_SetDropBufferMode(OH_NativeImage * image,bool isOpen)230 int32_t OH_NativeImage_SetDropBufferMode(OH_NativeImage* image, bool isOpen)
231 {
232 if (image == nullptr || image->consumer == nullptr) {
233 BLOGE("parameter error");
234 return SURFACE_ERROR_INVALID_PARAM;
235 }
236 return image->consumer->SetDropBufferSwitch(isOpen);
237 }