@@ -10,7 +10,6 @@ const char *error_message(scanbotsdk_error_code_t ec) {
1010 return scanbotsdk_error_message ();
1111}
1212
13-
1413struct frame {
1514 int width ;
1615 int height ;
@@ -29,22 +28,22 @@ frame *next_frame(mock_camera *camera) {
2928 return & camera -> mock_frame ;
3029}
3130
32- mock_camera * init_camera (const char * path ) {
31+ scanbotsdk_error_code_t init_camera (const char * path , mock_camera * * camera_out ) {
3332 scanbotsdk_image_t * image = NULL ;
3433 scanbotsdk_path_image_load_options_t * load_options = NULL ;
3534 scanbotsdk_path_image_load_options_create_with_defaults (& load_options );
3635 scanbotsdk_error_code_t ec = scanbotsdk_image_create_from_path (path , load_options , & image );
3736 scanbotsdk_path_image_load_options_free (load_options );
3837 if (ec != SCANBOTSDK_OK ) {
3938 fprintf (stderr , "Failed to create image from path: %d: %s\n" , ec , error_message (ec ));
40- return NULL ;
39+ return ec ;
4140 }
4241 scanbotsdk_raw_image_t * raw_image = NULL ;
4342 ec = scanbotsdk_image_to_raw_image (image , & raw_image );
4443 scanbotsdk_image_free (image );
4544 if (ec != SCANBOTSDK_OK ) {
4645 fprintf (stderr , "Failed to obtain raw image: %d: %s\n" , ec , error_message (ec ));
47- return NULL ;
46+ return ec ;
4847 }
4948 frame f ;
5049
@@ -63,7 +62,8 @@ mock_camera *init_camera(const char *path) {
6362 scanbotsdk_raw_image_free (raw_image );
6463 mock_camera * camera = malloc (sizeof (mock_camera ));
6564 camera -> mock_frame = f ;
66- return camera ;
65+ * camera_out = camera ;
66+ return SCANBOTSDK_OK ;
6767}
6868
6969void free_camera (mock_camera * camera ) {
@@ -74,37 +74,64 @@ void free_camera(mock_camera *camera) {
7474 free (camera );
7575}
7676
77- int main ( int argc , char * argv [] ) {
78- if ( argc < 3 ) {
79- fprintf ( stderr , "Usage: %s <license_key> <path_to_camera_mock_image>\n" , argv [ 0 ]) ;
80- return 1 ;
81- }
77+ scanbotsdk_error_code_t process_frame ( scanbotsdk_barcode_scanner_t * scanner , frame * frame , size_t frame_number ) {
78+ scanbotsdk_error_code_t ec = SCANBOTSDK_OK ;
79+ scanbotsdk_raw_image_load_options_t * image_load_options = NULL ;
80+ scanbotsdk_image_t * image = NULL ;
81+ scanbotsdk_barcode_scanner_result_t * result = NULL ;
8282
83- const char * license_key = argv [1 ];
84- const char * mock_frame_path = argv [2 ];
83+ // region create scanbotsdk_image_t from frame
84+ bool image_is_live = true;
85+ scanbotsdk_raw_image_load_options_create_with_defaults (image_is_live , & image_load_options );
8586
86- // region Initialize Scanbot SDK
87- scanbotsdk_init_params_t params ;
88- params .license_key = license_key ;
89- params .writeable_path = "." ;
87+ ec = scanbotsdk_image_create_from_raw_image (
88+ frame -> data , frame -> width , frame -> height , frame -> channels , frame -> stride , image_load_options , & image );
89+ if (ec != SCANBOTSDK_OK ) {
90+ goto exit ;
91+ }
92+ // endregion
93+
94+ // region run barcode scanner on the image
95+ ec = scanbotsdk_barcode_scanner_run (scanner , image , & result );
9096
91- scanbotsdk_error_code_t ec ;
92- ec = scanbotsdk_initialize (& params );
9397 if (ec != SCANBOTSDK_OK ) {
94- fprintf (stderr , "Failed to initialize Scanbot SDK: %d: %s\n" , ec , error_message (ec ));
95- return 1 ;
98+ goto exit ;
99+ }
100+ bool success = false;
101+ scanbotsdk_barcode_scanner_result_get_success (result , & success );
102+ if (!success ) {
103+ fprintf (stdout , "No barcodes found in frame %zu\n" , frame_number );
104+ } else {
105+ size_t barcodeCount = 0 ;
106+ scanbotsdk_barcode_scanner_result_get_barcodes_size (result , & barcodeCount );
107+ fprintf (stdout , "%zu barcodes found in frame %zu\n" , barcodeCount , frame_number );
108+ scanbotsdk_barcode_item_t * * barcodes = malloc (barcodeCount * sizeof (scanbotsdk_barcode_item_t * ));
109+ scanbotsdk_barcode_scanner_result_get_barcodes (result , barcodes , barcodeCount );
110+ for (size_t i = 0 ; i < barcodeCount ; i ++ ) {
111+ const char * text = NULL ;
112+ scanbotsdk_barcode_item_get_text (barcodes [i ], & text );
113+ fprintf (stdout , "Barcode %zu: %s\n" , i , text );
114+ }
115+ free (barcodes );
96116 }
97117 // endregion
98118
99- // region Create Barcode Scanner Configuration
119+ exit :
120+ scanbotsdk_raw_image_load_options_free (image_load_options );
121+ scanbotsdk_image_free (image );
122+ scanbotsdk_barcode_scanner_result_free (result );
123+ return ec ;
124+ }
125+
126+ scanbotsdk_error_code_t create_barcode_scanner (scanbotsdk_barcode_scanner_t * * barcode_scanner ) {
127+ scanbotsdk_error_code_t ec = SCANBOTSDK_OK ;
128+
100129 scanbotsdk_barcode_format_common_configuration_t * common_format_configuration = NULL ;
101- ec = scanbotsdk_barcode_format_common_configuration_create_with_defaults (
130+ scanbotsdk_barcode_scanner_configuration_t * barcode_scanner_configuration = NULL ;
131+
132+ // region create barcode scanner configuration
133+ scanbotsdk_barcode_format_common_configuration_create_with_defaults (
102134 & common_format_configuration );
103- if (ec != SCANBOTSDK_OK ) {
104- fprintf (stderr , "Failed to create common format configuration: %d: %s\n" , ec ,
105- error_message (ec ));
106- return 1 ;
107- }
108135 scanbotsdk_barcode_format_t common_formats [] = {
109136 SCANBOTSDK_BARCODE_FORMAT_AZTEC ,
110137 SCANBOTSDK_BARCODE_FORMAT_CODABAR ,
@@ -126,112 +153,104 @@ int main(int argc, char *argv[]) {
126153 ec = scanbotsdk_barcode_format_common_configuration_set_formats (common_format_configuration , common_formats ,
127154 sizeof (common_formats ) / sizeof (common_formats [0 ]));
128155 if (ec != SCANBOTSDK_OK ) {
129- scanbotsdk_barcode_format_common_configuration_free (common_format_configuration );
130- fprintf (stderr , "Failed to set formats in common format configuration: %d: %s\n" , ec ,
131- error_message (ec ));
132- return 1 ;
156+ goto exit ;
133157 }
134158
135159 scanbotsdk_barcode_format_configuration_base_t * common_format_configuration_as_base = NULL ;
136160 scanbotsdk_barcode_format_common_configuration_as_scanbotsdk_barcode_format_configuration_base (
137161 common_format_configuration , & common_format_configuration_as_base );
138162
139- scanbotsdk_barcode_scanner_configuration_t * barcode_scanner_configuration ;
140- ec = scanbotsdk_barcode_scanner_configuration_create_with_defaults (
141- & barcode_scanner_configuration );
142163
143- if (ec != SCANBOTSDK_OK ) {
144- scanbotsdk_barcode_format_configuration_base_free (common_format_configuration_as_base );
145- fprintf (stderr , "Failed to create barcode scanner configuration: %d: %s\n" , ec ,
146- error_message (ec ));
147- return 1 ;
148- }
164+ scanbotsdk_barcode_scanner_configuration_create_with_defaults (
165+ & barcode_scanner_configuration );
149166 ec = scanbotsdk_barcode_scanner_configuration_set_barcode_format_configurations (
150167 barcode_scanner_configuration , & common_format_configuration_as_base , 1 );
151- scanbotsdk_barcode_format_configuration_base_free (common_format_configuration_as_base );
152168 if (ec != SCANBOTSDK_OK ) {
153- scanbotsdk_barcode_scanner_configuration_free (barcode_scanner_configuration );
154- fprintf (stderr , "Failed to set barcode format configurations: %d: %s\n" , ec ,
155- error_message (ec ));
156- return 1 ;
169+ goto exit ;
157170 }
158171 // endregion
159172
160- // region Create Barcode Scanner
161- scanbotsdk_barcode_scanner_t * barcode_scanner = NULL ;
162- ec = scanbotsdk_barcode_scanner_create (barcode_scanner_configuration , & barcode_scanner );
173+ // region create barcode scanner
174+ ec = scanbotsdk_barcode_scanner_create (barcode_scanner_configuration , barcode_scanner );
175+ if (ec != SCANBOTSDK_OK ) {
176+ goto exit ;
177+ }
178+ // endregion
179+
180+ exit :
181+ scanbotsdk_barcode_format_common_configuration_free (common_format_configuration );
163182 scanbotsdk_barcode_scanner_configuration_free (barcode_scanner_configuration );
183+ return ec ;
184+ }
185+
186+ int main (int argc , char * argv []) {
187+ if (argc < 3 ) {
188+ fprintf (stderr , "Usage: %s <license_key> <path_to_camera_mock_image>\n" , argv [0 ]);
189+ return 1 ;
190+ }
191+
192+ const int initialization_timeout_ms = 15000 ;
193+ const int deregister_device_timeout_ms = 15000 ;
194+
195+ scanbotsdk_barcode_scanner_t * barcode_scanner = NULL ;
196+ mock_camera * camera = NULL ;
197+
198+ const char * license_key = argv [1 ];
199+ const char * mock_frame_path = argv [2 ];
200+
201+ // region initialize Scanbot SDK
202+ scanbotsdk_init_params_t params ;
203+ params .license_key = license_key ;
204+ params .writeable_path = "." ;
205+
206+ scanbotsdk_error_code_t ec ;
207+ ec = scanbotsdk_initialize (& params );
208+ if (ec != SCANBOTSDK_OK ) {
209+ fprintf (stderr , "Failed to initialize Scanbot SDK: %d: %s\n" , ec , error_message (ec ));
210+ goto exit ;
211+ }
212+ ec = scanbotsdk_wait_for_online_license_check_completion (initialization_timeout_ms );
164213 if (ec != SCANBOTSDK_OK ) {
165- fprintf (stderr , "Failed to create barcode scanner : %d: %s\n" , ec ,
214+ fprintf (stderr , "Failed to wait for online license check completion : %d: %s\n" , ec ,
166215 error_message (ec ));
167- return 1 ;
216+ goto exit ;
168217 }
169218 // endregion
170219
220+ ec = create_barcode_scanner (& barcode_scanner );
221+ if (ec != SCANBOTSDK_OK ) {
222+ fprintf (stderr , "Failed to create barcode scanner: %d: %s\n" , ec , error_message (ec ));
223+ goto exit ;
224+ }
225+
171226 // region create mock camera that always returns the same frame
172- mock_camera * camera = init_camera (mock_frame_path );
173- if (!camera ) {
174- scanbotsdk_barcode_scanner_free (barcode_scanner );
175- fprintf (stderr , "Failed to initialize mock camera with path: %s\n" , mock_frame_path );
176- return 1 ;
227+ ec = init_camera (mock_frame_path , & camera );
228+ if (ec != SCANBOTSDK_OK ) {
229+ fprintf (stderr , "Failed to initialize mock camera with image: %s\n" , mock_frame_path );
230+ goto exit ;
177231 }
178232 // endregion
179233
180- for (size_t frameNumber = 0 ; frameNumber < 10 ; frameNumber ++ ) {
181- fprintf (stdout , "Processing frame %zu\n" , frameNumber );
234+ // region frame processing loop
235+ for (size_t frame_number = 0 ; frame_number < 10 ; frame_number ++ ) {
236+ fprintf (stdout , "Processing frame %zu\n" , frame_number );
182237
183- // region create scanbotsdk_image_t from mock camera frame
184238 frame * frame = next_frame (camera );
185- bool imageIsLive = true;
186- scanbotsdk_raw_image_load_options_t * load_options = NULL ;
187- scanbotsdk_raw_image_load_options_create_with_defaults (imageIsLive , & load_options );
188- scanbotsdk_image_t * image = NULL ;
189- ec = scanbotsdk_image_create_from_raw_image (
190- frame -> data , frame -> width , frame -> height , frame -> channels , frame -> stride , load_options , & image );
191- scanbotsdk_raw_image_load_options_free (load_options );
192- if (ec != SCANBOTSDK_OK ) {
193- scanbotsdk_barcode_scanner_free (barcode_scanner );
194- free_camera (camera );
195- fprintf (stderr , "Failed to create image from raw data: %d: %s\n" , ec ,
196- error_message (ec ));
197- return 1 ;
198- }
199- // endregion
200-
201- // region run barcode scanner on the image
202- scanbotsdk_barcode_scanner_result_t * result = NULL ;
203- ec = scanbotsdk_barcode_scanner_run (barcode_scanner , image , & result );
204- scanbotsdk_image_free (image );
239+ ec = process_frame (barcode_scanner , frame , frame_number );
205240 if (ec != SCANBOTSDK_OK ) {
206- scanbotsdk_barcode_scanner_free (barcode_scanner );
207- free_camera (camera );
208- fprintf (stderr , "Failed to run barcode scanner: %d: %s\n" , ec ,
209- error_message (ec ));
210- return 1 ;
211- }
212- bool success = false;
213- scanbotsdk_barcode_scanner_result_get_success (result , & success );
214- if (!success ) {
215- fprintf (stdout , "No barcodes found in frame %zu\n" , frameNumber );
216- } else {
217- size_t barcodeCount = 0 ;
218- scanbotsdk_barcode_scanner_result_get_barcodes_size (result , & barcodeCount );
219- fprintf (stdout , "%zu barcodes found in frame %zu\n" , barcodeCount , frameNumber );
220- scanbotsdk_barcode_item_t * * barcodes = malloc (barcodeCount * sizeof (scanbotsdk_barcode_item_t * ));
221- scanbotsdk_barcode_scanner_result_get_barcodes (result , barcodes , barcodeCount );
222- for (size_t i = 0 ; i < barcodeCount ; i ++ ) {
223- const char * text = NULL ;
224- scanbotsdk_barcode_item_get_text (barcodes [i ], & text );
225- fprintf (stdout , "Barcode %zu: %s\n" , i , text );
226- }
227- free (barcodes );
241+ fprintf (stderr , "Failed to process frame %zu: %d: %s\n" , frame_number , ec , error_message (ec ));
242+ goto exit ;
228243 }
229- scanbotsdk_barcode_scanner_result_free (result );
230- // endregion
231244 }
245+ // endregion
246+
247+ exit :
232248 scanbotsdk_barcode_scanner_free (barcode_scanner );
233249 free_camera (camera );
250+ // If you are not using floating license, it is not necessary to call device deregistration.
251+ scanbotsdk_deregister_device ();
252+ scanbotsdk_wait_for_device_deregistration_completion (deregister_device_timeout_ms );
234253
235- return 0 ;
254+ return ( ec == SCANBOTSDK_OK ) ? 0 : 1 ;
236255}
237256
0 commit comments