+int decode_by_strip(OPJ_BOOL quiet,
+ const char* input_file,
+ OPJ_UINT32 strip_height,
+ opj_image_t* full_image)
+{
+ /* OPJ_UINT32 tilew, tileh; */
+ opj_codec_t * l_codec = NULL;
+ opj_image_t * l_image = NULL;
+ opj_stream_t * l_stream = NULL;
+ OPJ_UINT32 x0, y0, x1, y1, y;
+
+ l_codec = create_codec_and_stream(input_file, &l_stream);
+ if (l_codec == NULL) {
+ return 1;
+ }
+
+ /* Read the main header of the codestream and if necessary the JP2 boxes*/
+ if (! opj_read_header(l_stream, l_codec, &l_image)) {
+ fprintf(stderr, "ERROR -> failed to read the header\n");
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ return 1;
+ }
+
+ x0 = l_image->x0;
+ y0 = l_image->y0;
+ x1 = l_image->x1;
+ y1 = l_image->y1;
+ for (y = y0; y < y1; y += strip_height) {
+ OPJ_UINT32 h_req = strip_height;
+ if (y + h_req > y1) {
+ h_req = y1 - y;
+ }
+ if (!quiet) {
+ printf("Decoding %u...%u\n", y, y + h_req);
+ }
+ if (!opj_set_decode_area(l_codec, l_image, (OPJ_INT32)x0, (OPJ_INT32)y,
+ (OPJ_INT32)x1, (OPJ_INT32)(y + h_req))) {
+ fprintf(stderr, "ERROR -> failed to set the decoded area\n");
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ opj_image_destroy(l_image);
+ return 1;
+ }
+
+ /* Get the decoded image */
+ if (!(opj_decode(l_codec, l_stream, l_image))) {
+ fprintf(stderr, "ERROR -> failed to decode image!\n");
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ opj_image_destroy(l_image);
+ return 1;
+ }
+
+ if (full_image) {
+ OPJ_UINT32 y_check, x;
+ OPJ_UINT32 compno;
+ for (compno = 0; compno < l_image->numcomps; compno ++) {
+ for (y_check = 0; y_check < h_req; y_check++) {
+ for (x = x0; x < x1; x++) {
+ OPJ_INT32 sub_image_val =
+ l_image->comps[compno].data[y_check * (x1 - x0) + x];
+ OPJ_INT32 image_val =
+ full_image->comps[compno].data[(y + y_check) * (x1 - x0) + x];
+ if (sub_image_val != image_val) {
+ fprintf(stderr,
+ "Difference found at subimage pixel (%u,%u) "
+ "of compno=%u: got %d, expected %d\n",
+ x, y_check + y, compno, sub_image_val, image_val);
+ return 1;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ /* If image is small enough, try a final whole image read */
+ if (x1 - x0 < 10000 && y1 - y0 < 10000) {
+ if (!quiet) {
+ printf("Decoding full image\n");
+ }
+ if (!opj_set_decode_area(l_codec, l_image, (OPJ_INT32)x0, (OPJ_INT32)y0,
+ (OPJ_INT32)x1, (OPJ_INT32)y1)) {
+ fprintf(stderr, "ERROR -> failed to set the decoded area\n");
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ opj_image_destroy(l_image);
+ return 1;
+ }
+
+ /* Get the decoded image */
+ if (!(opj_decode(l_codec, l_stream, l_image))) {
+ fprintf(stderr, "ERROR -> failed to decode image!\n");
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ opj_image_destroy(l_image);
+ return 1;
+ }
+ }
+
+ if (! opj_end_decompress(l_codec, l_stream)) {
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ opj_image_destroy(l_image);
+ return 1;
+ }
+
+
+ opj_stream_destroy(l_stream);
+ opj_destroy_codec(l_codec);
+ opj_image_destroy(l_image);
+ return 0;
+}
+