1 /*
2 * Copyright (c) 2024 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 <hilog/log.h>
17 #include "image_receiver_module_test.h"
18
19 #define IMAGE_LOG_TAG "IMAGE_RECEIVER_TAGLOG"
20 #define IMAGE_LOG_DOMAIN 0x3200
21 #define LOG(fmt, ...) (void)OH_LOG_Print(LOG_APP, LOG_INFO, IMAGE_LOG_DOMAIN, IMAGE_LOG_TAG, fmt, ##__VA_ARGS__)
22
ImageReceiverModuleTest()23 ImageReceiverModuleTest::ImageReceiverModuleTest()
24 {
25 }
26
~ImageReceiverModuleTest()27 ImageReceiverModuleTest::~ImageReceiverModuleTest()
28 {
29 DestroyImageReceiver();
30 }
31
CreateImageReceiver(uint32_t width,uint32_t height,uint32_t capacity)32 Image_ErrorCode ImageReceiverModuleTest::CreateImageReceiver(uint32_t width, uint32_t height, uint32_t capacity)
33 {
34 LOG("CreateImageReceiver enter.");
35 if (imageReceiver_ != nullptr) {
36 if (ReuseSameRecevier(width, height, capacity)) {
37 LOG("Reuse last create ImageReceiver.");
38 return IMAGE_SUCCESS;
39 } else {
40 DestroyImageReceiver();
41 }
42 }
43 OH_ImageReceiverOptions *options = nullptr;
44 Image_ErrorCode ret = OH_ImageReceiverOptions_Create(&options);
45 if (ret != IMAGE_SUCCESS) {
46 LOG("Create Image Receiver options failed: err = %{public}d.", ret);
47 return ret;
48 }
49
50 width_ = width;
51 height_ = height;
52 capacity_ = capacity;
53 Image_Size size = { width_, height_ };
54 ret = OH_ImageReceiverOptions_SetSize(options, size);
55 if (ret != IMAGE_SUCCESS) {
56 OH_ImageReceiverOptions_Release(options);
57 LOG("Set Image Receiver options size(%{public}dx%{public}d) failed: err = %{public}d.",
58 size.width, size.height, ret);
59 return ret;
60 }
61 ret = OH_ImageReceiverOptions_SetCapacity(options, capacity_);
62 if (ret != IMAGE_SUCCESS) {
63 OH_ImageReceiverOptions_Release(options);
64 LOG("Set Image Receiver options capacity(%{public}d) failed: err = %{public}d.",
65 capacity, ret);
66 return ret;
67 }
68 ret = VerifyImageReceiverOptions(options);
69 if (ret != IMAGE_SUCCESS) {
70 OH_ImageReceiverOptions_Release(options);
71 LOG("Set Image Receiver options capacity(%{public}d) failed: err = %{public}d.",
72 capacity, ret);
73 return ret;
74 }
75 ret = OH_ImageReceiverNative_Create(options, &imageReceiver_);
76 if (ret != IMAGE_SUCCESS) {
77 OH_ImageReceiverOptions_Release(options);
78 LOG("Create Image Receiver failed: err = %{public}d.", ret);
79 return ret;
80 }
81 OH_ImageReceiverOptions_Release(options);
82 LOG("CreateImageReceiver end.");
83 return ret;
84 }
85
DestroyImageReceiver()86 Image_ErrorCode ImageReceiverModuleTest::DestroyImageReceiver()
87 {
88 LOG("DestroyImageReceiver enter.");
89 Image_ErrorCode ret = OH_ImageReceiverNative_Release(imageReceiver_);
90 if (ret != IMAGE_SUCCESS) {
91 LOG("Release Image Receiver failed: err = %{public}d.", ret);
92 return ret;
93 }
94 imageReceiver_ = nullptr;
95 LOG("DestroyImageReceiver end.");
96 return ret;
97 }
98
GetImageReceiverSurfaceId(uint64_t * surfaceId)99 Image_ErrorCode ImageReceiverModuleTest::GetImageReceiverSurfaceId(uint64_t *surfaceId)
100 {
101 LOG("GetImageReceiverSurfaceId enter.");
102 Image_ErrorCode ret = OH_ImageReceiverNative_GetReceivingSurfaceId(imageReceiver_, surfaceId);
103 if (ret != IMAGE_SUCCESS) {
104 LOG("Get Image Receiver SurfaceId failed: err = %{public}d.", ret);
105 return ret;
106 }
107 LOG("GetImageReceiverSurfaceId end.");
108 return ret;
109 }
110
GetImageReceiverLatestImage(OH_ImageNative ** image)111 Image_ErrorCode ImageReceiverModuleTest::GetImageReceiverLatestImage(OH_ImageNative **image)
112 {
113 LOG("GetImageReceiverLatestImage enter.");
114 Image_ErrorCode ret = OH_ImageReceiverNative_ReadLatestImage(imageReceiver_, image);
115 if (ret != IMAGE_SUCCESS) {
116 LOG("Read Image Receiver Latest Image failed: err = %{public}d.", ret);
117 return ret;
118 }
119 LOG("GetImageReceiverLatestImage end.");
120
121 int64_t timestamp = 0;
122 ret = OH_ImageNative_GetTimestamp(*image, ×tamp);
123 if (ret != IMAGE_SUCCESS) {
124 LOG("Get imageReceiverLatestImage failed : timestamp is : %{public}lld., err = %{public}d.",
125 static_cast<long long>(timestamp), ret);
126 return ret;
127 }
128 LOG("GetImageReceiverLatestImage %{public}s timestamp is : %{public}lld.", __func__,
129 static_cast<long long>(timestamp));
130 return ret;
131 }
132
GetImageReceiverNextImage(OH_ImageNative ** image)133 Image_ErrorCode ImageReceiverModuleTest::GetImageReceiverNextImage(OH_ImageNative **image)
134 {
135 LOG("GetImageReceiverNextImage enter.");
136 Image_ErrorCode ret = OH_ImageReceiverNative_ReadNextImage(imageReceiver_, image);
137 if (ret != IMAGE_SUCCESS) {
138 LOG("Read Image Receiver Next Image failed: err = %{public}d.", ret);
139 return ret;
140 }
141 LOG("GetImageReceiverNextImage end.");
142
143 int64_t timestamp = 0;
144 ret = OH_ImageNative_GetTimestamp(*image, ×tamp);
145 if (ret != IMAGE_SUCCESS) {
146 LOG("Get imageReceiverNextImage failed : timestamp is : %{public}lld., err = %{public}d.",
147 static_cast<long long>(timestamp), ret);
148 return ret;
149 }
150 LOG("GetImageReceiverNextImage %{public}s timestamp is : %{public}lld.", __func__,
151 static_cast<long long>(timestamp));
152 return ret;
153 }
154
RegisterImageReceiverListener(OH_ImageReceiver_OnCallback callback)155 Image_ErrorCode ImageReceiverModuleTest::RegisterImageReceiverListener(OH_ImageReceiver_OnCallback callback)
156 {
157 LOG("RegisterImageReceiverListener enter.");
158 Image_ErrorCode ret = OH_ImageReceiverNative_On(imageReceiver_, callback);
159 if (ret != IMAGE_SUCCESS) {
160 LOG("Register Image Receiver on callback failed: err = %{public}d.", ret);
161 return ret;
162 }
163 LOG("RegisterImageReceiverListener end.");
164 return ret;
165 }
166
UnregisterImageReceiverListener()167 Image_ErrorCode ImageReceiverModuleTest::UnregisterImageReceiverListener()
168 {
169 LOG("UnregisterImageReceiverListener enter.");
170 Image_ErrorCode ret = OH_ImageReceiverNative_Off(imageReceiver_);
171 if (ret != IMAGE_SUCCESS) {
172 LOG("Register Image Receiver on callback failed: err = %{public}d.", ret);
173 return ret;
174 }
175 LOG("UnregisterImageReceiverListener end.");
176 return ret;
177 }
178
VerifyImageReceiver()179 Image_ErrorCode ImageReceiverModuleTest::VerifyImageReceiver()
180 {
181 LOG("VerifyImageReceiver enter.");
182 Image_ErrorCode ret = IMAGE_SUCCESS;
183
184 Image_Size size = { 0 };
185 ret = OH_ImageReceiverNative_GetSize(imageReceiver_, &size);
186 if (ret != IMAGE_SUCCESS) {
187 LOG("Get Image Receiver size failed: err = %{public}d.", ret);
188 return ret;
189 }
190 LOG("Image Receiver size = %{public}dx%{public}d.", size.width, size.height);
191 if (size.width != width_ || size.height != height_) {
192 LOG("Get Image Receiver options size value is wrong: "
193 "expect(%{public}dx%{public}d) actual(%{public}dx%{public}d).",
194 width_, height_, size.width, size.height);
195 return IMAGE_BAD_PARAMETER;
196 }
197
198 int32_t capacity = 0;
199 ret = OH_ImageReceiverNative_GetCapacity(imageReceiver_, &capacity);
200 if (ret != IMAGE_SUCCESS) {
201 LOG("Get Image Receiver capacity failed: err = %{public}d.", ret);
202 return ret;
203 }
204 LOG("Image Receiver capacity = %{public}d.", capacity);
205 if (capacity != capacity_) {
206 LOG("Get Image Receiver capacity value is wrong: "
207 "expect(%{public}d) actual(%{public}d).",
208 capacity_, capacity);
209 return IMAGE_BAD_PARAMETER;
210 }
211
212 uint64_t id = 0;
213 ret = OH_ImageReceiverNative_GetReceivingSurfaceId(imageReceiver_, &id);
214 if (ret != IMAGE_SUCCESS) {
215 LOG("Get Image Receiver SurfaceId failed: err = %{public}d.", ret);
216 return ret;
217 }
218 LOG("Image Receiver surfaceId = %{public}llu.", static_cast<unsigned long long>(id));
219 if (id == 0) {
220 LOG("Get Image Receiver SurfaceId is zero.");
221 return IMAGE_BAD_PARAMETER;
222 }
223
224 LOG("VerifyImageReceiver end.");
225 return ret;
226 }
227
DumpImageInfo(OH_ImageNative * image)228 Image_ErrorCode ImageReceiverModuleTest::DumpImageInfo(OH_ImageNative *image)
229 {
230 LOG("DumpImageInfo enter.");
231 Image_Size size = { 0 };
232 std::vector<uint32_t> types;
233
234 if (GetImageSize(image, &size) != IMAGE_SUCCESS ||
235 GetImageComponentTypes(image, &types) != IMAGE_SUCCESS) {
236 LOG("Get Image property failed");
237 return IMAGE_BAD_PARAMETER;
238 }
239
240 LOG("=== Start dump image(%{public}p) ===.", image);
241 LOG("Get %{public}lu components.", static_cast<unsigned long>(types.size()));
242 for (uint32_t i = 0; i < types.size(); i++) {
243 OH_NativeBuffer* nativeBuffer = nullptr;
244 size_t bufferSize = 0;
245 int32_t rowStride = 0;
246 int32_t pixelStride = 0;
247 if (GetImageByteBuffer(image, types[i], &nativeBuffer) != IMAGE_SUCCESS ||
248 GetImageBufferSize(image, types[i], &bufferSize) != IMAGE_SUCCESS ||
249 GetImageRowStride(image, types[i], &rowStride) != IMAGE_SUCCESS ||
250 GetImagePixelStride(image, types[i], &pixelStride) != IMAGE_SUCCESS) {
251 LOG("Get Image property failed.");
252 return IMAGE_BAD_PARAMETER;
253 }
254 LOG("Image component(%{public}d): ByteBuffer(%{public}p) Size(%{public}lu "
255 "Stride(row %{public}d pixel %{public}d)).",
256 types[i], nativeBuffer, static_cast<unsigned long>(bufferSize), rowStride, pixelStride);
257 }
258 LOG("=== End dump image(%{public}p) ===.", image);
259
260 LOG("DumpImageInfo end.");
261 return IMAGE_SUCCESS;
262 }
263
ReleaseImage(OH_ImageNative * image)264 Image_ErrorCode ImageReceiverModuleTest::ReleaseImage(OH_ImageNative *image)
265 {
266 LOG("ReleaseImage enter.");
267 Image_ErrorCode ret = OH_ImageNative_Release(image);
268 if (ret != IMAGE_SUCCESS) {
269 LOG("Release Image failed: err = %{public}d.", ret);
270 return ret;
271 }
272 LOG("ReleaseImage end.");
273 return ret;
274 }
275
ReuseSameRecevier(uint32_t width,uint32_t height,uint32_t capacity)276 bool ImageReceiverModuleTest::ReuseSameRecevier(uint32_t width, uint32_t height, uint32_t capacity)
277 {
278 if (width == width_ && height == height_ && capacity == capacity_) {
279 return true;
280 }
281 return false;
282 }
283
VerifyImageReceiverOptions(OH_ImageReceiverOptions * options)284 Image_ErrorCode ImageReceiverModuleTest::VerifyImageReceiverOptions(OH_ImageReceiverOptions *options)
285 {
286 LOG("VerifyImageReceiverOptions enter.");
287 Image_ErrorCode ret = IMAGE_SUCCESS;
288
289 Image_Size size = { 0 };
290 ret = OH_ImageReceiverOptions_GetSize(options, &size);
291 if (ret != IMAGE_SUCCESS) {
292 LOG("Get Image Receiver options size failed: err = %{public}d.", ret);
293 return ret;
294 }
295 LOG("Image Receiver options size = %{public}dx%{public}d.", size.width, size.height);
296 if (size.width != width_ || size.height != height_) {
297 LOG("Get Image Receiver options size value is wrong: "
298 "expect(%{public}dx%{public}d) actual(%{public}dx%{public}d).",
299 width_, height_, size.width, size.height);
300 return IMAGE_BAD_PARAMETER;
301 }
302
303 int32_t capacity = 0;
304 ret = OH_ImageReceiverOptions_GetCapacity(options, &capacity);
305 if (ret != IMAGE_SUCCESS) {
306 LOG("Get Image Receiver options capacity failed: err = %{public}d.", ret);
307 return ret;
308 }
309 LOG("Image Receiver options capacity = %{public}d.", capacity);
310 if (capacity != capacity_) {
311 LOG("Get Image Receiver options capacity value is wrong: "
312 "expect(%{public}d) actual(%{public}d).",
313 capacity_, capacity);
314 return IMAGE_BAD_PARAMETER;
315 }
316
317 LOG("VerifyImageReceiverOptions end.");
318 return ret;
319 }
320
GetImageSize(OH_ImageNative * image,Image_Size * size)321 Image_ErrorCode ImageReceiverModuleTest::GetImageSize(OH_ImageNative *image, Image_Size *size)
322 {
323 Image_ErrorCode ret = OH_ImageNative_GetImageSize(image, size);
324 if (ret != IMAGE_SUCCESS) {
325 LOG("Get Image size failed: err = %{public}d.", ret);
326 return ret;
327 }
328 return ret;
329 }
330
GetImageComponentTypes(OH_ImageNative * image,std::vector<uint32_t> * types)331 Image_ErrorCode ImageReceiverModuleTest::GetImageComponentTypes(OH_ImageNative *image, std::vector<uint32_t> *types)
332 {
333 if (types == nullptr) {
334 LOG("Types is nullptr.");
335 return IMAGE_BAD_PARAMETER;
336 }
337
338 size_t typeSize = 0;
339 Image_ErrorCode ret = OH_ImageNative_GetComponentTypes(image, nullptr, &typeSize);
340 if (ret != IMAGE_SUCCESS) {
341 LOG("Get Image component types failed: err = %{public}d.", ret);
342 return ret;
343 }
344
345 uint32_t *typesArr = nullptr;
346 if (typeSize <= 0) {
347 return IMAGE_BAD_PARAMETER;
348 } else {
349 typesArr = new uint32_t[typeSize];
350 }
351
352 if (typesArr == nullptr) {
353 return IMAGE_ALLOC_FAILED;
354 }
355
356 ret = OH_ImageNative_GetComponentTypes(image, &typesArr, &typeSize);
357 if (ret != IMAGE_SUCCESS) {
358 delete [] typesArr;
359 LOG("Get Image component types failed: err = %{public}d.", ret);
360 return ret;
361 }
362
363 types->resize(typeSize);
364 for (uint32_t i = 0; i < typeSize; i++) {
365 types->push_back(typesArr[i]);
366 }
367
368 return ret;
369 }
370
GetImageByteBuffer(OH_ImageNative * image,int32_t type,OH_NativeBuffer ** nativeBuffer)371 Image_ErrorCode ImageReceiverModuleTest::GetImageByteBuffer(OH_ImageNative *image, int32_t type,
372 OH_NativeBuffer **nativeBuffer)
373 {
374 Image_ErrorCode ret = OH_ImageNative_GetByteBuffer(image, type, nativeBuffer);
375 if (ret != IMAGE_SUCCESS) {
376 LOG("Get Image ByteBuffer failed: err = %{public}d.", ret);
377 return ret;
378 }
379 return ret;
380 }
381
GetImageBufferSize(OH_ImageNative * image,int32_t type,size_t * size)382 Image_ErrorCode ImageReceiverModuleTest::GetImageBufferSize(OH_ImageNative *image, int32_t type, size_t *size)
383 {
384 Image_ErrorCode ret = OH_ImageNative_GetBufferSize(image, type, size);
385 if (ret != IMAGE_SUCCESS) {
386 LOG("Get Image buffer size failed: err = %{public}d.", ret);
387 return ret;
388 }
389 return ret;
390 }
391
GetImageRowStride(OH_ImageNative * image,int32_t type,int32_t * rowStride)392 Image_ErrorCode ImageReceiverModuleTest::GetImageRowStride(OH_ImageNative *image, int32_t type, int32_t *rowStride)
393 {
394 Image_ErrorCode ret = OH_ImageNative_GetRowStride(image, type, rowStride);
395 if (ret != IMAGE_SUCCESS) {
396 LOG("Get Image buffer rowStride failed: err = %{public}d.", ret);
397 return ret;
398 }
399 return ret;
400 }
401
GetImagePixelStride(OH_ImageNative * image,int32_t type,int32_t * pixelStride)402 Image_ErrorCode ImageReceiverModuleTest::GetImagePixelStride(OH_ImageNative *image, int32_t type, int32_t *pixelStride)
403 {
404 Image_ErrorCode ret = OH_ImageNative_GetPixelStride(image, type, pixelStride);
405 if (ret != IMAGE_SUCCESS) {
406 LOG("Get Image buffer pixelStride failed: err = %{public}d.", ret);
407 return ret;
408 }
409 return ret;
410 }
411