1# Using Image_NativeModule to Receive Images
2
3You can use the **ImageReceiver** class to obtain the surface ID of a component, read the latest image or the next image, and release **ImageReceiver** instances.
4
5## How to Develop
6
7### Adding Dependencies
8
9Open the **src/main/cpp/CMakeLists.txt** file of the native project, add **libohimage.so**, **libimage_receiver.so**, **libnative_image.so**, and **libhilog_ndk.z.so** (on which the log APIs depend) to the **target_link_libraries** dependency.
10
11```txt
12target_link_libraries(entry PUBLIC libhilog_ndk.z.so libohimage.so libimage_receiver.so libnative_image.so)
13```
14
15### Calling the Native APIs
16
17For details about the APIs, see [Image_NativeModule](../../reference/apis-image-kit/_image___native_module.md).
18
19Implement the C native APIs in **hello.cpp**. Refer to the sample code below.
20
21```c++
22#include <hilog/log.h>
23#include <multimedia/image_framework/image/image_native.h>
24#include <multimedia/image_framework/image/image_receiver_native.h>
25
26#undef LOG_DOMAIN
27#define LOG_DOMAIN 0x3200
28
29#undef LOG_TAG
30#define LOG_TAG "MY_TAG"
31
32#define IMAGE_WIDTH 320
33#define IMAGE_HEIGHT 480
34#define IMAGE_CAPACITY 2
35
36static void OnCallback(OH_ImageReceiverNative *receiver)
37{
38    OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest buffer avaliable.");
39}
40
41static void ImageReceiverNativeCTest()
42{
43    // Create an OH_ImageReceiverOptions instance.
44    OH_ImageReceiverOptions* options = nullptr;
45    Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(&options);
46    if (errCode != IMAGE_SUCCESS) {
47        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver options failed, errCode: %{public}d.", errCode);
48        return;
49    }
50
51    Image_Size imgSize;
52    imgSize.width = IMAGE_WIDTH;
53    imgSize.height = IMAGE_HEIGHT;
54
55    // Set the size attribute of OH_ImageReceiverOptions.
56    errCode = OH_ImageReceiverOptions_SetSize(options, imgSize);
57    if (errCode != IMAGE_SUCCESS) {
58        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options size failed, errCode: %{public}d.", errCode);
59        OH_ImageReceiverOptions_Release(options);
60        return;
61    }
62
63    // Set the capacity attribute of OH_ImageReceiverOptions.
64    errCode = OH_ImageReceiverOptions_SetCapacity(options, IMAGE_CAPACITY);
65    if (errCode != IMAGE_SUCCESS) {
66        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options capacity failed, errCode: %{public}d.", errCode);
67        OH_ImageReceiverOptions_Release(options);
68        return;
69    }
70
71    // Read the size attribute of OH_ImageReceiverOptions.
72    Image_Size imgSizeRead;
73    errCode = OH_ImageReceiverOptions_GetSize(options, &imgSizeRead);
74    if (errCode != IMAGE_SUCCESS) {
75        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options size failed, errCode: %{public}d.", errCode);
76        OH_ImageReceiverOptions_Release(options);
77        return;
78    }
79
80    // Check whether the size read is the same as the size set.
81    if (imgSizeRead.width != IMAGE_WIDTH || imgSizeRead.height != IMAGE_HEIGHT) {
82        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options size failed, width: %{public}d, height: %{public}d.", imgSizeRead.width, imgSizeRead.height);
83        OH_ImageReceiverOptions_Release(options);
84        return;
85    }
86
87    // Read the capacity attribute of OH_ImageReceiverOptions.
88    int32_t capacity = 0;
89    errCode = OH_ImageReceiverOptions_GetCapacity(options, &capacity);
90    if (errCode != IMAGE_SUCCESS) {
91        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options capacity failed, errCode: %{public}d.", errCode);
92        OH_ImageReceiverOptions_Release(options);
93        return;
94    }
95
96    // Check whether the capacity read is the same as the capacity set.
97    if (capacity != IMAGE_CAPACITY) {
98        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options capacity failed, capacity: %{public}d.", capacity);
99        OH_ImageReceiverOptions_Release(options);
100        return;
101    }
102
103    // Create an OH_ImageReceiverNative instance.
104    OH_ImageReceiverNative* receiver = nullptr;
105    errCode = OH_ImageReceiverNative_Create(options, &receiver);
106    if (errCode != IMAGE_SUCCESS) {
107        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver failed, errCode: %{public}d.", errCode);
108        OH_ImageReceiverOptions_Release(options);
109        return;
110    }
111
112    // Register a callback event. Each time a new image is received, the callback event is triggered.
113    uint64_t surfaceID = 0;
114    errCode = OH_ImageReceiverNative_On(receiver, OnCallback);
115    if (errCode != IMAGE_SUCCESS) {
116        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest image receiver on failed, errCode: %{public}d.", errCode);
117        OH_ImageReceiverOptions_Release(options);
118        OH_ImageReceiverNative_Release(receiver);
119        return;
120    }
121
122    // Read the surface ID attribute of OH_ImageReceiverNative.
123    uint64_t surfaceID = 0;
124    errCode = OH_ImageReceiverNative_GetReceivingSurfaceId(receiver, &surfaceID);
125    if (errCode != IMAGE_SUCCESS) {
126        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver surfaceID failed, errCode: %{public}d.", errCode);
127        OH_ImageReceiverOptions_Release(options);
128        OH_ImageReceiverNative_Release(receiver);
129        return;
130    }
131    OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver surfaceID: %{public}llu.", surfaceID);
132
133    // Read the size attribute of OH_ImageReceiverNative.
134    errCode = OH_ImageReceiverNative_GetSize(receiver, &imgSizeRead);
135    if (errCode != IMAGE_SUCCESS) {
136        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver size failed, errCode: %{public}d.", errCode);
137        OH_ImageReceiverOptions_Release(options);
138        OH_ImageReceiverNative_Release(receiver);
139        return;
140    }
141    OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver size: width = %{public}d, height = %{public}d.", imgSizeRead.width, imgSizeRead.height);
142
143    // Read the capacity attribute of OH_ImageReceiverNative.
144    errCode = OH_ImageReceiverNative_GetCapacity(receiver, &capacity);
145    if (errCode != IMAGE_SUCCESS) {
146        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver capacity failed, errCode: %{public}d.", errCode);
147        OH_ImageReceiverOptions_Release(options);
148        OH_ImageReceiverNative_Release(receiver);
149        return;
150    }
151    OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver capacity: %{public}d.", capacity);
152
153    // Read the next image object of OH_ImageReceiverNative.
154    OH_ImageNative* image = nullptr;
155    errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image);
156    if (errCode != IMAGE_SUCCESS) {
157        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed, errCode: %{public}d.", errCode);
158        OH_ImageReceiverOptions_Release(options);
159        OH_ImageReceiverNative_Release(receiver);
160        return;
161    }
162
163    // Release the OH_ImageNative instance.
164    errCode = OH_ImageNative_Release(image);
165    if (errCode != IMAGE_SUCCESS) {
166        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode);
167    }
168
169    // Read the latest image object of OH_ImageReceiverNative.
170    errCode = OH_ImageReceiverNative_ReadLatestImage(receiver, &image);
171    if (errCode != IMAGE_SUCCESS) {
172        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver latest image failed, errCode: %{public}d.", errCode);
173        OH_ImageReceiverOptions_Release(options);
174        OH_ImageReceiverNative_Release(receiver);
175        return;
176    }
177
178    // Release the OH_ImageNative instance.
179    errCode = OH_ImageNative_Release(image);
180    if (errCode != IMAGE_SUCCESS) {
181        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode);
182    }
183
184    // Release the OH_ImageReceiverOptions instance.
185    errCode = OH_ImageReceiverOptions_Release(options);
186    if (errCode != IMAGE_SUCCESS) {
187        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver options failed, errCode: %{public}d.", errCode);
188    }
189
190    // Unregister the callback event registered by calling OH_ImageReceiverNative_On.
191    errCode = OH_ImageReceiverNative_Off(receiver);
192    if (errCode != IMAGE_SUCCESS) {
193        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest image receiver off failed, errCode: %{public}d.", errCode);
194    }
195
196    // Release the OH_ImageReceiverOptions instance.
197    errCode = OH_ImageReceiverNative_Release(receiver);
198    if (errCode != IMAGE_SUCCESS) {
199        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver failed, errCode: %{public}d.", errCode);
200    }
201}
202```
203