• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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         BLOGE("parameter error");
203         return SURFACE_ERROR_INVALID_PARAM;
204     }
205     return image->consumer->ReleaseNativeWindowBuffer(nativeWindowBuffer, fenceFd);
206 }
207 
208 
OH_ConsumerSurface_SetDefaultUsage(OH_NativeImage * image,uint64_t usage)209 int32_t OH_ConsumerSurface_SetDefaultUsage(OH_NativeImage* image, uint64_t usage)
210 {
211     if (image == nullptr || image->consumer == nullptr) {
212         BLOGE("parameter error");
213         return SURFACE_ERROR_INVALID_PARAM;
214     }
215     return image->consumer->SetDefaultUsage(usage);
216 }
217 
OH_ConsumerSurface_SetDefaultSize(OH_NativeImage * image,int32_t width,int32_t height)218 int32_t OH_ConsumerSurface_SetDefaultSize(OH_NativeImage* image, int32_t width, int32_t height)
219 {
220     if (image == nullptr || image->consumer == nullptr || width <= 0 || height <= 0) {
221         BLOGE("parameter error");
222         return SURFACE_ERROR_INVALID_PARAM;
223     }
224     return image->consumer->SetDefaultSize(width, height);
225 }
226 
OH_NativeImage_SetDropBufferMode(OH_NativeImage * image,bool isOpen)227 int32_t OH_NativeImage_SetDropBufferMode(OH_NativeImage* image, bool isOpen)
228 {
229     if (image == nullptr || image->consumer == nullptr) {
230         BLOGE("parameter error");
231         return SURFACE_ERROR_INVALID_PARAM;
232     }
233     return image->consumer->SetDropBufferSwitch(isOpen);
234 }
235