diff options
Diffstat (limited to 'src/bin')
47 files changed, 18583 insertions, 18891 deletions
diff --git a/src/bin/common/color.c b/src/bin/common/color.c index 0f2b8dac..98b62348 100644 --- a/src/bin/common/color.c +++ b/src/bin/common/color.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. @@ -72,235 +72,299 @@ B: 0.999823 1.77204 -8.04142e-06 :Cr - 2^(prec - 1) -----------------------------------------------------------*/ static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr, - int *out_r, int *out_g, int *out_b) + int *out_r, int *out_g, int *out_b) { - int r, g, b; - - cb -= offset; cr -= offset; - r = y + (int)(1.402 * (float)cr); - if(r < 0) r = 0; else if(r > upb) r = upb; *out_r = r; - - g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr); - if(g < 0) g = 0; else if(g > upb) g = upb; *out_g = g; - - b = y + (int)(1.772 * (float)cb); - if(b < 0) b = 0; else if(b > upb) b = upb; *out_b = b; + int r, g, b; + + cb -= offset; + cr -= offset; + r = y + (int)(1.402 * (float)cr); + if(r < 0) r = 0; + else if(r > upb) r = upb; + *out_r = r; + + g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr); + if(g < 0) g = 0; + else if(g > upb) g = upb; + *out_g = g; + + b = y + (int)(1.772 * (float)cb); + if(b < 0) b = 0; + else if(b > upb) b = upb; + *out_b = b; } static void sycc444_to_rgb(opj_image_t *img) { - int *d0, *d1, *d2, *r, *g, *b; - const int *y, *cb, *cr; - unsigned int maxw, maxh, max, i; - int offset, upb; - - upb = (int)img->comps[0].prec; - offset = 1<<(upb - 1); upb = (1<<upb)-1; - - maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h; - max = maxw * maxh; - - y = img->comps[0].data; - cb = img->comps[1].data; - cr = img->comps[2].data; - - d0 = r = (int*)malloc(sizeof(int) * (size_t)max); - d1 = g = (int*)malloc(sizeof(int) * (size_t)max); - d2 = b = (int*)malloc(sizeof(int) * (size_t)max); - - for(i = 0U; i < max; ++i) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++cb; ++cr; ++r; ++g; ++b; - } - free(img->comps[0].data); img->comps[0].data = d0; - free(img->comps[1].data); img->comps[1].data = d1; - free(img->comps[2].data); img->comps[2].data = d2; + int *d0, *d1, *d2, *r, *g, *b; + const int *y, *cb, *cr; + unsigned int maxw, maxh, max, i; + int offset, upb; + + upb = (int)img->comps[0].prec; + offset = 1<<(upb - 1); + upb = (1<<upb)-1; + + maxw = (unsigned int)img->comps[0].w; + maxh = (unsigned int)img->comps[0].h; + max = maxw * maxh; + + y = img->comps[0].data; + cb = img->comps[1].data; + cr = img->comps[2].data; + + d0 = r = (int*)malloc(sizeof(int) * (size_t)max); + d1 = g = (int*)malloc(sizeof(int) * (size_t)max); + d2 = b = (int*)malloc(sizeof(int) * (size_t)max); + + for(i = 0U; i < max; ++i) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++cb; + ++cr; + ++r; + ++g; + ++b; + } + free(img->comps[0].data); + img->comps[0].data = d0; + free(img->comps[1].data); + img->comps[1].data = d1; + free(img->comps[2].data); + img->comps[2].data = d2; }/* sycc444_to_rgb() */ static void sycc422_to_rgb(opj_image_t *img) -{ - int *d0, *d1, *d2, *r, *g, *b; - const int *y, *cb, *cr; - unsigned int maxw, maxh, max; - int offset, upb; - unsigned int i, j; - - upb = (int)img->comps[0].prec; - offset = 1<<(upb - 1); upb = (1<<upb)-1; - - maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h; - max = maxw * maxh; - - y = img->comps[0].data; - cb = img->comps[1].data; - cr = img->comps[2].data; - - d0 = r = (int*)malloc(sizeof(int) * (size_t)max); - d1 = g = (int*)malloc(sizeof(int) * (size_t)max); - d2 = b = (int*)malloc(sizeof(int) * (size_t)max); - - for(i=0U; i < maxh; ++i) - { - for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++r; ++g; ++b; - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++r; ++g; ++b; ++cb; ++cr; - } - if (j < maxw) { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++r; ++g; ++b; ++cb; ++cr; - } - } - free(img->comps[0].data); img->comps[0].data = d0; - free(img->comps[1].data); img->comps[1].data = d1; - free(img->comps[2].data); img->comps[2].data = d2; +{ + int *d0, *d1, *d2, *r, *g, *b; + const int *y, *cb, *cr; + unsigned int maxw, maxh, max; + int offset, upb; + unsigned int i, j; + + upb = (int)img->comps[0].prec; + offset = 1<<(upb - 1); + upb = (1<<upb)-1; + + maxw = (unsigned int)img->comps[0].w; + maxh = (unsigned int)img->comps[0].h; + max = maxw * maxh; + + y = img->comps[0].data; + cb = img->comps[1].data; + cr = img->comps[2].data; + + d0 = r = (int*)malloc(sizeof(int) * (size_t)max); + d1 = g = (int*)malloc(sizeof(int) * (size_t)max); + d2 = b = (int*)malloc(sizeof(int) * (size_t)max); + + for(i=0U; i < maxh; ++i) { + for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + ++cb; + ++cr; + } + if (j < maxw) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + ++cb; + ++cr; + } + } + free(img->comps[0].data); + img->comps[0].data = d0; + free(img->comps[1].data); + img->comps[1].data = d1; + free(img->comps[2].data); + img->comps[2].data = d2; #if defined(USE_JPWL) || defined(USE_MJ2) - img->comps[1].w = maxw; img->comps[1].h = maxh; - img->comps[2].w = maxw; img->comps[2].h = maxh; + img->comps[1].w = maxw; + img->comps[1].h = maxh; + img->comps[2].w = maxw; + img->comps[2].h = maxh; #else - img->comps[1].w = (OPJ_UINT32)maxw; img->comps[1].h = (OPJ_UINT32)maxh; - img->comps[2].w = (OPJ_UINT32)maxw; img->comps[2].h = (OPJ_UINT32)maxh; + img->comps[1].w = (OPJ_UINT32)maxw; + img->comps[1].h = (OPJ_UINT32)maxh; + img->comps[2].w = (OPJ_UINT32)maxw; + img->comps[2].h = (OPJ_UINT32)maxh; #endif - img->comps[1].dx = img->comps[0].dx; - img->comps[2].dx = img->comps[0].dx; - img->comps[1].dy = img->comps[0].dy; - img->comps[2].dy = img->comps[0].dy; + img->comps[1].dx = img->comps[0].dx; + img->comps[2].dx = img->comps[0].dx; + img->comps[1].dy = img->comps[0].dy; + img->comps[2].dy = img->comps[0].dy; }/* sycc422_to_rgb() */ static void sycc420_to_rgb(opj_image_t *img) { - int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb; - const int *y, *cb, *cr, *ny; - unsigned int maxw, maxh, max; - int offset, upb; - unsigned int i, j; - - upb = (int)img->comps[0].prec; - offset = 1<<(upb - 1); upb = (1<<upb)-1; - - maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h; - max = maxw * maxh; - - y = img->comps[0].data; - cb = img->comps[1].data; - cr = img->comps[2].data; - - d0 = r = (int*)malloc(sizeof(int) * (size_t)max); - d1 = g = (int*)malloc(sizeof(int) * (size_t)max); - d2 = b = (int*)malloc(sizeof(int) * (size_t)max); - - for(i=0U; i < (maxh & ~(unsigned int)1U); i += 2U) - { - ny = y + maxw; - nr = r + maxw; ng = g + maxw; nb = b + maxw; - - for(j=0; j < (maxw & ~(unsigned int)1U); j += 2U) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++r; ++g; ++b; - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++r; ++g; ++b; - - sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); - ++ny; ++nr; ++ng; ++nb; - sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); - ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; - } - if(j < maxw) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - ++y; ++r; ++g; ++b; - - sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); - ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; - } - y += maxw; r += maxw; g += maxw; b += maxw; - } - if(i < maxh) - { - for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++r; ++g; ++b; - - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - - ++y; ++r; ++g; ++b; ++cb; ++cr; - } - if(j < maxw) - { - sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); - } - } - - free(img->comps[0].data); img->comps[0].data = d0; - free(img->comps[1].data); img->comps[1].data = d1; - free(img->comps[2].data); img->comps[2].data = d2; + int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb; + const int *y, *cb, *cr, *ny; + unsigned int maxw, maxh, max; + int offset, upb; + unsigned int i, j; + + upb = (int)img->comps[0].prec; + offset = 1<<(upb - 1); + upb = (1<<upb)-1; + + maxw = (unsigned int)img->comps[0].w; + maxh = (unsigned int)img->comps[0].h; + max = maxw * maxh; + + y = img->comps[0].data; + cb = img->comps[1].data; + cr = img->comps[2].data; + + d0 = r = (int*)malloc(sizeof(int) * (size_t)max); + d1 = g = (int*)malloc(sizeof(int) * (size_t)max); + d2 = b = (int*)malloc(sizeof(int) * (size_t)max); + + for(i=0U; i < (maxh & ~(unsigned int)1U); i += 2U) { + ny = y + maxw; + nr = r + maxw; + ng = g + maxw; + nb = b + maxw; + + for(j=0; j < (maxw & ~(unsigned int)1U); j += 2U) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + + sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); + ++ny; + ++nr; + ++ng; + ++nb; + sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); + ++ny; + ++nr; + ++ng; + ++nb; + ++cb; + ++cr; + } + if(j < maxw) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + + sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); + ++ny; + ++nr; + ++ng; + ++nb; + ++cb; + ++cr; + } + y += maxw; + r += maxw; + g += maxw; + b += maxw; + } + if(i < maxh) { + for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + + ++y; + ++r; + ++g; + ++b; + + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + + ++y; + ++r; + ++g; + ++b; + ++cb; + ++cr; + } + if(j < maxw) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + } + } + + free(img->comps[0].data); + img->comps[0].data = d0; + free(img->comps[1].data); + img->comps[1].data = d1; + free(img->comps[2].data); + img->comps[2].data = d2; #if defined(USE_JPWL) || defined(USE_MJ2) - img->comps[1].w = maxw; img->comps[1].h = maxh; - img->comps[2].w = maxw; img->comps[2].h = maxh; + img->comps[1].w = maxw; + img->comps[1].h = maxh; + img->comps[2].w = maxw; + img->comps[2].h = maxh; #else - img->comps[1].w = (OPJ_UINT32)maxw; img->comps[1].h = (OPJ_UINT32)maxh; - img->comps[2].w = (OPJ_UINT32)maxw; img->comps[2].h = (OPJ_UINT32)maxh; + img->comps[1].w = (OPJ_UINT32)maxw; + img->comps[1].h = (OPJ_UINT32)maxh; + img->comps[2].w = (OPJ_UINT32)maxw; + img->comps[2].h = (OPJ_UINT32)maxh; #endif - img->comps[1].dx = img->comps[0].dx; - img->comps[2].dx = img->comps[0].dx; - img->comps[1].dy = img->comps[0].dy; - img->comps[2].dy = img->comps[0].dy; + img->comps[1].dx = img->comps[0].dx; + img->comps[2].dx = img->comps[0].dx; + img->comps[1].dy = img->comps[0].dy; + img->comps[2].dy = img->comps[0].dy; }/* sycc420_to_rgb() */ void color_sycc_to_rgb(opj_image_t *img) { - if(img->numcomps < 3) - { - img->color_space = OPJ_CLRSPC_GRAY; - return; - } - - if((img->comps[0].dx == 1) - && (img->comps[1].dx == 2) - && (img->comps[2].dx == 2) - && (img->comps[0].dy == 1) - && (img->comps[1].dy == 2) - && (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */ - { - sycc420_to_rgb(img); - } - else - if((img->comps[0].dx == 1) - && (img->comps[1].dx == 2) - && (img->comps[2].dx == 2) - && (img->comps[0].dy == 1) - && (img->comps[1].dy == 1) - && (img->comps[2].dy == 1))/* horizontal sub-sample only */ - { - sycc422_to_rgb(img); - } - else - if((img->comps[0].dx == 1) - && (img->comps[1].dx == 1) - && (img->comps[2].dx == 1) - && (img->comps[0].dy == 1) - && (img->comps[1].dy == 1) - && (img->comps[2].dy == 1))/* no sub-sample */ - { - sycc444_to_rgb(img); - } - else - { - fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__); - return; - } - img->color_space = OPJ_CLRSPC_SRGB; + if(img->numcomps < 3) { + img->color_space = OPJ_CLRSPC_GRAY; + return; + } + + if((img->comps[0].dx == 1) + && (img->comps[1].dx == 2) + && (img->comps[2].dx == 2) + && (img->comps[0].dy == 1) + && (img->comps[1].dy == 2) + && (img->comps[2].dy == 2)) { /* horizontal and vertical sub-sample */ + sycc420_to_rgb(img); + } else if((img->comps[0].dx == 1) + && (img->comps[1].dx == 2) + && (img->comps[2].dx == 2) + && (img->comps[0].dy == 1) + && (img->comps[1].dy == 1) + && (img->comps[2].dy == 1)) { /* horizontal sub-sample only */ + sycc422_to_rgb(img); + } else if((img->comps[0].dx == 1) + && (img->comps[1].dx == 1) + && (img->comps[2].dx == 1) + && (img->comps[0].dy == 1) + && (img->comps[1].dy == 1) + && (img->comps[2].dy == 1)) { /* no sub-sample */ + sycc444_to_rgb(img); + } else { + fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__); + return; + } + img->color_space = OPJ_CLRSPC_SRGB; }/* color_sycc_to_rgb() */ @@ -325,412 +389,397 @@ void color_sycc_to_rgb(opj_image_t *img) /*#define DEBUG_PROFILE*/ void color_apply_icc_profile(opj_image_t *image) { - cmsHPROFILE in_prof, out_prof; - cmsHTRANSFORM transform; - cmsColorSpaceSignature in_space, out_space; - cmsUInt32Number intent, in_type, out_type, nr_samples; - int *r, *g, *b; - int prec, i, max, max_w, max_h; - OPJ_COLOR_SPACE oldspace; - - in_prof = - cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); + cmsHPROFILE in_prof, out_prof; + cmsHTRANSFORM transform; + cmsColorSpaceSignature in_space, out_space; + cmsUInt32Number intent, in_type, out_type, nr_samples; + int *r, *g, *b; + int prec, i, max, max_w, max_h; + OPJ_COLOR_SPACE oldspace; + + in_prof = + cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); #ifdef DEBUG_PROFILE - FILE *icm = fopen("debug.icm","wb"); - fwrite( image->icc_profile_buf,1, image->icc_profile_len,icm); - fclose(icm); + FILE *icm = fopen("debug.icm","wb"); + fwrite( image->icc_profile_buf,1, image->icc_profile_len,icm); + fclose(icm); #endif - if(in_prof == NULL) return; - - in_space = cmsGetPCS(in_prof); - out_space = cmsGetColorSpace(in_prof); - intent = cmsGetHeaderRenderingIntent(in_prof); - - - max_w = (int)image->comps[0].w; - max_h = (int)image->comps[0].h; - prec = (int)image->comps[0].prec; - oldspace = image->color_space; - - if(out_space == cmsSigRgbData) /* enumCS 16 */ - { - if( prec <= 8 ) - { - in_type = TYPE_RGB_8; - out_type = TYPE_RGB_8; - } - else - { - in_type = TYPE_RGB_16; - out_type = TYPE_RGB_16; - } - out_prof = cmsCreate_sRGBProfile(); - image->color_space = OPJ_CLRSPC_SRGB; - } - else - if(out_space == cmsSigGrayData) /* enumCS 17 */ - { - in_type = TYPE_GRAY_8; - out_type = TYPE_RGB_8; - out_prof = cmsCreate_sRGBProfile(); - image->color_space = OPJ_CLRSPC_SRGB; - } - else - if(out_space == cmsSigYCbCrData) /* enumCS 18 */ - { - in_type = TYPE_YCbCr_16; - out_type = TYPE_RGB_16; - out_prof = cmsCreate_sRGBProfile(); - image->color_space = OPJ_CLRSPC_SRGB; - } - else - { + if(in_prof == NULL) return; + + in_space = cmsGetPCS(in_prof); + out_space = cmsGetColorSpace(in_prof); + intent = cmsGetHeaderRenderingIntent(in_prof); + + + max_w = (int)image->comps[0].w; + max_h = (int)image->comps[0].h; + prec = (int)image->comps[0].prec; + oldspace = image->color_space; + + if(out_space == cmsSigRgbData) { /* enumCS 16 */ + if( prec <= 8 ) { + in_type = TYPE_RGB_8; + out_type = TYPE_RGB_8; + } else { + in_type = TYPE_RGB_16; + out_type = TYPE_RGB_16; + } + out_prof = cmsCreate_sRGBProfile(); + image->color_space = OPJ_CLRSPC_SRGB; + } else if(out_space == cmsSigGrayData) { /* enumCS 17 */ + in_type = TYPE_GRAY_8; + out_type = TYPE_RGB_8; + out_prof = cmsCreate_sRGBProfile(); + image->color_space = OPJ_CLRSPC_SRGB; + } else if(out_space == cmsSigYCbCrData) { /* enumCS 18 */ + in_type = TYPE_YCbCr_16; + out_type = TYPE_RGB_16; + out_prof = cmsCreate_sRGBProfile(); + image->color_space = OPJ_CLRSPC_SRGB; + } else { #ifdef DEBUG_PROFILE -fprintf(stderr,"%s:%d: color_apply_icc_profile\n\tICC Profile has unknown " -"output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n", -__FILE__,__LINE__,out_space, - (out_space>>24) & 0xff,(out_space>>16) & 0xff, - (out_space>>8) & 0xff, out_space & 0xff); + fprintf(stderr,"%s:%d: color_apply_icc_profile\n\tICC Profile has unknown " + "output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n", + __FILE__,__LINE__,out_space, + (out_space>>24) & 0xff,(out_space>>16) & 0xff, + (out_space>>8) & 0xff, out_space & 0xff); #endif - return; - } + return; + } #ifdef DEBUG_PROFILE -fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)" -"\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec, - max_w,max_h, (void*)in_prof,(void*)out_prof); - -fprintf(stderr,"\trender_intent (%u)\n\t" -"color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t" -" type: in(%u) out:(%u)\n", - intent, - in_space, - (in_space>>24) & 0xff,(in_space>>16) & 0xff, - (in_space>>8) & 0xff, in_space & 0xff, - - out_space, - (out_space>>24) & 0xff,(out_space>>16) & 0xff, - (out_space>>8) & 0xff, out_space & 0xff, - - in_type,out_type - ); + fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)" + "\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec, + max_w,max_h, (void*)in_prof,(void*)out_prof); + + fprintf(stderr,"\trender_intent (%u)\n\t" + "color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t" + " type: in(%u) out:(%u)\n", + intent, + in_space, + (in_space>>24) & 0xff,(in_space>>16) & 0xff, + (in_space>>8) & 0xff, in_space & 0xff, + + out_space, + (out_space>>24) & 0xff,(out_space>>16) & 0xff, + (out_space>>8) & 0xff, out_space & 0xff, + + in_type,out_type + ); #else - (void)prec; - (void)in_space; + (void)prec; + (void)in_space; #endif /* DEBUG_PROFILE */ - transform = cmsCreateTransform(in_prof, in_type, - out_prof, out_type, intent, 0); + transform = cmsCreateTransform(in_prof, in_type, + out_prof, out_type, intent, 0); #ifdef OPJ_HAVE_LIBLCMS2 -/* Possible for: LCMS_VERSION >= 2000 :*/ - cmsCloseProfile(in_prof); - cmsCloseProfile(out_prof); + /* Possible for: LCMS_VERSION >= 2000 :*/ + cmsCloseProfile(in_prof); + cmsCloseProfile(out_prof); #endif - if(transform == NULL) - { + if(transform == NULL) { #ifdef DEBUG_PROFILE -fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tcmsCreateTransform failed. " -"ICC Profile ignored.\n",__FILE__,__LINE__); + fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tcmsCreateTransform failed. " + "ICC Profile ignored.\n",__FILE__,__LINE__); #endif - image->color_space = oldspace; + image->color_space = oldspace; #ifdef OPJ_HAVE_LIBLCMS1 - cmsCloseProfile(in_prof); - cmsCloseProfile(out_prof); + cmsCloseProfile(in_prof); + cmsCloseProfile(out_prof); #endif - return; - } - - if(image->numcomps > 2)/* RGB, RGBA */ - { - if( prec <= 8 ) - { - unsigned char *inbuf, *outbuf, *in, *out; - max = max_w * max_h; - nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char); - in = inbuf = (unsigned char*)malloc(nr_samples); - out = outbuf = (unsigned char*)malloc(nr_samples); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *in++ = (unsigned char)*r++; - *in++ = (unsigned char)*g++; - *in++ = (unsigned char)*b++; - } - - cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *r++ = (int)*out++; - *g++ = (int)*out++; - *b++ = (int)*out++; - } - free(inbuf); free(outbuf); - } - else - { - unsigned short *inbuf, *outbuf, *in, *out; - max = max_w * max_h; - nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short); - in = inbuf = (unsigned short*)malloc(nr_samples); - out = outbuf = (unsigned short*)malloc(nr_samples); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *in++ = (unsigned short)*r++; - *in++ = (unsigned short)*g++; - *in++ = (unsigned short)*b++; - } - - cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *r++ = (int)*out++; - *g++ = (int)*out++; - *b++ = (int)*out++; - } - free(inbuf); free(outbuf); - } - } - else /* GRAY, GRAYA */ - { - unsigned char *in, *inbuf, *out, *outbuf; - max = max_w * max_h; - nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char); - in = inbuf = (unsigned char*)malloc(nr_samples); - out = outbuf = (unsigned char*)malloc(nr_samples); - - image->comps = (opj_image_comp_t*) - realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t)); - - if(image->numcomps == 2) - image->comps[3] = image->comps[1]; - - image->comps[1] = image->comps[0]; - image->comps[2] = image->comps[0]; - - image->comps[1].data = (int*)calloc((size_t)max, sizeof(int)); - image->comps[2].data = (int*)calloc((size_t)max, sizeof(int)); - - image->numcomps += 2; - - r = image->comps[0].data; - - for(i = 0; i < max; ++i) - { - *in++ = (unsigned char)*r++; - } - cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - - for(i = 0; i < max; ++i) - { - *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++; - } - free(inbuf); free(outbuf); - - }/* if(image->numcomps */ - - cmsDeleteTransform(transform); + return; + } + + if(image->numcomps > 2) { /* RGB, RGBA */ + if( prec <= 8 ) { + unsigned char *inbuf, *outbuf, *in, *out; + max = max_w * max_h; + nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char); + in = inbuf = (unsigned char*)malloc(nr_samples); + out = outbuf = (unsigned char*)malloc(nr_samples); + + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + + for(i = 0; i < max; ++i) { + *in++ = (unsigned char)*r++; + *in++ = (unsigned char)*g++; + *in++ = (unsigned char)*b++; + } + + cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); + + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + + for(i = 0; i < max; ++i) { + *r++ = (int)*out++; + *g++ = (int)*out++; + *b++ = (int)*out++; + } + free(inbuf); + free(outbuf); + } else { + unsigned short *inbuf, *outbuf, *in, *out; + max = max_w * max_h; + nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short); + in = inbuf = (unsigned short*)malloc(nr_samples); + out = outbuf = (unsigned short*)malloc(nr_samples); + + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + + for(i = 0; i < max; ++i) { + *in++ = (unsigned short)*r++; + *in++ = (unsigned short)*g++; + *in++ = (unsigned short)*b++; + } + + cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); + + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + + for(i = 0; i < max; ++i) { + *r++ = (int)*out++; + *g++ = (int)*out++; + *b++ = (int)*out++; + } + free(inbuf); + free(outbuf); + } + } else { /* GRAY, GRAYA */ + unsigned char *in, *inbuf, *out, *outbuf; + max = max_w * max_h; + nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char); + in = inbuf = (unsigned char*)malloc(nr_samples); + out = outbuf = (unsigned char*)malloc(nr_samples); + + image->comps = (opj_image_comp_t*) + realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t)); + + if(image->numcomps == 2) + image->comps[3] = image->comps[1]; + + image->comps[1] = image->comps[0]; + image->comps[2] = image->comps[0]; + + image->comps[1].data = (int*)calloc((size_t)max, sizeof(int)); + image->comps[2].data = (int*)calloc((size_t)max, sizeof(int)); + + image->numcomps += 2; + + r = image->comps[0].data; + + for(i = 0; i < max; ++i) { + *in++ = (unsigned char)*r++; + } + cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); + + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + + for(i = 0; i < max; ++i) { + *r++ = (int)*out++; + *g++ = (int)*out++; + *b++ = (int)*out++; + } + free(inbuf); + free(outbuf); + + }/* if(image->numcomps */ + + cmsDeleteTransform(transform); #ifdef OPJ_HAVE_LIBLCMS1 - cmsCloseProfile(in_prof); - cmsCloseProfile(out_prof); + cmsCloseProfile(in_prof); + cmsCloseProfile(out_prof); #endif }/* color_apply_icc_profile() */ void color_cielab_to_rgb(opj_image_t *image) { - int *row; - int enumcs, numcomps; - - image->color_space = OPJ_CLRSPC_SRGB; - - numcomps = (int)image->numcomps; - - if(numcomps != 3) - { - fprintf(stderr,"%s:%d:\n\tnumcomps %d not handled. Quitting.\n", - __FILE__,__LINE__,numcomps); - return; - } - - row = (int*)image->icc_profile_buf; - enumcs = row[0]; - - if(enumcs == 14) /* CIELab */ - { - int *L, *a, *b, *red, *green, *blue; - int *src0, *src1, *src2, *dst0, *dst1, *dst2; - double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2; - double minL, maxL, mina, maxa, minb, maxb; - unsigned int default_type; - unsigned int i, max; - cmsHPROFILE in, out; - cmsHTRANSFORM transform; - cmsUInt16Number RGB[3]; - cmsCIELab Lab; - - in = cmsCreateLab4Profile(NULL); - out = cmsCreate_sRGBProfile(); - - transform = cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); - + int *row; + int enumcs, numcomps; + + image->color_space = OPJ_CLRSPC_SRGB; + + numcomps = (int)image->numcomps; + + if(numcomps != 3) { + fprintf(stderr,"%s:%d:\n\tnumcomps %d not handled. Quitting.\n", + __FILE__,__LINE__,numcomps); + return; + } + + row = (int*)image->icc_profile_buf; + enumcs = row[0]; + + if(enumcs == 14) { /* CIELab */ + int *L, *a, *b, *red, *green, *blue; + int *src0, *src1, *src2, *dst0, *dst1, *dst2; + double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2; + double minL, maxL, mina, maxa, minb, maxb; + unsigned int default_type; + unsigned int i, max; + cmsHPROFILE in, out; + cmsHTRANSFORM transform; + cmsUInt16Number RGB[3]; + cmsCIELab Lab; + + in = cmsCreateLab4Profile(NULL); + out = cmsCreate_sRGBProfile(); + + transform = cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); + #ifdef OPJ_HAVE_LIBLCMS2 - cmsCloseProfile(in); - cmsCloseProfile(out); + cmsCloseProfile(in); + cmsCloseProfile(out); #endif - if(transform == NULL) - { + if(transform == NULL) { #ifdef OPJ_HAVE_LIBLCMS1 - cmsCloseProfile(in); - cmsCloseProfile(out); + cmsCloseProfile(in); + cmsCloseProfile(out); #endif - return; - } - prec0 = (double)image->comps[0].prec; - prec1 = (double)image->comps[1].prec; - prec2 = (double)image->comps[2].prec; - - default_type = (unsigned int)row[1]; - - if(default_type == 0x44454600)/* DEF : default */ - { - rl = 100; ra = 170; rb = 200; - ol = 0; - oa = pow(2, prec1 - 1); - ob = pow(2, prec2 - 2) + pow(2, prec2 - 3); - } - else - { - rl = row[2]; ra = row[4]; rb = row[6]; - ol = row[3]; oa = row[5]; ob = row[7]; - } - - L = src0 = image->comps[0].data; - a = src1 = image->comps[1].data; - b = src2 = image->comps[2].data; - - max = image->comps[0].w * image->comps[0].h; - - red = dst0 = (int*)malloc(max * sizeof(int)); - green = dst1 = (int*)malloc(max * sizeof(int)); - blue = dst2 = (int*)malloc(max * sizeof(int)); - - minL = -(rl * ol)/(pow(2, prec0)-1); - maxL = minL + rl; - - mina = -(ra * oa)/(pow(2, prec1)-1); - maxa = mina + ra; - - minb = -(rb * ob)/(pow(2, prec2)-1); - maxb = minb + rb; - - for(i = 0; i < max; ++i) - { - Lab.L = minL + (double)(*L) * (maxL - minL)/(pow(2, prec0)-1); ++L; - Lab.a = mina + (double)(*a) * (maxa - mina)/(pow(2, prec1)-1); ++a; - Lab.b = minb + (double)(*b) * (maxb - minb)/(pow(2, prec2)-1); ++b; - - cmsDoTransform(transform, &Lab, RGB, 1); - - *red++ = RGB[0]; - *green++ = RGB[1]; - *blue++ = RGB[2]; - } - cmsDeleteTransform(transform); + return; + } + prec0 = (double)image->comps[0].prec; + prec1 = (double)image->comps[1].prec; + prec2 = (double)image->comps[2].prec; + + default_type = (unsigned int)row[1]; + + if(default_type == 0x44454600) { /* DEF : default */ + rl = 100; + ra = 170; + rb = 200; + ol = 0; + oa = pow(2, prec1 - 1); + ob = pow(2, prec2 - 2) + pow(2, prec2 - 3); + } else { + rl = row[2]; + ra = row[4]; + rb = row[6]; + ol = row[3]; + oa = row[5]; + ob = row[7]; + } + + L = src0 = image->comps[0].data; + a = src1 = image->comps[1].data; + b = src2 = image->comps[2].data; + + max = image->comps[0].w * image->comps[0].h; + + red = dst0 = (int*)malloc(max * sizeof(int)); + green = dst1 = (int*)malloc(max * sizeof(int)); + blue = dst2 = (int*)malloc(max * sizeof(int)); + + minL = -(rl * ol)/(pow(2, prec0)-1); + maxL = minL + rl; + + mina = -(ra * oa)/(pow(2, prec1)-1); + maxa = mina + ra; + + minb = -(rb * ob)/(pow(2, prec2)-1); + maxb = minb + rb; + + for(i = 0; i < max; ++i) { + Lab.L = minL + (double)(*L) * (maxL - minL)/(pow(2, prec0)-1); + ++L; + Lab.a = mina + (double)(*a) * (maxa - mina)/(pow(2, prec1)-1); + ++a; + Lab.b = minb + (double)(*b) * (maxb - minb)/(pow(2, prec2)-1); + ++b; + + cmsDoTransform(transform, &Lab, RGB, 1); + + *red++ = RGB[0]; + *green++ = RGB[1]; + *blue++ = RGB[2]; + } + cmsDeleteTransform(transform); #ifdef OPJ_HAVE_LIBLCMS1 - cmsCloseProfile(in); - cmsCloseProfile(out); + cmsCloseProfile(in); + cmsCloseProfile(out); #endif - free(src0); image->comps[0].data = dst0; - free(src1); image->comps[1].data = dst1; - free(src2); image->comps[2].data = dst2; - - image->color_space = OPJ_CLRSPC_SRGB; - image->comps[0].prec = 16; - image->comps[1].prec = 16; - image->comps[2].prec = 16; - - return; - } - - fprintf(stderr,"%s:%d:\n\tenumCS %d not handled. Ignoring.\n", __FILE__,__LINE__, enumcs); + free(src0); + image->comps[0].data = dst0; + free(src1); + image->comps[1].data = dst1; + free(src2); + image->comps[2].data = dst2; + + image->color_space = OPJ_CLRSPC_SRGB; + image->comps[0].prec = 16; + image->comps[1].prec = 16; + image->comps[2].prec = 16; + + return; + } + + fprintf(stderr,"%s:%d:\n\tenumCS %d not handled. Ignoring.\n", __FILE__,__LINE__, enumcs); }/* color_apply_conversion() */ #endif /* OPJ_HAVE_LIBLCMS2 || OPJ_HAVE_LIBLCMS1 */ void color_cmyk_to_rgb(opj_image_t *image) { - float C, M, Y, K; - float sC, sM, sY, sK; - unsigned int w, h, max, i; - - w = image->comps[0].w; - h = image->comps[0].h; - - if(image->numcomps < 4) return; - - max = w * h; - - sC = 1.0F / (float)((1 << image->comps[0].prec) - 1); - sM = 1.0F / (float)((1 << image->comps[1].prec) - 1); - sY = 1.0F / (float)((1 << image->comps[2].prec) - 1); - sK = 1.0F / (float)((1 << image->comps[3].prec) - 1); - - for(i = 0; i < max; ++i) - { - /* CMYK values from 0 to 1 */ - C = (float)(image->comps[0].data[i]) * sC; - M = (float)(image->comps[1].data[i]) * sM; - Y = (float)(image->comps[2].data[i]) * sY; - K = (float)(image->comps[3].data[i]) * sK; - - /* Invert all CMYK values */ - C = 1.0F - C; - M = 1.0F - M; - Y = 1.0F - Y; - K = 1.0F - K; - - /* CMYK -> RGB : RGB results from 0 to 255 */ - image->comps[0].data[i] = (int)(255.0F * C * K); /* R */ - image->comps[1].data[i] = (int)(255.0F * M * K); /* G */ - image->comps[2].data[i] = (int)(255.0F * Y * K); /* B */ - } - - free(image->comps[3].data); image->comps[3].data = NULL; - image->comps[0].prec = 8; - image->comps[1].prec = 8; - image->comps[2].prec = 8; - image->numcomps -= 1; - image->color_space = OPJ_CLRSPC_SRGB; - - for (i = 3; i < image->numcomps; ++i) { - memcpy(&(image->comps[i]), &(image->comps[i+1]), sizeof(image->comps[i])); - } + float C, M, Y, K; + float sC, sM, sY, sK; + unsigned int w, h, max, i; + + w = image->comps[0].w; + h = image->comps[0].h; + + if(image->numcomps < 4) return; + + max = w * h; + + sC = 1.0F / (float)((1 << image->comps[0].prec) - 1); + sM = 1.0F / (float)((1 << image->comps[1].prec) - 1); + sY = 1.0F / (float)((1 << image->comps[2].prec) - 1); + sK = 1.0F / (float)((1 << image->comps[3].prec) - 1); + + for(i = 0; i < max; ++i) { + /* CMYK values from 0 to 1 */ + C = (float)(image->comps[0].data[i]) * sC; + M = (float)(image->comps[1].data[i]) * sM; + Y = (float)(image->comps[2].data[i]) * sY; + K = (float)(image->comps[3].data[i]) * sK; + + /* Invert all CMYK values */ + C = 1.0F - C; + M = 1.0F - M; + Y = 1.0F - Y; + K = 1.0F - K; + + /* CMYK -> RGB : RGB results from 0 to 255 */ + image->comps[0].data[i] = (int)(255.0F * C * K); /* R */ + image->comps[1].data[i] = (int)(255.0F * M * K); /* G */ + image->comps[2].data[i] = (int)(255.0F * Y * K); /* B */ + } + + free(image->comps[3].data); + image->comps[3].data = NULL; + image->comps[0].prec = 8; + image->comps[1].prec = 8; + image->comps[2].prec = 8; + image->numcomps -= 1; + image->color_space = OPJ_CLRSPC_SRGB; + + for (i = 3; i < image->numcomps; ++i) { + memcpy(&(image->comps[i]), &(image->comps[i+1]), sizeof(image->comps[i])); + } }/* color_cmyk_to_rgb() */ @@ -739,50 +788,54 @@ void color_cmyk_to_rgb(opj_image_t *image) */ void color_esycc_to_rgb(opj_image_t *image) { - int y, cb, cr, sign1, sign2, val; - unsigned int w, h, max, i; - int flip_value = (1 << (image->comps[0].prec-1)); - int max_value = (1 << image->comps[0].prec) - 1; - - if(image->numcomps < 3) return; - - w = image->comps[0].w; - h = image->comps[0].h; - - sign1 = (int)image->comps[1].sgnd; - sign2 = (int)image->comps[2].sgnd; - - max = w * h; - - for(i = 0; i < max; ++i) - { - - y = image->comps[0].data[i]; cb = image->comps[1].data[i]; cr = image->comps[2].data[i]; - - if( !sign1) cb -= flip_value; - if( !sign2) cr -= flip_value; - - val = (int) - ((float)y - (float)0.0000368 * (float)cb - + (float)1.40199 * (float)cr + (float)0.5); - - if(val > max_value) val = max_value; else if(val < 0) val = 0; - image->comps[0].data[i] = val; - - val = (int) - ((float)1.0003 * (float)y - (float)0.344125 * (float)cb - - (float)0.7141128 * (float)cr + (float)0.5); - - if(val > max_value) val = max_value; else if(val < 0) val = 0; - image->comps[1].data[i] = val; - - val = (int) - ((float)0.999823 * (float)y + (float)1.77204 * (float)cb - - (float)0.000008 *(float)cr + (float)0.5); - - if(val > max_value) val = max_value; else if(val < 0) val = 0; - image->comps[2].data[i] = val; - } - image->color_space = OPJ_CLRSPC_SRGB; + int y, cb, cr, sign1, sign2, val; + unsigned int w, h, max, i; + int flip_value = (1 << (image->comps[0].prec-1)); + int max_value = (1 << image->comps[0].prec) - 1; + + if(image->numcomps < 3) return; + + w = image->comps[0].w; + h = image->comps[0].h; + + sign1 = (int)image->comps[1].sgnd; + sign2 = (int)image->comps[2].sgnd; + + max = w * h; + + for(i = 0; i < max; ++i) { + + y = image->comps[0].data[i]; + cb = image->comps[1].data[i]; + cr = image->comps[2].data[i]; + + if( !sign1) cb -= flip_value; + if( !sign2) cr -= flip_value; + + val = (int) + ((float)y - (float)0.0000368 * (float)cb + + (float)1.40199 * (float)cr + (float)0.5); + + if(val > max_value) val = max_value; + else if(val < 0) val = 0; + image->comps[0].data[i] = val; + + val = (int) + ((float)1.0003 * (float)y - (float)0.344125 * (float)cb + - (float)0.7141128 * (float)cr + (float)0.5); + + if(val > max_value) val = max_value; + else if(val < 0) val = 0; + image->comps[1].data[i] = val; + + val = (int) + ((float)0.999823 * (float)y + (float)1.77204 * (float)cb + - (float)0.000008 *(float)cr + (float)0.5); + + if(val > max_value) val = max_value; + else if(val < 0) val = 0; + image->comps[2].data[i] = val; + } + image->color_space = OPJ_CLRSPC_SRGB; }/* color_esycc_to_rgb() */ diff --git a/src/bin/common/color.h b/src/bin/common/color.h index 0cd78e89..24792544 100644 --- a/src/bin/common/color.h +++ b/src/bin/common/color.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. diff --git a/src/bin/common/format_defs.h b/src/bin/common/format_defs.h index 608d7b3a..1985b54f 100644 --- a/src/bin/common/format_defs.h +++ b/src/bin/common/format_defs.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. diff --git a/src/bin/common/opj_getopt.c b/src/bin/common/opj_getopt.c index 65f271f8..46a76b92 100644 --- a/src/bin/common/opj_getopt.c +++ b/src/bin/common/opj_getopt.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 3-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 3-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -44,212 +44,213 @@ static char sccsid[] = "@(#)opj_getopt.c 8.3 (Berkeley) 4/27/95"; #include "opj_getopt.h" int opj_opterr = 1, /* if error message should be printed */ - opj_optind = 1, /* index into parent argv vector */ - opj_optopt, /* character checked for validity */ - opj_optreset; /* reset getopt */ - char *opj_optarg; /* argument associated with option */ + opj_optind = 1, /* index into parent argv vector */ + opj_optopt, /* character checked for validity */ + opj_optreset; /* reset getopt */ +char *opj_optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' -static char EMSG[]={""}; +static char EMSG[]= {""}; /* As this class remembers its values from one Java call to the other, reset the values before each use */ -void opj_reset_options_reading(void) { - opj_opterr = 1; - opj_optind = 1; +void opj_reset_options_reading(void) +{ + opj_opterr = 1; + opj_optind = 1; } /* * getopt -- * Parse argc/argv argument vector. */ -int opj_getopt(int nargc, char *const *nargv, const char *ostr) { +int opj_getopt(int nargc, char *const *nargv, const char *ostr) +{ # define __progname nargv[0] - static char *place = EMSG; /* option letter processing */ - const char *oli = NULL; /* option letter list index */ - - if (opj_optreset || !*place) { /* update scanning pointer */ - opj_optreset = 0; - if (opj_optind >= nargc || *(place = nargv[opj_optind]) != '-') { - place = EMSG; - return (-1); + static char *place = EMSG; /* option letter processing */ + const char *oli = NULL; /* option letter list index */ + + if (opj_optreset || !*place) { /* update scanning pointer */ + opj_optreset = 0; + if (opj_optind >= nargc || *(place = nargv[opj_optind]) != '-') { + place = EMSG; + return (-1); + } + if (place[1] && *++place == '-') { /* found "--" */ + ++opj_optind; + place = EMSG; + return (-1); + } + } /* option letter okay? */ + if ((opj_optopt = (int) *place++) == (int) ':' || + !(oli = strchr(ostr, opj_optopt))) { + /* + * if the user didn't specify '-' as an option, + * assume it means -1. + */ + if (opj_optopt == (int) '-') + return (-1); + if (!*place) + ++opj_optind; + if (opj_opterr && *ostr != ':') { + fprintf(stderr, + "%s: illegal option -- %c\n", __progname, opj_optopt); + return (BADCH); + } } - if (place[1] && *++place == '-') { /* found "--" */ - ++opj_optind; - place = EMSG; - return (-1); + if (*++oli != ':') { /* don't need argument */ + opj_optarg = NULL; + if (!*place) + ++opj_optind; + } else { /* need an argument */ + if (*place) /* no white space */ + opj_optarg = place; + else if (nargc <= ++opj_optind) { /* no arg */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opj_opterr) { + fprintf(stderr, + "%s: option requires an argument -- %c\n", + __progname, opj_optopt); + return (BADCH); + } + } else /* white space */ + opj_optarg = nargv[opj_optind]; + place = EMSG; + ++opj_optind; } - } /* option letter okay? */ - if ((opj_optopt = (int) *place++) == (int) ':' || - !(oli = strchr(ostr, opj_optopt))) { - /* - * if the user didn't specify '-' as an option, - * assume it means -1. - */ - if (opj_optopt == (int) '-') - return (-1); - if (!*place) - ++opj_optind; - if (opj_opterr && *ostr != ':') { - fprintf(stderr, - "%s: illegal option -- %c\n", __progname, opj_optopt); - return (BADCH); - } - } - if (*++oli != ':') { /* don't need argument */ - opj_optarg = NULL; - if (!*place) - ++opj_optind; - } else { /* need an argument */ - if (*place) /* no white space */ - opj_optarg = place; - else if (nargc <= ++opj_optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') - return (BADARG); - if (opj_opterr) { - fprintf(stderr, - "%s: option requires an argument -- %c\n", - __progname, opj_optopt); - return (BADCH); - } - } else /* white space */ - opj_optarg = nargv[opj_optind]; - place = EMSG; - ++opj_optind; - } - return (opj_optopt); /* dump back option letter */ + return (opj_optopt); /* dump back option letter */ } int opj_getopt_long(int argc, char * const argv[], const char *optstring, -const opj_option_t *longopts, int totlen) { - static int lastidx,lastofs; - const char *tmp; - int i,len; - char param = 1; + const opj_option_t *longopts, int totlen) +{ + static int lastidx,lastofs; + const char *tmp; + int i,len; + char param = 1; again: - if (opj_optind >= argc || !argv[opj_optind] || *argv[opj_optind]!='-') - return -1; - - if (argv[opj_optind][0]=='-' && argv[opj_optind][1]==0) { - if(opj_optind >= (argc - 1)){ /* no more input parameters */ - param = 0; - } - else{ /* more input parameters */ - if(argv[opj_optind + 1][0] == '-'){ - param = 0; /* Missing parameter after '-' */ - } - else{ - param = 2; - } - } - } - - if (param == 0) { - ++opj_optind; - return (BADCH); - } - - if (argv[opj_optind][0]=='-') { /* long option */ - char* arg=argv[opj_optind]+1; - const opj_option_t* o; - o=longopts; - len=sizeof(longopts[0]); - - if (param > 1){ - arg = argv[opj_optind+1]; - opj_optind++; - } - else - arg = argv[opj_optind]+1; - - if(strlen(arg)>1){ - for (i=0;i<totlen;i=i+len,o++) { - if (!strcmp(o->name,arg)) { /* match */ - if (o->has_arg == 0) { - if ((argv[opj_optind+1])&&(!(argv[opj_optind+1][0]=='-'))){ - fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[opj_optind+1]); - ++opj_optind; - } - }else{ - opj_optarg=argv[opj_optind+1]; - if(opj_optarg){ - if (opj_optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */ - if (opj_opterr) { - fprintf(stderr,"%s: option requires an argument\n",arg); - return (BADCH); - } - } - } - if (!opj_optarg && o->has_arg==1) { /* no argument there */ - if (opj_opterr) { - fprintf(stderr,"%s: option requires an argument \n",arg); - return (BADCH); - } - } - ++opj_optind; - } - ++opj_optind; - if (o->flag) - *(o->flag)=o->val; - else - return o->val; - return 0; - } - }/*(end for)String not found in the list*/ - fprintf(stderr,"Invalid option %s\n",arg); - ++opj_optind; - return (BADCH); - }else{ /*Single character input parameter*/ - if (*optstring==':') return ':'; - if (lastidx!=opj_optind) { - lastidx=opj_optind; lastofs=0; - } - opj_optopt=argv[opj_optind][lastofs+1]; - if ((tmp=strchr(optstring,opj_optopt))) {/*Found input parameter in list*/ - if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */ - ++opj_optind; - goto again; - } - if (tmp[1]==':') { /* argument expected */ - if (tmp[2]==':' || argv[opj_optind][lastofs+2]) { /* "-foo", return "oo" as opj_optarg */ - if (!*(opj_optarg=argv[opj_optind]+lastofs+2)) opj_optarg=0; - goto found; - } - opj_optarg=argv[opj_optind+1]; - if(opj_optarg){ - if (opj_optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */ - if (opj_opterr) { - fprintf(stderr,"%s: option requires an argument\n",arg); - return (BADCH); - } - } - } - if (!opj_optarg) { /* missing argument */ - if (opj_opterr) { - fprintf(stderr,"%s: option requires an argument\n",arg); - return (BADCH); - } - } - ++opj_optind; - }else {/*Argument not expected*/ - ++lastofs; - return opj_optopt; - } + if (opj_optind >= argc || !argv[opj_optind] || *argv[opj_optind]!='-') + return -1; + + if (argv[opj_optind][0]=='-' && argv[opj_optind][1]==0) { + if(opj_optind >= (argc - 1)) { /* no more input parameters */ + param = 0; + } else { /* more input parameters */ + if(argv[opj_optind + 1][0] == '-') { + param = 0; /* Missing parameter after '-' */ + } else { + param = 2; + } + } + } + + if (param == 0) { + ++opj_optind; + return (BADCH); + } + + if (argv[opj_optind][0]=='-') { /* long option */ + char* arg=argv[opj_optind]+1; + const opj_option_t* o; + o=longopts; + len=sizeof(longopts[0]); + + if (param > 1) { + arg = argv[opj_optind+1]; + opj_optind++; + } else + arg = argv[opj_optind]+1; + + if(strlen(arg)>1) { + for (i=0; i<totlen; i=i+len,o++) { + if (!strcmp(o->name,arg)) { /* match */ + if (o->has_arg == 0) { + if ((argv[opj_optind+1])&&(!(argv[opj_optind+1][0]=='-'))) { + fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[opj_optind+1]); + ++opj_optind; + } + } else { + opj_optarg=argv[opj_optind+1]; + if(opj_optarg) { + if (opj_optarg[0] == '-') { /* Has read next input parameter: No arg for current parameter */ + if (opj_opterr) { + fprintf(stderr,"%s: option requires an argument\n",arg); + return (BADCH); + } + } + } + if (!opj_optarg && o->has_arg==1) { /* no argument there */ + if (opj_opterr) { + fprintf(stderr,"%s: option requires an argument \n",arg); + return (BADCH); + } + } + ++opj_optind; + } + ++opj_optind; + if (o->flag) + *(o->flag)=o->val; + else + return o->val; + return 0; + } + }/*(end for)String not found in the list*/ + fprintf(stderr,"Invalid option %s\n",arg); + ++opj_optind; + return (BADCH); + } else { /*Single character input parameter*/ + if (*optstring==':') return ':'; + if (lastidx!=opj_optind) { + lastidx=opj_optind; + lastofs=0; + } + opj_optopt=argv[opj_optind][lastofs+1]; + if ((tmp=strchr(optstring,opj_optopt))) {/*Found input parameter in list*/ + if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */ + ++opj_optind; + goto again; + } + if (tmp[1]==':') { /* argument expected */ + if (tmp[2]==':' || argv[opj_optind][lastofs+2]) { /* "-foo", return "oo" as opj_optarg */ + if (!*(opj_optarg=argv[opj_optind]+lastofs+2)) opj_optarg=0; + goto found; + } + opj_optarg=argv[opj_optind+1]; + if(opj_optarg) { + if (opj_optarg[0] == '-') { /* Has read next input parameter: No arg for current parameter */ + if (opj_opterr) { + fprintf(stderr,"%s: option requires an argument\n",arg); + return (BADCH); + } + } + } + if (!opj_optarg) { /* missing argument */ + if (opj_opterr) { + fprintf(stderr,"%s: option requires an argument\n",arg); + return (BADCH); + } + } + ++opj_optind; + } else {/*Argument not expected*/ + ++lastofs; + return opj_optopt; + } found: - ++opj_optind; - return opj_optopt; - } else { /* not found */ - fprintf(stderr,"Invalid option %s\n",arg); - ++opj_optind; - return (BADCH); - }/*end of not found*/ - - }/* end of single character*/ - }/*end '-'*/ - fprintf(stderr,"Invalid option\n"); - ++opj_optind; - return (BADCH);; + ++opj_optind; + return opj_optopt; + } else { /* not found */ + fprintf(stderr,"Invalid option %s\n",arg); + ++opj_optind; + return (BADCH); + }/*end of not found*/ + + }/* end of single character*/ + }/*end '-'*/ + fprintf(stderr,"Invalid option\n"); + ++opj_optind; + return (BADCH);; }/*end function*/ diff --git a/src/bin/common/opj_getopt.h b/src/bin/common/opj_getopt.h index f97e8b35..87c5bafc 100644 --- a/src/bin/common/opj_getopt.h +++ b/src/bin/common/opj_getopt.h @@ -3,13 +3,12 @@ #ifndef _GETOPT_H_ #define _GETOPT_H_ -typedef struct opj_option -{ - const char *name; - int has_arg; - int *flag; - int val; -}opj_option_t; +typedef struct opj_option { + const char *name; + int has_arg; + int *flag; + int val; +} opj_option_t; #define NO_ARG 0 #define REQ_ARG 1 @@ -23,7 +22,7 @@ extern char *opj_optarg; extern int opj_getopt(int nargc, char *const *nargv, const char *ostr); extern int opj_getopt_long(int argc, char * const argv[], const char *optstring, - const opj_option_t *longopts, int totlen); + const opj_option_t *longopts, int totlen); extern void opj_reset_options_reading(void); #endif /* _GETOPT_H_ */ diff --git a/src/bin/common/opj_string.h b/src/bin/common/opj_string.h index 8829926a..f704a8c9 100644 --- a/src/bin/common/opj_string.h +++ b/src/bin/common/opj_string.h @@ -39,34 +39,34 @@ /* keep in mind there still is a buffer read overflow possible */ static size_t opj_strnlen_s(const char *src, size_t max_len) { - size_t len; - - if (src == NULL) { - return 0U; - } - for (len = 0U; (*src != '\0') && (len < max_len); src++, len++); - return len; + size_t len; + + if (src == NULL) { + return 0U; + } + for (len = 0U; (*src != '\0') && (len < max_len); src++, len++); + return len; } /* should be equivalent to C11 function except for the handler */ /* keep in mind there still is a buffer read overflow possible */ static int opj_strcpy_s(char* dst, size_t dst_size, const char* src) { - size_t src_len = 0U; - if ((dst == NULL) || (dst_size == 0U)) { - return EINVAL; - } - if (src == NULL) { - dst[0] = '\0'; - return EINVAL; - } - src_len = opj_strnlen_s(src, dst_size); - if (src_len >= dst_size) { - return ERANGE; - } - memcpy(dst, src, src_len); - dst[src_len] = '\0'; - return 0; + size_t src_len = 0U; + if ((dst == NULL) || (dst_size == 0U)) { + return EINVAL; + } + if (src == NULL) { + dst[0] = '\0'; + return EINVAL; + } + src_len = opj_strnlen_s(src, dst_size); + if (src_len >= dst_size) { + return ERANGE; + } + memcpy(dst, src, src_len); + dst[src_len] = '\0'; + return 0; } #endif /* OPJ_STRING_H */ diff --git a/src/bin/jp2/convert.c b/src/bin/jp2/convert.c index 13713204..d2e799f5 100644 --- a/src/bin/jp2/convert.c +++ b/src/bin/jp2/convert.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan @@ -50,7 +50,8 @@ * * log2(a) */ -static int int_floorlog2(int a) { +static int int_floorlog2(int a) +{ int l; for (l = 0; a > 1; l++) { a >>= 1; @@ -61,88 +62,88 @@ static int int_floorlog2(int a) { /* Component precision scaling */ void clip_component(opj_image_comp_t* component, OPJ_UINT32 precision) { - OPJ_SIZE_T i; - OPJ_SIZE_T len; - OPJ_UINT32 umax = (OPJ_UINT32)((OPJ_INT32)-1); - - len = (OPJ_SIZE_T)component->w * (OPJ_SIZE_T)component->h; - if (precision < 32) { - umax = (1U << precision) - 1U; - } - - if (component->sgnd) { - OPJ_INT32* l_data = component->data; - OPJ_INT32 max = (OPJ_INT32)(umax / 2U); - OPJ_INT32 min = -max - 1; - for (i = 0; i < len; ++i) { - if (l_data[i] > max) { - l_data[i] = max; - } else if (l_data[i] < min) { - l_data[i] = min; - } - } - } else { - OPJ_UINT32* l_data = (OPJ_UINT32*)component->data; - for (i = 0; i < len; ++i) { - if (l_data[i] > umax) { - l_data[i] = umax; - } - } - } - component->prec = precision; + OPJ_SIZE_T i; + OPJ_SIZE_T len; + OPJ_UINT32 umax = (OPJ_UINT32)((OPJ_INT32)-1); + + len = (OPJ_SIZE_T)component->w * (OPJ_SIZE_T)component->h; + if (precision < 32) { + umax = (1U << precision) - 1U; + } + + if (component->sgnd) { + OPJ_INT32* l_data = component->data; + OPJ_INT32 max = (OPJ_INT32)(umax / 2U); + OPJ_INT32 min = -max - 1; + for (i = 0; i < len; ++i) { + if (l_data[i] > max) { + l_data[i] = max; + } else if (l_data[i] < min) { + l_data[i] = min; + } + } + } else { + OPJ_UINT32* l_data = (OPJ_UINT32*)component->data; + for (i = 0; i < len; ++i) { + if (l_data[i] > umax) { + l_data[i] = umax; + } + } + } + component->prec = precision; } /* Component precision scaling */ static void scale_component_up(opj_image_comp_t* component, OPJ_UINT32 precision) { - OPJ_SIZE_T i, len; - - len = (OPJ_SIZE_T)component->w * (OPJ_SIZE_T)component->h; - if (component->sgnd) { - OPJ_INT64 newMax = (OPJ_INT64)(1U << (precision - 1)); - OPJ_INT64 oldMax = (OPJ_INT64)(1U << (component->prec - 1)); - OPJ_INT32* l_data = component->data; - for (i = 0; i < len; ++i) { - l_data[i] = (OPJ_INT32)(((OPJ_INT64)l_data[i] * newMax) / oldMax); - } - } else { - OPJ_UINT64 newMax = (OPJ_UINT64)((1U << precision) - 1U); - OPJ_UINT64 oldMax = (OPJ_UINT64)((1U << component->prec) - 1U); - OPJ_UINT32* l_data = (OPJ_UINT32*)component->data; - for (i = 0; i < len; ++i) { - l_data[i] = (OPJ_UINT32)(((OPJ_UINT64)l_data[i] * newMax) / oldMax); - } - } - component->prec = precision; - component->bpp = precision; + OPJ_SIZE_T i, len; + + len = (OPJ_SIZE_T)component->w * (OPJ_SIZE_T)component->h; + if (component->sgnd) { + OPJ_INT64 newMax = (OPJ_INT64)(1U << (precision - 1)); + OPJ_INT64 oldMax = (OPJ_INT64)(1U << (component->prec - 1)); + OPJ_INT32* l_data = component->data; + for (i = 0; i < len; ++i) { + l_data[i] = (OPJ_INT32)(((OPJ_INT64)l_data[i] * newMax) / oldMax); + } + } else { + OPJ_UINT64 newMax = (OPJ_UINT64)((1U << precision) - 1U); + OPJ_UINT64 oldMax = (OPJ_UINT64)((1U << component->prec) - 1U); + OPJ_UINT32* l_data = (OPJ_UINT32*)component->data; + for (i = 0; i < len; ++i) { + l_data[i] = (OPJ_UINT32)(((OPJ_UINT64)l_data[i] * newMax) / oldMax); + } + } + component->prec = precision; + component->bpp = precision; } void scale_component(opj_image_comp_t* component, OPJ_UINT32 precision) { - int shift; - OPJ_SIZE_T i, len; - - if (component->prec == precision) { - return; - } - if (component->prec < precision) { - scale_component_up(component, precision); - return; - } - shift = (int)(component->prec - precision); - len = (OPJ_SIZE_T)component->w * (OPJ_SIZE_T)component->h; - if (component->sgnd) { - OPJ_INT32* l_data = component->data; - for (i = 0; i < len; ++i) { - l_data[i] >>= shift; - } - } else { - OPJ_UINT32* l_data = (OPJ_UINT32*)component->data; - for (i = 0; i < len; ++i) { - l_data[i] >>= shift; - } - } - component->bpp = precision; - component->prec = precision; + int shift; + OPJ_SIZE_T i, len; + + if (component->prec == precision) { + return; + } + if (component->prec < precision) { + scale_component_up(component, precision); + return; + } + shift = (int)(component->prec - precision); + len = (OPJ_SIZE_T)component->w * (OPJ_SIZE_T)component->h; + if (component->sgnd) { + OPJ_INT32* l_data = component->data; + for (i = 0; i < len; ++i) { + l_data[i] >>= shift; + } + } else { + OPJ_UINT32* l_data = (OPJ_UINT32*)component->data; + for (i = 0; i < len; ++i) { + l_data[i] >>= shift; + } + } + component->bpp = precision; + component->prec = precision; } @@ -150,381 +151,381 @@ void scale_component(opj_image_comp_t* component, OPJ_UINT32 precision) /* used by PNG/TIFF */ static void convert_32s_C1P1(const OPJ_INT32* pSrc, OPJ_INT32* const* pDst, OPJ_SIZE_T length) { - memcpy(pDst[0], pSrc, length * sizeof(OPJ_INT32)); + memcpy(pDst[0], pSrc, length * sizeof(OPJ_INT32)); } static void convert_32s_C2P2(const OPJ_INT32* pSrc, OPJ_INT32* const* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - OPJ_INT32* pDst0 = pDst[0]; - OPJ_INT32* pDst1 = pDst[1]; - - for (i = 0; i < length; i++) { - pDst0[i] = pSrc[2*i+0]; - pDst1[i] = pSrc[2*i+1]; - } + OPJ_SIZE_T i; + OPJ_INT32* pDst0 = pDst[0]; + OPJ_INT32* pDst1 = pDst[1]; + + for (i = 0; i < length; i++) { + pDst0[i] = pSrc[2*i+0]; + pDst1[i] = pSrc[2*i+1]; + } } static void convert_32s_C3P3(const OPJ_INT32* pSrc, OPJ_INT32* const* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - OPJ_INT32* pDst0 = pDst[0]; - OPJ_INT32* pDst1 = pDst[1]; - OPJ_INT32* pDst2 = pDst[2]; - - for (i = 0; i < length; i++) { - pDst0[i] = pSrc[3*i+0]; - pDst1[i] = pSrc[3*i+1]; - pDst2[i] = pSrc[3*i+2]; - } + OPJ_SIZE_T i; + OPJ_INT32* pDst0 = pDst[0]; + OPJ_INT32* pDst1 = pDst[1]; + OPJ_INT32* pDst2 = pDst[2]; + + for (i = 0; i < length; i++) { + pDst0[i] = pSrc[3*i+0]; + pDst1[i] = pSrc[3*i+1]; + pDst2[i] = pSrc[3*i+2]; + } } static void convert_32s_C4P4(const OPJ_INT32* pSrc, OPJ_INT32* const* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - OPJ_INT32* pDst0 = pDst[0]; - OPJ_INT32* pDst1 = pDst[1]; - OPJ_INT32* pDst2 = pDst[2]; - OPJ_INT32* pDst3 = pDst[3]; - - for (i = 0; i < length; i++) { - pDst0[i] = pSrc[4*i+0]; - pDst1[i] = pSrc[4*i+1]; - pDst2[i] = pSrc[4*i+2]; - pDst3[i] = pSrc[4*i+3]; - } + OPJ_SIZE_T i; + OPJ_INT32* pDst0 = pDst[0]; + OPJ_INT32* pDst1 = pDst[1]; + OPJ_INT32* pDst2 = pDst[2]; + OPJ_INT32* pDst3 = pDst[3]; + + for (i = 0; i < length; i++) { + pDst0[i] = pSrc[4*i+0]; + pDst1[i] = pSrc[4*i+1]; + pDst2[i] = pSrc[4*i+2]; + pDst3[i] = pSrc[4*i+3]; + } } const convert_32s_CXPX convert_32s_CXPX_LUT[5] = { - NULL, - convert_32s_C1P1, - convert_32s_C2P2, - convert_32s_C3P3, - convert_32s_C4P4 + NULL, + convert_32s_C1P1, + convert_32s_C2P2, + convert_32s_C3P3, + convert_32s_C4P4 }; static void convert_32s_P1C1(OPJ_INT32 const* const* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length, OPJ_INT32 adjust) { - OPJ_SIZE_T i; - const OPJ_INT32* pSrc0 = pSrc[0]; - - for (i = 0; i < length; i++) { - pDst[i] = pSrc0[i] + adjust; - } + OPJ_SIZE_T i; + const OPJ_INT32* pSrc0 = pSrc[0]; + + for (i = 0; i < length; i++) { + pDst[i] = pSrc0[i] + adjust; + } } static void convert_32s_P2C2(OPJ_INT32 const* const* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length, OPJ_INT32 adjust) { - OPJ_SIZE_T i; - const OPJ_INT32* pSrc0 = pSrc[0]; - const OPJ_INT32* pSrc1 = pSrc[1]; - - for (i = 0; i < length; i++) { - pDst[2*i+0] = pSrc0[i] + adjust; - pDst[2*i+1] = pSrc1[i] + adjust; - } + OPJ_SIZE_T i; + const OPJ_INT32* pSrc0 = pSrc[0]; + const OPJ_INT32* pSrc1 = pSrc[1]; + + for (i = 0; i < length; i++) { + pDst[2*i+0] = pSrc0[i] + adjust; + pDst[2*i+1] = pSrc1[i] + adjust; + } } static void convert_32s_P3C3(OPJ_INT32 const* const* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length, OPJ_INT32 adjust) { - OPJ_SIZE_T i; - const OPJ_INT32* pSrc0 = pSrc[0]; - const OPJ_INT32* pSrc1 = pSrc[1]; - const OPJ_INT32* pSrc2 = pSrc[2]; - - for (i = 0; i < length; i++) { - pDst[3*i+0] = pSrc0[i] + adjust; - pDst[3*i+1] = pSrc1[i] + adjust; - pDst[3*i+2] = pSrc2[i] + adjust; - } + OPJ_SIZE_T i; + const OPJ_INT32* pSrc0 = pSrc[0]; + const OPJ_INT32* pSrc1 = pSrc[1]; + const OPJ_INT32* pSrc2 = pSrc[2]; + + for (i = 0; i < length; i++) { + pDst[3*i+0] = pSrc0[i] + adjust; + pDst[3*i+1] = pSrc1[i] + adjust; + pDst[3*i+2] = pSrc2[i] + adjust; + } } static void convert_32s_P4C4(OPJ_INT32 const* const* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length, OPJ_INT32 adjust) { - OPJ_SIZE_T i; - const OPJ_INT32* pSrc0 = pSrc[0]; - const OPJ_INT32* pSrc1 = pSrc[1]; - const OPJ_INT32* pSrc2 = pSrc[2]; - const OPJ_INT32* pSrc3 = pSrc[3]; - - for (i = 0; i < length; i++) { - pDst[4*i+0] = pSrc0[i] + adjust; - pDst[4*i+1] = pSrc1[i] + adjust; - pDst[4*i+2] = pSrc2[i] + adjust; - pDst[4*i+3] = pSrc3[i] + adjust; - } + OPJ_SIZE_T i; + const OPJ_INT32* pSrc0 = pSrc[0]; + const OPJ_INT32* pSrc1 = pSrc[1]; + const OPJ_INT32* pSrc2 = pSrc[2]; + const OPJ_INT32* pSrc3 = pSrc[3]; + + for (i = 0; i < length; i++) { + pDst[4*i+0] = pSrc0[i] + adjust; + pDst[4*i+1] = pSrc1[i] + adjust; + pDst[4*i+2] = pSrc2[i] + adjust; + pDst[4*i+3] = pSrc3[i] + adjust; + } } const convert_32s_PXCX convert_32s_PXCX_LUT[5] = { - NULL, - convert_32s_P1C1, - convert_32s_P2C2, - convert_32s_P3C3, - convert_32s_P4C4 + NULL, + convert_32s_P1C1, + convert_32s_P2C2, + convert_32s_P3C3, + convert_32s_P4C4 }; /* bit depth conversions */ /* used by PNG/TIFF up to 8bpp */ static void convert_1u32s_C1R(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)7U); i+=8U) { - OPJ_UINT32 val = *pSrc++; - pDst[i+0] = (OPJ_INT32)( val >> 7); - pDst[i+1] = (OPJ_INT32)((val >> 6) & 0x1U); - pDst[i+2] = (OPJ_INT32)((val >> 5) & 0x1U); - pDst[i+3] = (OPJ_INT32)((val >> 4) & 0x1U); - pDst[i+4] = (OPJ_INT32)((val >> 3) & 0x1U); - pDst[i+5] = (OPJ_INT32)((val >> 2) & 0x1U); - pDst[i+6] = (OPJ_INT32)((val >> 1) & 0x1U); - pDst[i+7] = (OPJ_INT32)(val & 0x1U); - } - if (length & 7U) { - OPJ_UINT32 val = *pSrc++; - length = length & 7U; - pDst[i+0] = (OPJ_INT32)(val >> 7); - - if (length > 1U) { - pDst[i+1] = (OPJ_INT32)((val >> 6) & 0x1U); - if (length > 2U) { - pDst[i+2] = (OPJ_INT32)((val >> 5) & 0x1U); - if (length > 3U) { - pDst[i+3] = (OPJ_INT32)((val >> 4) & 0x1U); - if (length > 4U) { - pDst[i+4] = (OPJ_INT32)((val >> 3) & 0x1U); - if (length > 5U) { - pDst[i+5] = (OPJ_INT32)((val >> 2) & 0x1U); - if (length > 6U) { - pDst[i+6] = (OPJ_INT32)((val >> 1) & 0x1U); - } - } - } - } - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)7U); i+=8U) { + OPJ_UINT32 val = *pSrc++; + pDst[i+0] = (OPJ_INT32)( val >> 7); + pDst[i+1] = (OPJ_INT32)((val >> 6) & 0x1U); + pDst[i+2] = (OPJ_INT32)((val >> 5) & 0x1U); + pDst[i+3] = (OPJ_INT32)((val >> 4) & 0x1U); + pDst[i+4] = (OPJ_INT32)((val >> 3) & 0x1U); + pDst[i+5] = (OPJ_INT32)((val >> 2) & 0x1U); + pDst[i+6] = (OPJ_INT32)((val >> 1) & 0x1U); + pDst[i+7] = (OPJ_INT32)(val & 0x1U); + } + if (length & 7U) { + OPJ_UINT32 val = *pSrc++; + length = length & 7U; + pDst[i+0] = (OPJ_INT32)(val >> 7); + + if (length > 1U) { + pDst[i+1] = (OPJ_INT32)((val >> 6) & 0x1U); + if (length > 2U) { + pDst[i+2] = (OPJ_INT32)((val >> 5) & 0x1U); + if (length > 3U) { + pDst[i+3] = (OPJ_INT32)((val >> 4) & 0x1U); + if (length > 4U) { + pDst[i+4] = (OPJ_INT32)((val >> 3) & 0x1U); + if (length > 5U) { + pDst[i+5] = (OPJ_INT32)((val >> 2) & 0x1U); + if (length > 6U) { + pDst[i+6] = (OPJ_INT32)((val >> 1) & 0x1U); + } + } + } + } + } + } + } } static void convert_2u32s_C1R(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 val = *pSrc++; - pDst[i+0] = (OPJ_INT32)( val >> 6); - pDst[i+1] = (OPJ_INT32)((val >> 4) & 0x3U); - pDst[i+2] = (OPJ_INT32)((val >> 2) & 0x3U); - pDst[i+3] = (OPJ_INT32)(val & 0x3U); - } - if (length & 3U) { - OPJ_UINT32 val = *pSrc++; - length = length & 3U; - pDst[i+0] = (OPJ_INT32)(val >> 6); - - if (length > 1U) { - pDst[i+1] = (OPJ_INT32)((val >> 4) & 0x3U); - if (length > 2U) { - pDst[i+2] = (OPJ_INT32)((val >> 2) & 0x3U); - - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 val = *pSrc++; + pDst[i+0] = (OPJ_INT32)( val >> 6); + pDst[i+1] = (OPJ_INT32)((val >> 4) & 0x3U); + pDst[i+2] = (OPJ_INT32)((val >> 2) & 0x3U); + pDst[i+3] = (OPJ_INT32)(val & 0x3U); + } + if (length & 3U) { + OPJ_UINT32 val = *pSrc++; + length = length & 3U; + pDst[i+0] = (OPJ_INT32)(val >> 6); + + if (length > 1U) { + pDst[i+1] = (OPJ_INT32)((val >> 4) & 0x3U); + if (length > 2U) { + pDst[i+2] = (OPJ_INT32)((val >> 2) & 0x3U); + + } + } + } } static void convert_4u32s_C1R(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { - OPJ_UINT32 val = *pSrc++; - pDst[i+0] = (OPJ_INT32)(val >> 4); - pDst[i+1] = (OPJ_INT32)(val & 0xFU); - } - if (length & 1U) { - OPJ_UINT8 val = *pSrc++; - pDst[i+0] = (OPJ_INT32)(val >> 4); - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { + OPJ_UINT32 val = *pSrc++; + pDst[i+0] = (OPJ_INT32)(val >> 4); + pDst[i+1] = (OPJ_INT32)(val & 0xFU); + } + if (length & 1U) { + OPJ_UINT8 val = *pSrc++; + pDst[i+0] = (OPJ_INT32)(val >> 4); + } } static void convert_6u32s_C1R(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - OPJ_UINT32 val2 = *pSrc++; - pDst[i+0] = (OPJ_INT32)(val0 >> 2); - pDst[i+1] = (OPJ_INT32)(((val0 & 0x3U) << 4) | (val1 >> 4)); - pDst[i+2] = (OPJ_INT32)(((val1 & 0xFU) << 2) | (val2 >> 6)); - pDst[i+3] = (OPJ_INT32)(val2 & 0x3FU); - - } - if (length & 3U) { - OPJ_UINT32 val0 = *pSrc++; - length = length & 3U; - pDst[i+0] = (OPJ_INT32)(val0 >> 2); - - if (length > 1U) { - OPJ_UINT32 val1 = *pSrc++; - pDst[i+1] = (OPJ_INT32)(((val0 & 0x3U) << 4) | (val1 >> 4)); - if (length > 2U) { - OPJ_UINT32 val2 = *pSrc++; - pDst[i+2] = (OPJ_INT32)(((val1 & 0xFU) << 2) | (val2 >> 6)); - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + OPJ_UINT32 val2 = *pSrc++; + pDst[i+0] = (OPJ_INT32)(val0 >> 2); + pDst[i+1] = (OPJ_INT32)(((val0 & 0x3U) << 4) | (val1 >> 4)); + pDst[i+2] = (OPJ_INT32)(((val1 & 0xFU) << 2) | (val2 >> 6)); + pDst[i+3] = (OPJ_INT32)(val2 & 0x3FU); + + } + if (length & 3U) { + OPJ_UINT32 val0 = *pSrc++; + length = length & 3U; + pDst[i+0] = (OPJ_INT32)(val0 >> 2); + + if (length > 1U) { + OPJ_UINT32 val1 = *pSrc++; + pDst[i+1] = (OPJ_INT32)(((val0 & 0x3U) << 4) | (val1 >> 4)); + if (length > 2U) { + OPJ_UINT32 val2 = *pSrc++; + pDst[i+2] = (OPJ_INT32)(((val1 & 0xFU) << 2) | (val2 >> 6)); + } + } + } } static void convert_8u32s_C1R(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < length; i++) { - pDst[i] = pSrc[i]; - } + OPJ_SIZE_T i; + for (i = 0; i < length; i++) { + pDst[i] = pSrc[i]; + } } const convert_XXx32s_C1R convert_XXu32s_C1R_LUT[9] = { - NULL, - convert_1u32s_C1R, - convert_2u32s_C1R, - NULL, - convert_4u32s_C1R, - NULL, - convert_6u32s_C1R, - NULL, - convert_8u32s_C1R + NULL, + convert_1u32s_C1R, + convert_2u32s_C1R, + NULL, + convert_4u32s_C1R, + NULL, + convert_6u32s_C1R, + NULL, + convert_8u32s_C1R }; static void convert_32s1u_C1R(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)7U); i+=8U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; - OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; - OPJ_UINT32 src4 = (OPJ_UINT32)pSrc[i+4]; - OPJ_UINT32 src5 = (OPJ_UINT32)pSrc[i+5]; - OPJ_UINT32 src6 = (OPJ_UINT32)pSrc[i+6]; - OPJ_UINT32 src7 = (OPJ_UINT32)pSrc[i+7]; - - *pDst++ = (OPJ_BYTE)((src0 << 7) | (src1 << 6) | (src2 << 5) | (src3 << 4) | (src4 << 3) | (src5 << 2) | (src6 << 1) | src7); - } - - if (length & 7U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = 0U; - OPJ_UINT32 src2 = 0U; - OPJ_UINT32 src3 = 0U; - OPJ_UINT32 src4 = 0U; - OPJ_UINT32 src5 = 0U; - OPJ_UINT32 src6 = 0U; - length = length & 7U; - - if (length > 1U) { - src1 = (OPJ_UINT32)pSrc[i+1]; - if (length > 2U) { - src2 = (OPJ_UINT32)pSrc[i+2]; - if (length > 3U) { - src3 = (OPJ_UINT32)pSrc[i+3]; - if (length > 4U) { - src4 = (OPJ_UINT32)pSrc[i+4]; - if (length > 5U) { - src5 = (OPJ_UINT32)pSrc[i+5]; - if (length > 6U) { - src6 = (OPJ_UINT32)pSrc[i+6]; - } - } - } - } - } - } - *pDst++ = (OPJ_BYTE)((src0 << 7) | (src1 << 6) | (src2 << 5) | (src3 << 4) | (src4 << 3) | (src5 << 2) | (src6 << 1)); - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)7U); i+=8U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; + OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; + OPJ_UINT32 src4 = (OPJ_UINT32)pSrc[i+4]; + OPJ_UINT32 src5 = (OPJ_UINT32)pSrc[i+5]; + OPJ_UINT32 src6 = (OPJ_UINT32)pSrc[i+6]; + OPJ_UINT32 src7 = (OPJ_UINT32)pSrc[i+7]; + + *pDst++ = (OPJ_BYTE)((src0 << 7) | (src1 << 6) | (src2 << 5) | (src3 << 4) | (src4 << 3) | (src5 << 2) | (src6 << 1) | src7); + } + + if (length & 7U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = 0U; + OPJ_UINT32 src2 = 0U; + OPJ_UINT32 src3 = 0U; + OPJ_UINT32 src4 = 0U; + OPJ_UINT32 src5 = 0U; + OPJ_UINT32 src6 = 0U; + length = length & 7U; + + if (length > 1U) { + src1 = (OPJ_UINT32)pSrc[i+1]; + if (length > 2U) { + src2 = (OPJ_UINT32)pSrc[i+2]; + if (length > 3U) { + src3 = (OPJ_UINT32)pSrc[i+3]; + if (length > 4U) { + src4 = (OPJ_UINT32)pSrc[i+4]; + if (length > 5U) { + src5 = (OPJ_UINT32)pSrc[i+5]; + if (length > 6U) { + src6 = (OPJ_UINT32)pSrc[i+6]; + } + } + } + } + } + } + *pDst++ = (OPJ_BYTE)((src0 << 7) | (src1 << 6) | (src2 << 5) | (src3 << 4) | (src4 << 3) | (src5 << 2) | (src6 << 1)); + } } static void convert_32s2u_C1R(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; - OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; - - *pDst++ = (OPJ_BYTE)((src0 << 6) | (src1 << 4) | (src2 << 2) | src3); - } - - if (length & 3U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = 0U; - OPJ_UINT32 src2 = 0U; - length = length & 3U; - - if (length > 1U) { - src1 = (OPJ_UINT32)pSrc[i+1]; - if (length > 2U) { - src2 = (OPJ_UINT32)pSrc[i+2]; - } - } - *pDst++ = (OPJ_BYTE)((src0 << 6) | (src1 << 4) | (src2 << 2)); - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; + OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; + + *pDst++ = (OPJ_BYTE)((src0 << 6) | (src1 << 4) | (src2 << 2) | src3); + } + + if (length & 3U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = 0U; + OPJ_UINT32 src2 = 0U; + length = length & 3U; + + if (length > 1U) { + src1 = (OPJ_UINT32)pSrc[i+1]; + if (length > 2U) { + src2 = (OPJ_UINT32)pSrc[i+2]; + } + } + *pDst++ = (OPJ_BYTE)((src0 << 6) | (src1 << 4) | (src2 << 2)); + } } static void convert_32s4u_C1R(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - - *pDst++ = (OPJ_BYTE)((src0 << 4) | src1); - } - - if (length & 1U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - *pDst++ = (OPJ_BYTE)((src0 << 4)); - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + + *pDst++ = (OPJ_BYTE)((src0 << 4) | src1); + } + + if (length & 1U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + *pDst++ = (OPJ_BYTE)((src0 << 4)); + } } static void convert_32s6u_C1R(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; - OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; - - *pDst++ = (OPJ_BYTE)((src0 << 2) | (src1 >> 4)); - *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 2)); - *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6) | src3); - } - - if (length & 3U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = 0U; - OPJ_UINT32 src2 = 0U; - length = length & 3U; - - if (length > 1U) { - src1 = (OPJ_UINT32)pSrc[i+1]; - if (length > 2U) { - src2 = (OPJ_UINT32)pSrc[i+2]; - } - } - *pDst++ = (OPJ_BYTE)((src0 << 2) | (src1 >> 4)); - if (length > 1U) { - *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 2)); - if (length > 2U) { - *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6)); - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; + OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; + + *pDst++ = (OPJ_BYTE)((src0 << 2) | (src1 >> 4)); + *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 2)); + *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6) | src3); + } + + if (length & 3U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = 0U; + OPJ_UINT32 src2 = 0U; + length = length & 3U; + + if (length > 1U) { + src1 = (OPJ_UINT32)pSrc[i+1]; + if (length > 2U) { + src2 = (OPJ_UINT32)pSrc[i+2]; + } + } + *pDst++ = (OPJ_BYTE)((src0 << 2) | (src1 >> 4)); + if (length > 1U) { + *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 2)); + if (length > 2U) { + *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6)); + } + } + } } static void convert_32s8u_C1R(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < length; ++i) { - pDst[i] = (OPJ_BYTE)pSrc[i]; - } + OPJ_SIZE_T i; + for (i = 0; i < length; ++i) { + pDst[i] = (OPJ_BYTE)pSrc[i]; + } } const convert_32sXXx_C1R convert_32sXXu_C1R_LUT[9] = { - NULL, - convert_32s1u_C1R, - convert_32s2u_C1R, - NULL, - convert_32s4u_C1R, - NULL, - convert_32s6u_C1R, - NULL, - convert_32s8u_C1R + NULL, + convert_32s1u_C1R, + convert_32s2u_C1R, + NULL, + convert_32s4u_C1R, + NULL, + convert_32s6u_C1R, + NULL, + convert_32s8u_C1R }; /* -->> -->> -->> -->> @@ -535,8 +536,7 @@ const convert_32sXXx_C1R convert_32sXXu_C1R_LUT[9] = { #ifdef INFORMATION_ONLY /* TGA header definition. */ -struct tga_header -{ +struct tga_header { unsigned char id_length; /* Image id field length */ unsigned char colour_map_type; /* Colour map type */ unsigned char image_type; /* Image type */ @@ -558,7 +558,8 @@ struct tga_header }; #endif /* INFORMATION_ONLY */ -static unsigned short get_ushort(const unsigned char *data) { +static unsigned short get_ushort(const unsigned char *data) +{ unsigned short val = *(const unsigned short *)data; #ifdef OPJ_BIG_ENDIAN val = ((val & 0xffU) << 8) | (val >> 8); @@ -568,7 +569,7 @@ static unsigned short get_ushort(const unsigned char *data) { #define TGA_HEADER_SIZE 18 -static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, +static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, unsigned int *width, unsigned int *height, int *flip_image) { int palette_size; @@ -581,8 +582,7 @@ static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, if (!bits_per_pixel || !width || !height || !flip_image) return 0; - if ( fread(tga, TGA_HEADER_SIZE, 1, fp) != 1 ) - { + if ( fread(tga, TGA_HEADER_SIZE, 1, fp) != 1 ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0 ; } @@ -608,11 +608,9 @@ static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, *height = (unsigned int)image_h; /* Ignore tga identifier, if present ... */ - if (id_len) - { + if (id_len) { unsigned char *id = (unsigned char *) malloc(id_len); - if ( !fread(id, id_len, 1, fp) ) - { + if ( !fread(id, id_len, 1, fp) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); free(id); return 0 ; @@ -623,8 +621,7 @@ static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, /* Test for compressed formats ... not yet supported ... // Note :- 9 - RLE encoded palettized. // 10 - RLE encoded RGB. */ - if (image_type > 8) - { + if (image_type > 8) { fprintf(stderr, "Sorry, compressed tga files are not currently supported.\n"); return 0 ; } @@ -634,8 +631,7 @@ static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, /* Palettized formats are not yet supported, skip over the palette, if present ... */ palette_size = cmap_len * (cmap_entry_size/8); - if (palette_size>0) - { + if (palette_size>0) { fprintf(stderr, "File contains a palette - not yet supported."); fseek(fp, palette_size, SEEK_CUR); } @@ -651,7 +647,7 @@ static INLINE OPJ_UINT16 swap16(OPJ_UINT16 x) #endif -static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, +static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, OPJ_BOOL flip_image) { OPJ_UINT16 image_w, image_h, us0; @@ -665,7 +661,7 @@ static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, if ( bits_per_pixel < 256 ) pixel_depth = (unsigned char)bits_per_pixel; - else{ + else { fprintf(stderr,"ERROR: Wrong bits per pixel inside tga_header"); return 0; } @@ -713,7 +709,8 @@ fails: return 0; } -opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { +opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) +{ FILE *f; opj_image_t *image; unsigned int image_width, image_height, pixel_bit_depth; @@ -753,8 +750,7 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { if (mono) { color_space = OPJ_CLRSPC_GRAY; numcomps = save_alpha ? 2 : 1; - } - else { + } else { numcomps = save_alpha ? 4 : 3; color_space = OPJ_CLRSPC_SRGB; } @@ -788,8 +784,7 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { image->y1 = !image->y0 ? (OPJ_UINT32)(image_height - 1) * (OPJ_UINT32)subsampling_dy + 1 : image->y0 + (OPJ_UINT32)(image_height - 1) * (OPJ_UINT32)subsampling_dy + 1; /* set image data */ - for (y=0; y < image_height; y++) - { + for (y=0; y < image_height; y++) { int index; if (flip_image) @@ -797,28 +792,23 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { else index = (int)(y*image_width); - if (numcomps==3) - { - for (x=0;x<image_width;x++) - { + if (numcomps==3) { + for (x=0; x<image_width; x++) { unsigned char r,g,b; - if( !fread(&b, 1, 1, f) ) - { + if( !fread(&b, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); return NULL; } - if ( !fread(&g, 1, 1, f) ) - { + if ( !fread(&g, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); return NULL; } - if ( !fread(&r, 1, 1, f) ) - { + if ( !fread(&r, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); @@ -830,35 +820,28 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { image->comps[2].data[index]=b; index++; } - } - else if (numcomps==4) - { - for (x=0;x<image_width;x++) - { + } else if (numcomps==4) { + for (x=0; x<image_width; x++) { unsigned char r,g,b,a; - if ( !fread(&b, 1, 1, f) ) - { + if ( !fread(&b, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); return NULL; } - if ( !fread(&g, 1, 1, f) ) - { + if ( !fread(&g, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); return NULL; } - if ( !fread(&r, 1, 1, f) ) - { + if ( !fread(&r, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); return NULL; } - if ( !fread(&a, 1, 1, f) ) - { + if ( !fread(&a, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); opj_image_destroy(image); fclose(f); @@ -871,8 +854,7 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { image->comps[3].data[index]=a; index++; } - } - else { + } else { fprintf(stderr, "Currently unsupported bit depth : %s\n", filename); } } @@ -880,7 +862,8 @@ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { return image; } -int imagetotga(opj_image_t * image, const char *outfile) { +int imagetotga(opj_image_t * image, const char *outfile) +{ int width, height, bpp, x, y; OPJ_BOOL write_alpha; unsigned int i; @@ -919,7 +902,7 @@ int imagetotga(opj_image_t * image, const char *outfile) { bpp = write_alpha ? 32 : 24; if (!tga_writeheader(fdest, bpp, width , height, OPJ_TRUE)) - goto fin; + goto fin; alpha_channel = image->numcomps-1; @@ -929,74 +912,69 @@ int imagetotga(opj_image_t * image, const char *outfile) { adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - for (y=0; y < height; y++) - { - unsigned int index= (unsigned int)(y*width); - - for (x=0; x < width; x++, index++) - { - r = (float)(image->comps[0].data[index] + adjustR); - - if (image->numcomps > 2) - { - g = (float)(image->comps[1].data[index] + adjustG); - b = (float)(image->comps[2].data[index] + adjustB); - } - else - {/* Greyscale ... */ - g = r; - b = r; - } - -/* TGA format writes BGR ... */ - if(b > 255.) b = 255.; else if(b < 0.) b = 0.; - value = (unsigned char)(b*scale); - res = fwrite(&value,1,1,fdest); - - if( res < 1 ) - { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - goto fin; - } - if(g > 255.) g = 255.; else if(g < 0.) g = 0.; - value = (unsigned char)(g*scale); - res = fwrite(&value,1,1,fdest); - - if( res < 1 ) - { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - goto fin; - } - if(r > 255.) r = 255.; else if(r < 0.) r = 0.; - value = (unsigned char)(r*scale); - res = fwrite(&value,1,1,fdest); - - if( res < 1 ) - { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - goto fin; - } - - if (write_alpha) - { - a = (float)(image->comps[alpha_channel].data[index]); - if(a > 255.) a = 255.; else if(a < 0.) a = 0.; - value = (unsigned char)(a*scale); - res = fwrite(&value,1,1,fdest); - - if( res < 1 ) - { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - goto fin; - } - } - } - } - fails = 0; + for (y=0; y < height; y++) { + unsigned int index= (unsigned int)(y*width); + + for (x=0; x < width; x++, index++) { + r = (float)(image->comps[0].data[index] + adjustR); + + if (image->numcomps > 2) { + g = (float)(image->comps[1].data[index] + adjustG); + b = (float)(image->comps[2].data[index] + adjustB); + } else { + /* Greyscale ... */ + g = r; + b = r; + } + + /* TGA format writes BGR ... */ + if(b > 255.) b = 255.; + else if(b < 0.) b = 0.; + value = (unsigned char)(b*scale); + res = fwrite(&value,1,1,fdest); + + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + goto fin; + } + if(g > 255.) g = 255.; + else if(g < 0.) g = 0.; + value = (unsigned char)(g*scale); + res = fwrite(&value,1,1,fdest); + + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + goto fin; + } + if(r > 255.) r = 255.; + else if(r < 0.) r = 0.; + value = (unsigned char)(r*scale); + res = fwrite(&value,1,1,fdest); + + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + goto fin; + } + + if (write_alpha) { + a = (float)(image->comps[alpha_channel].data[index]); + if(a > 255.) a = 255.; + else if(a < 0.) a = 0.; + value = (unsigned char)(a*scale); + res = fwrite(&value,1,1,fdest); + + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + goto fin; + } + } + } + } + fails = 0; fin: - fclose(fdest); + fclose(fdest); - return fails; + return fails; } /* -->> -->> -->> -->> @@ -1009,8 +987,7 @@ PGX IMAGE FORMAT static unsigned char readuchar(FILE * f) { unsigned char c1; - if ( !fread(&c1, 1, 1, f) ) - { + if ( !fread(&c1, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } @@ -1020,13 +997,11 @@ static unsigned char readuchar(FILE * f) static unsigned short readushort(FILE * f, int bigendian) { unsigned char c1, c2; - if ( !fread(&c1, 1, 1, f) ) - { + if ( !fread(&c1, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } - if ( !fread(&c2, 1, 1, f) ) - { + if ( !fread(&c2, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } @@ -1039,23 +1014,19 @@ static unsigned short readushort(FILE * f, int bigendian) static unsigned int readuint(FILE * f, int bigendian) { unsigned char c1, c2, c3, c4; - if ( !fread(&c1, 1, 1, f) ) - { + if ( !fread(&c1, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } - if ( !fread(&c2, 1, 1, f) ) - { + if ( !fread(&c2, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } - if ( !fread(&c3, 1, 1, f) ) - { + if ( !fread(&c3, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } - if ( !fread(&c4, 1, 1, f) ) - { + if ( !fread(&c4, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } @@ -1065,7 +1036,8 @@ static unsigned int readuint(FILE * f, int bigendian) return (unsigned int)(c4 << 24) + (unsigned int)(c3 << 16) + (unsigned int)(c2 << 8) + c1; } -opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { +opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) +{ FILE *f = NULL; int w, h, prec; int i, numcomps, max; @@ -1095,7 +1067,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { } fseek(f, 0, SEEK_SET); - if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9){ + if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9) { fclose(f); fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n"); return NULL; @@ -1131,15 +1103,15 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { } else { cmptparm.sgnd = 0; } - if(prec < 8) - { + if(prec < 8) { force8 = 1; - ushift = 8 - prec; dshift = prec - ushift; - if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); else adjustS = 0; + ushift = 8 - prec; + dshift = prec - ushift; + if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); + else adjustS = 0; cmptparm.sgnd = 0; prec = 8; - } - else ushift = dshift = force8 = adjustS = 0; + } else ushift = dshift = force8 = adjustS = 0; cmptparm.prec = (OPJ_UINT32)prec; cmptparm.bpp = (OPJ_UINT32)prec; @@ -1164,8 +1136,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { for (i = 0; i < w * h; i++) { int v; - if(force8) - { + if(force8) { v = readuchar(f) + adjustS; v = (v<<ushift) + (v>>dshift); comp->data[i] = (unsigned char)v; @@ -1207,105 +1178,96 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { static INLINE int clamp( const int value, const int prec, const int sgnd ) { - if( sgnd ) - { - if (prec <= 8) return CLAMP(value,-128,127); - else if (prec <= 16) return CLAMP(value,-32768,32767); - else return CLAMP(value,-2147483647-1,2147483647); - } - else - { - if (prec <= 8) return CLAMP(value,0,255); - else if (prec <= 16) return CLAMP(value,0,65535); - else return value; /*CLAMP(value,0,4294967295);*/ + if( sgnd ) { + if (prec <= 8) return CLAMP(value,-128,127); + else if (prec <= 16) return CLAMP(value,-32768,32767); + else return CLAMP(value,-2147483647-1,2147483647); + } else { + if (prec <= 8) return CLAMP(value,0,255); + else if (prec <= 16) return CLAMP(value,0,65535); + else return value; /*CLAMP(value,0,4294967295);*/ } } -int imagetopgx(opj_image_t * image, const char *outfile) +int imagetopgx(opj_image_t * image, const char *outfile) { - int w, h; - int i, j, fails = 1; - unsigned int compno; - FILE *fdest = NULL; - - for (compno = 0; compno < image->numcomps; compno++) - { - opj_image_comp_t *comp = &image->comps[compno]; - char bname[256]; /* buffer for name */ - char *name = bname; /* pointer */ - int nbytes = 0; - size_t res; - const size_t olen = strlen(outfile); - const size_t dotpos = olen - 4; - const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ - - if( outfile[dotpos] != '.' ) - { - /* `pgx` was recognized but there is no dot at expected position */ - fprintf(stderr, "ERROR -> Impossible happen." ); - goto fin; - } - if( total > 256 ) - { - name = (char*)malloc(total+1); - if (name == NULL) { - goto fin; - } - } - strncpy(name, outfile, dotpos); - sprintf(name+dotpos, "_%u.pgx", compno); - fdest = fopen(name, "wb"); - /* don't need name anymore */ - - if (!fdest) - { - - fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); - if( total > 256 ) free(name); - goto fin; - } - - w = (int)image->comps[compno].w; - h = (int)image->comps[compno].h; - - fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, - w, h); - - if (comp->prec <= 8) - nbytes = 1; - else if (comp->prec <= 16) - nbytes = 2; - else - nbytes = 4; - - for (i = 0; i < w * h; i++) - { - /* FIXME: clamp func is being called within a loop */ - const int val = clamp(image->comps[compno].data[i], - (int)comp->prec, (int)comp->sgnd); - - for (j = nbytes - 1; j >= 0; j--) - { - int v = (int)(val >> (j * 8)); - unsigned char byte = (unsigned char)v; - res = fwrite(&byte, 1, 1, fdest); - - if( res < 1 ) - { - fprintf(stderr, "failed to write 1 byte for %s\n", name); - if( total > 256 ) free(name); - goto fin; - } - } - } - if( total > 256 ) free(name); - fclose(fdest); fdest = NULL; - } - fails = 0; + int w, h; + int i, j, fails = 1; + unsigned int compno; + FILE *fdest = NULL; + + for (compno = 0; compno < image->numcomps; compno++) { + opj_image_comp_t *comp = &image->comps[compno]; + char bname[256]; /* buffer for name */ + char *name = bname; /* pointer */ + int nbytes = 0; + size_t res; + const size_t olen = strlen(outfile); + const size_t dotpos = olen - 4; + const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ + + if( outfile[dotpos] != '.' ) { + /* `pgx` was recognized but there is no dot at expected position */ + fprintf(stderr, "ERROR -> Impossible happen." ); + goto fin; + } + if( total > 256 ) { + name = (char*)malloc(total+1); + if (name == NULL) { + goto fin; + } + } + strncpy(name, outfile, dotpos); + sprintf(name+dotpos, "_%u.pgx", compno); + fdest = fopen(name, "wb"); + /* don't need name anymore */ + + if (!fdest) { + + fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); + if( total > 256 ) free(name); + goto fin; + } + + w = (int)image->comps[compno].w; + h = (int)image->comps[compno].h; + + fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, + w, h); + + if (comp->prec <= 8) + nbytes = 1; + else if (comp->prec <= 16) + nbytes = 2; + else + nbytes = 4; + + for (i = 0; i < w * h; i++) { + /* FIXME: clamp func is being called within a loop */ + const int val = clamp(image->comps[compno].data[i], + (int)comp->prec, (int)comp->sgnd); + + for (j = nbytes - 1; j >= 0; j--) { + int v = (int)(val >> (j * 8)); + unsigned char byte = (unsigned char)v; + res = fwrite(&byte, 1, 1, fdest); + + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", name); + if( total > 256 ) free(name); + goto fin; + } + } + } + if( total > 256 ) free(name); + fclose(fdest); + fdest = NULL; + } + fails = 0; fin: - if(fdest) fclose(fdest); + if(fdest) fclose(fdest); - return fails; + return fails; } /* -->> -->> -->> -->> @@ -1314,8 +1276,7 @@ PNM IMAGE FORMAT <<-- <<-- <<-- <<-- */ -struct pnm_header -{ +struct pnm_header { int width, height, maxval, depth, format; char rgb, rgba, gray, graya, bw; char ok; @@ -1323,10 +1284,12 @@ struct pnm_header static char *skip_white(char *s) { - while(*s) - { + while(*s) { if(*s == '\n' || *s == '\r') return NULL; - if(isspace(*s)) { ++s; continue; } + if(isspace(*s)) { + ++s; + continue; + } return s; } return NULL; @@ -1343,12 +1306,14 @@ static char *skip_int(char *start, int *out_n) if(s == NULL) return NULL; start = s; - while(*s) - { + while(*s) { if( !isdigit(*s)) break; ++s; } - c = *s; *s = 0; *out_n = atoi(start); *s = c; + c = *s; + *s = 0; + *out_n = atoi(start); + *s = c; return s; } @@ -1361,12 +1326,17 @@ static char *skip_idf(char *start, char out_idf[256]) if(s == NULL) return NULL; start = s; - while(*s) - { - if(isalpha(*s) || *s == '_') { ++s; continue; } + while(*s) { + if(isalpha(*s) || *s == '_') { + ++s; + continue; + } break; } - c = *s; *s = 0; strncpy(out_idf, start, 255); *s = c; + c = *s; + *s = 0; + strncpy(out_idf, start, 255); + *s = c; return s; } @@ -1376,95 +1346,91 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph) char idf[256], type[256]; char line[256]; - if (fgets(line, 250, reader) == NULL) - { + if (fgets(line, 250, reader) == NULL) { fprintf(stderr,"\nWARNING: fgets return a NULL value"); return; } - if(line[0] != 'P') - { - fprintf(stderr,"read_pnm_header:PNM:magic P missing\n"); return; + if(line[0] != 'P') { + fprintf(stderr,"read_pnm_header:PNM:magic P missing\n"); + return; } format = atoi(line + 1); - if(format < 1 || format > 7) - { + if(format < 1 || format > 7) { fprintf(stderr,"read_pnm_header:magic format %d invalid\n", format); return; } ph->format = format; ttype = end = have_wh = 0; - while(fgets(line, 250, reader)) - { + while(fgets(line, 250, reader)) { char *s; if(*line == '#') continue; s = line; - if(format == 7) - { + if(format == 7) { s = skip_idf(s, idf); if(s == NULL || *s == 0) return; - if(strcmp(idf, "ENDHDR") == 0) - { - end = 1; break; + if(strcmp(idf, "ENDHDR") == 0) { + end = 1; + break; } - if(strcmp(idf, "WIDTH") == 0) - { + if(strcmp(idf, "WIDTH") == 0) { s = skip_int(s, &ph->width); if(s == NULL || *s == 0) return; continue; } - if(strcmp(idf, "HEIGHT") == 0) - { + if(strcmp(idf, "HEIGHT") == 0) { s = skip_int(s, &ph->height); if(s == NULL || *s == 0) return; continue; } - if(strcmp(idf, "DEPTH") == 0) - { + if(strcmp(idf, "DEPTH") == 0) { s = skip_int(s, &ph->depth); if(s == NULL || *s == 0) return; continue; } - if(strcmp(idf, "MAXVAL") == 0) - { + if(strcmp(idf, "MAXVAL") == 0) { s = skip_int(s, &ph->maxval); if(s == NULL || *s == 0) return; continue; } - if(strcmp(idf, "TUPLTYPE") == 0) - { + if(strcmp(idf, "TUPLTYPE") == 0) { s = skip_idf(s, type); if(s == NULL || *s == 0) return; - if(strcmp(type, "BLACKANDWHITE") == 0) - { - ph->bw = 1; ttype = 1; continue; + if(strcmp(type, "BLACKANDWHITE") == 0) { + ph->bw = 1; + ttype = 1; + continue; } - if(strcmp(type, "GRAYSCALE") == 0) - { - ph->gray = 1; ttype = 1; continue; + if(strcmp(type, "GRAYSCALE") == 0) { + ph->gray = 1; + ttype = 1; + continue; } - if(strcmp(type, "GRAYSCALE_ALPHA") == 0) - { - ph->graya = 1; ttype = 1; continue; + if(strcmp(type, "GRAYSCALE_ALPHA") == 0) { + ph->graya = 1; + ttype = 1; + continue; } - if(strcmp(type, "RGB") == 0) - { - ph->rgb = 1; ttype = 1; continue; + if(strcmp(type, "RGB") == 0) { + ph->rgb = 1; + ttype = 1; + continue; } - if(strcmp(type, "RGB_ALPHA") == 0) - { - ph->rgba = 1; ttype = 1; continue; + if(strcmp(type, "RGB_ALPHA") == 0) { + ph->rgba = 1; + ttype = 1; + continue; } fprintf(stderr,"read_pnm_header:unknown P7 TUPLTYPE %s\n",type); return; @@ -1473,8 +1439,7 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph) return; } /* if(format == 7) */ - if( !have_wh) - { + if( !have_wh) { s = skip_int(s, &ph->width); s = skip_int(s, &ph->height); @@ -1482,22 +1447,19 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph) have_wh = 1; if(format == 1 || format == 4) break; - - if(format == 2 || format == 3 || format == 5 || format == 6) - { + + if(format == 2 || format == 3 || format == 5 || format == 6) { if (skip_int(s, &ph->maxval) != NULL) { if(ph->maxval > 65535) { return; - } - else { + } else { break; } } } continue; } - if(format == 2 || format == 3 || format == 5 || format == 6) - { + if(format == 2 || format == 3 || format == 5 || format == 6) { /* P2, P3, P5, P6: */ s = skip_int(s, &ph->maxval); @@ -1505,31 +1467,24 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph) } break; }/* while(fgets( ) */ - if(format == 2 || format == 3 || format > 4) - { + if(format == 2 || format == 3 || format > 4) { if(ph->maxval < 1 || ph->maxval > 65535) return; } if(ph->width < 1 || ph->height < 1) return; - if(format == 7) - { - if(!end) - { - fprintf(stderr,"read_pnm_header:P7 without ENDHDR\n"); return; + if(format == 7) { + if(!end) { + fprintf(stderr,"read_pnm_header:P7 without ENDHDR\n"); + return; } if(ph->depth < 1 || ph->depth > 4) return; if(ph->width && ph->height && ph->depth && ph->maxval && ttype) ph->ok = 1; - } - else - { - if(format != 1 && format != 4) - { + } else { + if(format != 1 && format != 4) { if(ph->width && ph->height && ph->maxval) ph->ok = 1; - } - else - { + } else { if(ph->width && ph->height) ph->ok = 1; ph->maxval = 255; } @@ -1556,7 +1511,8 @@ static int has_prec(int val) return 16; } -opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { +opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) +{ int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; @@ -1567,8 +1523,7 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { opj_image_t * image = NULL; struct pnm_header header_info; - if((fp = fopen(filename, "rb")) == NULL) - { + if((fp = fopen(filename, "rb")) == NULL) { fprintf(stderr, "pnmtoimage:Failed to open %s for reading!\n",filename); return NULL; } @@ -1576,12 +1531,14 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { read_pnm_header(fp, &header_info); - if(!header_info.ok) { fclose(fp); return NULL; } + if(!header_info.ok) { + fclose(fp); + return NULL; + } format = header_info.format; - switch(format) - { + switch(format) { case 1: /* ascii bitmap */ case 4: /* raw bitmap */ numcomps = 1; @@ -1601,7 +1558,9 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { numcomps = header_info.depth; break; - default: fclose(fp); return NULL; + default: + fclose(fp); + return NULL; } if(numcomps < 3) color_space = OPJ_CLRSPC_GRAY;/* GRAY, GRAYA */ @@ -1619,8 +1578,7 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { memset(&cmptparm[0], 0, (size_t)numcomps * sizeof(opj_image_cmptparm_t)); - for(i = 0; i < numcomps; i++) - { + for(i = 0; i < numcomps; i++) { cmptparm[i].prec = (OPJ_UINT32)prec; cmptparm[i].bpp = (OPJ_UINT32)prec; cmptparm[i].sgnd = 0; @@ -1631,7 +1589,10 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { } image = opj_image_create((OPJ_UINT32)numcomps, &cmptparm[0], color_space); - if(!image) { fclose(fp); return NULL; } + if(!image) { + fclose(fp); + return NULL; + } /* set image offset and reference grid */ image->x0 = (OPJ_UINT32)parameters->image_offset_x0; @@ -1639,14 +1600,11 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { image->x1 = (OPJ_UINT32)(parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1); image->y1 = (OPJ_UINT32)(parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1); - if((format == 2) || (format == 3)) /* ascii pixmap */ - { + if((format == 2) || (format == 3)) { /* ascii pixmap */ unsigned int index; - for (i = 0; i < w * h; i++) - { - for(compno = 0; compno < numcomps; compno++) - { + for (i = 0; i < w * h; i++) { + for(compno = 0; compno < numcomps; compno++) { index = 0; if (fscanf(fp, "%u", &index) != 1) fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); @@ -1654,91 +1612,70 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { image->comps[compno].data[i] = (OPJ_INT32)(index * 255)/header_info.maxval; } } - } - else - if((format == 5) - || (format == 6) - ||((format == 7) - && ( header_info.gray || header_info.graya - || header_info.rgb || header_info.rgba)))/* binary pixmap */ - { - unsigned char c0, c1, one; - - one = (prec < 9); - - for (i = 0; i < w * h; i++) - { - for(compno = 0; compno < numcomps; compno++) - { - if ( !fread(&c0, 1, 1, fp) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - fclose(fp); - return NULL; - } - if(one) - { - image->comps[compno].data[i] = c0; - } - else - { - if ( !fread(&c1, 1, 1, fp) ) - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - /* netpbm: */ - image->comps[compno].data[i] = ((c0<<8) | c1); - } + } else if((format == 5) + || (format == 6) + ||((format == 7) + && ( header_info.gray || header_info.graya + || header_info.rgb || header_info.rgba))) { /* binary pixmap */ + unsigned char c0, c1, one; + + one = (prec < 9); + + for (i = 0; i < w * h; i++) { + for(compno = 0; compno < numcomps; compno++) { + if ( !fread(&c0, 1, 1, fp) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + fclose(fp); + return NULL; + } + if(one) { + image->comps[compno].data[i] = c0; + } else { + if ( !fread(&c1, 1, 1, fp) ) + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + /* netpbm: */ + image->comps[compno].data[i] = ((c0<<8) | c1); } } } - else - if(format == 1) /* ascii bitmap */ - { - for (i = 0; i < w * h; i++) - { - unsigned int index; + } else if(format == 1) { /* ascii bitmap */ + for (i = 0; i < w * h; i++) { + unsigned int index; - if ( fscanf(fp, "%u", &index) != 1) - fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); + if ( fscanf(fp, "%u", &index) != 1) + fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); - image->comps[0].data[i] = (index?0:255); + image->comps[0].data[i] = (index?0:255); + } + } else if(format == 4) { + int x, y, bit; + unsigned char uc; + + i = 0; + for(y = 0; y < h; ++y) { + bit = -1; + uc = 0; + + for(x = 0; x < w; ++x) { + if(bit == -1) { + bit = 7; + uc = (unsigned char)getc(fp); } + image->comps[0].data[i] = (((uc>>bit) & 1)?0:255); + --bit; + ++i; } - else - if(format == 4) - { - int x, y, bit; - unsigned char uc; - - i = 0; - for(y = 0; y < h; ++y) - { - bit = -1; uc = 0; - - for(x = 0; x < w; ++x) - { - if(bit == -1) - { - bit = 7; - uc = (unsigned char)getc(fp); - } - image->comps[0].data[i] = (((uc>>bit) & 1)?0:255); - --bit; ++i; - } - } - } - else - if((format == 7 && header_info.bw)) /*MONO*/ - { - unsigned char uc; - - for(i = 0; i < w * h; ++i) - { - if ( !fread(&uc, 1, 1, fp) ) - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - image->comps[0].data[i] = (uc & 1)?0:255; - } - } + } + } else if((format == 7 && header_info.bw)) { /*MONO*/ + unsigned char uc; + + for(i = 0; i < w * h; ++i) { + if ( !fread(&uc, 1, 1, fp) ) + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + image->comps[0].data[i] = (uc & 1)?0:255; + } + } fclose(fp); return image; @@ -1757,57 +1694,55 @@ int imagetopnm(opj_image_t * image, const char *outfile, int force_split) const char *tmp = outfile; char *destname; - alpha = NULL; + alpha = NULL; - if((prec = (int)image->comps[0].prec) > 16) - { + if((prec = (int)image->comps[0].prec) > 16) { fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16" "\n\t: refused.\n",__FILE__,__LINE__,prec); return 1; } - two = has_alpha = 0; fails = 1; + two = has_alpha = 0; + fails = 1; ncomp = image->numcomps; - while (*tmp) ++tmp; tmp -= 2; + while (*tmp) ++tmp; + tmp -= 2; want_gray = (*tmp == 'g' || *tmp == 'G'); ncomp = image->numcomps; if(want_gray) ncomp = 1; if ((force_split == 0) && - (ncomp == 2 /* GRAYA */ - || (ncomp > 2 /* RGB, RGBA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec - ))) - { + (ncomp == 2 /* GRAYA */ + || (ncomp > 2 /* RGB, RGBA */ + && image->comps[0].dx == image->comps[1].dx + && image->comps[1].dx == image->comps[2].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[1].dy == image->comps[2].dy + && image->comps[0].prec == image->comps[1].prec + && image->comps[1].prec == image->comps[2].prec + ))) { fdest = fopen(outfile, "wb"); - if (!fdest) - { + if (!fdest) { fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); return fails; } two = (prec > 8); triple = (ncomp > 2); - wr = (int)image->comps[0].w; hr = (int)image->comps[0].h; - max = (1<<prec) - 1; has_alpha = (ncomp == 4 || ncomp == 2); + wr = (int)image->comps[0].w; + hr = (int)image->comps[0].h; + max = (1<<prec) - 1; + has_alpha = (ncomp == 4 || ncomp == 2); red = image->comps[0].data; - if(triple) - { + if(triple) { green = image->comps[1].data; blue = image->comps[2].data; - } - else green = blue = NULL; + } else green = blue = NULL; - if(has_alpha) - { + if(has_alpha) { const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA"); fprintf(fdest, "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %u\n" @@ -1815,53 +1750,53 @@ int imagetopnm(opj_image_t * image, const char *outfile, int force_split) wr, hr, ncomp, max, tt); alpha = image->comps[ncomp - 1].data; adjustA = (image->comps[ncomp - 1].sgnd ? - 1 << (image->comps[ncomp - 1].prec - 1) : 0); - } - else - { + 1 << (image->comps[ncomp - 1].prec - 1) : 0); + } else { fprintf(fdest, "P6\n# OpenJPEG-%s\n%d %d\n%d\n", opj_version(), wr, hr, max); adjustA = 0; } adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - if(triple) - { + if(triple) { adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - } - else adjustG = adjustB = 0; + } else adjustG = adjustB = 0; - for(i = 0; i < wr * hr; ++i) - { - if(two) - { - v = *red + adjustR; ++red; -if(v > 65535) v = 65535; else if(v < 0) v = 0; + for(i = 0; i < wr * hr; ++i) { + if(two) { + v = *red + adjustR; + ++red; + if(v > 65535) v = 65535; + else if(v < 0) v = 0; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - if(triple) - { - v = *green + adjustG; ++green; -if(v > 65535) v = 65535; else if(v < 0) v = 0; + if(triple) { + v = *green + adjustG; + ++green; + if(v > 65535) v = 65535; + else if(v < 0) v = 0; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - v = *blue + adjustB; ++blue; -if(v > 65535) v = 65535; else if(v < 0) v = 0; + v = *blue + adjustB; + ++blue; + if(v > 65535) v = 65535; + else if(v < 0) v = 0; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); }/* if(triple) */ - if(has_alpha) - { - v = *alpha + adjustA; ++alpha; - if(v > 65535) v = 65535; else if(v < 0) v = 0; + if(has_alpha) { + v = *alpha + adjustA; + ++alpha; + if(v > 65535) v = 65535; + else if(v < 0) v = 0; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); @@ -1871,64 +1806,63 @@ if(v > 65535) v = 65535; else if(v < 0) v = 0; } /* if(two) */ /* prec <= 8: */ - v = *red++; - if(v > 255) v = 255; else if(v < 0) v = 0; - - fprintf(fdest, "%c", (unsigned char)v); - if(triple) - { - v = *green++; - if(v > 255) v = 255; else if(v < 0) v = 0; - - fprintf(fdest, "%c", (unsigned char)v); - v = *blue++; - if(v > 255) v = 255; else if(v < 0) v = 0; - - fprintf(fdest, "%c", (unsigned char)v); - } - if(has_alpha) - { - v = *alpha++; - if(v > 255) v = 255; else if(v < 0) v = 0; - - fprintf(fdest, "%c", (unsigned char)v); - } + v = *red++; + if(v > 255) v = 255; + else if(v < 0) v = 0; + + fprintf(fdest, "%c", (unsigned char)v); + if(triple) { + v = *green++; + if(v > 255) v = 255; + else if(v < 0) v = 0; + + fprintf(fdest, "%c", (unsigned char)v); + v = *blue++; + if(v > 255) v = 255; + else if(v < 0) v = 0; + + fprintf(fdest, "%c", (unsigned char)v); + } + if(has_alpha) { + v = *alpha++; + if(v > 255) v = 255; + else if(v < 0) v = 0; + + fprintf(fdest, "%c", (unsigned char)v); + } } /* for(i */ - fclose(fdest); return 0; + fclose(fdest); + return 0; } /* YUV or MONO: */ - if (image->numcomps > ncomp) - { + if (image->numcomps > ncomp) { fprintf(stderr,"WARNING -> [PGM file] Only the first component\n"); fprintf(stderr," is written to the file\n"); } destname = (char*)malloc(strlen(outfile) + 8); - for (compno = 0; compno < ncomp; compno++) - { - if (ncomp > 1) - { - /*sprintf(destname, "%d.%s", compno, outfile);*/ - const size_t olen = strlen(outfile); - const size_t dotpos = olen - 4; - - strncpy(destname, outfile, dotpos); - sprintf(destname+dotpos, "_%u.pgm", compno); - } - else + for (compno = 0; compno < ncomp; compno++) { + if (ncomp > 1) { + /*sprintf(destname, "%d.%s", compno, outfile);*/ + const size_t olen = strlen(outfile); + const size_t dotpos = olen - 4; + + strncpy(destname, outfile, dotpos); + sprintf(destname+dotpos, "_%u.pgm", compno); + } else sprintf(destname, "%s", outfile); fdest = fopen(destname, "wb"); - if (!fdest) - { + if (!fdest) { fprintf(stderr, "ERROR -> failed to open %s for writing\n", destname); free(destname); return 1; } - wr = (int)image->comps[compno].w; hr = (int)image->comps[compno].h; + wr = (int)image->comps[compno].w; + hr = (int)image->comps[compno].h; prec = (int)image->comps[compno].prec; max = (1<<prec) - 1; @@ -1937,36 +1871,35 @@ if(v > 65535) v = 65535; else if(v < 0) v = 0; red = image->comps[compno].data; adjustR = - (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0); + (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0); - if(prec > 8) - { - for (i = 0; i < wr * hr; i++) - { - v = *red + adjustR; ++red; -if(v > 65535) v = 65535; else if(v < 0) v = 0; + if(prec > 8) { + for (i = 0; i < wr * hr; i++) { + v = *red + adjustR; + ++red; + if(v > 65535) v = 65535; + else if(v < 0) v = 0; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - if(has_alpha) - { + if(has_alpha) { v = *alpha++; -if(v > 65535) v = 65535; else if(v < 0) v = 0; + if(v > 65535) v = 65535; + else if(v < 0) v = 0; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); } }/* for(i */ - } - else /* prec <= 8 */ - { - for(i = 0; i < wr * hr; ++i) - { - v = *red + adjustR; ++red; - if(v > 255) v = 255; else if(v < 0) v = 0; - - fprintf(fdest, "%c", (unsigned char)v); + } else { /* prec <= 8 */ + for(i = 0; i < wr * hr; ++i) { + v = *red + adjustR; + ++red; + if(v > 255) v = 255; + else if(v < 0) v = 0; + + fprintf(fdest, "%c", (unsigned char)v); } } fclose(fdest); @@ -1981,7 +1914,8 @@ if(v > 65535) v = 65535; else if(v < 0) v = 0; RAW IMAGE FORMAT <<-- <<-- <<-- <<-- */ -static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp, OPJ_BOOL big_endian) { +static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp, OPJ_BOOL big_endian) +{ int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; @@ -1992,8 +1926,7 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p opj_image_t * image = NULL; unsigned short ch; - if((! (raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & raw_cp->rawBitDepth)) == 0) - { + if((! (raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & raw_cp->rawBitDepth)) == 0) { fprintf(stderr,"\nError: invalid raw image parameters\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F <width>,<height>,<ncomp>,<bitdepth>,{s,u}@<dx1>x<dy1>:...:<dxn>x<dyn>\n"); @@ -2054,8 +1987,7 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p image->x1 = (OPJ_UINT32)parameters->image_offset_x0 + (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1; image->y1 = (OPJ_UINT32)parameters->image_offset_y0 + (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1; - if(raw_cp->rawBitDepth <= 8) - { + if(raw_cp->rawBitDepth <= 8) { unsigned char value = 0; for(compno = 0; compno < numcomps; compno++) { int nloop = (w*h)/(raw_cp->rawComps[compno].dx*raw_cp->rawComps[compno].dy); @@ -2069,9 +2001,7 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value; } } - } - else if(raw_cp->rawBitDepth <= 16) - { + } else if(raw_cp->rawBitDepth <= 16) { unsigned short value; for(compno = 0; compno < numcomps; compno++) { int nloop = (w*h)/(raw_cp->rawComps[compno].dx*raw_cp->rawComps[compno].dy); @@ -2090,19 +2020,15 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p fclose(f); return NULL; } - if( big_endian ) - { + if( big_endian ) { value = (unsigned short)((temp1 << 8) + temp2); - } - else - { + } else { value = (unsigned short)((temp2 << 8) + temp1); } image->comps[compno].data[i] = raw_cp->rawSigned?(short)value:value; } } - } - else { + } else { fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n"); opj_image_destroy(image); fclose(f); @@ -2117,11 +2043,13 @@ static opj_image_t* rawtoimage_common(const char *filename, opj_cparameters_t *p return image; } -opj_image_t* rawltoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) { +opj_image_t* rawltoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) +{ return rawtoimage_common(filename, parameters, raw_cp, OPJ_FALSE); } -opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) { +opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) +{ return rawtoimage_common(filename, parameters, raw_cp, OPJ_TRUE); } @@ -2136,8 +2064,7 @@ static int imagetoraw_common(opj_image_t * image, const char *outfile, OPJ_BOOL unsigned char uc; (void)big_endian; - if((image->numcomps * image->x1 * image->y1) == 0) - { + if((image->numcomps * image->x1 * image->y1) == 0) { fprintf(stderr,"\nError: invalid raw image parameters\n"); return 1; } @@ -2151,24 +2078,22 @@ static int imagetoraw_common(opj_image_t * image, const char *outfile, OPJ_BOOL fails = 1; fprintf(stdout,"Raw image characteristics: %d components\n", image->numcomps); - for(compno = 0; compno < image->numcomps; compno++) - { + for(compno = 0; compno < image->numcomps; compno++) { fprintf(stdout,"Component %u characteristics: %dx%dx%d %s\n", compno, image->comps[compno].w, image->comps[compno].h, image->comps[compno].prec, image->comps[compno].sgnd==1 ? "signed": "unsigned"); w = (int)image->comps[compno].w; h = (int)image->comps[compno].h; - if(image->comps[compno].prec <= 8) - { - if(image->comps[compno].sgnd == 1) - { + if(image->comps[compno].prec <= 8) { + if(image->comps[compno].sgnd == 1) { mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { curr = *ptr; - if(curr > 127) curr = 127; else if(curr < -128) curr = -128; + if(curr > 127) curr = 127; + else if(curr < -128) curr = -128; uc = (unsigned char) (curr & mask); res = fwrite(&uc, 1, 1, rawFile); if( res < 1 ) { @@ -2178,15 +2103,14 @@ static int imagetoraw_common(opj_image_t * image, const char *outfile, OPJ_BOOL ptr++; } } - } - else if(image->comps[compno].sgnd == 0) - { + } else if(image->comps[compno].sgnd == 0) { mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { curr = *ptr; - if(curr > 255) curr = 255; else if(curr < 0) curr = 0; + if(curr > 255) curr = 255; + else if(curr < 0) curr = 0; uc = (unsigned char) (curr & mask); res = fwrite(&uc, 1, 1, rawFile); if( res < 1 ) { @@ -2197,18 +2121,19 @@ static int imagetoraw_common(opj_image_t * image, const char *outfile, OPJ_BOOL } } } - } - else if(image->comps[compno].prec <= 16) - { - if(image->comps[compno].sgnd == 1) - { - union { signed short val; signed char vals[2]; } uc16; + } else if(image->comps[compno].prec <= 16) { + if(image->comps[compno].sgnd == 1) { + union { + signed short val; + signed char vals[2]; + } uc16; mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { curr = *ptr; - if(curr > 32767 ) curr = 32767; else if( curr < -32768) curr = -32768; + if(curr > 32767 ) curr = 32767; + else if( curr < -32768) curr = -32768; uc16.val = (signed short)(curr & mask); res = fwrite(uc16.vals, 1, 2, rawFile); if( res < 2 ) { @@ -2218,16 +2143,18 @@ static int imagetoraw_common(opj_image_t * image, const char *outfile, OPJ_BOOL ptr++; } } - } - else if(image->comps[compno].sgnd == 0) - { - union { unsigned short val; unsigned char vals[2]; } uc16; + } else if(image->comps[compno].sgnd == 0) { + union { + unsigned short val; + unsigned char vals[2]; + } uc16; mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { curr = *ptr; - if(curr > 65535 ) curr = 65535; else if( curr < 0) curr = 0; + if(curr > 65535 ) curr = 65535; + else if( curr < 0) curr = 0; uc16.val = (unsigned short)(curr & mask); res = fwrite(uc16.vals, 1, 2, rawFile); if( res < 2 ) { @@ -2238,19 +2165,15 @@ static int imagetoraw_common(opj_image_t * image, const char *outfile, OPJ_BOOL } } } - } - else if (image->comps[compno].prec <= 32) - { + } else if (image->comps[compno].prec <= 32) { fprintf(stderr,"More than 16 bits per component no handled yet\n"); goto fin; - } - else - { + } else { fprintf(stderr,"Error: invalid precision: %d\n", image->comps[compno].prec); goto fin; } } - fails = 0; + fails = 0; fin: fclose(rawFile); return fails; diff --git a/src/bin/jp2/convert.h b/src/bin/jp2/convert.h index ab1d61a8..8c54b0af 100644 --- a/src/bin/jp2/convert.h +++ b/src/bin/jp2/convert.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. @@ -50,19 +50,19 @@ typedef struct raw_comp_cparameters { /**@name RAW image encoding parameters */ /*@{*/ typedef struct raw_cparameters { - /** width of the raw image */ - int rawWidth; - /** height of the raw image */ - int rawHeight; + /** width of the raw image */ + int rawWidth; + /** height of the raw image */ + int rawHeight; /** number of components of the raw image */ - int rawComp; + int rawComp; /** bit depth of the raw image */ int rawBitDepth; /** signed/unsigned raw image */ OPJ_BOOL rawSigned; /** raw components parameters */ raw_comp_cparameters_t *rawComps; - /*@}*/ + /*@}*/ } raw_cparameters_t; /* Component precision clipping */ diff --git a/src/bin/jp2/convertbmp.c b/src/bin/jp2/convertbmp.c index 910574b8..ae5f232e 100644 --- a/src/bin/jp2/convertbmp.c +++ b/src/bin/jp2/convertbmp.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan @@ -46,743 +46,722 @@ #include "convert.h" typedef struct { - OPJ_UINT16 bfType; /* 'BM' for Bitmap (19776) */ - OPJ_UINT32 bfSize; /* Size of the file */ - OPJ_UINT16 bfReserved1; /* Reserved : 0 */ - OPJ_UINT16 bfReserved2; /* Reserved : 0 */ - OPJ_UINT32 bfOffBits; /* Offset */ + OPJ_UINT16 bfType; /* 'BM' for Bitmap (19776) */ + OPJ_UINT32 bfSize; /* Size of the file */ + OPJ_UINT16 bfReserved1; /* Reserved : 0 */ + OPJ_UINT16 bfReserved2; /* Reserved : 0 */ + OPJ_UINT32 bfOffBits; /* Offset */ } OPJ_BITMAPFILEHEADER; typedef struct { - OPJ_UINT32 biSize; /* Size of the structure in bytes */ - OPJ_UINT32 biWidth; /* Width of the image in pixels */ - OPJ_UINT32 biHeight; /* Heigth of the image in pixels */ - OPJ_UINT16 biPlanes; /* 1 */ - OPJ_UINT16 biBitCount; /* Number of color bits by pixels */ - OPJ_UINT32 biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */ - OPJ_UINT32 biSizeImage; /* Size of the image in bytes */ - OPJ_UINT32 biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */ - OPJ_UINT32 biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */ - OPJ_UINT32 biClrUsed; /* Number of color used in the image (0: ALL) */ - OPJ_UINT32 biClrImportant; /* Number of important color (0: ALL) */ - OPJ_UINT32 biRedMask; /* Red channel bit mask */ - OPJ_UINT32 biGreenMask; /* Green channel bit mask */ - OPJ_UINT32 biBlueMask; /* Blue channel bit mask */ - OPJ_UINT32 biAlphaMask; /* Alpha channel bit mask */ - OPJ_UINT32 biColorSpaceType; /* Color space type */ - OPJ_UINT8 biColorSpaceEP[36]; /* Color space end points */ - OPJ_UINT32 biRedGamma; /* Red channel gamma */ - OPJ_UINT32 biGreenGamma; /* Green channel gamma */ - OPJ_UINT32 biBlueGamma; /* Blue channel gamma */ - OPJ_UINT32 biIntent; /* Intent */ - OPJ_UINT32 biIccProfileData; /* ICC profile data */ - OPJ_UINT32 biIccProfileSize; /* ICC profile size */ - OPJ_UINT32 biReserved; /* Reserved */ + OPJ_UINT32 biSize; /* Size of the structure in bytes */ + OPJ_UINT32 biWidth; /* Width of the image in pixels */ + OPJ_UINT32 biHeight; /* Heigth of the image in pixels */ + OPJ_UINT16 biPlanes; /* 1 */ + OPJ_UINT16 biBitCount; /* Number of color bits by pixels */ + OPJ_UINT32 biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */ + OPJ_UINT32 biSizeImage; /* Size of the image in bytes */ + OPJ_UINT32 biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */ + OPJ_UINT32 biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */ + OPJ_UINT32 biClrUsed; /* Number of color used in the image (0: ALL) */ + OPJ_UINT32 biClrImportant; /* Number of important color (0: ALL) */ + OPJ_UINT32 biRedMask; /* Red channel bit mask */ + OPJ_UINT32 biGreenMask; /* Green channel bit mask */ + OPJ_UINT32 biBlueMask; /* Blue channel bit mask */ + OPJ_UINT32 biAlphaMask; /* Alpha channel bit mask */ + OPJ_UINT32 biColorSpaceType; /* Color space type */ + OPJ_UINT8 biColorSpaceEP[36]; /* Color space end points */ + OPJ_UINT32 biRedGamma; /* Red channel gamma */ + OPJ_UINT32 biGreenGamma; /* Green channel gamma */ + OPJ_UINT32 biBlueGamma; /* Blue channel gamma */ + OPJ_UINT32 biIntent; /* Intent */ + OPJ_UINT32 biIccProfileData; /* ICC profile data */ + OPJ_UINT32 biIccProfileSize; /* ICC profile size */ + OPJ_UINT32 biReserved; /* Reserved */ } OPJ_BITMAPINFOHEADER; static void opj_applyLUT8u_8u32s_C1R( - OPJ_UINT8 const* pSrc, OPJ_INT32 srcStride, - OPJ_INT32* pDst, OPJ_INT32 dstStride, - OPJ_UINT8 const* pLUT, - OPJ_UINT32 width, OPJ_UINT32 height) + OPJ_UINT8 const* pSrc, OPJ_INT32 srcStride, + OPJ_INT32* pDst, OPJ_INT32 dstStride, + OPJ_UINT8 const* pLUT, + OPJ_UINT32 width, OPJ_UINT32 height) { - OPJ_UINT32 y; - - for (y = height; y != 0U; --y) { - OPJ_UINT32 x; - - for(x = 0; x < width; x++) - { - pDst[x] = (OPJ_INT32)pLUT[pSrc[x]]; - } - pSrc += srcStride; - pDst += dstStride; - } + OPJ_UINT32 y; + + for (y = height; y != 0U; --y) { + OPJ_UINT32 x; + + for(x = 0; x < width; x++) { + pDst[x] = (OPJ_INT32)pLUT[pSrc[x]]; + } + pSrc += srcStride; + pDst += dstStride; + } } static void opj_applyLUT8u_8u32s_C1P3R( - OPJ_UINT8 const* pSrc, OPJ_INT32 srcStride, - OPJ_INT32* const* pDst, OPJ_INT32 const* pDstStride, - OPJ_UINT8 const* const* pLUT, - OPJ_UINT32 width, OPJ_UINT32 height) + OPJ_UINT8 const* pSrc, OPJ_INT32 srcStride, + OPJ_INT32* const* pDst, OPJ_INT32 const* pDstStride, + OPJ_UINT8 const* const* pLUT, + OPJ_UINT32 width, OPJ_UINT32 height) { - OPJ_UINT32 y; - OPJ_INT32* pR = pDst[0]; - OPJ_INT32* pG = pDst[1]; - OPJ_INT32* pB = pDst[2]; - OPJ_UINT8 const* pLUT_R = pLUT[0]; - OPJ_UINT8 const* pLUT_G = pLUT[1]; - OPJ_UINT8 const* pLUT_B = pLUT[2]; - - for (y = height; y != 0U; --y) { - OPJ_UINT32 x; - - for(x = 0; x < width; x++) - { - OPJ_UINT8 idx = pSrc[x]; - pR[x] = (OPJ_INT32)pLUT_R[idx]; - pG[x] = (OPJ_INT32)pLUT_G[idx]; - pB[x] = (OPJ_INT32)pLUT_B[idx]; - } - pSrc += srcStride; - pR += pDstStride[0]; - pG += pDstStride[1]; - pB += pDstStride[2]; - } + OPJ_UINT32 y; + OPJ_INT32* pR = pDst[0]; + OPJ_INT32* pG = pDst[1]; + OPJ_INT32* pB = pDst[2]; + OPJ_UINT8 const* pLUT_R = pLUT[0]; + OPJ_UINT8 const* pLUT_G = pLUT[1]; + OPJ_UINT8 const* pLUT_B = pLUT[2]; + + for (y = height; y != 0U; --y) { + OPJ_UINT32 x; + + for(x = 0; x < width; x++) { + OPJ_UINT8 idx = pSrc[x]; + pR[x] = (OPJ_INT32)pLUT_R[idx]; + pG[x] = (OPJ_INT32)pLUT_G[idx]; + pB[x] = (OPJ_INT32)pLUT_B[idx]; + } + pSrc += srcStride; + pR += pDstStride[0]; + pG += pDstStride[1]; + pB += pDstStride[2]; + } } static void bmp24toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image) { - int index; - OPJ_UINT32 width, height; - OPJ_UINT32 x, y; - const OPJ_UINT8 *pSrc = NULL; - - width = image->comps[0].w; - height = image->comps[0].h; - - index = 0; - pSrc = pData + (height - 1U) * stride; - for(y = 0; y < height; y++) - { - for(x = 0; x < width; x++) - { - image->comps[0].data[index] = (OPJ_INT32)pSrc[3*x+2]; /* R */ - image->comps[1].data[index] = (OPJ_INT32)pSrc[3*x+1]; /* G */ - image->comps[2].data[index] = (OPJ_INT32)pSrc[3*x+0]; /* B */ - index++; - } - pSrc -= stride; - } + int index; + OPJ_UINT32 width, height; + OPJ_UINT32 x, y; + const OPJ_UINT8 *pSrc = NULL; + + width = image->comps[0].w; + height = image->comps[0].h; + + index = 0; + pSrc = pData + (height - 1U) * stride; + for(y = 0; y < height; y++) { + for(x = 0; x < width; x++) { + image->comps[0].data[index] = (OPJ_INT32)pSrc[3*x+2]; /* R */ + image->comps[1].data[index] = (OPJ_INT32)pSrc[3*x+1]; /* G */ + image->comps[2].data[index] = (OPJ_INT32)pSrc[3*x+0]; /* B */ + index++; + } + pSrc -= stride; + } } static void bmp_mask_get_shift_and_prec(OPJ_UINT32 mask, OPJ_UINT32* shift, OPJ_UINT32* prec) { - OPJ_UINT32 l_shift, l_prec; - - l_shift = l_prec = 0U; - - if (mask != 0U) { - while ((mask & 1U) == 0U) { - mask >>= 1; - l_shift++; - } - while (mask & 1U) { - mask >>= 1; - l_prec++; - } - } - *shift = l_shift; *prec = l_prec; + OPJ_UINT32 l_shift, l_prec; + + l_shift = l_prec = 0U; + + if (mask != 0U) { + while ((mask & 1U) == 0U) { + mask >>= 1; + l_shift++; + } + while (mask & 1U) { + mask >>= 1; + l_prec++; + } + } + *shift = l_shift; + *prec = l_prec; } static void bmpmask32toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image, OPJ_UINT32 redMask, OPJ_UINT32 greenMask, OPJ_UINT32 blueMask, OPJ_UINT32 alphaMask) { - int index; - OPJ_UINT32 width, height; - OPJ_UINT32 x, y; - const OPJ_UINT8 *pSrc = NULL; - OPJ_BOOL hasAlpha = OPJ_FALSE; - OPJ_UINT32 redShift, redPrec; - OPJ_UINT32 greenShift, greenPrec; - OPJ_UINT32 blueShift, bluePrec; - OPJ_UINT32 alphaShift, alphaPrec; - - width = image->comps[0].w; - height = image->comps[0].h; - - hasAlpha = image->numcomps > 3U; - - bmp_mask_get_shift_and_prec(redMask, &redShift, &redPrec); - bmp_mask_get_shift_and_prec(greenMask, &greenShift, &greenPrec); - bmp_mask_get_shift_and_prec(blueMask, &blueShift, &bluePrec); - bmp_mask_get_shift_and_prec(alphaMask, &alphaShift, &alphaPrec); - - image->comps[0].bpp = redPrec; - image->comps[0].prec = redPrec; - image->comps[1].bpp = greenPrec; - image->comps[1].prec = greenPrec; - image->comps[2].bpp = bluePrec; - image->comps[2].prec = bluePrec; - if (hasAlpha) { - image->comps[3].bpp = alphaPrec; - image->comps[3].prec = alphaPrec; - } - - index = 0; - pSrc = pData + (height - 1U) * stride; - for(y = 0; y < height; y++) - { - for(x = 0; x < width; x++) - { - OPJ_UINT32 value = 0U; - - value |= ((OPJ_UINT32)pSrc[4*x+0]) << 0; - value |= ((OPJ_UINT32)pSrc[4*x+1]) << 8; - value |= ((OPJ_UINT32)pSrc[4*x+2]) << 16; - value |= ((OPJ_UINT32)pSrc[4*x+3]) << 24; - - image->comps[0].data[index] = (OPJ_INT32)((value & redMask) >> redShift); /* R */ - image->comps[1].data[index] = (OPJ_INT32)((value & greenMask) >> greenShift); /* G */ - image->comps[2].data[index] = (OPJ_INT32)((value & blueMask) >> blueShift); /* B */ - if (hasAlpha) { - image->comps[3].data[index] = (OPJ_INT32)((value & alphaMask) >> alphaShift); /* A */ - } - index++; - } - pSrc -= stride; - } + int index; + OPJ_UINT32 width, height; + OPJ_UINT32 x, y; + const OPJ_UINT8 *pSrc = NULL; + OPJ_BOOL hasAlpha = OPJ_FALSE; + OPJ_UINT32 redShift, redPrec; + OPJ_UINT32 greenShift, greenPrec; + OPJ_UINT32 blueShift, bluePrec; + OPJ_UINT32 alphaShift, alphaPrec; + + width = image->comps[0].w; + height = image->comps[0].h; + + hasAlpha = image->numcomps > 3U; + + bmp_mask_get_shift_and_prec(redMask, &redShift, &redPrec); + bmp_mask_get_shift_and_prec(greenMask, &greenShift, &greenPrec); + bmp_mask_get_shift_and_prec(blueMask, &blueShift, &bluePrec); + bmp_mask_get_shift_and_prec(alphaMask, &alphaShift, &alphaPrec); + + image->comps[0].bpp = redPrec; + image->comps[0].prec = redPrec; + image->comps[1].bpp = greenPrec; + image->comps[1].prec = greenPrec; + image->comps[2].bpp = bluePrec; + image->comps[2].prec = bluePrec; + if (hasAlpha) { + image->comps[3].bpp = alphaPrec; + image->comps[3].prec = alphaPrec; + } + + index = 0; + pSrc = pData + (height - 1U) * stride; + for(y = 0; y < height; y++) { + for(x = 0; x < width; x++) { + OPJ_UINT32 value = 0U; + + value |= ((OPJ_UINT32)pSrc[4*x+0]) << 0; + value |= ((OPJ_UINT32)pSrc[4*x+1]) << 8; + value |= ((OPJ_UINT32)pSrc[4*x+2]) << 16; + value |= ((OPJ_UINT32)pSrc[4*x+3]) << 24; + + image->comps[0].data[index] = (OPJ_INT32)((value & redMask) >> redShift); /* R */ + image->comps[1].data[index] = (OPJ_INT32)((value & greenMask) >> greenShift); /* G */ + image->comps[2].data[index] = (OPJ_INT32)((value & blueMask) >> blueShift); /* B */ + if (hasAlpha) { + image->comps[3].data[index] = (OPJ_INT32)((value & alphaMask) >> alphaShift); /* A */ + } + index++; + } + pSrc -= stride; + } } static void bmpmask16toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image, OPJ_UINT32 redMask, OPJ_UINT32 greenMask, OPJ_UINT32 blueMask, OPJ_UINT32 alphaMask) { - int index; - OPJ_UINT32 width, height; - OPJ_UINT32 x, y; - const OPJ_UINT8 *pSrc = NULL; - OPJ_BOOL hasAlpha = OPJ_FALSE; - OPJ_UINT32 redShift, redPrec; - OPJ_UINT32 greenShift, greenPrec; - OPJ_UINT32 blueShift, bluePrec; - OPJ_UINT32 alphaShift, alphaPrec; - - width = image->comps[0].w; - height = image->comps[0].h; - - hasAlpha = image->numcomps > 3U; - - bmp_mask_get_shift_and_prec(redMask, &redShift, &redPrec); - bmp_mask_get_shift_and_prec(greenMask, &greenShift, &greenPrec); - bmp_mask_get_shift_and_prec(blueMask, &blueShift, &bluePrec); - bmp_mask_get_shift_and_prec(alphaMask, &alphaShift, &alphaPrec); - - image->comps[0].bpp = redPrec; - image->comps[0].prec = redPrec; - image->comps[1].bpp = greenPrec; - image->comps[1].prec = greenPrec; - image->comps[2].bpp = bluePrec; - image->comps[2].prec = bluePrec; - if (hasAlpha) { - image->comps[3].bpp = alphaPrec; - image->comps[3].prec = alphaPrec; - } - - index = 0; - pSrc = pData + (height - 1U) * stride; - for(y = 0; y < height; y++) - { - for(x = 0; x < width; x++) - { - OPJ_UINT32 value = 0U; - - value |= ((OPJ_UINT32)pSrc[2*x+0]) << 0; - value |= ((OPJ_UINT32)pSrc[2*x+1]) << 8; - - image->comps[0].data[index] = (OPJ_INT32)((value & redMask) >> redShift); /* R */ - image->comps[1].data[index] = (OPJ_INT32)((value & greenMask) >> greenShift); /* G */ - image->comps[2].data[index] = (OPJ_INT32)((value & blueMask) >> blueShift); /* B */ - if (hasAlpha) { - image->comps[3].data[index] = (OPJ_INT32)((value & alphaMask) >> alphaShift); /* A */ - } - index++; - } - pSrc -= stride; - } + int index; + OPJ_UINT32 width, height; + OPJ_UINT32 x, y; + const OPJ_UINT8 *pSrc = NULL; + OPJ_BOOL hasAlpha = OPJ_FALSE; + OPJ_UINT32 redShift, redPrec; + OPJ_UINT32 greenShift, greenPrec; + OPJ_UINT32 blueShift, bluePrec; + OPJ_UINT32 alphaShift, alphaPrec; + + width = image->comps[0].w; + height = image->comps[0].h; + + hasAlpha = image->numcomps > 3U; + + bmp_mask_get_shift_and_prec(redMask, &redShift, &redPrec); + bmp_mask_get_shift_and_prec(greenMask, &greenShift, &greenPrec); + bmp_mask_get_shift_and_prec(blueMask, &blueShift, &bluePrec); + bmp_mask_get_shift_and_prec(alphaMask, &alphaShift, &alphaPrec); + + image->comps[0].bpp = redPrec; + image->comps[0].prec = redPrec; + image->comps[1].bpp = greenPrec; + image->comps[1].prec = greenPrec; + image->comps[2].bpp = bluePrec; + image->comps[2].prec = bluePrec; + if (hasAlpha) { + image->comps[3].bpp = alphaPrec; + image->comps[3].prec = alphaPrec; + } + + index = 0; + pSrc = pData + (height - 1U) * stride; + for(y = 0; y < height; y++) { + for(x = 0; x < width; x++) { + OPJ_UINT32 value = 0U; + + value |= ((OPJ_UINT32)pSrc[2*x+0]) << 0; + value |= ((OPJ_UINT32)pSrc[2*x+1]) << 8; + + image->comps[0].data[index] = (OPJ_INT32)((value & redMask) >> redShift); /* R */ + image->comps[1].data[index] = (OPJ_INT32)((value & greenMask) >> greenShift); /* G */ + image->comps[2].data[index] = (OPJ_INT32)((value & blueMask) >> blueShift); /* B */ + if (hasAlpha) { + image->comps[3].data[index] = (OPJ_INT32)((value & alphaMask) >> alphaShift); /* A */ + } + index++; + } + pSrc -= stride; + } } static opj_image_t* bmp8toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image, OPJ_UINT8 const* const* pLUT) { - OPJ_UINT32 width, height; - const OPJ_UINT8 *pSrc = NULL; - - width = image->comps[0].w; - height = image->comps[0].h; - - pSrc = pData + (height - 1U) * stride; - if (image->numcomps == 1U) { - opj_applyLUT8u_8u32s_C1R(pSrc, -(OPJ_INT32)stride, image->comps[0].data, (OPJ_INT32)width, pLUT[0], width, height); - } - else { - OPJ_INT32* pDst[3]; - OPJ_INT32 pDstStride[3]; - - pDst[0] = image->comps[0].data; pDst[1] = image->comps[1].data; pDst[2] = image->comps[2].data; - pDstStride[0] = (OPJ_INT32)width; pDstStride[1] = (OPJ_INT32)width; pDstStride[2] = (OPJ_INT32)width; - opj_applyLUT8u_8u32s_C1P3R(pSrc, -(OPJ_INT32)stride, pDst, pDstStride, pLUT, width, height); - } - return image; + OPJ_UINT32 width, height; + const OPJ_UINT8 *pSrc = NULL; + + width = image->comps[0].w; + height = image->comps[0].h; + + pSrc = pData + (height - 1U) * stride; + if (image->numcomps == 1U) { + opj_applyLUT8u_8u32s_C1R(pSrc, -(OPJ_INT32)stride, image->comps[0].data, (OPJ_INT32)width, pLUT[0], width, height); + } else { + OPJ_INT32* pDst[3]; + OPJ_INT32 pDstStride[3]; + + pDst[0] = image->comps[0].data; + pDst[1] = image->comps[1].data; + pDst[2] = image->comps[2].data; + pDstStride[0] = (OPJ_INT32)width; + pDstStride[1] = (OPJ_INT32)width; + pDstStride[2] = (OPJ_INT32)width; + opj_applyLUT8u_8u32s_C1P3R(pSrc, -(OPJ_INT32)stride, pDst, pDstStride, pLUT, width, height); + } + return image; } static OPJ_BOOL bmp_read_file_header(FILE* IN, OPJ_BITMAPFILEHEADER* header) { - header->bfType = (OPJ_UINT16)getc(IN); - header->bfType |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); - - if (header->bfType != 19778) { - fprintf(stderr,"Error, not a BMP file!\n"); - return OPJ_FALSE; - } - - /* FILE HEADER */ - /* ------------- */ - header->bfSize = (OPJ_UINT32)getc(IN); - header->bfSize |= (OPJ_UINT32)getc(IN) << 8; - header->bfSize |= (OPJ_UINT32)getc(IN) << 16; - header->bfSize |= (OPJ_UINT32)getc(IN) << 24; - - header->bfReserved1 = (OPJ_UINT16)getc(IN); - header->bfReserved1 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); - - header->bfReserved2 = (OPJ_UINT16)getc(IN); - header->bfReserved2 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); - - header->bfOffBits = (OPJ_UINT32)getc(IN); - header->bfOffBits |= (OPJ_UINT32)getc(IN) << 8; - header->bfOffBits |= (OPJ_UINT32)getc(IN) << 16; - header->bfOffBits |= (OPJ_UINT32)getc(IN) << 24; - return OPJ_TRUE; + header->bfType = (OPJ_UINT16)getc(IN); + header->bfType |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); + + if (header->bfType != 19778) { + fprintf(stderr,"Error, not a BMP file!\n"); + return OPJ_FALSE; + } + + /* FILE HEADER */ + /* ------------- */ + header->bfSize = (OPJ_UINT32)getc(IN); + header->bfSize |= (OPJ_UINT32)getc(IN) << 8; + header->bfSize |= (OPJ_UINT32)getc(IN) << 16; + header->bfSize |= (OPJ_UINT32)getc(IN) << 24; + + header->bfReserved1 = (OPJ_UINT16)getc(IN); + header->bfReserved1 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); + + header->bfReserved2 = (OPJ_UINT16)getc(IN); + header->bfReserved2 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); + + header->bfOffBits = (OPJ_UINT32)getc(IN); + header->bfOffBits |= (OPJ_UINT32)getc(IN) << 8; + header->bfOffBits |= (OPJ_UINT32)getc(IN) << 16; + header->bfOffBits |= (OPJ_UINT32)getc(IN) << 24; + return OPJ_TRUE; } static OPJ_BOOL bmp_read_info_header(FILE* IN, OPJ_BITMAPINFOHEADER* header) { - memset(header, 0, sizeof(*header)); - /* INFO HEADER */ - /* ------------- */ - header->biSize = (OPJ_UINT32)getc(IN); - header->biSize |= (OPJ_UINT32)getc(IN) << 8; - header->biSize |= (OPJ_UINT32)getc(IN) << 16; - header->biSize |= (OPJ_UINT32)getc(IN) << 24; - - switch (header->biSize) { - case 12U: /* BITMAPCOREHEADER */ - case 40U: /* BITMAPINFOHEADER */ - case 52U: /* BITMAPV2INFOHEADER */ - case 56U: /* BITMAPV3INFOHEADER */ - case 108U: /* BITMAPV4HEADER */ - case 124U: /* BITMAPV5HEADER */ - break; - default: - fprintf(stderr,"Error, unknown BMP header size %d\n", header->biSize); - return OPJ_FALSE; - } - - header->biWidth = (OPJ_UINT32)getc(IN); - header->biWidth |= (OPJ_UINT32)getc(IN) << 8; - header->biWidth |= (OPJ_UINT32)getc(IN) << 16; - header->biWidth |= (OPJ_UINT32)getc(IN) << 24; - - header->biHeight = (OPJ_UINT32)getc(IN); - header->biHeight |= (OPJ_UINT32)getc(IN) << 8; - header->biHeight |= (OPJ_UINT32)getc(IN) << 16; - header->biHeight |= (OPJ_UINT32)getc(IN) << 24; - - header->biPlanes = (OPJ_UINT16)getc(IN); - header->biPlanes |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); - - header->biBitCount = (OPJ_UINT16)getc(IN); - header->biBitCount |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); - - if(header->biSize >= 40U) { - header->biCompression = (OPJ_UINT32)getc(IN); - header->biCompression |= (OPJ_UINT32)getc(IN) << 8; - header->biCompression |= (OPJ_UINT32)getc(IN) << 16; - header->biCompression |= (OPJ_UINT32)getc(IN) << 24; - - header->biSizeImage = (OPJ_UINT32)getc(IN); - header->biSizeImage |= (OPJ_UINT32)getc(IN) << 8; - header->biSizeImage |= (OPJ_UINT32)getc(IN) << 16; - header->biSizeImage |= (OPJ_UINT32)getc(IN) << 24; - - header->biXpelsPerMeter = (OPJ_UINT32)getc(IN); - header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8; - header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16; - header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24; - - header->biYpelsPerMeter = (OPJ_UINT32)getc(IN); - header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8; - header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16; - header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24; - - header->biClrUsed = (OPJ_UINT32)getc(IN); - header->biClrUsed |= (OPJ_UINT32)getc(IN) << 8; - header->biClrUsed |= (OPJ_UINT32)getc(IN) << 16; - header->biClrUsed |= (OPJ_UINT32)getc(IN) << 24; - - header->biClrImportant = (OPJ_UINT32)getc(IN); - header->biClrImportant |= (OPJ_UINT32)getc(IN) << 8; - header->biClrImportant |= (OPJ_UINT32)getc(IN) << 16; - header->biClrImportant |= (OPJ_UINT32)getc(IN) << 24; - } - - if(header->biSize >= 56U) { - header->biRedMask = (OPJ_UINT32)getc(IN); - header->biRedMask |= (OPJ_UINT32)getc(IN) << 8; - header->biRedMask |= (OPJ_UINT32)getc(IN) << 16; - header->biRedMask |= (OPJ_UINT32)getc(IN) << 24; - - header->biGreenMask = (OPJ_UINT32)getc(IN); - header->biGreenMask |= (OPJ_UINT32)getc(IN) << 8; - header->biGreenMask |= (OPJ_UINT32)getc(IN) << 16; - header->biGreenMask |= (OPJ_UINT32)getc(IN) << 24; - - header->biBlueMask = (OPJ_UINT32)getc(IN); - header->biBlueMask |= (OPJ_UINT32)getc(IN) << 8; - header->biBlueMask |= (OPJ_UINT32)getc(IN) << 16; - header->biBlueMask |= (OPJ_UINT32)getc(IN) << 24; - - header->biAlphaMask = (OPJ_UINT32)getc(IN); - header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 8; - header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 16; - header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 24; - } - - if(header->biSize >= 108U) { - header->biColorSpaceType = (OPJ_UINT32)getc(IN); - header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 8; - header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 16; - header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 24; - - if (fread(&(header->biColorSpaceEP), 1U, sizeof(header->biColorSpaceEP), IN) != sizeof(header->biColorSpaceEP)) { - fprintf(stderr,"Error, can't read BMP header\n"); - return OPJ_FALSE; - } - - header->biRedGamma = (OPJ_UINT32)getc(IN); - header->biRedGamma |= (OPJ_UINT32)getc(IN) << 8; - header->biRedGamma |= (OPJ_UINT32)getc(IN) << 16; - header->biRedGamma |= (OPJ_UINT32)getc(IN) << 24; - - header->biGreenGamma = (OPJ_UINT32)getc(IN); - header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 8; - header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 16; - header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 24; - - header->biBlueGamma = (OPJ_UINT32)getc(IN); - header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 8; - header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 16; - header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 24; - } - - if(header->biSize >= 124U) { - header->biIntent = (OPJ_UINT32)getc(IN); - header->biIntent |= (OPJ_UINT32)getc(IN) << 8; - header->biIntent |= (OPJ_UINT32)getc(IN) << 16; - header->biIntent |= (OPJ_UINT32)getc(IN) << 24; - - header->biIccProfileData = (OPJ_UINT32)getc(IN); - header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 8; - header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 16; - header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 24; - - header->biIccProfileSize = (OPJ_UINT32)getc(IN); - header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 8; - header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 16; - header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 24; - - header->biReserved = (OPJ_UINT32)getc(IN); - header->biReserved |= (OPJ_UINT32)getc(IN) << 8; - header->biReserved |= (OPJ_UINT32)getc(IN) << 16; - header->biReserved |= (OPJ_UINT32)getc(IN) << 24; - } - return OPJ_TRUE; + memset(header, 0, sizeof(*header)); + /* INFO HEADER */ + /* ------------- */ + header->biSize = (OPJ_UINT32)getc(IN); + header->biSize |= (OPJ_UINT32)getc(IN) << 8; + header->biSize |= (OPJ_UINT32)getc(IN) << 16; + header->biSize |= (OPJ_UINT32)getc(IN) << 24; + + switch (header->biSize) { + case 12U: /* BITMAPCOREHEADER */ + case 40U: /* BITMAPINFOHEADER */ + case 52U: /* BITMAPV2INFOHEADER */ + case 56U: /* BITMAPV3INFOHEADER */ + case 108U: /* BITMAPV4HEADER */ + case 124U: /* BITMAPV5HEADER */ + break; + default: + fprintf(stderr,"Error, unknown BMP header size %d\n", header->biSize); + return OPJ_FALSE; + } + + header->biWidth = (OPJ_UINT32)getc(IN); + header->biWidth |= (OPJ_UINT32)getc(IN) << 8; + header->biWidth |= (OPJ_UINT32)getc(IN) << 16; + header->biWidth |= (OPJ_UINT32)getc(IN) << 24; + + header->biHeight = (OPJ_UINT32)getc(IN); + header->biHeight |= (OPJ_UINT32)getc(IN) << 8; + header->biHeight |= (OPJ_UINT32)getc(IN) << 16; + header->biHeight |= (OPJ_UINT32)getc(IN) << 24; + + header->biPlanes = (OPJ_UINT16)getc(IN); + header->biPlanes |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); + + header->biBitCount = (OPJ_UINT16)getc(IN); + header->biBitCount |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8); + + if(header->biSize >= 40U) { + header->biCompression = (OPJ_UINT32)getc(IN); + header->biCompression |= (OPJ_UINT32)getc(IN) << 8; + header->biCompression |= (OPJ_UINT32)getc(IN) << 16; + header->biCompression |= (OPJ_UINT32)getc(IN) << 24; + + header->biSizeImage = (OPJ_UINT32)getc(IN); + header->biSizeImage |= (OPJ_UINT32)getc(IN) << 8; + header->biSizeImage |= (OPJ_UINT32)getc(IN) << 16; + header->biSizeImage |= (OPJ_UINT32)getc(IN) << 24; + + header->biXpelsPerMeter = (OPJ_UINT32)getc(IN); + header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8; + header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16; + header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24; + + header->biYpelsPerMeter = (OPJ_UINT32)getc(IN); + header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8; + header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16; + header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24; + + header->biClrUsed = (OPJ_UINT32)getc(IN); + header->biClrUsed |= (OPJ_UINT32)getc(IN) << 8; + header->biClrUsed |= (OPJ_UINT32)getc(IN) << 16; + header->biClrUsed |= (OPJ_UINT32)getc(IN) << 24; + + header->biClrImportant = (OPJ_UINT32)getc(IN); + header->biClrImportant |= (OPJ_UINT32)getc(IN) << 8; + header->biClrImportant |= (OPJ_UINT32)getc(IN) << 16; + header->biClrImportant |= (OPJ_UINT32)getc(IN) << 24; + } + + if(header->biSize >= 56U) { + header->biRedMask = (OPJ_UINT32)getc(IN); + header->biRedMask |= (OPJ_UINT32)getc(IN) << 8; + header->biRedMask |= (OPJ_UINT32)getc(IN) << 16; + header->biRedMask |= (OPJ_UINT32)getc(IN) << 24; + + header->biGreenMask = (OPJ_UINT32)getc(IN); + header->biGreenMask |= (OPJ_UINT32)getc(IN) << 8; + header->biGreenMask |= (OPJ_UINT32)getc(IN) << 16; + header->biGreenMask |= (OPJ_UINT32)getc(IN) << 24; + + header->biBlueMask = (OPJ_UINT32)getc(IN); + header->biBlueMask |= (OPJ_UINT32)getc(IN) << 8; + header->biBlueMask |= (OPJ_UINT32)getc(IN) << 16; + header->biBlueMask |= (OPJ_UINT32)getc(IN) << 24; + + header->biAlphaMask = (OPJ_UINT32)getc(IN); + header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 8; + header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 16; + header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 24; + } + + if(header->biSize >= 108U) { + header->biColorSpaceType = (OPJ_UINT32)getc(IN); + header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 8; + header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 16; + header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 24; + + if (fread(&(header->biColorSpaceEP), 1U, sizeof(header->biColorSpaceEP), IN) != sizeof(header->biColorSpaceEP)) { + fprintf(stderr,"Error, can't read BMP header\n"); + return OPJ_FALSE; + } + + header->biRedGamma = (OPJ_UINT32)getc(IN); + header->biRedGamma |= (OPJ_UINT32)getc(IN) << 8; + header->biRedGamma |= (OPJ_UINT32)getc(IN) << 16; + header->biRedGamma |= (OPJ_UINT32)getc(IN) << 24; + + header->biGreenGamma = (OPJ_UINT32)getc(IN); + header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 8; + header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 16; + header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 24; + + header->biBlueGamma = (OPJ_UINT32)getc(IN); + header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 8; + header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 16; + header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 24; + } + + if(header->biSize >= 124U) { + header->biIntent = (OPJ_UINT32)getc(IN); + header->biIntent |= (OPJ_UINT32)getc(IN) << 8; + header->biIntent |= (OPJ_UINT32)getc(IN) << 16; + header->biIntent |= (OPJ_UINT32)getc(IN) << 24; + + header->biIccProfileData = (OPJ_UINT32)getc(IN); + header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 8; + header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 16; + header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 24; + + header->biIccProfileSize = (OPJ_UINT32)getc(IN); + header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 8; + header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 16; + header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 24; + + header->biReserved = (OPJ_UINT32)getc(IN); + header->biReserved |= (OPJ_UINT32)getc(IN) << 8; + header->biReserved |= (OPJ_UINT32)getc(IN) << 16; + header->biReserved |= (OPJ_UINT32)getc(IN) << 24; + } + return OPJ_TRUE; } static OPJ_BOOL bmp_read_raw_data(FILE* IN, OPJ_UINT8* pData, OPJ_UINT32 stride, OPJ_UINT32 width, OPJ_UINT32 height) { - OPJ_ARG_NOT_USED(width); - - if ( fread(pData, sizeof(OPJ_UINT8), stride * height, IN) != (stride * height) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return OPJ_FALSE; - } - return OPJ_TRUE; + OPJ_ARG_NOT_USED(width); + + if ( fread(pData, sizeof(OPJ_UINT8), stride * height, IN) != (stride * height) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return OPJ_FALSE; + } + return OPJ_TRUE; } static OPJ_BOOL bmp_read_rle8_data(FILE* IN, OPJ_UINT8* pData, OPJ_UINT32 stride, OPJ_UINT32 width, OPJ_UINT32 height) { - OPJ_UINT32 x, y; - OPJ_UINT8 *pix; - const OPJ_UINT8 *beyond; - - beyond = pData + stride * height; - pix = pData; - - x = y = 0U; - while (y < height) - { - int c = getc(IN); - - if (c) { - int j; - OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN); - - for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { - *pix = c1; - } - } - else { - c = getc(IN); - if (c == 0x00) { /* EOL */ - x = 0; - ++y; - pix = pData + y * stride + x; - } - else if (c == 0x01) { /* EOP */ - break; - } - else if (c == 0x02) { /* MOVE by dxdy */ - c = getc(IN); - x += (OPJ_UINT32)c; - c = getc(IN); - y += (OPJ_UINT32)c; - pix = pData + y * stride + x; - } - else /* 03 .. 255 */ - { - int j; - for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) - { - OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN); - *pix = c1; - } - if ((OPJ_UINT32)c & 1U) { /* skip padding byte */ - getc(IN); - } - } - } - }/* while() */ - return OPJ_TRUE; + OPJ_UINT32 x, y; + OPJ_UINT8 *pix; + const OPJ_UINT8 *beyond; + + beyond = pData + stride * height; + pix = pData; + + x = y = 0U; + while (y < height) { + int c = getc(IN); + + if (c) { + int j; + OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN); + + for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { + *pix = c1; + } + } else { + c = getc(IN); + if (c == 0x00) { /* EOL */ + x = 0; + ++y; + pix = pData + y * stride + x; + } else if (c == 0x01) { /* EOP */ + break; + } else if (c == 0x02) { /* MOVE by dxdy */ + c = getc(IN); + x += (OPJ_UINT32)c; + c = getc(IN); + y += (OPJ_UINT32)c; + pix = pData + y * stride + x; + } else { /* 03 .. 255 */ + int j; + for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { + OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN); + *pix = c1; + } + if ((OPJ_UINT32)c & 1U) { /* skip padding byte */ + getc(IN); + } + } + } + }/* while() */ + return OPJ_TRUE; } static OPJ_BOOL bmp_read_rle4_data(FILE* IN, OPJ_UINT8* pData, OPJ_UINT32 stride, OPJ_UINT32 width, OPJ_UINT32 height) { - OPJ_UINT32 x, y; - OPJ_UINT8 *pix; - const OPJ_UINT8 *beyond; - - beyond = pData + stride * height; - pix = pData; - x = y = 0U; - while(y < height) - { - int c = getc(IN); - if(c == EOF) break; - - if(c) {/* encoded mode */ - int j; - OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN); - - for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { - *pix = (OPJ_UINT8)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU)); - } - } - else { /* absolute mode */ - c = getc(IN); - if(c == EOF) break; - - if(c == 0x00) { /* EOL */ - x = 0; y++; pix = pData + y * stride; - } - else if(c == 0x01) { /* EOP */ - break; - } - else if(c == 0x02) { /* MOVE by dxdy */ - c = getc(IN); x += (OPJ_UINT32)c; - c = getc(IN); y += (OPJ_UINT32)c; - pix = pData + y * stride + x; - } - else { /* 03 .. 255 : absolute mode */ - int j; - OPJ_UINT8 c1 = 0U; - - for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { - if((j&1) == 0) { - c1 = (OPJ_UINT8)getc(IN); - } - *pix = (OPJ_UINT8)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU)); - } - if(((c&3) == 1) || ((c&3) == 2)) { /* skip padding byte */ - getc(IN); - } - } - } - } /* while(y < height) */ - return OPJ_TRUE; + OPJ_UINT32 x, y; + OPJ_UINT8 *pix; + const OPJ_UINT8 *beyond; + + beyond = pData + stride * height; + pix = pData; + x = y = 0U; + while(y < height) { + int c = getc(IN); + if(c == EOF) break; + + if(c) {/* encoded mode */ + int j; + OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN); + + for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { + *pix = (OPJ_UINT8)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU)); + } + } else { /* absolute mode */ + c = getc(IN); + if(c == EOF) break; + + if(c == 0x00) { /* EOL */ + x = 0; + y++; + pix = pData + y * stride; + } else if(c == 0x01) { /* EOP */ + break; + } else if(c == 0x02) { /* MOVE by dxdy */ + c = getc(IN); + x += (OPJ_UINT32)c; + c = getc(IN); + y += (OPJ_UINT32)c; + pix = pData + y * stride + x; + } else { /* 03 .. 255 : absolute mode */ + int j; + OPJ_UINT8 c1 = 0U; + + for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) { + if((j&1) == 0) { + c1 = (OPJ_UINT8)getc(IN); + } + *pix = (OPJ_UINT8)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU)); + } + if(((c&3) == 1) || ((c&3) == 2)) { /* skip padding byte */ + getc(IN); + } + } + } + } /* while(y < height) */ + return OPJ_TRUE; } opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters) { - opj_image_cmptparm_t cmptparm[4]; /* maximum of 4 components */ - OPJ_UINT8 lut_R[256], lut_G[256], lut_B[256]; - OPJ_UINT8 const* pLUT[3]; - opj_image_t * image = NULL; - FILE *IN; - OPJ_BITMAPFILEHEADER File_h; - OPJ_BITMAPINFOHEADER Info_h; - OPJ_UINT32 i, palette_len, numcmpts = 1U; - OPJ_BOOL l_result = OPJ_FALSE; - OPJ_UINT8* pData = NULL; - OPJ_UINT32 stride; - - pLUT[0] = lut_R; pLUT[1] = lut_G; pLUT[2] = lut_B; - - IN = fopen(filename, "rb"); - if (!IN) - { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - return NULL; - } - - if (!bmp_read_file_header(IN, &File_h)) { - fclose(IN); - return NULL; - } - if (!bmp_read_info_header(IN, &Info_h)) { - fclose(IN); - return NULL; - } - - /* Load palette */ - if (Info_h.biBitCount <= 8U) - { - memset(&lut_R[0], 0, sizeof(lut_R)); - memset(&lut_G[0], 0, sizeof(lut_G)); - memset(&lut_B[0], 0, sizeof(lut_B)); - - palette_len = Info_h.biClrUsed; - if((palette_len == 0U) && (Info_h.biBitCount <= 8U)) { - palette_len = (1U << Info_h.biBitCount); - } - if (palette_len > 256U) { - palette_len = 256U; - } - if (palette_len > 0U) { - OPJ_UINT8 has_color = 0U; - for (i = 0U; i < palette_len; i++) { - lut_B[i] = (OPJ_UINT8)getc(IN); - lut_G[i] = (OPJ_UINT8)getc(IN); - lut_R[i] = (OPJ_UINT8)getc(IN); - (void)getc(IN); /* padding */ - has_color |= (lut_B[i] ^ lut_G[i]) | (lut_G[i] ^ lut_R[i]); - } - if(has_color) { - numcmpts = 3U; - } - } - } else { - numcmpts = 3U; - if ((Info_h.biCompression == 3) && (Info_h.biAlphaMask != 0U)) { - numcmpts++; - } - } - - stride = ((Info_h.biWidth * Info_h.biBitCount + 31U) / 32U) * 4U; /* rows are aligned on 32bits */ - if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /* RLE 4 gets decoded as 8 bits data for now... */ - stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U; - } - pData = (OPJ_UINT8 *) calloc(1, stride * Info_h.biHeight * sizeof(OPJ_UINT8)); - if (pData == NULL) { - fclose(IN); - return NULL; - } - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, (long)File_h.bfOffBits, SEEK_SET); - - switch (Info_h.biCompression) { - case 0: - case 3: - /* read raw data */ - l_result = bmp_read_raw_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight); - break; - case 1: - /* read rle8 data */ - l_result = bmp_read_rle8_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight); - break; - case 2: - /* read rle4 data */ - l_result = bmp_read_rle4_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight); - break; - default: - fprintf(stderr, "Unsupported BMP compression\n"); - l_result = OPJ_FALSE; - break; - } - if (!l_result) { - free(pData); - fclose(IN); - return NULL; - } - - /* create the image */ - memset(&cmptparm[0], 0, sizeof(cmptparm)); - for(i = 0; i < 4U; i++) - { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = (OPJ_UINT32)parameters->subsampling_dx; - cmptparm[i].dy = (OPJ_UINT32)parameters->subsampling_dy; - cmptparm[i].w = Info_h.biWidth; - cmptparm[i].h = Info_h.biHeight; - } - - image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? OPJ_CLRSPC_GRAY : OPJ_CLRSPC_SRGB); - if(!image) { - fclose(IN); - free(pData); - return NULL; - } - if (numcmpts == 4U) { - image->comps[3].alpha = 1; - } - - /* set image offset and reference grid */ - image->x0 = (OPJ_UINT32)parameters->image_offset_x0; - image->y0 = (OPJ_UINT32)parameters->image_offset_y0; - image->x1 = image->x0 + (Info_h.biWidth - 1U) * (OPJ_UINT32)parameters->subsampling_dx + 1U; - image->y1 = image->y0 + (Info_h.biHeight - 1U) * (OPJ_UINT32)parameters->subsampling_dy + 1U; - - /* Read the data */ - if (Info_h.biBitCount == 24 && Info_h.biCompression == 0) { /*RGB */ - bmp24toimage(pData, stride, image); - } - else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) { /* RGB 8bpp Indexed */ - bmp8toimage(pData, stride, image, pLUT); - } - else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) { /*RLE8*/ - bmp8toimage(pData, stride, image, pLUT); - } - else if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /*RLE4*/ - bmp8toimage(pData, stride, image, pLUT); /* RLE 4 gets decoded as 8 bits data for now */ - } - else if (Info_h.biBitCount == 32 && Info_h.biCompression == 0) { /* RGBX */ - bmpmask32toimage(pData, stride, image, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, 0x00000000U); - } - else if (Info_h.biBitCount == 32 && Info_h.biCompression == 3) { /* bitmask */ - bmpmask32toimage(pData, stride, image, Info_h.biRedMask, Info_h.biGreenMask, Info_h.biBlueMask, Info_h.biAlphaMask); - } - else if (Info_h.biBitCount == 16 && Info_h.biCompression == 0) { /* RGBX */ - bmpmask16toimage(pData, stride, image, 0x7C00U, 0x03E0U, 0x001FU, 0x0000U); - } - else if (Info_h.biBitCount == 16 && Info_h.biCompression == 3) { /* bitmask */ - if ((Info_h.biRedMask == 0U) && (Info_h.biGreenMask == 0U) && (Info_h.biBlueMask == 0U)) { - Info_h.biRedMask = 0xF800U; - Info_h.biGreenMask = 0x07E0U; - Info_h.biBlueMask = 0x001FU; - } - bmpmask16toimage(pData, stride, image, Info_h.biRedMask, Info_h.biGreenMask, Info_h.biBlueMask, Info_h.biAlphaMask); - } - else { - opj_image_destroy(image); - image = NULL; - fprintf(stderr, "Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n", Info_h.biBitCount); - } - free(pData); - fclose(IN); - return image; + opj_image_cmptparm_t cmptparm[4]; /* maximum of 4 components */ + OPJ_UINT8 lut_R[256], lut_G[256], lut_B[256]; + OPJ_UINT8 const* pLUT[3]; + opj_image_t * image = NULL; + FILE *IN; + OPJ_BITMAPFILEHEADER File_h; + OPJ_BITMAPINFOHEADER Info_h; + OPJ_UINT32 i, palette_len, numcmpts = 1U; + OPJ_BOOL l_result = OPJ_FALSE; + OPJ_UINT8* pData = NULL; + OPJ_UINT32 stride; + + pLUT[0] = lut_R; + pLUT[1] = lut_G; + pLUT[2] = lut_B; + + IN = fopen(filename, "rb"); + if (!IN) { + fprintf(stderr, "Failed to open %s for reading !!\n", filename); + return NULL; + } + + if (!bmp_read_file_header(IN, &File_h)) { + fclose(IN); + return NULL; + } + if (!bmp_read_info_header(IN, &Info_h)) { + fclose(IN); + return NULL; + } + + /* Load palette */ + if (Info_h.biBitCount <= 8U) { + memset(&lut_R[0], 0, sizeof(lut_R)); + memset(&lut_G[0], 0, sizeof(lut_G)); + memset(&lut_B[0], 0, sizeof(lut_B)); + + palette_len = Info_h.biClrUsed; + if((palette_len == 0U) && (Info_h.biBitCount <= 8U)) { + palette_len = (1U << Info_h.biBitCount); + } + if (palette_len > 256U) { + palette_len = 256U; + } + if (palette_len > 0U) { + OPJ_UINT8 has_color = 0U; + for (i = 0U; i < palette_len; i++) { + lut_B[i] = (OPJ_UINT8)getc(IN); + lut_G[i] = (OPJ_UINT8)getc(IN); + lut_R[i] = (OPJ_UINT8)getc(IN); + (void)getc(IN); /* padding */ + has_color |= (lut_B[i] ^ lut_G[i]) | (lut_G[i] ^ lut_R[i]); + } + if(has_color) { + numcmpts = 3U; + } + } + } else { + numcmpts = 3U; + if ((Info_h.biCompression == 3) && (Info_h.biAlphaMask != 0U)) { + numcmpts++; + } + } + + stride = ((Info_h.biWidth * Info_h.biBitCount + 31U) / 32U) * 4U; /* rows are aligned on 32bits */ + if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /* RLE 4 gets decoded as 8 bits data for now... */ + stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U; + } + pData = (OPJ_UINT8 *) calloc(1, stride * Info_h.biHeight * sizeof(OPJ_UINT8)); + if (pData == NULL) { + fclose(IN); + return NULL; + } + /* Place the cursor at the beginning of the image information */ + fseek(IN, 0, SEEK_SET); + fseek(IN, (long)File_h.bfOffBits, SEEK_SET); + + switch (Info_h.biCompression) { + case 0: + case 3: + /* read raw data */ + l_result = bmp_read_raw_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight); + break; + case 1: + /* read rle8 data */ + l_result = bmp_read_rle8_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight); + break; + case 2: + /* read rle4 data */ + l_result = bmp_read_rle4_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight); + break; + default: + fprintf(stderr, "Unsupported BMP compression\n"); + l_result = OPJ_FALSE; + break; + } + if (!l_result) { + free(pData); + fclose(IN); + return NULL; + } + + /* create the image */ + memset(&cmptparm[0], 0, sizeof(cmptparm)); + for(i = 0; i < 4U; i++) { + cmptparm[i].prec = 8; + cmptparm[i].bpp = 8; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = (OPJ_UINT32)parameters->subsampling_dx; + cmptparm[i].dy = (OPJ_UINT32)parameters->subsampling_dy; + cmptparm[i].w = Info_h.biWidth; + cmptparm[i].h = Info_h.biHeight; + } + + image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? OPJ_CLRSPC_GRAY : OPJ_CLRSPC_SRGB); + if(!image) { + fclose(IN); + free(pData); + return NULL; + } + if (numcmpts == 4U) { + image->comps[3].alpha = 1; + } + + /* set image offset and reference grid */ + image->x0 = (OPJ_UINT32)parameters->image_offset_x0; + image->y0 = (OPJ_UINT32)parameters->image_offset_y0; + image->x1 = image->x0 + (Info_h.biWidth - 1U) * (OPJ_UINT32)parameters->subsampling_dx + 1U; + image->y1 = image->y0 + (Info_h.biHeight - 1U) * (OPJ_UINT32)parameters->subsampling_dy + 1U; + + /* Read the data */ + if (Info_h.biBitCount == 24 && Info_h.biCompression == 0) { /*RGB */ + bmp24toimage(pData, stride, image); + } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) { /* RGB 8bpp Indexed */ + bmp8toimage(pData, stride, image, pLUT); + } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) { /*RLE8*/ + bmp8toimage(pData, stride, image, pLUT); + } else if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /*RLE4*/ + bmp8toimage(pData, stride, image, pLUT); /* RLE 4 gets decoded as 8 bits data for now */ + } else if (Info_h.biBitCount == 32 && Info_h.biCompression == 0) { /* RGBX */ + bmpmask32toimage(pData, stride, image, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, 0x00000000U); + } else if (Info_h.biBitCount == 32 && Info_h.biCompression == 3) { /* bitmask */ + bmpmask32toimage(pData, stride, image, Info_h.biRedMask, Info_h.biGreenMask, Info_h.biBlueMask, Info_h.biAlphaMask); + } else if (Info_h.biBitCount == 16 && Info_h.biCompression == 0) { /* RGBX */ + bmpmask16toimage(pData, stride, image, 0x7C00U, 0x03E0U, 0x001FU, 0x0000U); + } else if (Info_h.biBitCount == 16 && Info_h.biCompression == 3) { /* bitmask */ + if ((Info_h.biRedMask == 0U) && (Info_h.biGreenMask == 0U) && (Info_h.biBlueMask == 0U)) { + Info_h.biRedMask = 0xF800U; + Info_h.biGreenMask = 0x07E0U; + Info_h.biBlueMask = 0x001FU; + } + bmpmask16toimage(pData, stride, image, Info_h.biRedMask, Info_h.biGreenMask, Info_h.biBlueMask, Info_h.biAlphaMask); + } else { + opj_image_destroy(image); + image = NULL; + fprintf(stderr, "Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n", Info_h.biBitCount); + } + free(pData); + fclose(IN); + return image; } -int imagetobmp(opj_image_t * image, const char *outfile) { +int imagetobmp(opj_image_t * image, const char *outfile) +{ int w, h; int i, pad; FILE *fdest = NULL; @@ -850,20 +829,17 @@ int imagetobmp(opj_image_t * image, const char *outfile) { if (image->comps[0].prec > 8) { adjustR = (int)image->comps[0].prec - 8; printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); - } - else + } else adjustR = 0; if (image->comps[1].prec > 8) { adjustG = (int)image->comps[1].prec - 8; printf("BMP CONVERSION: Truncating component 1 from %d bits to 8 bits\n", image->comps[1].prec); - } - else + } else adjustG = 0; if (image->comps[2].prec > 8) { adjustB = (int)image->comps[2].prec - 8; printf("BMP CONVERSION: Truncating component 2 from %d bits to 8 bits\n", image->comps[2].prec); - } - else + } else adjustB = 0; for (i = 0; i < w * h; i++) { @@ -873,19 +849,22 @@ int imagetobmp(opj_image_t * image, const char *outfile) { r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); r = ((r >> adjustR)+((r >> (adjustR-1))%2)); - if(r > 255) r = 255; else if(r < 0) r = 0; + if(r > 255) r = 255; + else if(r < 0) r = 0; rc = (OPJ_UINT8)r; g = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); g = ((g >> adjustG)+((g >> (adjustG-1))%2)); - if(g > 255) g = 255; else if(g < 0) g = 0; + if(g > 255) g = 255; + else if(g < 0) g = 0; gc = (OPJ_UINT8)g; b = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); b = ((b >> adjustB)+((b >> (adjustB-1))%2)); - if(b > 255) b = 255; else if(b < 0) b = 0; + if(b > 255) b = 255; + else if(b < 0) b = 0; bc = (OPJ_UINT8)b; fprintf(fdest, "%c%c%c", bc, gc, rc); @@ -949,7 +928,7 @@ int imagetobmp(opj_image_t * image, const char *outfile) { if (image->comps[0].prec > 8) { adjustR = (int)image->comps[0].prec - 8; printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); - }else + } else adjustR = 0; for (i = 0; i < 256; i++) { @@ -962,7 +941,8 @@ int imagetobmp(opj_image_t * image, const char *outfile) { r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); r = ((r >> adjustR)+((r >> (adjustR-1))%2)); - if(r > 255) r = 255; else if(r < 0) r = 0; + if(r > 255) r = 255; + else if(r < 0) r = 0; fprintf(fdest, "%c", (OPJ_UINT8)r); diff --git a/src/bin/jp2/convertpng.c b/src/bin/jp2/convertpng.c index 8d117412..10531028 100644 --- a/src/bin/jp2/convertpng.c +++ b/src/bin/jp2/convertpng.c @@ -56,437 +56,422 @@ static void convert_16u32s_C1R(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < length; i++) { - OPJ_INT32 val0 = *pSrc++; - OPJ_INT32 val1 = *pSrc++; - pDst[i] = val0 << 8 | val1; - } + OPJ_SIZE_T i; + for (i = 0; i < length; i++) { + OPJ_INT32 val0 = *pSrc++; + OPJ_INT32 val1 = *pSrc++; + pDst[i] = val0 << 8 | val1; + } } opj_image_t *pngtoimage(const char *read_idf, opj_cparameters_t * params) { - png_structp png = NULL; - png_infop info = NULL; - double gamma; - int bit_depth, interlace_type,compression_type, filter_type; - OPJ_UINT32 i; - png_uint_32 width, height = 0U; - int color_type; - FILE *reader = NULL; - OPJ_BYTE** rows = NULL; - OPJ_INT32* row32s = NULL; - /* j2k: */ - opj_image_t *image = NULL; - opj_image_cmptparm_t cmptparm[4]; - OPJ_UINT32 nr_comp; - OPJ_BYTE sigbuf[8]; - convert_XXx32s_C1R cvtXXTo32s = NULL; - convert_32s_CXPX cvtCxToPx = NULL; - OPJ_INT32* planes[4]; - - if((reader = fopen(read_idf, "rb")) == NULL) - { - fprintf(stderr,"pngtoimage: can not open %s\n",read_idf); - return NULL; - } - - if(fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE - || memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0) - { - fprintf(stderr,"pngtoimage: %s is no valid PNG file\n",read_idf); - goto fin; - } - - if((png = png_create_read_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL)) == NULL) - goto fin; - if((info = png_create_info_struct(png)) == NULL) - goto fin; - - if(setjmp(png_jmpbuf(png))) - goto fin; - - png_init_io(png, reader); - png_set_sig_bytes(png, MAGIC_SIZE); - - png_read_info(png, info); - - if(png_get_IHDR(png, info, &width, &height, - &bit_depth, &color_type, &interlace_type, - &compression_type, &filter_type) == 0) - goto fin; - - /* png_set_expand(): - * expand paletted images to RGB, expand grayscale images of - * less than 8-bit depth to 8-bit depth, and expand tRNS chunks - * to alpha channels. - */ - if(color_type == PNG_COLOR_TYPE_PALETTE) { - png_set_expand(png); - } - - if(png_get_valid(png, info, PNG_INFO_tRNS)) { - png_set_expand(png); - } - /* We might wan't to expand background */ - /* - if(png_get_valid(png, info, PNG_INFO_bKGD)) { - png_color_16p bgnd; - png_get_bKGD(png, info, &bgnd); - png_set_background(png, bgnd, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); - } - */ - - if( !png_get_gAMA(png, info, &gamma)) - gamma = 1.0; - - /* we're not displaying but converting, screen gamma == 1.0 */ - png_set_gamma(png, 1.0, gamma); - - png_read_update_info(png, info); - - color_type = png_get_color_type(png, info); - - switch (color_type) { - case PNG_COLOR_TYPE_GRAY: - nr_comp = 1; - break; - case PNG_COLOR_TYPE_GRAY_ALPHA: - nr_comp = 2; - break; - case PNG_COLOR_TYPE_RGB: - nr_comp = 3; - break; - case PNG_COLOR_TYPE_RGB_ALPHA: - nr_comp = 4; - break; - default: - fprintf(stderr,"pngtoimage: colortype %d is not supported\n", color_type); - goto fin; - } - cvtCxToPx = convert_32s_CXPX_LUT[nr_comp]; - bit_depth = png_get_bit_depth(png, info); - - switch (bit_depth) { - case 1: - case 2: - case 4: - case 8: - cvtXXTo32s = convert_XXu32s_C1R_LUT[bit_depth]; - break; - case 16: /* 16 bpp is specific to PNG */ - cvtXXTo32s = convert_16u32s_C1R; - break; - default: - fprintf(stderr,"pngtoimage: bit depth %d is not supported\n", bit_depth); - goto fin; - } - - - rows = (OPJ_BYTE**)calloc(height+1, sizeof(OPJ_BYTE*)); - for(i = 0; i < height; ++i) - rows[i] = (OPJ_BYTE*)malloc(png_get_rowbytes(png,info)); - - png_read_image(png, rows); - - /* Create image */ - memset(cmptparm, 0, sizeof(cmptparm)); - for(i = 0; i < nr_comp; ++i) - { - cmptparm[i].prec = (OPJ_UINT32)bit_depth; - /* bits_per_pixel: 8 or 16 */ - cmptparm[i].bpp = (OPJ_UINT32)bit_depth; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = (OPJ_UINT32)params->subsampling_dx; - cmptparm[i].dy = (OPJ_UINT32)params->subsampling_dy; - cmptparm[i].w = (OPJ_UINT32)width; - cmptparm[i].h = (OPJ_UINT32)height; - } - - image = opj_image_create(nr_comp, &cmptparm[0], (nr_comp > 2U) ? OPJ_CLRSPC_SRGB : OPJ_CLRSPC_GRAY); - if(image == NULL) goto fin; - image->x0 = (OPJ_UINT32)params->image_offset_x0; - image->y0 = (OPJ_UINT32)params->image_offset_y0; - image->x1 = (OPJ_UINT32)(image->x0 + (width - 1) * (OPJ_UINT32)params->subsampling_dx + 1 + image->x0); - image->y1 = (OPJ_UINT32)(image->y0 + (height - 1) * (OPJ_UINT32)params->subsampling_dy + 1 + image->y0); - - row32s = (OPJ_INT32 *)malloc((size_t)width * nr_comp * sizeof(OPJ_INT32)); - if(row32s == NULL) goto fin; - - /* Set alpha channel */ - image->comps[nr_comp-1U].alpha = 1U - (nr_comp & 1U); - - for(i = 0; i < nr_comp; i++) - { - planes[i] = image->comps[i].data; - } - - for(i = 0; i < height; ++i) - { - cvtXXTo32s(rows[i], row32s, (OPJ_SIZE_T)width * nr_comp); - cvtCxToPx(row32s, planes, width); - planes[0] += width; - planes[1] += width; - planes[2] += width; - planes[3] += width; - } + png_structp png = NULL; + png_infop info = NULL; + double gamma; + int bit_depth, interlace_type,compression_type, filter_type; + OPJ_UINT32 i; + png_uint_32 width, height = 0U; + int color_type; + FILE *reader = NULL; + OPJ_BYTE** rows = NULL; + OPJ_INT32* row32s = NULL; + /* j2k: */ + opj_image_t *image = NULL; + opj_image_cmptparm_t cmptparm[4]; + OPJ_UINT32 nr_comp; + OPJ_BYTE sigbuf[8]; + convert_XXx32s_C1R cvtXXTo32s = NULL; + convert_32s_CXPX cvtCxToPx = NULL; + OPJ_INT32* planes[4]; + + if((reader = fopen(read_idf, "rb")) == NULL) { + fprintf(stderr,"pngtoimage: can not open %s\n",read_idf); + return NULL; + } + + if(fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE + || memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0) { + fprintf(stderr,"pngtoimage: %s is no valid PNG file\n",read_idf); + goto fin; + } + + if((png = png_create_read_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL)) == NULL) + goto fin; + if((info = png_create_info_struct(png)) == NULL) + goto fin; + + if(setjmp(png_jmpbuf(png))) + goto fin; + + png_init_io(png, reader); + png_set_sig_bytes(png, MAGIC_SIZE); + + png_read_info(png, info); + + if(png_get_IHDR(png, info, &width, &height, + &bit_depth, &color_type, &interlace_type, + &compression_type, &filter_type) == 0) + goto fin; + + /* png_set_expand(): + * expand paletted images to RGB, expand grayscale images of + * less than 8-bit depth to 8-bit depth, and expand tRNS chunks + * to alpha channels. + */ + if(color_type == PNG_COLOR_TYPE_PALETTE) { + png_set_expand(png); + } + + if(png_get_valid(png, info, PNG_INFO_tRNS)) { + png_set_expand(png); + } + /* We might wan't to expand background */ + /* + if(png_get_valid(png, info, PNG_INFO_bKGD)) { + png_color_16p bgnd; + png_get_bKGD(png, info, &bgnd); + png_set_background(png, bgnd, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + } + */ + + if( !png_get_gAMA(png, info, &gamma)) + gamma = 1.0; + + /* we're not displaying but converting, screen gamma == 1.0 */ + png_set_gamma(png, 1.0, gamma); + + png_read_update_info(png, info); + + color_type = png_get_color_type(png, info); + + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: + nr_comp = 1; + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + nr_comp = 2; + break; + case PNG_COLOR_TYPE_RGB: + nr_comp = 3; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + nr_comp = 4; + break; + default: + fprintf(stderr,"pngtoimage: colortype %d is not supported\n", color_type); + goto fin; + } + cvtCxToPx = convert_32s_CXPX_LUT[nr_comp]; + bit_depth = png_get_bit_depth(png, info); + + switch (bit_depth) { + case 1: + case 2: + case 4: + case 8: + cvtXXTo32s = convert_XXu32s_C1R_LUT[bit_depth]; + break; + case 16: /* 16 bpp is specific to PNG */ + cvtXXTo32s = convert_16u32s_C1R; + break; + default: + fprintf(stderr,"pngtoimage: bit depth %d is not supported\n", bit_depth); + goto fin; + } + + + rows = (OPJ_BYTE**)calloc(height+1, sizeof(OPJ_BYTE*)); + for(i = 0; i < height; ++i) + rows[i] = (OPJ_BYTE*)malloc(png_get_rowbytes(png,info)); + + png_read_image(png, rows); + + /* Create image */ + memset(cmptparm, 0, sizeof(cmptparm)); + for(i = 0; i < nr_comp; ++i) { + cmptparm[i].prec = (OPJ_UINT32)bit_depth; + /* bits_per_pixel: 8 or 16 */ + cmptparm[i].bpp = (OPJ_UINT32)bit_depth; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = (OPJ_UINT32)params->subsampling_dx; + cmptparm[i].dy = (OPJ_UINT32)params->subsampling_dy; + cmptparm[i].w = (OPJ_UINT32)width; + cmptparm[i].h = (OPJ_UINT32)height; + } + + image = opj_image_create(nr_comp, &cmptparm[0], (nr_comp > 2U) ? OPJ_CLRSPC_SRGB : OPJ_CLRSPC_GRAY); + if(image == NULL) goto fin; + image->x0 = (OPJ_UINT32)params->image_offset_x0; + image->y0 = (OPJ_UINT32)params->image_offset_y0; + image->x1 = (OPJ_UINT32)(image->x0 + (width - 1) * (OPJ_UINT32)params->subsampling_dx + 1 + image->x0); + image->y1 = (OPJ_UINT32)(image->y0 + (height - 1) * (OPJ_UINT32)params->subsampling_dy + 1 + image->y0); + + row32s = (OPJ_INT32 *)malloc((size_t)width * nr_comp * sizeof(OPJ_INT32)); + if(row32s == NULL) goto fin; + + /* Set alpha channel */ + image->comps[nr_comp-1U].alpha = 1U - (nr_comp & 1U); + + for(i = 0; i < nr_comp; i++) { + planes[i] = image->comps[i].data; + } + + for(i = 0; i < height; ++i) { + cvtXXTo32s(rows[i], row32s, (OPJ_SIZE_T)width * nr_comp); + cvtCxToPx(row32s, planes, width); + planes[0] += width; + planes[1] += width; + planes[2] += width; + planes[3] += width; + } fin: - if(rows) - { - for(i = 0; i < height; ++i) - free(rows[i]); - free(rows); - } - if (row32s) { - free(row32s); - } - if(png) - png_destroy_read_struct(&png, &info, NULL); - - fclose(reader); - - return image; - + if(rows) { + for(i = 0; i < height; ++i) + free(rows[i]); + free(rows); + } + if (row32s) { + free(row32s); + } + if(png) + png_destroy_read_struct(&png, &info, NULL); + + fclose(reader); + + return image; + }/* pngtoimage() */ static void convert_32s16u_C1R(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < length; i++) { - OPJ_UINT32 val = (OPJ_UINT32)pSrc[i]; - *pDst++ = (OPJ_BYTE)(val >> 8); - *pDst++ = (OPJ_BYTE)val; - } + OPJ_SIZE_T i; + for (i = 0; i < length; i++) { + OPJ_UINT32 val = (OPJ_UINT32)pSrc[i]; + *pDst++ = (OPJ_BYTE)(val >> 8); + *pDst++ = (OPJ_BYTE)val; + } } int imagetopng(opj_image_t * image, const char *write_idf) { - FILE * volatile writer = NULL; - png_structp png = NULL; - png_infop info = NULL; - png_bytep volatile row_buf = NULL; - int nr_comp, color_type; - volatile int prec; - png_color_8 sig_bit; - OPJ_INT32 const* planes[4]; - int i; - OPJ_INT32* volatile buffer32s = NULL; - - volatile int fails = 1; - - memset(&sig_bit, 0, sizeof(sig_bit)); - prec = (int)image->comps[0].prec; - planes[0] = image->comps[0].data; - nr_comp = (int)image->numcomps; - - if (nr_comp > 4) { - nr_comp = 4; - } - for (i = 1; i < nr_comp; ++i) { - if (image->comps[0].dx != image->comps[i].dx) { - break; - } - if (image->comps[0].dy != image->comps[i].dy) { - break; - } - if (image->comps[0].prec != image->comps[i].prec) { - break; - } - if (image->comps[0].sgnd != image->comps[i].sgnd) { - break; - } - planes[i] = image->comps[i].data; - } - if (i != nr_comp) { - fprintf(stderr,"imagetopng: All components shall have the same subsampling, same bit depth, same sign.\n"); - fprintf(stderr,"\tAborting\n"); - return 1; - } - for (i = 0; i < nr_comp; ++i) { - clip_component(&(image->comps[i]), image->comps[0].prec); - } - if(prec > 8 && prec < 16) - { - for (i = 0; i < nr_comp; ++i) { - scale_component(&(image->comps[i]), 16); - } - prec = 16; - } - else if(prec < 8 && nr_comp > 1)/* GRAY_ALPHA, RGB, RGB_ALPHA */ - { - for (i = 0; i < nr_comp; ++i) { - scale_component(&(image->comps[i]), 8); - } - prec = 8; - } else if((prec > 1) && (prec < 8) && ((prec == 6) || ((prec & 1)==1))) { /* GRAY with non native precision */ - if ((prec == 5) || (prec == 6)) { - prec = 8; - } else { - prec++; - } - for (i = 0; i < nr_comp; ++i) { - scale_component(&(image->comps[i]), (OPJ_UINT32)prec); - } - } - - if(prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16) - { - fprintf(stderr,"imagetopng: can not create %s\n\twrong bit_depth %d\n", write_idf, prec); - return fails; - } - - writer = fopen(write_idf, "wb"); - - if(writer == NULL) return fails; - - /* Create and initialize the png_struct with the desired error handler - * functions. If you want to use the default stderr and longjump method, - * you can supply NULL for the last three parameters. We also check that - * the library version is compatible with the one used at compile time, - * in case we are using dynamically linked libraries. REQUIRED. - */ - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); - /*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */ - - if(png == NULL) goto fin; - - /* Allocate/initialize the image information data. REQUIRED - */ - info = png_create_info_struct(png); - - if(info == NULL) goto fin; - - /* Set error handling. REQUIRED if you are not supplying your own - * error handling functions in the png_create_write_struct() call. - */ - if(setjmp(png_jmpbuf(png))) goto fin; - - /* I/O initialization functions is REQUIRED - */ - png_init_io(png, writer); - - /* Set the image information here. Width and height are up to 2^31, - * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on - * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, - * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, - * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or - * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST - * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. - * REQUIRED - * - * ERRORS: - * - * color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8 - * color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8 - * color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8 - * color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8 - * - */ - png_set_compression_level(png, Z_BEST_COMPRESSION); - - if(nr_comp >= 3) /* RGB(A) */ - { - color_type = PNG_COLOR_TYPE_RGB; - sig_bit.red = sig_bit.green = sig_bit.blue = (png_byte)prec; - } - else /* GRAY(A) */ - { - color_type = PNG_COLOR_TYPE_GRAY; - sig_bit.gray = (png_byte)prec; - } - if((nr_comp & 1) == 0) /* ALPHA */ - { - color_type |= PNG_COLOR_MASK_ALPHA; - sig_bit.alpha = (png_byte)prec; - } - - png_set_IHDR(png, info, image->comps[0].w, image->comps[0].h, prec, color_type, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - - png_set_sBIT(png, info, &sig_bit); - /* png_set_gamma(png, 2.2, 1./2.2); */ - /* png_set_sRGB(png, info, PNG_sRGB_INTENT_PERCEPTUAL); */ - png_write_info(png, info); - - /* setup conversion */ - { - OPJ_SIZE_T rowStride; - png_size_t png_row_size; - - png_row_size = png_get_rowbytes(png, info); - rowStride = ((OPJ_SIZE_T)image->comps[0].w * (OPJ_SIZE_T)nr_comp * (OPJ_SIZE_T)prec + 7U) / 8U; - if (rowStride != (OPJ_SIZE_T)png_row_size) { - fprintf(stderr, "Invalid PNG row size\n"); - goto fin; - } - row_buf = (png_bytep)malloc(png_row_size); - if (row_buf == NULL) { - fprintf(stderr, "Can't allocate memory for PNG row\n"); - goto fin; - } - buffer32s = (OPJ_INT32*)malloc((OPJ_SIZE_T)image->comps[0].w * (OPJ_SIZE_T)nr_comp * sizeof(OPJ_INT32)); - if (buffer32s == NULL) { - fprintf(stderr, "Can't allocate memory for interleaved 32s row\n"); - goto fin; - } - } - - /* convert */ - { - OPJ_SIZE_T width= image->comps[0].w; - OPJ_UINT32 y; - convert_32s_PXCX cvtPxToCx = convert_32s_PXCX_LUT[nr_comp]; - convert_32sXXx_C1R cvt32sToPack = NULL; - OPJ_INT32 adjust = image->comps[0].sgnd ? 1 << (prec - 1) : 0; - png_bytep row_buf_cpy = row_buf; - OPJ_INT32* buffer32s_cpy = buffer32s; - - switch (prec) { - case 1: - case 2: - case 4: - case 8: - cvt32sToPack = convert_32sXXu_C1R_LUT[prec]; - break; - case 16: - cvt32sToPack = convert_32s16u_C1R; - break; - default: - /* never here */ - break; - } - - for(y = 0; y < image->comps[0].h; ++y) - { - cvtPxToCx(planes, buffer32s_cpy, width, adjust); - cvt32sToPack(buffer32s_cpy, row_buf_cpy, width * (OPJ_SIZE_T)nr_comp); - png_write_row(png, row_buf_cpy); - planes[0] += width; - planes[1] += width; - planes[2] += width; - planes[3] += width; - } - } - - png_write_end(png, info); - - fails = 0; - + FILE * volatile writer = NULL; + png_structp png = NULL; + png_infop info = NULL; + png_bytep volatile row_buf = NULL; + int nr_comp, color_type; + volatile int prec; + png_color_8 sig_bit; + OPJ_INT32 const* planes[4]; + int i; + OPJ_INT32* volatile buffer32s = NULL; + + volatile int fails = 1; + + memset(&sig_bit, 0, sizeof(sig_bit)); + prec = (int)image->comps[0].prec; + planes[0] = image->comps[0].data; + nr_comp = (int)image->numcomps; + + if (nr_comp > 4) { + nr_comp = 4; + } + for (i = 1; i < nr_comp; ++i) { + if (image->comps[0].dx != image->comps[i].dx) { + break; + } + if (image->comps[0].dy != image->comps[i].dy) { + break; + } + if (image->comps[0].prec != image->comps[i].prec) { + break; + } + if (image->comps[0].sgnd != image->comps[i].sgnd) { + break; + } + planes[i] = image->comps[i].data; + } + if (i != nr_comp) { + fprintf(stderr,"imagetopng: All components shall have the same subsampling, same bit depth, same sign.\n"); + fprintf(stderr,"\tAborting\n"); + return 1; + } + for (i = 0; i < nr_comp; ++i) { + clip_component(&(image->comps[i]), image->comps[0].prec); + } + if(prec > 8 && prec < 16) { + for (i = 0; i < nr_comp; ++i) { + scale_component(&(image->comps[i]), 16); + } + prec = 16; + } else if(prec < 8 && nr_comp > 1) { /* GRAY_ALPHA, RGB, RGB_ALPHA */ + for (i = 0; i < nr_comp; ++i) { + scale_component(&(image->comps[i]), 8); + } + prec = 8; + } else if((prec > 1) && (prec < 8) && ((prec == 6) || ((prec & 1)==1))) { /* GRAY with non native precision */ + if ((prec == 5) || (prec == 6)) { + prec = 8; + } else { + prec++; + } + for (i = 0; i < nr_comp; ++i) { + scale_component(&(image->comps[i]), (OPJ_UINT32)prec); + } + } + + if(prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16) { + fprintf(stderr,"imagetopng: can not create %s\n\twrong bit_depth %d\n", write_idf, prec); + return fails; + } + + writer = fopen(write_idf, "wb"); + + if(writer == NULL) return fails; + + /* Create and initialize the png_struct with the desired error handler + * functions. If you want to use the default stderr and longjump method, + * you can supply NULL for the last three parameters. We also check that + * the library version is compatible with the one used at compile time, + * in case we are using dynamically linked libraries. REQUIRED. + */ + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + /*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */ + + if(png == NULL) goto fin; + + /* Allocate/initialize the image information data. REQUIRED + */ + info = png_create_info_struct(png); + + if(info == NULL) goto fin; + + /* Set error handling. REQUIRED if you are not supplying your own + * error handling functions in the png_create_write_struct() call. + */ + if(setjmp(png_jmpbuf(png))) goto fin; + + /* I/O initialization functions is REQUIRED + */ + png_init_io(png, writer); + + /* Set the image information here. Width and height are up to 2^31, + * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on + * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, + * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, + * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or + * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST + * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. + * REQUIRED + * + * ERRORS: + * + * color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8 + * color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8 + * color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8 + * color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8 + * + */ + png_set_compression_level(png, Z_BEST_COMPRESSION); + + if(nr_comp >= 3) { /* RGB(A) */ + color_type = PNG_COLOR_TYPE_RGB; + sig_bit.red = sig_bit.green = sig_bit.blue = (png_byte)prec; + } else { /* GRAY(A) */ + color_type = PNG_COLOR_TYPE_GRAY; + sig_bit.gray = (png_byte)prec; + } + if((nr_comp & 1) == 0) { /* ALPHA */ + color_type |= PNG_COLOR_MASK_ALPHA; + sig_bit.alpha = (png_byte)prec; + } + + png_set_IHDR(png, info, image->comps[0].w, image->comps[0].h, prec, color_type, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_set_sBIT(png, info, &sig_bit); + /* png_set_gamma(png, 2.2, 1./2.2); */ + /* png_set_sRGB(png, info, PNG_sRGB_INTENT_PERCEPTUAL); */ + png_write_info(png, info); + + /* setup conversion */ + { + OPJ_SIZE_T rowStride; + png_size_t png_row_size; + + png_row_size = png_get_rowbytes(png, info); + rowStride = ((OPJ_SIZE_T)image->comps[0].w * (OPJ_SIZE_T)nr_comp * (OPJ_SIZE_T)prec + 7U) / 8U; + if (rowStride != (OPJ_SIZE_T)png_row_size) { + fprintf(stderr, "Invalid PNG row size\n"); + goto fin; + } + row_buf = (png_bytep)malloc(png_row_size); + if (row_buf == NULL) { + fprintf(stderr, "Can't allocate memory for PNG row\n"); + goto fin; + } + buffer32s = (OPJ_INT32*)malloc((OPJ_SIZE_T)image->comps[0].w * (OPJ_SIZE_T)nr_comp * sizeof(OPJ_INT32)); + if (buffer32s == NULL) { + fprintf(stderr, "Can't allocate memory for interleaved 32s row\n"); + goto fin; + } + } + + /* convert */ + { + OPJ_SIZE_T width= image->comps[0].w; + OPJ_UINT32 y; + convert_32s_PXCX cvtPxToCx = convert_32s_PXCX_LUT[nr_comp]; + convert_32sXXx_C1R cvt32sToPack = NULL; + OPJ_INT32 adjust = image->comps[0].sgnd ? 1 << (prec - 1) : 0; + png_bytep row_buf_cpy = row_buf; + OPJ_INT32* buffer32s_cpy = buffer32s; + + switch (prec) { + case 1: + case 2: + case 4: + case 8: + cvt32sToPack = convert_32sXXu_C1R_LUT[prec]; + break; + case 16: + cvt32sToPack = convert_32s16u_C1R; + break; + default: + /* never here */ + break; + } + + for(y = 0; y < image->comps[0].h; ++y) { + cvtPxToCx(planes, buffer32s_cpy, width, adjust); + cvt32sToPack(buffer32s_cpy, row_buf_cpy, width * (OPJ_SIZE_T)nr_comp); + png_write_row(png, row_buf_cpy); + planes[0] += width; + planes[1] += width; + planes[2] += width; + planes[3] += width; + } + } + + png_write_end(png, info); + + fails = 0; + fin: - if(png) { - png_destroy_write_struct(&png, &info); - } - if(row_buf) { - free(row_buf); - } - if(buffer32s) { - free(buffer32s); - } - fclose(writer); - - if(fails) (void)remove(write_idf); /* ignore return value */ - - return fails; + if(png) { + png_destroy_write_struct(&png, &info); + } + if(row_buf) { + free(row_buf); + } + if(buffer32s) { + free(buffer32s); + } + fclose(writer); + + if(fails) (void)remove(write_idf); /* ignore return value */ + + return fails; }/* imagetopng() */ diff --git a/src/bin/jp2/converttif.c b/src/bin/jp2/converttif.c index dbda0741..907b93a5 100644 --- a/src/bin/jp2/converttif.c +++ b/src/bin/jp2/converttif.c @@ -52,360 +52,357 @@ #include "convert.h" /* -->> -->> -->> -->> - + TIFF IMAGE FORMAT - + <<-- <<-- <<-- <<-- */ static void tif_32sto10u(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; - OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; - - *pDst++ = (OPJ_BYTE)(src0 >> 2); - *pDst++ = (OPJ_BYTE)(((src0 & 0x3U) << 6) | (src1 >> 4)); - *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 6)); - *pDst++ = (OPJ_BYTE)(((src2 & 0x3FU) << 2) | (src3 >> 8)); - *pDst++ = (OPJ_BYTE)(src3); - } - - if (length & 3U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = 0U; - OPJ_UINT32 src2 = 0U; - length = length & 3U; - - if (length > 1U) { - src1 = (OPJ_UINT32)pSrc[i+1]; - if (length > 2U) { - src2 = (OPJ_UINT32)pSrc[i+2]; - } - } - *pDst++ = (OPJ_BYTE)(src0 >> 2); - *pDst++ = (OPJ_BYTE)(((src0 & 0x3U) << 6) | (src1 >> 4)); - if (length > 1U) { - *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 6)); - if (length > 2U) { - *pDst++ = (OPJ_BYTE)(((src2 & 0x3FU) << 2)); - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; + OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; + + *pDst++ = (OPJ_BYTE)(src0 >> 2); + *pDst++ = (OPJ_BYTE)(((src0 & 0x3U) << 6) | (src1 >> 4)); + *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 6)); + *pDst++ = (OPJ_BYTE)(((src2 & 0x3FU) << 2) | (src3 >> 8)); + *pDst++ = (OPJ_BYTE)(src3); + } + + if (length & 3U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = 0U; + OPJ_UINT32 src2 = 0U; + length = length & 3U; + + if (length > 1U) { + src1 = (OPJ_UINT32)pSrc[i+1]; + if (length > 2U) { + src2 = (OPJ_UINT32)pSrc[i+2]; + } + } + *pDst++ = (OPJ_BYTE)(src0 >> 2); + *pDst++ = (OPJ_BYTE)(((src0 & 0x3U) << 6) | (src1 >> 4)); + if (length > 1U) { + *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 6)); + if (length > 2U) { + *pDst++ = (OPJ_BYTE)(((src2 & 0x3FU) << 2)); + } + } + } } static void tif_32sto12u(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - - *pDst++ = (OPJ_BYTE)(src0 >> 4); - *pDst++ = (OPJ_BYTE)(((src0 & 0xFU) << 4) | (src1 >> 8)); - *pDst++ = (OPJ_BYTE)(src1); - } - - if (length & 1U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - *pDst++ = (OPJ_BYTE)(src0 >> 4); - *pDst++ = (OPJ_BYTE)(((src0 & 0xFU) << 4)); - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + + *pDst++ = (OPJ_BYTE)(src0 >> 4); + *pDst++ = (OPJ_BYTE)(((src0 & 0xFU) << 4) | (src1 >> 8)); + *pDst++ = (OPJ_BYTE)(src1); + } + + if (length & 1U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + *pDst++ = (OPJ_BYTE)(src0 >> 4); + *pDst++ = (OPJ_BYTE)(((src0 & 0xFU) << 4)); + } } static void tif_32sto14u(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; - OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; - OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; - - *pDst++ = (OPJ_BYTE)(src0 >> 6); - *pDst++ = (OPJ_BYTE)(((src0 & 0x3FU) << 2) | (src1 >> 12)); - *pDst++ = (OPJ_BYTE)(src1 >> 4); - *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 10)); - *pDst++ = (OPJ_BYTE)(src2 >> 2); - *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6) | (src3 >> 8)); - *pDst++ = (OPJ_BYTE)(src3); - } - - if (length & 3U) { - OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; - OPJ_UINT32 src1 = 0U; - OPJ_UINT32 src2 = 0U; - length = length & 3U; - - if (length > 1U) { - src1 = (OPJ_UINT32)pSrc[i+1]; - if (length > 2U) { - src2 = (OPJ_UINT32)pSrc[i+2]; - } - } - *pDst++ = (OPJ_BYTE)(src0 >> 6); - *pDst++ = (OPJ_BYTE)(((src0 & 0x3FU) << 2) | (src1 >> 12)); - if (length > 1U) { - *pDst++ = (OPJ_BYTE)(src1 >> 4); - *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 10)); - if (length > 2U) { - *pDst++ = (OPJ_BYTE)(src2 >> 2); - *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6)); - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = (OPJ_UINT32)pSrc[i+1]; + OPJ_UINT32 src2 = (OPJ_UINT32)pSrc[i+2]; + OPJ_UINT32 src3 = (OPJ_UINT32)pSrc[i+3]; + + *pDst++ = (OPJ_BYTE)(src0 >> 6); + *pDst++ = (OPJ_BYTE)(((src0 & 0x3FU) << 2) | (src1 >> 12)); + *pDst++ = (OPJ_BYTE)(src1 >> 4); + *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 10)); + *pDst++ = (OPJ_BYTE)(src2 >> 2); + *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6) | (src3 >> 8)); + *pDst++ = (OPJ_BYTE)(src3); + } + + if (length & 3U) { + OPJ_UINT32 src0 = (OPJ_UINT32)pSrc[i+0]; + OPJ_UINT32 src1 = 0U; + OPJ_UINT32 src2 = 0U; + length = length & 3U; + + if (length > 1U) { + src1 = (OPJ_UINT32)pSrc[i+1]; + if (length > 2U) { + src2 = (OPJ_UINT32)pSrc[i+2]; + } + } + *pDst++ = (OPJ_BYTE)(src0 >> 6); + *pDst++ = (OPJ_BYTE)(((src0 & 0x3FU) << 2) | (src1 >> 12)); + if (length > 1U) { + *pDst++ = (OPJ_BYTE)(src1 >> 4); + *pDst++ = (OPJ_BYTE)(((src1 & 0xFU) << 4) | (src2 >> 10)); + if (length > 2U) { + *pDst++ = (OPJ_BYTE)(src2 >> 2); + *pDst++ = (OPJ_BYTE)(((src2 & 0x3U) << 6)); + } + } + } } static void tif_32sto16u(const OPJ_INT32* pSrc, OPJ_UINT16* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < length; ++i) { - pDst[i] = (OPJ_UINT16)pSrc[i]; - } + OPJ_SIZE_T i; + for (i = 0; i < length; ++i) { + pDst[i] = (OPJ_UINT16)pSrc[i]; + } } int imagetotif(opj_image_t * image, const char *outfile) { - int width, height; - int bps,adjust, sgnd; - int tiPhoto; - TIFF *tif; - tdata_t buf; - tsize_t strip_size; - OPJ_UINT32 i, numcomps; - OPJ_SIZE_T rowStride; - OPJ_INT32* buffer32s = NULL; - OPJ_INT32 const* planes[4]; - convert_32s_PXCX cvtPxToCx = NULL; - convert_32sXXx_C1R cvt32sToTif = NULL; - - bps = (int)image->comps[0].prec; - planes[0] = image->comps[0].data; - - numcomps = image->numcomps; - - if (image->color_space == OPJ_CLRSPC_CMYK) { - if (numcomps < 4U) { - fprintf(stderr,"imagetotif: CMYK images shall be composed of at least 4 planes.\n"); - fprintf(stderr,"\tAborting\n"); - return 1; - } - tiPhoto = PHOTOMETRIC_SEPARATED; - if (numcomps > 4U) { - numcomps = 4U; /* Alpha not supported */ - } - } - else if (numcomps > 2U) { - tiPhoto = PHOTOMETRIC_RGB; - if (numcomps > 4U) { - numcomps = 4U; - } - } else { - tiPhoto = PHOTOMETRIC_MINISBLACK; - } - for (i = 1U; i < numcomps; ++i) { - if (image->comps[0].dx != image->comps[i].dx) { - break; - } - if (image->comps[0].dy != image->comps[i].dy) { - break; - } - if (image->comps[0].prec != image->comps[i].prec) { - break; - } - if (image->comps[0].sgnd != image->comps[i].sgnd) { - break; - } - planes[i] = image->comps[i].data; - } - if (i != numcomps) { - fprintf(stderr,"imagetotif: All components shall have the same subsampling, same bit depth.\n"); - fprintf(stderr,"\tAborting\n"); - return 1; - } - - if((bps > 16) || ((bps != 1) && (bps & 1))) bps = 0; - if(bps == 0) - { - fprintf(stderr,"imagetotif: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",bps); - fprintf(stderr,"\tAborting\n"); - return 1; - } - tif = TIFFOpen(outfile, "wb"); - if (!tif) - { - fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile); - return 1; - } - for (i = 0U; i < numcomps; ++i) { - clip_component(&(image->comps[i]), image->comps[0].prec); - } - cvtPxToCx = convert_32s_PXCX_LUT[numcomps]; - switch (bps) { - case 1: - case 2: - case 4: - case 6: - case 8: - cvt32sToTif = convert_32sXXu_C1R_LUT[bps]; - break; - case 10: - cvt32sToTif = tif_32sto10u; - break; - case 12: - cvt32sToTif = tif_32sto12u; - break; - case 14: - cvt32sToTif = tif_32sto14u; - break; - case 16: - cvt32sToTif = (convert_32sXXx_C1R)tif_32sto16u; - break; - default: - /* never here */ - break; - } - sgnd = (int)image->comps[0].sgnd; - adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; - width = (int)image->comps[0].w; - height = (int)image->comps[0].h; - - TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, numcomps); - TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto); - TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); - - strip_size = TIFFStripSize(tif); - rowStride = ((OPJ_SIZE_T)width * numcomps * (OPJ_SIZE_T)bps + 7U) / 8U; - if (rowStride != (OPJ_SIZE_T)strip_size) { - fprintf(stderr, "Invalid TIFF strip size\n"); - TIFFClose(tif); - return 1; - } - buf = _TIFFmalloc(strip_size); - if (buf == NULL) { - TIFFClose(tif); - return 1; - } - buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)width * numcomps * sizeof(OPJ_INT32)); - if (buffer32s == NULL) { - _TIFFfree(buf); - TIFFClose(tif); - return 1; - } - - for (i = 0; i < image->comps[0].h; ++i) { - cvtPxToCx(planes, buffer32s, (OPJ_SIZE_T)width, adjust); - cvt32sToTif(buffer32s, (OPJ_BYTE *)buf, (OPJ_SIZE_T)width * numcomps); - (void)TIFFWriteEncodedStrip(tif, i, (void*)buf, strip_size); - planes[0] += width; - planes[1] += width; - planes[2] += width; - planes[3] += width; - } - _TIFFfree((void*)buf); - TIFFClose(tif); - free(buffer32s); - - return 0; + int width, height; + int bps,adjust, sgnd; + int tiPhoto; + TIFF *tif; + tdata_t buf; + tsize_t strip_size; + OPJ_UINT32 i, numcomps; + OPJ_SIZE_T rowStride; + OPJ_INT32* buffer32s = NULL; + OPJ_INT32 const* planes[4]; + convert_32s_PXCX cvtPxToCx = NULL; + convert_32sXXx_C1R cvt32sToTif = NULL; + + bps = (int)image->comps[0].prec; + planes[0] = image->comps[0].data; + + numcomps = image->numcomps; + + if (image->color_space == OPJ_CLRSPC_CMYK) { + if (numcomps < 4U) { + fprintf(stderr,"imagetotif: CMYK images shall be composed of at least 4 planes.\n"); + fprintf(stderr,"\tAborting\n"); + return 1; + } + tiPhoto = PHOTOMETRIC_SEPARATED; + if (numcomps > 4U) { + numcomps = 4U; /* Alpha not supported */ + } + } else if (numcomps > 2U) { + tiPhoto = PHOTOMETRIC_RGB; + if (numcomps > 4U) { + numcomps = 4U; + } + } else { + tiPhoto = PHOTOMETRIC_MINISBLACK; + } + for (i = 1U; i < numcomps; ++i) { + if (image->comps[0].dx != image->comps[i].dx) { + break; + } + if (image->comps[0].dy != image->comps[i].dy) { + break; + } + if (image->comps[0].prec != image->comps[i].prec) { + break; + } + if (image->comps[0].sgnd != image->comps[i].sgnd) { + break; + } + planes[i] = image->comps[i].data; + } + if (i != numcomps) { + fprintf(stderr,"imagetotif: All components shall have the same subsampling, same bit depth.\n"); + fprintf(stderr,"\tAborting\n"); + return 1; + } + + if((bps > 16) || ((bps != 1) && (bps & 1))) bps = 0; + if(bps == 0) { + fprintf(stderr,"imagetotif: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",bps); + fprintf(stderr,"\tAborting\n"); + return 1; + } + tif = TIFFOpen(outfile, "wb"); + if (!tif) { + fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile); + return 1; + } + for (i = 0U; i < numcomps; ++i) { + clip_component(&(image->comps[i]), image->comps[0].prec); + } + cvtPxToCx = convert_32s_PXCX_LUT[numcomps]; + switch (bps) { + case 1: + case 2: + case 4: + case 6: + case 8: + cvt32sToTif = convert_32sXXu_C1R_LUT[bps]; + break; + case 10: + cvt32sToTif = tif_32sto10u; + break; + case 12: + cvt32sToTif = tif_32sto12u; + break; + case 14: + cvt32sToTif = tif_32sto14u; + break; + case 16: + cvt32sToTif = (convert_32sXXx_C1R)tif_32sto16u; + break; + default: + /* never here */ + break; + } + sgnd = (int)image->comps[0].sgnd; + adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; + width = (int)image->comps[0].w; + height = (int)image->comps[0].h; + + TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, numcomps); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto); + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); + + strip_size = TIFFStripSize(tif); + rowStride = ((OPJ_SIZE_T)width * numcomps * (OPJ_SIZE_T)bps + 7U) / 8U; + if (rowStride != (OPJ_SIZE_T)strip_size) { + fprintf(stderr, "Invalid TIFF strip size\n"); + TIFFClose(tif); + return 1; + } + buf = _TIFFmalloc(strip_size); + if (buf == NULL) { + TIFFClose(tif); + return 1; + } + buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)width * numcomps * sizeof(OPJ_INT32)); + if (buffer32s == NULL) { + _TIFFfree(buf); + TIFFClose(tif); + return 1; + } + + for (i = 0; i < image->comps[0].h; ++i) { + cvtPxToCx(planes, buffer32s, (OPJ_SIZE_T)width, adjust); + cvt32sToTif(buffer32s, (OPJ_BYTE *)buf, (OPJ_SIZE_T)width * numcomps); + (void)TIFFWriteEncodedStrip(tif, i, (void*)buf, strip_size); + planes[0] += width; + planes[1] += width; + planes[2] += width; + planes[3] += width; + } + _TIFFfree((void*)buf); + TIFFClose(tif); + free(buffer32s); + + return 0; }/* imagetotif() */ static void tif_10uto32s(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - OPJ_UINT32 val2 = *pSrc++; - OPJ_UINT32 val3 = *pSrc++; - OPJ_UINT32 val4 = *pSrc++; - - pDst[i+0] = (OPJ_INT32)((val0 << 2) | (val1 >> 6)); - pDst[i+1] = (OPJ_INT32)(((val1 & 0x3FU) << 4) | (val2 >> 4)); - pDst[i+2] = (OPJ_INT32)(((val2 & 0xFU) << 6) | (val3 >> 2)); - pDst[i+3] = (OPJ_INT32)(((val3 & 0x3U) << 8) | val4); - - } - if (length & 3U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - length = length & 3U; - pDst[i+0] = (OPJ_INT32)((val0 << 2) | (val1 >> 6)); - - if (length > 1U) { - OPJ_UINT32 val2 = *pSrc++; - pDst[i+1] = (OPJ_INT32)(((val1 & 0x3FU) << 4) | (val2 >> 4)); - if (length > 2U) { - OPJ_UINT32 val3 = *pSrc++; - pDst[i+2] = (OPJ_INT32)(((val2 & 0xFU) << 6) | (val3 >> 2)); - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + OPJ_UINT32 val2 = *pSrc++; + OPJ_UINT32 val3 = *pSrc++; + OPJ_UINT32 val4 = *pSrc++; + + pDst[i+0] = (OPJ_INT32)((val0 << 2) | (val1 >> 6)); + pDst[i+1] = (OPJ_INT32)(((val1 & 0x3FU) << 4) | (val2 >> 4)); + pDst[i+2] = (OPJ_INT32)(((val2 & 0xFU) << 6) | (val3 >> 2)); + pDst[i+3] = (OPJ_INT32)(((val3 & 0x3U) << 8) | val4); + + } + if (length & 3U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + length = length & 3U; + pDst[i+0] = (OPJ_INT32)((val0 << 2) | (val1 >> 6)); + + if (length > 1U) { + OPJ_UINT32 val2 = *pSrc++; + pDst[i+1] = (OPJ_INT32)(((val1 & 0x3FU) << 4) | (val2 >> 4)); + if (length > 2U) { + OPJ_UINT32 val3 = *pSrc++; + pDst[i+2] = (OPJ_INT32)(((val2 & 0xFU) << 6) | (val3 >> 2)); + } + } + } } static void tif_12uto32s(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - OPJ_UINT32 val2 = *pSrc++; - - pDst[i+0] = (OPJ_INT32)((val0 << 4) | (val1 >> 4)); - pDst[i+1] = (OPJ_INT32)(((val1 & 0xFU) << 8) | val2); - } - if (length & 1U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - pDst[i+0] = (OPJ_INT32)((val0 << 4) | (val1 >> 4)); - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)1U); i+=2U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + OPJ_UINT32 val2 = *pSrc++; + + pDst[i+0] = (OPJ_INT32)((val0 << 4) | (val1 >> 4)); + pDst[i+1] = (OPJ_INT32)(((val1 & 0xFU) << 8) | val2); + } + if (length & 1U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + pDst[i+0] = (OPJ_INT32)((val0 << 4) | (val1 >> 4)); + } } static void tif_14uto32s(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - OPJ_UINT32 val2 = *pSrc++; - OPJ_UINT32 val3 = *pSrc++; - OPJ_UINT32 val4 = *pSrc++; - OPJ_UINT32 val5 = *pSrc++; - OPJ_UINT32 val6 = *pSrc++; - - pDst[i+0] = (OPJ_INT32)((val0 << 6) | (val1 >> 2)); - pDst[i+1] = (OPJ_INT32)(((val1 & 0x3U) << 12) | (val2 << 4) | (val3 >> 4)); - pDst[i+2] = (OPJ_INT32)(((val3 & 0xFU) << 10) | (val4 << 2) | (val5 >> 6)); - pDst[i+3] = (OPJ_INT32)(((val5 & 0x3FU) << 8) | val6); - - } - if (length & 3U) { - OPJ_UINT32 val0 = *pSrc++; - OPJ_UINT32 val1 = *pSrc++; - length = length & 3U; - pDst[i+0] = (OPJ_INT32)((val0 << 6) | (val1 >> 2)); - - if (length > 1U) { - OPJ_UINT32 val2 = *pSrc++; - OPJ_UINT32 val3 = *pSrc++; - pDst[i+1] = (OPJ_INT32)(((val1 & 0x3U) << 12) | (val2 << 4) | (val3 >> 4)); - if (length > 2U) { - OPJ_UINT32 val4 = *pSrc++; - OPJ_UINT32 val5 = *pSrc++; - pDst[i+2] = (OPJ_INT32)(((val3 & 0xFU) << 10) | (val4 << 2) | (val5 >> 6)); - } - } - } + OPJ_SIZE_T i; + for (i = 0; i < (length & ~(OPJ_SIZE_T)3U); i+=4U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + OPJ_UINT32 val2 = *pSrc++; + OPJ_UINT32 val3 = *pSrc++; + OPJ_UINT32 val4 = *pSrc++; + OPJ_UINT32 val5 = *pSrc++; + OPJ_UINT32 val6 = *pSrc++; + + pDst[i+0] = (OPJ_INT32)((val0 << 6) | (val1 >> 2)); + pDst[i+1] = (OPJ_INT32)(((val1 & 0x3U) << 12) | (val2 << 4) | (val3 >> 4)); + pDst[i+2] = (OPJ_INT32)(((val3 & 0xFU) << 10) | (val4 << 2) | (val5 >> 6)); + pDst[i+3] = (OPJ_INT32)(((val5 & 0x3FU) << 8) | val6); + + } + if (length & 3U) { + OPJ_UINT32 val0 = *pSrc++; + OPJ_UINT32 val1 = *pSrc++; + length = length & 3U; + pDst[i+0] = (OPJ_INT32)((val0 << 6) | (val1 >> 2)); + + if (length > 1U) { + OPJ_UINT32 val2 = *pSrc++; + OPJ_UINT32 val3 = *pSrc++; + pDst[i+1] = (OPJ_INT32)(((val1 & 0x3U) << 12) | (val2 << 4) | (val3 >> 4)); + if (length > 2U) { + OPJ_UINT32 val4 = *pSrc++; + OPJ_UINT32 val5 = *pSrc++; + pDst[i+2] = (OPJ_INT32)(((val3 & 0xFU) << 10) | (val4 << 2) | (val5 >> 6)); + } + } + } } /* seems that libtiff decodes this to machine endianness */ static void tif_16uto32s(const OPJ_UINT16* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length) { - OPJ_SIZE_T i; - for (i = 0; i < length; i++) { - pDst[i] = pSrc[i]; - } + OPJ_SIZE_T i; + for (i = 0; i < length; i++) { + pDst[i] = pSrc[i]; + } } /* @@ -414,231 +411,219 @@ static void tif_16uto32s(const OPJ_UINT16* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T len */ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - TIFF *tif; - tdata_t buf; - tstrip_t strip; - tsize_t strip_size; - int j, currentPlane, numcomps = 0, w, h; - OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_UNKNOWN; - opj_image_cmptparm_t cmptparm[4]; /* RGBA */ - opj_image_t *image = NULL; - int has_alpha = 0; - unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; - unsigned int tiWidth, tiHeight; - OPJ_BOOL is_cinema = OPJ_IS_CINEMA(parameters->rsiz); - convert_XXx32s_C1R cvtTifTo32s = NULL; - convert_32s_CXPX cvtCxToPx = NULL; - OPJ_INT32* buffer32s = NULL; - OPJ_INT32* planes[4]; - OPJ_SIZE_T rowStride; - - tif = TIFFOpen(filename, "r"); - - if(!tif) - { - fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename); - return 0; - } - tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0; - tiWidth = tiHeight = 0; - - TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth); - TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight); - TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps); - TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf); - TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); - TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); - TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); - w= (int)tiWidth; - h= (int)tiHeight; - - if((tiBps > 16U) || ((tiBps != 1U) && (tiBps & 1U))) { - fprintf(stderr,"tiftoimage: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",tiBps); - fprintf(stderr,"\tAborting\n"); - TIFFClose(tif); - return NULL; - } - if(tiPhoto != PHOTOMETRIC_MINISBLACK && tiPhoto != PHOTOMETRIC_RGB) { - fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A) and GRAY(A) has been implemented\n",(int) tiPhoto); - fprintf(stderr,"\tAborting\n"); - TIFFClose(tif); - return NULL; - } - - switch (tiBps) { - case 1: - case 2: - case 4: - case 6: - case 8: - cvtTifTo32s = convert_XXu32s_C1R_LUT[tiBps]; - break; - /* others are specific to TIFF */ - case 10: - cvtTifTo32s = tif_10uto32s; - break; - case 12: - cvtTifTo32s = tif_12uto32s; - break; - case 14: - cvtTifTo32s = tif_14uto32s; - break; - case 16: - cvtTifTo32s = (convert_XXx32s_C1R)tif_16uto32s; - break; - default: - /* never here */ - break; - } - - {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */ - uint16* sampleinfo; - uint16 extrasamples; - - TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, - &extrasamples, &sampleinfo); - - if(extrasamples >= 1) - { - switch(sampleinfo[0]) - { - case EXTRASAMPLE_UNSPECIFIED: - /* Workaround for some images without correct info about alpha channel - */ - if(tiSpp > 3) - has_alpha = 1; - break; - - case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */ - case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */ - has_alpha = 1; - break; - } - } - else /* extrasamples == 0 */ - if(tiSpp == 4 || tiSpp == 2) has_alpha = 1; - } - - /* initialize image components */ - memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); - - if ((tiPhoto == PHOTOMETRIC_RGB) && (is_cinema) && (tiBps != 12U)) { - fprintf(stdout,"WARNING:\n" - "Input image bitdepth is %d bits\n" - "TIF conversion has automatically rescaled to 12-bits\n" - "to comply with cinema profiles.\n", - tiBps); - } else { - is_cinema = 0U; - } - - if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */ - { - numcomps = 3 + has_alpha; - color_space = OPJ_CLRSPC_SRGB; - } - else if (tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */ - { - numcomps = 1 + has_alpha; - color_space = OPJ_CLRSPC_GRAY; - } - - cvtCxToPx = convert_32s_CXPX_LUT[numcomps]; - if (tiPC == PLANARCONFIG_SEPARATE) { - cvtCxToPx = convert_32s_CXPX_LUT[1]; /* override */ - tiSpp = 1U; /* consider only one sample per plane */ - } - - for(j = 0; j < numcomps; j++) - { - cmptparm[j].prec = tiBps; - cmptparm[j].bpp = tiBps; - cmptparm[j].dx = (OPJ_UINT32)subsampling_dx; - cmptparm[j].dy = (OPJ_UINT32)subsampling_dy; - cmptparm[j].w = (OPJ_UINT32)w; - cmptparm[j].h = (OPJ_UINT32)h; - } - - image = opj_image_create((OPJ_UINT32)numcomps, &cmptparm[0], color_space); - if(!image) - { - TIFFClose(tif); - return NULL; - } - /* set image offset and reference grid */ - image->x0 = (OPJ_UINT32)parameters->image_offset_x0; - image->y0 = (OPJ_UINT32)parameters->image_offset_y0; - image->x1 = !image->x0 ? (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1 : - image->x0 + (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1; - image->y1 = !image->y0 ? (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1 : - image->y0 + (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1; - - for(j = 0; j < numcomps; j++) - { - planes[j] = image->comps[j].data; - } - image->comps[numcomps - 1].alpha = (OPJ_UINT16)(1 - (numcomps & 1)); - - strip_size = TIFFStripSize(tif); - - buf = _TIFFmalloc(strip_size); - if (buf == NULL) { - TIFFClose(tif); - opj_image_destroy(image); - return NULL; - } - rowStride = ((OPJ_SIZE_T)w * tiSpp * tiBps + 7U) / 8U; - buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)w * tiSpp * sizeof(OPJ_INT32)); - if (buffer32s == NULL) { - _TIFFfree(buf); - TIFFClose(tif); - opj_image_destroy(image); - return NULL; - } - - strip = 0; - currentPlane = 0; - do - { - planes[0] = image->comps[currentPlane].data; /* to manage planar data */ - h= (int)tiHeight; - /* Read the Image components */ - for(; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++) - { - const OPJ_UINT8 *dat8; - OPJ_SIZE_T ssize; - - ssize = (OPJ_SIZE_T)TIFFReadEncodedStrip(tif, strip, buf, strip_size); - dat8 = (const OPJ_UINT8*)buf; - - while (ssize >= rowStride) { - cvtTifTo32s(dat8, buffer32s, (OPJ_SIZE_T)w * tiSpp); - cvtCxToPx(buffer32s, planes, (OPJ_SIZE_T)w); - planes[0] += w; - planes[1] += w; - planes[2] += w; - planes[3] += w; - dat8 += rowStride; - ssize -= rowStride; - h--; - } - } - currentPlane++; - } while ((tiPC == PLANARCONFIG_SEPARATE) && (currentPlane < numcomps)); - - free(buffer32s); - _TIFFfree(buf); - TIFFClose(tif); - - if (is_cinema) { - for (j=0; j < numcomps; ++j) { - scale_component(&(image->comps[j]), 12); - } - - } - return image; + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + TIFF *tif; + tdata_t buf; + tstrip_t strip; + tsize_t strip_size; + int j, currentPlane, numcomps = 0, w, h; + OPJ_COLOR_SPACE color_space = OPJ_CLRSPC_UNKNOWN; + opj_image_cmptparm_t cmptparm[4]; /* RGBA */ + opj_image_t *image = NULL; + int has_alpha = 0; + unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; + unsigned int tiWidth, tiHeight; + OPJ_BOOL is_cinema = OPJ_IS_CINEMA(parameters->rsiz); + convert_XXx32s_C1R cvtTifTo32s = NULL; + convert_32s_CXPX cvtCxToPx = NULL; + OPJ_INT32* buffer32s = NULL; + OPJ_INT32* planes[4]; + OPJ_SIZE_T rowStride; + + tif = TIFFOpen(filename, "r"); + + if(!tif) { + fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename); + return 0; + } + tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0; + tiWidth = tiHeight = 0; + + TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth); + TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight); + TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps); + TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf); + TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); + TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); + TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); + w= (int)tiWidth; + h= (int)tiHeight; + + if((tiBps > 16U) || ((tiBps != 1U) && (tiBps & 1U))) { + fprintf(stderr,"tiftoimage: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",tiBps); + fprintf(stderr,"\tAborting\n"); + TIFFClose(tif); + return NULL; + } + if(tiPhoto != PHOTOMETRIC_MINISBLACK && tiPhoto != PHOTOMETRIC_RGB) { + fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A) and GRAY(A) has been implemented\n",(int) tiPhoto); + fprintf(stderr,"\tAborting\n"); + TIFFClose(tif); + return NULL; + } + + switch (tiBps) { + case 1: + case 2: + case 4: + case 6: + case 8: + cvtTifTo32s = convert_XXu32s_C1R_LUT[tiBps]; + break; + /* others are specific to TIFF */ + case 10: + cvtTifTo32s = tif_10uto32s; + break; + case 12: + cvtTifTo32s = tif_12uto32s; + break; + case 14: + cvtTifTo32s = tif_14uto32s; + break; + case 16: + cvtTifTo32s = (convert_XXx32s_C1R)tif_16uto32s; + break; + default: + /* never here */ + break; + } + + {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */ + uint16* sampleinfo; + uint16 extrasamples; + + TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, + &extrasamples, &sampleinfo); + + if(extrasamples >= 1) { + switch(sampleinfo[0]) { + case EXTRASAMPLE_UNSPECIFIED: + /* Workaround for some images without correct info about alpha channel + */ + if(tiSpp > 3) + has_alpha = 1; + break; + + case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */ + case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */ + has_alpha = 1; + break; + } + } else /* extrasamples == 0 */ + if(tiSpp == 4 || tiSpp == 2) has_alpha = 1; + } + + /* initialize image components */ + memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); + + if ((tiPhoto == PHOTOMETRIC_RGB) && (is_cinema) && (tiBps != 12U)) { + fprintf(stdout,"WARNING:\n" + "Input image bitdepth is %d bits\n" + "TIF conversion has automatically rescaled to 12-bits\n" + "to comply with cinema profiles.\n", + tiBps); + } else { + is_cinema = 0U; + } + + if(tiPhoto == PHOTOMETRIC_RGB) { /* RGB(A) */ + numcomps = 3 + has_alpha; + color_space = OPJ_CLRSPC_SRGB; + } else if (tiPhoto == PHOTOMETRIC_MINISBLACK) { /* GRAY(A) */ + numcomps = 1 + has_alpha; + color_space = OPJ_CLRSPC_GRAY; + } + + cvtCxToPx = convert_32s_CXPX_LUT[numcomps]; + if (tiPC == PLANARCONFIG_SEPARATE) { + cvtCxToPx = convert_32s_CXPX_LUT[1]; /* override */ + tiSpp = 1U; /* consider only one sample per plane */ + } + + for(j = 0; j < numcomps; j++) { + cmptparm[j].prec = tiBps; + cmptparm[j].bpp = tiBps; + cmptparm[j].dx = (OPJ_UINT32)subsampling_dx; + cmptparm[j].dy = (OPJ_UINT32)subsampling_dy; + cmptparm[j].w = (OPJ_UINT32)w; + cmptparm[j].h = (OPJ_UINT32)h; + } + + image = opj_image_create((OPJ_UINT32)numcomps, &cmptparm[0], color_space); + if(!image) { + TIFFClose(tif); + return NULL; + } + /* set image offset and reference grid */ + image->x0 = (OPJ_UINT32)parameters->image_offset_x0; + image->y0 = (OPJ_UINT32)parameters->image_offset_y0; + image->x1 = !image->x0 ? (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1 : + image->x0 + (OPJ_UINT32)(w - 1) * (OPJ_UINT32)subsampling_dx + 1; + image->y1 = !image->y0 ? (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1 : + image->y0 + (OPJ_UINT32)(h - 1) * (OPJ_UINT32)subsampling_dy + 1; + + for(j = 0; j < numcomps; j++) { + planes[j] = image->comps[j].data; + } + image->comps[numcomps - 1].alpha = (OPJ_UINT16)(1 - (numcomps & 1)); + + strip_size = TIFFStripSize(tif); + + buf = _TIFFmalloc(strip_size); + if (buf == NULL) { + TIFFClose(tif); + opj_image_destroy(image); + return NULL; + } + rowStride = ((OPJ_SIZE_T)w * tiSpp * tiBps + 7U) / 8U; + buffer32s = (OPJ_INT32 *)malloc((OPJ_SIZE_T)w * tiSpp * sizeof(OPJ_INT32)); + if (buffer32s == NULL) { + _TIFFfree(buf); + TIFFClose(tif); + opj_image_destroy(image); + return NULL; + } + + strip = 0; + currentPlane = 0; + do { + planes[0] = image->comps[currentPlane].data; /* to manage planar data */ + h= (int)tiHeight; + /* Read the Image components */ + for(; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++) { + const OPJ_UINT8 *dat8; + OPJ_SIZE_T ssize; + + ssize = (OPJ_SIZE_T)TIFFReadEncodedStrip(tif, strip, buf, strip_size); + dat8 = (const OPJ_UINT8*)buf; + + while (ssize >= rowStride) { + cvtTifTo32s(dat8, buffer32s, (OPJ_SIZE_T)w * tiSpp); + cvtCxToPx(buffer32s, planes, (OPJ_SIZE_T)w); + planes[0] += w; + planes[1] += w; + planes[2] += w; + planes[3] += w; + dat8 += rowStride; + ssize -= rowStride; + h--; + } + } + currentPlane++; + } while ((tiPC == PLANARCONFIG_SEPARATE) && (currentPlane < numcomps)); + + free(buffer32s); + _TIFFfree(buf); + TIFFClose(tif); + + if (is_cinema) { + for (j=0; j < numcomps; ++j) { + scale_component(&(image->comps[j]), 12); + } + + } + return image; }/* tiftoimage() */ diff --git a/src/bin/jp2/index.c b/src/bin/jp2/index.c index af6e1381..65acbf5b 100644 --- a/src/bin/jp2/index.c +++ b/src/bin/jp2/index.c @@ -1,12 +1,12 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,356 +42,357 @@ /** Write a structured index to a file -@param cstr_info Codestream information +@param cstr_info Codestream information @param index Index filename @return Returns 0 if successful, returns 1 otherwise */ -int write_index_file(opj_codestream_info_t *cstr_info, char *index) { - int tileno, compno, layno, resno, precno, pack_nb, x, y; - FILE *stream = NULL; - double total_disto = 0; -/* UniPG>> */ - int tilepartno; - char disto_on, numpix_on; +int write_index_file(opj_codestream_info_t *cstr_info, char *index) +{ + int tileno, compno, layno, resno, precno, pack_nb, x, y; + FILE *stream = NULL; + double total_disto = 0; + /* UniPG>> */ + int tilepartno; + char disto_on, numpix_on; #ifdef USE_JPWL - if (!strcmp(index, JPWL_PRIVATEINDEX_NAME)) - return 0; + if (!strcmp(index, JPWL_PRIVATEINDEX_NAME)) + return 0; #endif /* USE_JPWL */ -/* <<UniPG */ - - if (!cstr_info) - return 1; - - stream = fopen(index, "w"); - if (!stream) { - fprintf(stderr, "failed to open index file [%s] for writing\n", index); - return 1; - } - - if (cstr_info->tile[0].distotile) - disto_on = 1; - else - disto_on = 0; - - if (cstr_info->tile[0].numpix) - numpix_on = 1; - else - numpix_on = 0; - - fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h); - fprintf(stream, "%d\n", cstr_info->prog); - fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y); - fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th); - fprintf(stream, "%d\n", cstr_info->numcomps); - fprintf(stream, "%d\n", cstr_info->numlayers); - fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */ - - for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { - fprintf(stream, "[%d,%d] ", - (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */ - } - - fprintf(stream, "\n"); -/* UniPG>> */ - fprintf(stream, "%d\n", cstr_info->main_head_start); -/* <<UniPG */ - fprintf(stream, "%d\n", cstr_info->main_head_end); - fprintf(stream, "%d\n", cstr_info->codestream_size); - - fprintf(stream, "\nINFO ON TILES\n"); - fprintf(stream, "tileno start_pos end_hd end_tile nbparts"); - if (disto_on) - fprintf(stream," disto"); - if (numpix_on) - fprintf(stream," nbpix"); - if (disto_on && numpix_on) - fprintf(stream," disto/nbpix"); - fprintf(stream, "\n"); - - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - fprintf(stream, "%4d %9d %9d %9d %9d", - cstr_info->tile[tileno].tileno, - cstr_info->tile[tileno].start_pos, - cstr_info->tile[tileno].end_header, - cstr_info->tile[tileno].end_pos, - cstr_info->tile[tileno].num_tps); - if (disto_on) - fprintf(stream," %9e", cstr_info->tile[tileno].distotile); - if (numpix_on) - fprintf(stream," %9d", cstr_info->tile[tileno].numpix); - if (disto_on && numpix_on) - fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix); - fprintf(stream, "\n"); - } - - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - OPJ_OFF_T start_pos, end_ph_pos, end_pos; - double disto = 0; - int max_numdecompos = 0; - pack_nb = 0; - - for (compno = 0; compno < cstr_info->numcomps; compno++) { - if (max_numdecompos < cstr_info->numdecompos[compno]) - max_numdecompos = cstr_info->numdecompos[compno]; - } - - fprintf(stream, "\nTILE %d DETAILS\n", tileno); - fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n"); - for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++) - fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n", - tilepartno, tileno, - cstr_info->tile[tileno].tp[tilepartno].tp_start_pack, - cstr_info->tile[tileno].tp[tilepartno].tp_numpacks, - cstr_info->tile[tileno].tp[tilepartno].tp_start_pos, - cstr_info->tile[tileno].tp[tilepartno].tp_end_header, - cstr_info->tile[tileno].tp[tilepartno].tp_end_pos - ); - - if (cstr_info->prog == OPJ_LRCP) { /* LRCP */ - fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (layno = 0; layno < cstr_info->numlayers; layno++) { - for (resno = 0; resno < max_numdecompos + 1; resno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int prec_max; - if (resno > cstr_info->numdecompos[compno]) - break; - prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %7d %5d %6d %6d %6" PRId64 " %6" PRId64 " %7" PRId64, - pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* LRCP */ - - else if (cstr_info->prog == OPJ_RLCP) { /* RLCP */ - fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (resno = 0; resno < max_numdecompos + 1; resno++) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int prec_max; - if (resno > cstr_info->numdecompos[compno]) - break; - prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %7d %6d %6d %9" PRId64 " %9" PRId64 " %7" PRId64, - pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* RLCP */ - - else if (cstr_info->prog == OPJ_RPCL) { /* RPCL */ - - fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < numprec; precno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); - int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); - int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; - int precno_y = (int) floor( (float)precno/(float)pcnx ); - if (resno > cstr_info->numdecompos[compno]) - break; - for(y = y0; y < y1; y++) { - if (precno_y*pcy == y ) { - for (x = x0; x < x1; x++) { - if (precno_x*pcx == x ) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %6d %6d %7d %9" PRId64 " %9" PRId64 " %7" PRId64, - pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* precno */ - } /* compno */ - } /* resno */ - } /* RPCL */ - - else if (cstr_info->prog == OPJ_PCRL) { /* PCRL */ - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - - /* Count the maximum number of precincts */ - int max_numprec = 0; - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - if (numprec > max_numprec) - max_numprec = numprec; - } - - fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (precno = 0; precno < max_numprec; precno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); - int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); - int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; - int precno_y = (int) floor( (float)precno/(float)pcnx ); - if (precno >= numprec) - continue; - for(y = y0; y < y1; y++) { - if (precno_y*pcy == y ) { - for (x = x0; x < x1; x++) { - if (precno_x*pcx == x ) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9" PRId64 " %9" PRId64 " %7" PRId64, - pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* resno */ - } /* compno */ - } /* precno */ - } /* PCRL */ - - else { /* CPRL */ - /* Count the maximum number of precincts */ - int max_numprec = 0; - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - if (numprec > max_numprec) - max_numprec = numprec; - } - - fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (compno = 0; compno < cstr_info->numcomps; compno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - - for (precno = 0; precno < max_numprec; precno++) { - for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); - int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); - int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; - int precno_y = (int) floor( (float)precno/(float)pcnx ); - if (precno >= numprec) - continue; - - for(y = y0; y < y1; y++) { - if (precno_y*pcy == y ) { - for (x = x0; x < x1; x++) { - if (precno_x*pcx == x ) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9" PRId64 " %9" PRId64 " %7" PRId64, - pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* resno */ - } /* precno */ - } /* compno */ - } /* CPRL */ - } /* tileno */ - - if (disto_on) { - fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */ - fprintf(stream, "%.8e\n", total_disto); /* SE totale */ - } -/* UniPG>> */ - /* print the markers' list */ - if (cstr_info->marknum) { - fprintf(stream, "\nMARKER LIST\n"); - fprintf(stream, "%d\n", cstr_info->marknum); - fprintf(stream, "type\tstart_pos length\n"); - for (x = 0; x < cstr_info->marknum; x++) - fprintf(stream, "%X\t%9" PRId64 " %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len); - } -/* <<UniPG */ - fclose(stream); - - fprintf(stderr,"Generated index file %s\n", index); - - return 0; + /* <<UniPG */ + + if (!cstr_info) + return 1; + + stream = fopen(index, "w"); + if (!stream) { + fprintf(stderr, "failed to open index file [%s] for writing\n", index); + return 1; + } + + if (cstr_info->tile[0].distotile) + disto_on = 1; + else + disto_on = 0; + + if (cstr_info->tile[0].numpix) + numpix_on = 1; + else + numpix_on = 0; + + fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h); + fprintf(stream, "%d\n", cstr_info->prog); + fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y); + fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th); + fprintf(stream, "%d\n", cstr_info->numcomps); + fprintf(stream, "%d\n", cstr_info->numlayers); + fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */ + + for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { + fprintf(stream, "[%d,%d] ", + (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */ + } + + fprintf(stream, "\n"); + /* UniPG>> */ + fprintf(stream, "%d\n", cstr_info->main_head_start); + /* <<UniPG */ + fprintf(stream, "%d\n", cstr_info->main_head_end); + fprintf(stream, "%d\n", cstr_info->codestream_size); + + fprintf(stream, "\nINFO ON TILES\n"); + fprintf(stream, "tileno start_pos end_hd end_tile nbparts"); + if (disto_on) + fprintf(stream," disto"); + if (numpix_on) + fprintf(stream," nbpix"); + if (disto_on && numpix_on) + fprintf(stream," disto/nbpix"); + fprintf(stream, "\n"); + + for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { + fprintf(stream, "%4d %9d %9d %9d %9d", + cstr_info->tile[tileno].tileno, + cstr_info->tile[tileno].start_pos, + cstr_info->tile[tileno].end_header, + cstr_info->tile[tileno].end_pos, + cstr_info->tile[tileno].num_tps); + if (disto_on) + fprintf(stream," %9e", cstr_info->tile[tileno].distotile); + if (numpix_on) + fprintf(stream," %9d", cstr_info->tile[tileno].numpix); + if (disto_on && numpix_on) + fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix); + fprintf(stream, "\n"); + } + + for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { + OPJ_OFF_T start_pos, end_ph_pos, end_pos; + double disto = 0; + int max_numdecompos = 0; + pack_nb = 0; + + for (compno = 0; compno < cstr_info->numcomps; compno++) { + if (max_numdecompos < cstr_info->numdecompos[compno]) + max_numdecompos = cstr_info->numdecompos[compno]; + } + + fprintf(stream, "\nTILE %d DETAILS\n", tileno); + fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n"); + for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++) + fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n", + tilepartno, tileno, + cstr_info->tile[tileno].tp[tilepartno].tp_start_pack, + cstr_info->tile[tileno].tp[tilepartno].tp_numpacks, + cstr_info->tile[tileno].tp[tilepartno].tp_start_pos, + cstr_info->tile[tileno].tp[tilepartno].tp_end_header, + cstr_info->tile[tileno].tp[tilepartno].tp_end_pos + ); + + if (cstr_info->prog == OPJ_LRCP) { /* LRCP */ + fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (layno = 0; layno < cstr_info->numlayers; layno++) { + for (resno = 0; resno < max_numdecompos + 1; resno++) { + for (compno = 0; compno < cstr_info->numcomps; compno++) { + int prec_max; + if (resno > cstr_info->numdecompos[compno]) + break; + prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + for (precno = 0; precno < prec_max; precno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %7d %5d %6d %6d %6" PRId64 " %6" PRId64 " %7" PRId64, + pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + } + } + } /* LRCP */ + + else if (cstr_info->prog == OPJ_RLCP) { /* RLCP */ + fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (resno = 0; resno < max_numdecompos + 1; resno++) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + for (compno = 0; compno < cstr_info->numcomps; compno++) { + int prec_max; + if (resno > cstr_info->numdecompos[compno]) + break; + prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + for (precno = 0; precno < prec_max; precno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %5d %7d %6d %6d %9" PRId64 " %9" PRId64 " %7" PRId64, + pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + } + } + } /* RLCP */ + + else if (cstr_info->prog == OPJ_RPCL) { /* RPCL */ + + fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (resno = 0; resno < max_numdecompos + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + for (precno = 0; precno < numprec; precno++) { + /* I suppose components have same XRsiz, YRsiz */ + int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; + int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; + int x1 = x0 + cstr_info->tile_x; + int y1 = y0 + cstr_info->tile_y; + for (compno = 0; compno < cstr_info->numcomps; compno++) { + int pcnx = cstr_info->tile[tileno].pw[resno]; + int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); + int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); + int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; + int precno_y = (int) floor( (float)precno/(float)pcnx ); + if (resno > cstr_info->numdecompos[compno]) + break; + for(y = y0; y < y1; y++) { + if (precno_y*pcy == y ) { + for (x = x0; x < x1; x++) { + if (precno_x*pcx == x ) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %5d %6d %6d %7d %9" PRId64 " %9" PRId64 " %7" PRId64, + pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + }/* x = x0..x1 */ + } + } /* y = y0..y1 */ + } /* precno */ + } /* compno */ + } /* resno */ + } /* RPCL */ + + else if (cstr_info->prog == OPJ_PCRL) { /* PCRL */ + /* I suppose components have same XRsiz, YRsiz */ + int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; + int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; + int x1 = x0 + cstr_info->tile_x; + int y1 = y0 + cstr_info->tile_y; + + /* Count the maximum number of precincts */ + int max_numprec = 0; + for (resno = 0; resno < max_numdecompos + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + if (numprec > max_numprec) + max_numprec = numprec; + } + + fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (precno = 0; precno < max_numprec; precno++) { + for (compno = 0; compno < cstr_info->numcomps; compno++) { + for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + int pcnx = cstr_info->tile[tileno].pw[resno]; + int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); + int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); + int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; + int precno_y = (int) floor( (float)precno/(float)pcnx ); + if (precno >= numprec) + continue; + for(y = y0; y < y1; y++) { + if (precno_y*pcy == y ) { + for (x = x0; x < x1; x++) { + if (precno_x*pcx == x ) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %6d %6d %5d %7d %9" PRId64 " %9" PRId64 " %7" PRId64, + pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + }/* x = x0..x1 */ + } + } /* y = y0..y1 */ + } /* resno */ + } /* compno */ + } /* precno */ + } /* PCRL */ + + else { /* CPRL */ + /* Count the maximum number of precincts */ + int max_numprec = 0; + for (resno = 0; resno < max_numdecompos + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + if (numprec > max_numprec) + max_numprec = numprec; + } + + fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (compno = 0; compno < cstr_info->numcomps; compno++) { + /* I suppose components have same XRsiz, YRsiz */ + int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; + int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; + int x1 = x0 + cstr_info->tile_x; + int y1 = y0 + cstr_info->tile_y; + + for (precno = 0; precno < max_numprec; precno++) { + for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + int pcnx = cstr_info->tile[tileno].pw[resno]; + int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); + int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); + int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; + int precno_y = (int) floor( (float)precno/(float)pcnx ); + if (precno >= numprec) + continue; + + for(y = y0; y < y1; y++) { + if (precno_y*pcy == y ) { + for (x = x0; x < x1; x++) { + if (precno_x*pcx == x ) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %6d %6d %5d %7d %9" PRId64 " %9" PRId64 " %7" PRId64, + pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + }/* x = x0..x1 */ + } + } /* y = y0..y1 */ + } /* resno */ + } /* precno */ + } /* compno */ + } /* CPRL */ + } /* tileno */ + + if (disto_on) { + fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */ + fprintf(stream, "%.8e\n", total_disto); /* SE totale */ + } + /* UniPG>> */ + /* print the markers' list */ + if (cstr_info->marknum) { + fprintf(stream, "\nMARKER LIST\n"); + fprintf(stream, "%d\n", cstr_info->marknum); + fprintf(stream, "type\tstart_pos length\n"); + for (x = 0; x < cstr_info->marknum; x++) + fprintf(stream, "%X\t%9" PRId64 " %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len); + } + /* <<UniPG */ + fclose(stream); + + fprintf(stderr,"Generated index file %s\n", index); + + return 0; } diff --git a/src/bin/jp2/index.h b/src/bin/jp2/index.h index d8b448d0..b461e91b 100644 --- a/src/bin/jp2/index.h +++ b/src/bin/jp2/index.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -40,7 +40,7 @@ extern "C" { /** Write a structured index to a file -@param cstr_info Codestream information +@param cstr_info Codestream information @param index Index filename @return Returns 0 if successful, returns 1 otherwise */ diff --git a/src/bin/jp2/opj_compress.c b/src/bin/jp2/opj_compress.c index 9d690a56..1332d3a8 100644 --- a/src/bin/jp2/opj_compress.c +++ b/src/bin/jp2/opj_compress.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan @@ -71,14 +71,14 @@ #include "format_defs.h" #include "opj_string.h" -typedef struct dircnt{ +typedef struct dircnt { /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; -}dircnt_t; +} dircnt_t; -typedef struct img_folder{ +typedef struct img_folder { /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ @@ -87,9 +87,10 @@ typedef struct img_folder{ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; -}img_fol_t; +} img_fol_t; -static void encode_help_display(void) { +static void encode_help_display(void) +{ fprintf(stdout,"\nThis is the opj_compress utility from the OpenJPEG project.\n" "It compresses various image formats with the JPEG 2000 algorithm.\n" "It has been compiled against openjp2 library v%s.\n\n",opj_version()); @@ -108,9 +109,9 @@ static void encode_help_display(void) { fprintf(stdout," * No sub-sampling in x or y direction\n"); fprintf(stdout," * No mode switch activated\n"); fprintf(stdout," * Progression order: LRCP\n"); - #ifdef FIXME_INDEX +#ifdef FIXME_INDEX fprintf(stdout," * No index file\n"); - #endif /* FIXME_INDEX */ +#endif /* FIXME_INDEX */ fprintf(stdout," * No ROI upshifted\n"); fprintf(stdout," * No offset of the origin of the image\n"); fprintf(stdout," * No offset of the origin of the tiles\n"); @@ -218,10 +219,10 @@ static void encode_help_display(void) { fprintf(stdout," Divide packets of every tile into tile-parts.\n"); fprintf(stdout," Division is made by grouping Resolutions (R), Layers (L)\n"); fprintf(stdout," or Components (C).\n"); - #ifdef FIXME_INDEX +#ifdef FIXME_INDEX fprintf(stdout,"-x <index file>\n"); fprintf(stdout," Create an index file.\n"); - #endif /*FIXME_INDEX*/ +#endif /*FIXME_INDEX*/ fprintf(stdout,"-ROI c=<component index>,U=<upshifting value>\n"); fprintf(stdout," Quantization indices upshifted for a component. \n"); fprintf(stdout," Warning: This option does not implement the usual ROI (Region of Interest).\n"); @@ -353,7 +354,8 @@ static void encode_help_display(void) { #endif /*FIXME_INDEX*/ } -static OPJ_PROG_ORDER give_progression(const char progression[4]) { +static OPJ_PROG_ORDER give_progression(const char progression[4]) +{ if(strncmp(progression, "LRCP", 4) == 0) { return OPJ_LRCP; } @@ -373,7 +375,8 @@ static OPJ_PROG_ORDER give_progression(const char progression[4]) { return OPJ_PROG_UNKNOWN; } -static unsigned int get_num_images(char *imgdirpath){ +static unsigned int get_num_images(char *imgdirpath) +{ DIR *dir; struct dirent* content; unsigned int num_images = 0; @@ -381,13 +384,13 @@ static unsigned int get_num_images(char *imgdirpath){ /*Reading the input images from given input directory*/ dir= opendir(imgdirpath); - if(!dir){ + if(!dir) { fprintf(stderr,"Could not open Folder %s\n",imgdirpath); return 0; } num_images=0; - while((content=readdir(dir))!=NULL){ + while((content=readdir(dir))!=NULL) { if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) continue; num_images++; @@ -396,7 +399,8 @@ static unsigned int get_num_images(char *imgdirpath){ return num_images; } -static int load_images(dircnt_t *dirptr, char *imgdirpath){ +static int load_images(dircnt_t *dirptr, char *imgdirpath) +{ DIR *dir; struct dirent* content; int i = 0; @@ -404,25 +408,26 @@ static int load_images(dircnt_t *dirptr, char *imgdirpath){ /*Reading the input images from given input directory*/ dir= opendir(imgdirpath); - if(!dir){ + if(!dir) { fprintf(stderr,"Could not open Folder %s\n",imgdirpath); return 1; - }else { + } else { fprintf(stderr,"Folder opened successfully\n"); } - while((content=readdir(dir))!=NULL){ + while((content=readdir(dir))!=NULL) { if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) continue; strcpy(dirptr->filename[i],content->d_name); i++; } - closedir(dir); + closedir(dir); return 0; } -static int get_file_format(char *filename) { +static int get_file_format(char *filename) +{ unsigned int i; static const char *extension[] = { "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "rawl", "tga", "png", "j2k", "jp2", "j2c", "jpc" @@ -442,12 +447,14 @@ static int get_file_format(char *filename) { return -1; } -static char * get_file_name(char *name){ +static char * get_file_name(char *name) +{ char *fname = strtok(name,"."); return fname; } -static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){ +static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters) +{ char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; char *temp_p, temp1[OPJ_PATH_LEN]=""; @@ -460,14 +467,14 @@ static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_c if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infilename) != 0) { return 1; } - + /*Set output file*/ strcpy(temp_ofname,get_file_name(image_filename)); - while((temp_p = strtok(NULL,".")) != NULL){ + while((temp_p = strtok(NULL,".")) != NULL) { strcat(temp_ofname,temp1); sprintf(temp1,".%s",temp_p); } - if(img_fol->set_out_format==1){ + if(img_fol->set_out_format==1) { sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfilename) != 0) { return 1; @@ -479,10 +486,11 @@ static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_c /* ------------------------------------------------------------------------------------ */ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, - img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename, size_t indexfilename_size) { + img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename, size_t indexfilename_size) +{ OPJ_UINT32 i, j; int totlen, c; - opj_option_t long_option[]={ + opj_option_t long_option[]= { {"cinema2K",REQ_ARG, NULL ,'w'}, {"cinema4K",NO_ARG, NULL ,'y'}, {"ImgDir",REQ_ARG, NULL ,'z'}, @@ -498,22 +506,21 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param /* parse the command line */ const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:JY:" - #ifdef USE_JPWL - "W:" - #endif /* USE_JPWL */ - "h"; +#ifdef USE_JPWL + "W:" +#endif /* USE_JPWL */ + "h"; totlen=sizeof(long_option); img_fol->set_out_format=0; raw_cp->rawWidth = 0; - do{ + do { c = opj_getopt_long(argc, argv, optlist,long_option,totlen); if (c == -1) break; switch (c) { - case 'i': /* input file */ - { + case 'i': { /* input file */ char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { @@ -537,12 +544,11 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'o': /* output file */ - { + case 'o': { /* output file */ char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { @@ -557,11 +563,10 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } } - break; + break; - /* ----------------------------------------------------- */ - case 'O': /* output format */ - { + /* ----------------------------------------------------- */ + case 'O': { /* output format */ char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); @@ -577,14 +582,13 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'r': /* rates rates/distorsion */ - { + case 'r': { /* rates rates/distorsion */ char *s = opj_optarg; parameters->tcp_numlayers = 0; while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { @@ -598,13 +602,12 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } parameters->cp_disto_alloc = 1; } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'F': /* Raw image format parameters */ - { + case 'F': { /* Raw image format parameters */ OPJ_BOOL wrong = OPJ_FALSE; char *substr1; char *substr2; @@ -687,12 +690,11 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'q': /* add fixed_quality */ - { + case 'q': { /* add fixed_quality */ char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; @@ -705,13 +707,12 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } parameters->cp_fixed_quality = 1; } - break; + break; - /* dda */ - /* ----------------------------------------------------- */ + /* dda */ + /* ----------------------------------------------------- */ - case 'f': /* mod fixed_quality (before : -q) */ - { + case 'f': { /* mod fixed_quality (before : -q) */ int *row = NULL, *col = NULL; OPJ_UINT32 numlayers = 0, numresolution = 0, matrix_width = 0; @@ -753,28 +754,25 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } parameters->cp_fixed_alloc = 1; } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 't': /* tiles */ - { + case 't': { /* tiles */ sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); parameters->tile_size_on = OPJ_TRUE; } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'n': /* resolution */ - { + case 'n': { /* resolution */ sscanf(opj_optarg, "%d", ¶meters->numresolution); } - break; + break; - /* ----------------------------------------------------- */ - case 'c': /* precinct dimension */ - { + /* ----------------------------------------------------- */ + case 'c': { /* precinct dimension */ char sep; int res_spec = 0; @@ -783,26 +781,23 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param do { sep = 0; ret = sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], - ¶meters->prch_init[res_spec], &sep); - if( !(ret == 2 && sep == 0) && !(ret == 3 && sep == ',') ) - { - fprintf(stderr,"\nError: could not parse precinct dimension: '%s' %x\n", s, sep); - fprintf(stderr,"Example: -i lena.raw -o lena.j2k -c [128,128],[128,128]\n"); - return 1; - } + ¶meters->prch_init[res_spec], &sep); + if( !(ret == 2 && sep == 0) && !(ret == 3 && sep == ',') ) { + fprintf(stderr,"\nError: could not parse precinct dimension: '%s' %x\n", s, sep); + fprintf(stderr,"Example: -i lena.raw -o lena.j2k -c [128,128],[128,128]\n"); + return 1; + } parameters->csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; - } - while (sep == ','); + } while (sep == ','); parameters->res_spec = res_spec; } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'b': /* code-block dimension */ - { + case 'b': { /* code-block dimension */ int cblockw_init = 0, cblockh_init = 0; sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init); if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 @@ -815,12 +810,11 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param parameters->cblockw_init = cblockw_init; parameters->cblockh_init = cblockh_init; } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'x': /* creation of index file */ - { + case 'x': { /* creation of index file */ if (opj_strcpy_s(indexfilename, indexfilename_size, opj_optarg) != 0) { return 1; } @@ -830,12 +824,11 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param " '-x' option ignored.\n"); /* << FIXME ADE INDEX */ } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'p': /* progression order */ - { + case 'p': { /* progression order */ char progression[4]; strncpy(progression, opj_optarg, 4); @@ -846,24 +839,22 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 's': /* subsampling factor */ - { + case 's': { /* subsampling factor */ if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, ¶meters->subsampling_dy) != 2) { fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); return 1; } } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'd': /* coordonnate of the reference grid */ - { + case 'd': { /* coordonnate of the reference grid */ if (sscanf(opj_optarg, "%d,%d", ¶meters->image_offset_x0, ¶meters->image_offset_y0) != 2) { fprintf(stderr, "-d 'coordonnate of the reference grid' argument " @@ -871,18 +862,17 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } } - break; + break; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ case 'h': /* display an help description */ encode_help_display(); return 1; - /* ----------------------------------------------------- */ + /* ----------------------------------------------------- */ - case 'P': /* POC */ - { + case 'P': { /* POC */ int numpocs = 0; /* number of progression order change (POC) default 0 */ opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ @@ -905,28 +895,25 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } parameters->numpocs = (OPJ_UINT32)numpocs; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'S': /* SOP marker */ - { + case 'S': { /* SOP marker */ parameters->csty |= 0x02; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'E': /* EPH marker */ - { + case 'E': { /* EPH marker */ parameters->csty |= 0x04; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'M': /* Mode switch pas tous au point !! */ - { + case 'M': { /* Mode switch pas tous au point !! */ int value = 0; if (sscanf(opj_optarg, "%d", &value) == 1) { for (i = 0; i <= 5; i++) { @@ -936,85 +923,78 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } } } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'R': /* ROI */ - { + case 'R': { /* ROI */ if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) { fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); return 1; } } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'T': /* Tile offset */ - { + case 'T': { /* Tile offset */ if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0) != 2) { fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); return 1; } } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'C': /* add a comment */ - { + case 'C': { /* add a comment */ parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); if(parameters->cp_comment) { strcpy(parameters->cp_comment, opj_optarg); } } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'I': /* reversible or not */ - { + case 'I': { /* reversible or not */ parameters->irreversible = 1; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'u': /* Tile part generation*/ - { + case 'u': { /* Tile part generation*/ parameters->tp_flag = opj_optarg[0]; parameters->tp_on = 1; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'z': /* Image Directory path */ - { + case 'z': { /* Image Directory path */ img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'w': /* Digital Cinema 2K profile compliance*/ - { + case 'w': { /* Digital Cinema 2K profile compliance*/ int fps=0; sscanf(opj_optarg,"%d",&fps); - if(fps == 24){ + if(fps == 24) { parameters->rsiz = OPJ_PROFILE_CINEMA_2K; parameters->max_comp_size = OPJ_CINEMA_24_COMP; parameters->max_cs_size = OPJ_CINEMA_24_CS; - }else if(fps == 48 ){ + } else if(fps == 48 ) { parameters->rsiz = OPJ_PROFILE_CINEMA_2K; parameters->max_comp_size = OPJ_CINEMA_48_COMP; parameters->max_cs_size = OPJ_CINEMA_48_CS; - }else { + } else { fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); return 1; } @@ -1022,37 +1002,34 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param "Other options specified could be overriden\n"); } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'y': /* Digital Cinema 4K profile compliance*/ - { + case 'y': { /* Digital Cinema 4K profile compliance*/ parameters->rsiz = OPJ_PROFILE_CINEMA_4K; fprintf(stdout,"CINEMA 4K profile activated\n" "Other options specified could be overriden\n"); } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'Y': /* Shall we do an MCT ? 0:no_mct;1:rgb->ycc;2:custom mct (-m option required)*/ - { + case 'Y': { /* Shall we do an MCT ? 0:no_mct;1:rgb->ycc;2:custom mct (-m option required)*/ int mct_mode=0; sscanf(opj_optarg,"%d",&mct_mode); - if(mct_mode < 0 || mct_mode > 2){ + if(mct_mode < 0 || mct_mode > 2) { fprintf(stderr,"MCT incorrect value!! Current accepted values are 0, 1 or 2.\n"); return 1; } parameters->tcp_mct = (char) mct_mode; } - break; + break; - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'm': /* mct input file */ - { + case 'm': { /* mct input file */ char *lFilename = opj_optarg; char *lMatrix; char *lCurrentPtr ; @@ -1107,14 +1084,14 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param return 1; } lCurrentDoublePtr = lSpace; - for (i2=0;i2<lMctComp;++i2) { + for (i2=0; i2<lMctComp; ++i2) { lStrLen = strlen(lCurrentPtr) + 1; *lCurrentDoublePtr++ = (float) atof(lCurrentPtr); lCurrentPtr += lStrLen; } l_int_ptr = (int*) lCurrentDoublePtr; - for (i2=0;i2<lNbComp;++i2) { + for (i2=0; i2<lNbComp; ++i2) { lStrLen = strlen(lCurrentPtr) + 1; *l_int_ptr++ = atoi(lCurrentPtr); lCurrentPtr += lStrLen; @@ -1127,17 +1104,16 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param free(lSpace); free(lMatrix); } - break; + break; /* ------------------------------------------------------ */ /* UniPG>> */ #ifdef USE_JPWL - /* ------------------------------------------------------ */ + /* ------------------------------------------------------ */ - case 'W': /* JPWL capabilities switched on */ - { + case 'W': { /* JPWL capabilities switched on */ char *token = NULL; int hprot, pprot, sens, addr, size, range; @@ -1164,7 +1140,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param if(sscanf(token, "h=%d", &hprot) == 1) { /* Main header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || - ((hprot >= 37) && (hprot <= 128)))) { + ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot); return 1; } @@ -1173,7 +1149,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) { /* Tile part header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || - ((hprot >= 37) && (hprot <= 128)))) { + ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot); return 1; } @@ -1219,7 +1195,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param if (sscanf(token, "p=%d", &pprot) == 1) { /* Method for all tiles and all packets */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { + ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot); return 1; } @@ -1230,7 +1206,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) { /* method specified from that tile on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { + ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } @@ -1247,7 +1223,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) { /* method fully specified from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { + ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } @@ -1268,7 +1244,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) { /* default method from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { + ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } @@ -1450,51 +1426,50 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param parameters->jpwl_epc_on = OPJ_TRUE; } - break; + break; #endif /* USE_JPWL */ - /* <<UniPG */ - /* ------------------------------------------------------ */ + /* <<UniPG */ + /* ------------------------------------------------------ */ - case 'J': /* jpip on */ - { + case 'J': { /* jpip on */ parameters->jpip_on = OPJ_TRUE; } - break; - /* ------------------------------------------------------ */ + break; + /* ------------------------------------------------------ */ default: fprintf(stderr, "[WARNING] An invalid option has been ignored\n"); break; } - }while(c != -1); + } while(c != -1); - if(img_fol->set_imgdir == 1){ - if(!(parameters->infile[0] == 0)){ + if(img_fol->set_imgdir == 1) { + if(!(parameters->infile[0] == 0)) { fprintf(stderr, "[ERROR] options -ImgDir and -i cannot be used together !!\n"); return 1; } - if(img_fol->set_out_format == 0){ + if(img_fol->set_out_format == 0) { fprintf(stderr, "[ERROR] When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); fprintf(stderr, "Only one format allowed! Valid formats are j2k and jp2!!\n"); return 1; } - if(!((parameters->outfile[0] == 0))){ + if(!((parameters->outfile[0] == 0))) { fprintf(stderr, "[ERROR] options -ImgDir and -o cannot be used together !!\n"); fprintf(stderr, "Specify OutputFormat using -OutFor<FORMAT> !!\n"); return 1; } - }else{ + } else { if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { fprintf(stderr, "[ERROR] Required parameters are missing\n" - "Example: %s -i image.pgm -o image.j2k\n",argv[0]); + "Example: %s -i image.pgm -o image.j2k\n",argv[0]); fprintf(stderr, " Help: %s -h\n",argv[0]); return 1; } } if ( (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) - || (parameters->decod_format == RAWL_DFMT && raw_cp->rawWidth == 0)) { + || (parameters->decod_format == RAWL_DFMT && raw_cp->rawWidth == 0)) { fprintf(stderr,"[ERROR] invalid raw image parameters\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); @@ -1533,9 +1508,9 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param /* If subsampled image is provided, automatically disable MCT */ if ( ((parameters->decod_format == RAW_DFMT) || (parameters->decod_format == RAWL_DFMT)) - && ( ((raw_cp->rawComp > 1 ) && ((raw_cp->rawComps[1].dx > 1) || (raw_cp->rawComps[1].dy > 1))) - || ((raw_cp->rawComp > 2 ) && ((raw_cp->rawComps[2].dx > 1) || (raw_cp->rawComps[2].dy > 1))) - )) { + && ( ((raw_cp->rawComp > 1 ) && ((raw_cp->rawComps[1].dx > 1) || (raw_cp->rawComps[1].dy > 1))) + || ((raw_cp->rawComp > 2 ) && ((raw_cp->rawComps[2].dx > 1) || (raw_cp->rawComps[2].dy > 1))) + )) { parameters->tcp_mct = 0; } @@ -1547,43 +1522,47 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param /** sample error debug callback expecting no client object */ -static void error_callback(const char *msg, void *client_data) { +static void error_callback(const char *msg, void *client_data) +{ (void)client_data; fprintf(stdout, "[ERROR] %s", msg); } /** sample warning debug callback expecting no client object */ -static void warning_callback(const char *msg, void *client_data) { +static void warning_callback(const char *msg, void *client_data) +{ (void)client_data; fprintf(stdout, "[WARNING] %s", msg); } /** sample debug callback expecting no client object */ -static void info_callback(const char *msg, void *client_data) { +static void info_callback(const char *msg, void *client_data) +{ (void)client_data; fprintf(stdout, "[INFO] %s", msg); } -OPJ_FLOAT64 opj_clock(void) { +OPJ_FLOAT64 opj_clock(void) +{ #ifdef _WIN32 - /* _WIN32: use QueryPerformance (very accurate) */ + /* _WIN32: use QueryPerformance (very accurate) */ LARGE_INTEGER freq , t ; /* freq is the clock speed of the CPU */ QueryPerformanceFrequency(&freq) ; - /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ + /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ /* t is the high resolution performance counter (see MSDN) */ QueryPerformanceCounter ( & t ) ; return freq.QuadPart ? ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) : 0 ; #else - /* Unix or Linux: use resource usage */ + /* Unix or Linux: use resource usage */ struct rusage t; OPJ_FLOAT64 procTime; /* (1) Get the rusage data structure at this moment (man getrusage) */ getrusage(0,&t); /* (2) What is the elapsed time ? - CPU time = User time + System time */ - /* (2a) Get the seconds */ + /* (2a) Get the seconds */ procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec); /* (2b) More precisely! Get the microseconds part ! */ return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; @@ -1596,7 +1575,8 @@ OPJ_FLOAT64 opj_clock(void) { * OPJ_COMPRESS MAIN */ /* -------------------------------------------------------------------------- */ -int main(int argc, char **argv) { +int main(int argc, char **argv) +{ opj_cparameters_t parameters; /* compression parameters */ @@ -1639,35 +1619,35 @@ int main(int argc, char **argv) { } /* Read directory if necessary */ - if(img_fol.set_imgdir==1){ + if(img_fol.set_imgdir==1) { num_images=get_num_images(img_fol.imgdirpath); dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); - if(dirptr){ + if(dirptr) { dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ dirptr->filename = (char**) malloc(num_images*sizeof(char*)); - if(!dirptr->filename_buf){ + if(!dirptr->filename_buf) { return 0; } - for(i=0;i<num_images;i++){ + for(i=0; i<num_images; i++) { dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; } } - if(load_images(dirptr,img_fol.imgdirpath)==1){ + if(load_images(dirptr,img_fol.imgdirpath)==1) { return 0; } - if (num_images==0){ + if (num_images==0) { fprintf(stdout,"Folder is empty\n"); return 0; } - }else{ + } else { num_images=1; } /*Encoding image one by one*/ - for(imageno=0;imageno<num_images;imageno++) { + for(imageno=0; imageno<num_images; imageno++) { image = NULL; fprintf(stderr,"\n"); - if(img_fol.set_imgdir==1){ + if(img_fol.set_imgdir==1) { if (get_next_file((int)imageno, dirptr,&img_fol, ¶meters)) { fprintf(stderr,"skipping file...\n"); continue; @@ -1769,8 +1749,8 @@ int main(int argc, char **argv) { } /* Can happen if input file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined -*/ + * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined + */ if( !image) { fprintf(stderr, "Unable to load file: got no image\n"); return 1; @@ -1780,12 +1760,12 @@ int main(int argc, char **argv) { if (parameters.tcp_mct == (char) 255) { /* mct mode has not been set in commandline */ parameters.tcp_mct = (image->numcomps >= 3) ? 1 : 0; } else { /* mct mode has been set in commandline */ - if ((parameters.tcp_mct == 1) && (image->numcomps < 3)){ + if ((parameters.tcp_mct == 1) && (image->numcomps < 3)) { fprintf(stderr, "RGB->YCC conversion cannot be used:\n"); fprintf(stderr, "Input image has less than 3 components\n"); return 1; } - if ((parameters.tcp_mct == 2) && (!parameters.mct_data)){ + if ((parameters.tcp_mct == 2) && (!parameters.mct_data)) { fprintf(stderr, "Custom MCT has been set but no array-based MCT\n"); fprintf(stderr, "has been provided. Aborting.\n"); return 1; @@ -1796,14 +1776,12 @@ int main(int argc, char **argv) { /* ---------------------------- */ switch(parameters.cod_format) { - case J2K_CFMT: /* JPEG-2000 codestream */ - { + case J2K_CFMT: { /* JPEG-2000 codestream */ /* Get a decoder handle */ l_codec = opj_create_compress(OPJ_CODEC_J2K); break; } - case JP2_CFMT: /* JPEG 2000 compressed image data */ - { + case JP2_CFMT: { /* JPEG 2000 compressed image data */ /* Get a decoder handle */ l_codec = opj_create_compress(OPJ_CODEC_JP2); break; @@ -1835,7 +1813,7 @@ int main(int argc, char **argv) { /* open a byte stream for writing and allocate memory for all tiles */ l_stream = opj_stream_create_default_file_stream(parameters.outfile,OPJ_FALSE); - if (! l_stream){ + if (! l_stream) { return 1; } @@ -1849,7 +1827,7 @@ int main(int argc, char **argv) { OPJ_UINT32 l_data_size = 512*512*3; l_data = (OPJ_BYTE*) calloc( 1,l_data_size); assert( l_data ); - for (i=0;i<l_nb_tiles;++i) { + for (i=0; i<l_nb_tiles; ++i) { if (! opj_write_tile(l_codec,i,l_data,l_data_size,l_stream)) { fprintf(stderr, "ERROR -> test_tile_encoder: failed to write the tile %d!\n",i); opj_stream_destroy(l_stream); @@ -1859,8 +1837,7 @@ int main(int argc, char **argv) { } } free(l_data); - } - else { + } else { bSuccess = bSuccess && opj_encode(l_codec, l_stream); if (!bSuccess) { fprintf(stderr, "failed to encode image: opj_encode\n"); @@ -1876,11 +1853,11 @@ int main(int argc, char **argv) { opj_destroy_codec(l_codec); opj_image_destroy(image); fprintf(stderr, "failed to encode image\n"); - remove(parameters.outfile); + remove(parameters.outfile); return 1; } - num_compressed_files++; + num_compressed_files++; fprintf(stdout,"[INFO] Generated outfile %s\n",parameters.outfile); /* close and free the byte stream */ opj_stream_destroy(l_stream); @@ -1897,10 +1874,10 @@ int main(int argc, char **argv) { if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_matrice) free(parameters.cp_matrice); if(raw_cp.rawComps) free(raw_cp.rawComps); - + t = opj_clock() - t; if (num_compressed_files) { - fprintf(stdout, "encode time: %d ms \n", (int)((t * 1000.0)/(OPJ_FLOAT64)num_compressed_files)); + fprintf(stdout, "encode time: %d ms \n", (int)((t * 1000.0)/(OPJ_FLOAT64)num_compressed_files)); } return 0; diff --git a/src/bin/jp2/opj_decompress.c b/src/bin/jp2/opj_decompress.c index f3b1cd5c..21b4cea4 100644 --- a/src/bin/jp2/opj_decompress.c +++ b/src/bin/jp2/opj_decompress.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,11 +8,11 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan - * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR + * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR * Copyright (c) 2012, CS Systemes d'Information, France * All rights reserved. * @@ -77,80 +77,77 @@ #include "format_defs.h" #include "opj_string.h" -typedef struct dircnt{ - /** Buffer for holding images read from Directory*/ - char *filename_buf; - /** Pointer to the buffer*/ - char **filename; -}dircnt_t; - - -typedef struct img_folder{ - /** The directory path of the folder containing input images*/ - char *imgdirpath; - /** Output format*/ - const char *out_format; - /** Enable option*/ - char set_imgdir; - /** Enable Cod Format for output*/ - char set_out_format; - -}img_fol_t; - -typedef enum opj_prec_mode -{ - OPJ_PREC_MODE_CLIP, - OPJ_PREC_MODE_SCALE +typedef struct dircnt { + /** Buffer for holding images read from Directory*/ + char *filename_buf; + /** Pointer to the buffer*/ + char **filename; +} dircnt_t; + + +typedef struct img_folder { + /** The directory path of the folder containing input images*/ + char *imgdirpath; + /** Output format*/ + const char *out_format; + /** Enable option*/ + char set_imgdir; + /** Enable Cod Format for output*/ + char set_out_format; + +} img_fol_t; + +typedef enum opj_prec_mode { + OPJ_PREC_MODE_CLIP, + OPJ_PREC_MODE_SCALE } opj_precision_mode; -typedef struct opj_prec -{ - OPJ_UINT32 prec; - opj_precision_mode mode; -}opj_precision; - -typedef struct opj_decompress_params -{ - /** core library parameters */ - opj_dparameters_t core; - - /** input file name */ - char infile[OPJ_PATH_LEN]; - /** output file name */ - char outfile[OPJ_PATH_LEN]; - /** input file format 0: J2K, 1: JP2, 2: JPT */ - int decod_format; - /** output file format 0: PGX, 1: PxM, 2: BMP */ - int cod_format; - /** index file name */ - char indexfilename[OPJ_PATH_LEN]; - - /** Decoding area left boundary */ - OPJ_UINT32 DA_x0; - /** Decoding area right boundary */ - OPJ_UINT32 DA_x1; - /** Decoding area up boundary */ - OPJ_UINT32 DA_y0; - /** Decoding area bottom boundary */ - OPJ_UINT32 DA_y1; - /** Verbose mode */ - OPJ_BOOL m_verbose; - - /** tile number ot the decoded tile*/ - OPJ_UINT32 tile_index; - /** Nb of tile to decode */ - OPJ_UINT32 nb_tile_to_decode; - - opj_precision* precision; - OPJ_UINT32 nb_precision; - - /* force output colorspace to RGB */ - int force_rgb; - /* upsample components according to their dx/dy values */ - int upsample; - /* split output components to different files */ - int split_pnm; -}opj_decompress_parameters; +typedef struct opj_prec { + OPJ_UINT32 prec; + opj_precision_mode mode; +} opj_precision; + +typedef struct opj_decompress_params { + /** core library parameters */ + opj_dparameters_t core; + + /** input file name */ + char infile[OPJ_PATH_LEN]; + /** output file name */ + char outfile[OPJ_PATH_LEN]; + /** input file format 0: J2K, 1: JP2, 2: JPT */ + int decod_format; + /** output file format 0: PGX, 1: PxM, 2: BMP */ + int cod_format; + /** index file name */ + char indexfilename[OPJ_PATH_LEN]; + + /** Decoding area left boundary */ + OPJ_UINT32 DA_x0; + /** Decoding area right boundary */ + OPJ_UINT32 DA_x1; + /** Decoding area up boundary */ + OPJ_UINT32 DA_y0; + /** Decoding area bottom boundary */ + OPJ_UINT32 DA_y1; + /** Verbose mode */ + OPJ_BOOL m_verbose; + + /** tile number ot the decoded tile*/ + OPJ_UINT32 tile_index; + /** Nb of tile to decode */ + OPJ_UINT32 nb_tile_to_decode; + + opj_precision* precision; + OPJ_UINT32 nb_precision; + + /* force output colorspace to RGB */ + int force_rgb; + /* upsample components according to their dx/dy values */ + int upsample; + /* split output components to different files */ + int split_pnm; +} opj_decompress_parameters; /* -------------------------------------------------------------------------- */ /* Declarations */ @@ -166,253 +163,256 @@ int parse_DA_values( char* inArg, unsigned int *DA_x0, unsigned int *DA_y0, unsi static opj_image_t* convert_gray_to_rgb(opj_image_t* original); /* -------------------------------------------------------------------------- */ -static void decode_help_display(void) { - fprintf(stdout,"\nThis is the opj_decompress utility from the OpenJPEG project.\n" - "It decompresses JPEG 2000 codestreams to various image formats.\n" - "It has been compiled against openjp2 library v%s.\n\n",opj_version()); - - fprintf(stdout,"Parameters:\n" - "-----------\n" - "\n" - " -ImgDir <directory> \n" - " Image file Directory path \n" - " -OutFor <PBM|PGM|PPM|PNM|PAM|PGX|PNG|BMP|TIF|RAW|RAWL|TGA>\n" - " REQUIRED only if -ImgDir is used\n" - " Output format for decompressed images.\n"); - fprintf(stdout," -i <compressed file>\n" - " REQUIRED only if an Input image directory is not specified\n" - " Currently accepts J2K-files, JP2-files and JPT-files. The file type\n" - " is identified based on its suffix.\n"); - fprintf(stdout," -o <decompressed file>\n" - " REQUIRED\n" - " Currently accepts formats specified above (see OutFor option)\n" - " Binary data is written to the file (not ascii). If a PGX\n" - " filename is given, there will be as many output files as there are\n" - " components: an indice starting from 0 will then be appended to the\n" - " output filename, just before the \"pgx\" extension. If a PGM filename\n" - " is given and there are more than one component, only the first component\n" - " will be written to the file.\n"); - fprintf(stdout," -r <reduce factor>\n" - " Set the number of highest resolution levels to be discarded. The\n" - " image resolution is effectively divided by 2 to the power of the\n" - " number of discarded levels. The reduce factor is limited by the\n" - " smallest total number of decomposition levels among tiles.\n" - " -l <number of quality layers to decode>\n" - " Set the maximum number of quality layers to decode. If there are\n" - " less quality layers than the specified number, all the quality layers\n" - " are decoded.\n"); - fprintf(stdout," -x \n" - " Create an index file *.Idx (-x index_name.Idx) \n" - " -d <x0,y0,x1,y1>\n" - " OPTIONAL\n" - " Decoding area\n" - " By default all the image is decoded.\n" - " -t <tile_number>\n" - " OPTIONAL\n" - " Set the tile number of the decoded tile. Follow the JPEG2000 convention from left-up to bottom-up\n" - " By default all tiles are decoded.\n"); - fprintf(stdout," -p <comp 0 precision>[C|S][,<comp 1 precision>[C|S][,...]]\n" - " OPTIONAL\n" - " Force the precision (bit depth) of components.\n"); - fprintf(stdout," There shall be at least 1 value. Theres no limit on the number of values (comma separated, last values ignored if too much values).\n" - " If there are less values than components, the last value is used for remaining components.\n" - " If 'C' is specified (default), values are clipped.\n" - " If 'S' is specified, values are scaled.\n" - " A 0 value can be specified (meaning original bit depth).\n"); - fprintf(stdout," -force-rgb\n" - " Force output image colorspace to RGB\n" - " -upsample\n" - " Downsampled components will be upsampled to image size\n" - " -split-pnm\n" - " Split output components to different files when writing to PNM\n" - "\n"); -/* UniPG>> */ +static void decode_help_display(void) +{ + fprintf(stdout,"\nThis is the opj_decompress utility from the OpenJPEG project.\n" + "It decompresses JPEG 2000 codestreams to various image formats.\n" + "It has been compiled against openjp2 library v%s.\n\n",opj_version()); + + fprintf(stdout,"Parameters:\n" + "-----------\n" + "\n" + " -ImgDir <directory> \n" + " Image file Directory path \n" + " -OutFor <PBM|PGM|PPM|PNM|PAM|PGX|PNG|BMP|TIF|RAW|RAWL|TGA>\n" + " REQUIRED only if -ImgDir is used\n" + " Output format for decompressed images.\n"); + fprintf(stdout," -i <compressed file>\n" + " REQUIRED only if an Input image directory is not specified\n" + " Currently accepts J2K-files, JP2-files and JPT-files. The file type\n" + " is identified based on its suffix.\n"); + fprintf(stdout," -o <decompressed file>\n" + " REQUIRED\n" + " Currently accepts formats specified above (see OutFor option)\n" + " Binary data is written to the file (not ascii). If a PGX\n" + " filename is given, there will be as many output files as there are\n" + " components: an indice starting from 0 will then be appended to the\n" + " output filename, just before the \"pgx\" extension. If a PGM filename\n" + " is given and there are more than one component, only the first component\n" + " will be written to the file.\n"); + fprintf(stdout," -r <reduce factor>\n" + " Set the number of highest resolution levels to be discarded. The\n" + " image resolution is effectively divided by 2 to the power of the\n" + " number of discarded levels. The reduce factor is limited by the\n" + " smallest total number of decomposition levels among tiles.\n" + " -l <number of quality layers to decode>\n" + " Set the maximum number of quality layers to decode. If there are\n" + " less quality layers than the specified number, all the quality layers\n" + " are decoded.\n"); + fprintf(stdout," -x \n" + " Create an index file *.Idx (-x index_name.Idx) \n" + " -d <x0,y0,x1,y1>\n" + " OPTIONAL\n" + " Decoding area\n" + " By default all the image is decoded.\n" + " -t <tile_number>\n" + " OPTIONAL\n" + " Set the tile number of the decoded tile. Follow the JPEG2000 convention from left-up to bottom-up\n" + " By default all tiles are decoded.\n"); + fprintf(stdout," -p <comp 0 precision>[C|S][,<comp 1 precision>[C|S][,...]]\n" + " OPTIONAL\n" + " Force the precision (bit depth) of components.\n"); + fprintf(stdout," There shall be at least 1 value. Theres no limit on the number of values (comma separated, last values ignored if too much values).\n" + " If there are less values than components, the last value is used for remaining components.\n" + " If 'C' is specified (default), values are clipped.\n" + " If 'S' is specified, values are scaled.\n" + " A 0 value can be specified (meaning original bit depth).\n"); + fprintf(stdout," -force-rgb\n" + " Force output image colorspace to RGB\n" + " -upsample\n" + " Downsampled components will be upsampled to image size\n" + " -split-pnm\n" + " Split output components to different files when writing to PNM\n" + "\n"); + /* UniPG>> */ #ifdef USE_JPWL - fprintf(stdout," -W <options>\n" - " Activates the JPWL correction capability, if the codestream complies.\n" - " Options can be a comma separated list of <param=val> tokens:\n" - " c, c=numcomps\n" - " numcomps is the number of expected components in the codestream\n" - " (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); + fprintf(stdout," -W <options>\n" + " Activates the JPWL correction capability, if the codestream complies.\n" + " Options can be a comma separated list of <param=val> tokens:\n" + " c, c=numcomps\n" + " numcomps is the number of expected components in the codestream\n" + " (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); #endif /* USE_JPWL */ -/* <<UniPG */ - fprintf(stdout,"\n"); + /* <<UniPG */ + fprintf(stdout,"\n"); } /* -------------------------------------------------------------------------- */ static OPJ_BOOL parse_precision(const char* option, opj_decompress_parameters* parameters) { - const char* l_remaining = option; - OPJ_BOOL l_result = OPJ_TRUE; - - /* reset */ - if (parameters->precision) { - free(parameters->precision); - parameters->precision = NULL; - } - parameters->nb_precision = 0U; - - for(;;) - { - int prec; - char mode; - char comma; - int count; - - count = sscanf(l_remaining, "%d%c%c", &prec, &mode, &comma); - if (count == 1) { - mode = 'C'; - count++; - } - if ((count == 2) || (mode==',')) { - if (mode==',') { - mode = 'C'; - } - comma=','; - count = 3; - } - if (count == 3) { - if ((prec < 1) || (prec > 32)) { - fprintf(stderr,"Invalid precision %d in precision option %s\n", prec, option); - l_result = OPJ_FALSE; - break; - } - if ((mode != 'C') && (mode != 'S')) { - fprintf(stderr,"Invalid precision mode %c in precision option %s\n", mode, option); - l_result = OPJ_FALSE; - break; - } - if (comma != ',') { - fprintf(stderr,"Invalid character %c in precision option %s\n", comma, option); - l_result = OPJ_FALSE; - break; - } - - if (parameters->precision == NULL) { - /* first one */ - parameters->precision = (opj_precision *)malloc(sizeof(opj_precision)); - if (parameters->precision == NULL) { - fprintf(stderr,"Could not allocate memory for precision option\n"); - l_result = OPJ_FALSE; - break; - } - } else { - OPJ_UINT32 l_new_size = parameters->nb_precision + 1U; - opj_precision* l_new; - - if (l_new_size == 0U) { - fprintf(stderr,"Could not allocate memory for precision option\n"); - l_result = OPJ_FALSE; - break; - } - - l_new = (opj_precision *)realloc(parameters->precision, l_new_size * sizeof(opj_precision)); - if (l_new == NULL) { - fprintf(stderr,"Could not allocate memory for precision option\n"); - l_result = OPJ_FALSE; - break; - } - parameters->precision = l_new; - } - - parameters->precision[parameters->nb_precision].prec = (OPJ_UINT32)prec; - switch (mode) { - case 'C': - parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_CLIP; - break; - case 'S': - parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_SCALE; - break; - default: - break; - } - parameters->nb_precision++; - - l_remaining = strchr(l_remaining, ','); - if (l_remaining == NULL) { - break; - } - l_remaining += 1; - } else { - fprintf(stderr,"Could not parse precision option %s\n", option); - l_result = OPJ_FALSE; - break; - } - } - - return l_result; + const char* l_remaining = option; + OPJ_BOOL l_result = OPJ_TRUE; + + /* reset */ + if (parameters->precision) { + free(parameters->precision); + parameters->precision = NULL; + } + parameters->nb_precision = 0U; + + for(;;) { + int prec; + char mode; + char comma; + int count; + + count = sscanf(l_remaining, "%d%c%c", &prec, &mode, &comma); + if (count == 1) { + mode = 'C'; + count++; + } + if ((count == 2) || (mode==',')) { + if (mode==',') { + mode = 'C'; + } + comma=','; + count = 3; + } + if (count == 3) { + if ((prec < 1) || (prec > 32)) { + fprintf(stderr,"Invalid precision %d in precision option %s\n", prec, option); + l_result = OPJ_FALSE; + break; + } + if ((mode != 'C') && (mode != 'S')) { + fprintf(stderr,"Invalid precision mode %c in precision option %s\n", mode, option); + l_result = OPJ_FALSE; + break; + } + if (comma != ',') { + fprintf(stderr,"Invalid character %c in precision option %s\n", comma, option); + l_result = OPJ_FALSE; + break; + } + + if (parameters->precision == NULL) { + /* first one */ + parameters->precision = (opj_precision *)malloc(sizeof(opj_precision)); + if (parameters->precision == NULL) { + fprintf(stderr,"Could not allocate memory for precision option\n"); + l_result = OPJ_FALSE; + break; + } + } else { + OPJ_UINT32 l_new_size = parameters->nb_precision + 1U; + opj_precision* l_new; + + if (l_new_size == 0U) { + fprintf(stderr,"Could not allocate memory for precision option\n"); + l_result = OPJ_FALSE; + break; + } + + l_new = (opj_precision *)realloc(parameters->precision, l_new_size * sizeof(opj_precision)); + if (l_new == NULL) { + fprintf(stderr,"Could not allocate memory for precision option\n"); + l_result = OPJ_FALSE; + break; + } + parameters->precision = l_new; + } + + parameters->precision[parameters->nb_precision].prec = (OPJ_UINT32)prec; + switch (mode) { + case 'C': + parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_CLIP; + break; + case 'S': + parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_SCALE; + break; + default: + break; + } + parameters->nb_precision++; + + l_remaining = strchr(l_remaining, ','); + if (l_remaining == NULL) { + break; + } + l_remaining += 1; + } else { + fprintf(stderr,"Could not parse precision option %s\n", option); + l_result = OPJ_FALSE; + break; + } + } + + return l_result; } /* -------------------------------------------------------------------------- */ -int get_num_images(char *imgdirpath){ - DIR *dir; - struct dirent* content; - int num_images = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 0; - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - num_images++; - } - closedir(dir); - return num_images; +int get_num_images(char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int num_images = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 0; + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + num_images++; + } + closedir(dir); + return num_images; } /* -------------------------------------------------------------------------- */ -int load_images(dircnt_t *dirptr, char *imgdirpath){ - DIR *dir; - struct dirent* content; - int i = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 1; - }else { - fprintf(stderr,"Folder opened successfully\n"); - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - - strcpy(dirptr->filename[i],content->d_name); - i++; - } - closedir(dir); - return 0; +int load_images(dircnt_t *dirptr, char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int i = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 1; + } else { + fprintf(stderr,"Folder opened successfully\n"); + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + + strcpy(dirptr->filename[i],content->d_name); + i++; + } + closedir(dir); + return 0; } /* -------------------------------------------------------------------------- */ -int get_file_format(const char *filename) { - unsigned int i; - static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "rawl", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; - static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, RAWL_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; - const char * ext = strrchr(filename, '.'); - if (ext == NULL) - return -1; - ext++; - if(*ext) { - for(i = 0; i < sizeof(format)/sizeof(*format); i++) { - if(strcasecmp(ext, extension[i]) == 0) { - return format[i]; - } - } - } - - return -1; +int get_file_format(const char *filename) +{ + unsigned int i; + static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "rawl", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; + static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, RAWL_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; + const char * ext = strrchr(filename, '.'); + if (ext == NULL) + return -1; + ext++; + if(*ext) { + for(i = 0; i < sizeof(format)/sizeof(*format); i++) { + if(strcasecmp(ext, extension[i]) == 0) { + return format[i]; + } + } + } + + return -1; } #ifdef _WIN32 @@ -422,33 +422,34 @@ const char* path_separator = "/"; #endif /* -------------------------------------------------------------------------- */ -char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_decompress_parameters *parameters){ - char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; - char *temp_p, temp1[OPJ_PATH_LEN]=""; - - strcpy(image_filename,dirptr->filename[imageno]); - fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); - sprintf(infilename, "%s%s%s", img_fol->imgdirpath, path_separator, image_filename); - parameters->decod_format = infile_format(infilename); - if (parameters->decod_format == -1) - return 1; - if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infilename) != 0) { - return 1; - } - - /*Set output file*/ - strcpy(temp_ofname,strtok(image_filename,".")); - while((temp_p = strtok(NULL,".")) != NULL){ - strcat(temp_ofname,temp1); - sprintf(temp1,".%s",temp_p); - } - if(img_fol->set_out_format==1){ - sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); - if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfilename) != 0) { - return 1; - } - } - return 0; +char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_decompress_parameters *parameters) +{ + char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; + char *temp_p, temp1[OPJ_PATH_LEN]=""; + + strcpy(image_filename,dirptr->filename[imageno]); + fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); + sprintf(infilename, "%s%s%s", img_fol->imgdirpath, path_separator, image_filename); + parameters->decod_format = infile_format(infilename); + if (parameters->decod_format == -1) + return 1; + if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infilename) != 0) { + return 1; + } + + /*Set output file*/ + strcpy(temp_ofname,strtok(image_filename,".")); + while((temp_p = strtok(NULL,".")) != NULL) { + strcat(temp_ofname,temp1); + sprintf(temp1,".%s",temp_p); + } + if(img_fol->set_out_format==1) { + sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); + if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfilename) != 0) { + return 1; + } + } + return 0; } /* -------------------------------------------------------------------------- */ @@ -459,52 +460,50 @@ char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_decompre static int infile_format(const char *fname) { - FILE *reader; - const char *s, *magic_s; - int ext_format, magic_format; - unsigned char buf[12]; - OPJ_SIZE_T l_nb_read; + FILE *reader; + const char *s, *magic_s; + int ext_format, magic_format; + unsigned char buf[12]; + OPJ_SIZE_T l_nb_read; - reader = fopen(fname, "rb"); + reader = fopen(fname, "rb"); - if (reader == NULL) - return -2; + if (reader == NULL) + return -2; - memset(buf, 0, 12); - l_nb_read = fread(buf, 1, 12, reader); - fclose(reader); - if (l_nb_read != 12) - return -1; + memset(buf, 0, 12); + l_nb_read = fread(buf, 1, 12, reader); + fclose(reader); + if (l_nb_read != 12) + return -1; - ext_format = get_file_format(fname); + ext_format = get_file_format(fname); - if (ext_format == JPT_CFMT) - return JPT_CFMT; + if (ext_format == JPT_CFMT) + return JPT_CFMT; - if (memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 || memcmp(buf, JP2_MAGIC, 4) == 0) { - magic_format = JP2_CFMT; - magic_s = ".jp2"; - } - else if (memcmp(buf, J2K_CODESTREAM_MAGIC, 4) == 0) { - magic_format = J2K_CFMT; - magic_s = ".j2k or .jpc or .j2c"; - } - else - return -1; + if (memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 || memcmp(buf, JP2_MAGIC, 4) == 0) { + magic_format = JP2_CFMT; + magic_s = ".jp2"; + } else if (memcmp(buf, J2K_CODESTREAM_MAGIC, 4) == 0) { + magic_format = J2K_CFMT; + magic_s = ".j2k or .jpc or .j2c"; + } else + return -1; - if (magic_format == ext_format) - return ext_format; + if (magic_format == ext_format) + return ext_format; - s = fname + strlen(fname) - 4; + s = fname + strlen(fname) - 4; - fputs("\n===========================================\n", stderr); - fprintf(stderr, "The extension of this file is incorrect.\n" - "FOUND %s. SHOULD BE %s\n", s, magic_s); - fputs("===========================================\n", stderr); + fputs("\n===========================================\n", stderr); + fprintf(stderr, "The extension of this file is incorrect.\n" + "FOUND %s. SHOULD BE %s\n", s, magic_s); + fputs("===========================================\n", stderr); - return magic_format; + return magic_format; } /* -------------------------------------------------------------------------- */ @@ -512,334 +511,323 @@ static int infile_format(const char *fname) * Parse the command line */ /* -------------------------------------------------------------------------- */ -int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *parameters,img_fol_t *img_fol) { - /* parse the command line */ - int totlen, c; - opj_option_t long_option[]={ - {"ImgDir", REQ_ARG, NULL,'y'}, - {"OutFor", REQ_ARG, NULL,'O'}, - {"force-rgb", NO_ARG, NULL, 1}, - {"upsample", NO_ARG, NULL, 1}, - {"split-pnm", NO_ARG, NULL, 1} - }; - - const char optlist[] = "i:o:r:l:x:d:t:p:" - -/* UniPG>> */ +int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *parameters,img_fol_t *img_fol) +{ + /* parse the command line */ + int totlen, c; + opj_option_t long_option[]= { + {"ImgDir", REQ_ARG, NULL,'y'}, + {"OutFor", REQ_ARG, NULL,'O'}, + {"force-rgb", NO_ARG, NULL, 1}, + {"upsample", NO_ARG, NULL, 1}, + {"split-pnm", NO_ARG, NULL, 1} + }; + + const char optlist[] = "i:o:r:l:x:d:t:p:" + + /* UniPG>> */ #ifdef USE_JPWL - "W:" + "W:" #endif /* USE_JPWL */ -/* <<UniPG */ - "h" ; - - long_option[2].flag = &(parameters->force_rgb); - long_option[3].flag = &(parameters->upsample); - long_option[4].flag = &(parameters->split_pnm); - totlen=sizeof(long_option); - opj_reset_options_reading(); - img_fol->set_out_format = 0; - do { - c = opj_getopt_long(argc, argv,optlist,long_option,totlen); - if (c == -1) - break; - switch (c) { - case 0: /* long opt with flag */ - break; - case 'i': /* input file */ - { - char *infile = opj_optarg; - parameters->decod_format = infile_format(infile); - switch(parameters->decod_format) { - case J2K_CFMT: - break; - case JP2_CFMT: - break; - case JPT_CFMT: - break; - case -2: - fprintf(stderr, - "!! infile cannot be read: %s !!\n\n", - infile); - return 1; - default: - fprintf(stderr, - "[ERROR] Unknown input file format: %s \n" - " Known file formats are *.j2k, *.jp2, *.jpc or *.jpt\n", - infile); - return 1; - } - if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infile) != 0) { - fprintf(stderr, "[ERROR] Path is too long\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'o': /* output file */ - { - char *outfile = opj_optarg; - parameters->cod_format = get_file_format(outfile); - switch(parameters->cod_format) { - case PGX_DFMT: - break; - case PXM_DFMT: - break; - case BMP_DFMT: - break; - case TIF_DFMT: - break; - case RAW_DFMT: - break; - case RAWL_DFMT: - break; - case TGA_DFMT: - break; - case PNG_DFMT: - break; - default: - fprintf(stderr, "Unknown output format image %s [only *.png, *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!!\n", outfile); - return 1; - } - if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfile) != 0) { - fprintf(stderr, "[ERROR] Path is too long\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'O': /* output format */ - { - char outformat[50]; - char *of = opj_optarg; - sprintf(outformat,".%s",of); - img_fol->set_out_format = 1; - parameters->cod_format = get_file_format(outformat); - switch(parameters->cod_format) { - case PGX_DFMT: - img_fol->out_format = "pgx"; - break; - case PXM_DFMT: - img_fol->out_format = "ppm"; - break; - case BMP_DFMT: - img_fol->out_format = "bmp"; - break; - case TIF_DFMT: - img_fol->out_format = "tif"; - break; - case RAW_DFMT: - img_fol->out_format = "raw"; - break; - case RAWL_DFMT: - img_fol->out_format = "rawl"; - break; - case TGA_DFMT: - img_fol->out_format = "raw"; - break; - case PNG_DFMT: - img_fol->out_format = "png"; - break; - default: - fprintf(stderr, "Unknown output format image %s [only *.png, *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!!\n", outformat); - return 1; - break; - } - } - break; - - /* ----------------------------------------------------- */ - - - case 'r': /* reduce option */ - { - sscanf(opj_optarg, "%u", &(parameters->core.cp_reduce)); - } - break; - - /* ----------------------------------------------------- */ - - - case 'l': /* layering option */ - { - sscanf(opj_optarg, "%u", &(parameters->core.cp_layer)); - } - break; - - /* ----------------------------------------------------- */ - - case 'h': /* display an help description */ - decode_help_display(); - return 1; - + /* <<UniPG */ + "h" ; + + long_option[2].flag = &(parameters->force_rgb); + long_option[3].flag = &(parameters->upsample); + long_option[4].flag = &(parameters->split_pnm); + totlen=sizeof(long_option); + opj_reset_options_reading(); + img_fol->set_out_format = 0; + do { + c = opj_getopt_long(argc, argv,optlist,long_option,totlen); + if (c == -1) + break; + switch (c) { + case 0: /* long opt with flag */ + break; + case 'i': { /* input file */ + char *infile = opj_optarg; + parameters->decod_format = infile_format(infile); + switch(parameters->decod_format) { + case J2K_CFMT: + break; + case JP2_CFMT: + break; + case JPT_CFMT: + break; + case -2: + fprintf(stderr, + "!! infile cannot be read: %s !!\n\n", + infile); + return 1; + default: + fprintf(stderr, + "[ERROR] Unknown input file format: %s \n" + " Known file formats are *.j2k, *.jp2, *.jpc or *.jpt\n", + infile); + return 1; + } + if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infile) != 0) { + fprintf(stderr, "[ERROR] Path is too long\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'o': { /* output file */ + char *outfile = opj_optarg; + parameters->cod_format = get_file_format(outfile); + switch(parameters->cod_format) { + case PGX_DFMT: + break; + case PXM_DFMT: + break; + case BMP_DFMT: + break; + case TIF_DFMT: + break; + case RAW_DFMT: + break; + case RAWL_DFMT: + break; + case TGA_DFMT: + break; + case PNG_DFMT: + break; + default: + fprintf(stderr, "Unknown output format image %s [only *.png, *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!!\n", outfile); + return 1; + } + if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfile) != 0) { + fprintf(stderr, "[ERROR] Path is too long\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'O': { /* output format */ + char outformat[50]; + char *of = opj_optarg; + sprintf(outformat,".%s",of); + img_fol->set_out_format = 1; + parameters->cod_format = get_file_format(outformat); + switch(parameters->cod_format) { + case PGX_DFMT: + img_fol->out_format = "pgx"; + break; + case PXM_DFMT: + img_fol->out_format = "ppm"; + break; + case BMP_DFMT: + img_fol->out_format = "bmp"; + break; + case TIF_DFMT: + img_fol->out_format = "tif"; + break; + case RAW_DFMT: + img_fol->out_format = "raw"; + break; + case RAWL_DFMT: + img_fol->out_format = "rawl"; + break; + case TGA_DFMT: + img_fol->out_format = "raw"; + break; + case PNG_DFMT: + img_fol->out_format = "png"; + break; + default: + fprintf(stderr, "Unknown output format image %s [only *.png, *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!!\n", outformat); + return 1; + break; + } + } + break; + + /* ----------------------------------------------------- */ + + + case 'r': { /* reduce option */ + sscanf(opj_optarg, "%u", &(parameters->core.cp_reduce)); + } + break; + + /* ----------------------------------------------------- */ + + + case 'l': { /* layering option */ + sscanf(opj_optarg, "%u", &(parameters->core.cp_layer)); + } + break; + + /* ----------------------------------------------------- */ + + case 'h': /* display an help description */ + decode_help_display(); + return 1; + + /* ----------------------------------------------------- */ + + case 'y': { /* Image Directory path */ + img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); + strcpy(img_fol->imgdirpath,opj_optarg); + img_fol->set_imgdir=1; + } + break; + + /* ----------------------------------------------------- */ + + case 'd': { /* Input decode ROI */ + size_t size_optarg = (size_t)strlen(opj_optarg) + 1U; + char *ROI_values = (char*) malloc(size_optarg); + if (ROI_values == NULL) { + fprintf(stderr, "[ERROR] Couldn't allocate memory\n"); + return 1; + } + ROI_values[0] = '\0'; + memcpy(ROI_values, opj_optarg, size_optarg); + /*printf("ROI_values = %s [%d / %d]\n", ROI_values, strlen(ROI_values), size_optarg ); */ + parse_DA_values( ROI_values, ¶meters->DA_x0, ¶meters->DA_y0, ¶meters->DA_x1, ¶meters->DA_y1); + + free(ROI_values); + } + break; + + /* ----------------------------------------------------- */ + + case 't': { /* Input tile index */ + sscanf(opj_optarg, "%u", ¶meters->tile_index); + parameters->nb_tile_to_decode = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'x': { /* Creation of index file */ + if (opj_strcpy_s(parameters->indexfilename, sizeof(parameters->indexfilename), opj_optarg) != 0) { + fprintf(stderr, "[ERROR] Path is too long\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + case 'p': { /* Force precision */ + if (!parse_precision(opj_optarg, parameters)) { + return 1; + } + } + break; /* ----------------------------------------------------- */ - case 'y': /* Image Directory path */ - { - img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); - strcpy(img_fol->imgdirpath,opj_optarg); - img_fol->set_imgdir=1; - } - break; - - /* ----------------------------------------------------- */ - - case 'd': /* Input decode ROI */ - { - size_t size_optarg = (size_t)strlen(opj_optarg) + 1U; - char *ROI_values = (char*) malloc(size_optarg); - if (ROI_values == NULL) { - fprintf(stderr, "[ERROR] Couldn't allocate memory\n"); - return 1; - } - ROI_values[0] = '\0'; - memcpy(ROI_values, opj_optarg, size_optarg); - /*printf("ROI_values = %s [%d / %d]\n", ROI_values, strlen(ROI_values), size_optarg ); */ - parse_DA_values( ROI_values, ¶meters->DA_x0, ¶meters->DA_y0, ¶meters->DA_x1, ¶meters->DA_y1); - - free(ROI_values); - } - break; - - /* ----------------------------------------------------- */ - - case 't': /* Input tile index */ - { - sscanf(opj_optarg, "%u", ¶meters->tile_index); - parameters->nb_tile_to_decode = 1; - } - break; - - /* ----------------------------------------------------- */ - - case 'x': /* Creation of index file */ - { - if (opj_strcpy_s(parameters->indexfilename, sizeof(parameters->indexfilename), opj_optarg) != 0) { - fprintf(stderr, "[ERROR] Path is too long\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - case 'p': /* Force precision */ - { - if (!parse_precision(opj_optarg, parameters)) - { - return 1; - } - } - break; - /* ----------------------------------------------------- */ - - /* UniPG>> */ + /* UniPG>> */ #ifdef USE_JPWL - - case 'W': /* activate JPWL correction */ - { - char *token = NULL; - - token = strtok(opj_optarg, ","); - while(token != NULL) { - - /* search expected number of components */ - if (*token == 'c') { - - static int compno; - - compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ - - if(sscanf(token, "c=%d", &compno) == 1) { - /* Specified */ - if ((compno < 1) || (compno > 256)) { - fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); - return 1; - } - parameters->jpwl_exp_comps = compno; - - } else if (!strcmp(token, "c")) { - /* default */ - parameters->jpwl_exp_comps = compno; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); - return 1; - }; - } - - /* search maximum number of tiles */ - if (*token == 't') { - - static int tileno; - - tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ - - if(sscanf(token, "t=%d", &tileno) == 1) { - /* Specified */ - if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { - fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); - return 1; - } - parameters->jpwl_max_tiles = tileno; - - } else if (!strcmp(token, "t")) { - /* default */ - parameters->jpwl_max_tiles = tileno; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); - return 1; - }; - } - - /* next token or bust */ - token = strtok(NULL, ","); - }; - parameters->jpwl_correct = OPJ_TRUE; - fprintf(stdout, "JPWL correction capability activated\n"); - fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); - } - break; + + case 'W': { /* activate JPWL correction */ + char *token = NULL; + + token = strtok(opj_optarg, ","); + while(token != NULL) { + + /* search expected number of components */ + if (*token == 'c') { + + static int compno; + + compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ + + if(sscanf(token, "c=%d", &compno) == 1) { + /* Specified */ + if ((compno < 1) || (compno > 256)) { + fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); + return 1; + } + parameters->jpwl_exp_comps = compno; + + } else if (!strcmp(token, "c")) { + /* default */ + parameters->jpwl_exp_comps = compno; /* auto for default size */ + + } else { + fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); + return 1; + }; + } + + /* search maximum number of tiles */ + if (*token == 't') { + + static int tileno; + + tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ + + if(sscanf(token, "t=%d", &tileno) == 1) { + /* Specified */ + if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { + fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); + return 1; + } + parameters->jpwl_max_tiles = tileno; + + } else if (!strcmp(token, "t")) { + /* default */ + parameters->jpwl_max_tiles = tileno; /* auto for default size */ + + } else { + fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); + return 1; + }; + } + + /* next token or bust */ + token = strtok(NULL, ","); + }; + parameters->jpwl_correct = OPJ_TRUE; + fprintf(stdout, "JPWL correction capability activated\n"); + fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); + } + break; #endif /* USE_JPWL */ -/* <<UniPG */ + /* <<UniPG */ + + /* ----------------------------------------------------- */ - /* ----------------------------------------------------- */ - default: fprintf(stderr, "[WARNING] An invalid option has been ignored.\n"); break; - } - }while(c != -1); + } + } while(c != -1); - /* check for possible errors */ - if(img_fol->set_imgdir==1){ - if(!(parameters->infile[0]==0)){ + /* check for possible errors */ + if(img_fol->set_imgdir==1) { + if(!(parameters->infile[0]==0)) { fprintf(stderr, "[ERROR] options -ImgDir and -i cannot be used together.\n"); - return 1; - } - if(img_fol->set_out_format == 0){ + return 1; + } + if(img_fol->set_out_format == 0) { fprintf(stderr, "[ERROR] When -ImgDir is used, -OutFor <FORMAT> must be used.\n"); fprintf(stderr, "Only one format allowed.\n" - "Valid format are PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA.\n"); - return 1; - } - if(!((parameters->outfile[0] == 0))){ + "Valid format are PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA.\n"); + return 1; + } + if(!((parameters->outfile[0] == 0))) { fprintf(stderr, "[ERROR] options -ImgDir and -o cannot be used together.\n"); - return 1; - } - }else{ - if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { + return 1; + } + } else { + if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { fprintf(stderr, "[ERROR] Required parameters are missing\n" - "Example: %s -i image.j2k -o image.pgm\n",argv[0]); + "Example: %s -i image.j2k -o image.pgm\n",argv[0]); fprintf(stderr, " Help: %s -h\n",argv[0]); - return 1; - } - } + return 1; + } + } - return 0; + return 0; } /* -------------------------------------------------------------------------- */ @@ -850,46 +838,48 @@ int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *para /* -------------------------------------------------------------------------- */ int parse_DA_values( char* inArg, unsigned int *DA_x0, unsigned int *DA_y0, unsigned int *DA_x1, unsigned int *DA_y1) { - int it = 0; - int values[4]; - char delims[] = ","; - char *result = NULL; - result = strtok( inArg, delims ); - - while( (result != NULL) && (it < 4 ) ) { - values[it] = atoi(result); - result = strtok( NULL, delims ); - it++; - } - - if (it != 4) { - return EXIT_FAILURE; - } - else{ - *DA_x0 = (OPJ_UINT32)values[0]; *DA_y0 = (OPJ_UINT32)values[1]; - *DA_x1 = (OPJ_UINT32)values[2]; *DA_y1 = (OPJ_UINT32)values[3]; - return EXIT_SUCCESS; - } + int it = 0; + int values[4]; + char delims[] = ","; + char *result = NULL; + result = strtok( inArg, delims ); + + while( (result != NULL) && (it < 4 ) ) { + values[it] = atoi(result); + result = strtok( NULL, delims ); + it++; + } + + if (it != 4) { + return EXIT_FAILURE; + } else { + *DA_x0 = (OPJ_UINT32)values[0]; + *DA_y0 = (OPJ_UINT32)values[1]; + *DA_x1 = (OPJ_UINT32)values[2]; + *DA_y1 = (OPJ_UINT32)values[3]; + return EXIT_SUCCESS; + } } -OPJ_FLOAT64 opj_clock(void) { +OPJ_FLOAT64 opj_clock(void) +{ #ifdef _WIN32 - /* _WIN32: use QueryPerformance (very accurate) */ + /* _WIN32: use QueryPerformance (very accurate) */ LARGE_INTEGER freq , t ; /* freq is the clock speed of the CPU */ QueryPerformanceFrequency(&freq) ; - /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ + /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ /* t is the high resolution performance counter (see MSDN) */ QueryPerformanceCounter ( & t ) ; - return freq.QuadPart ? (t.QuadPart / (OPJ_FLOAT64)freq.QuadPart) : 0; + return freq.QuadPart ? (t.QuadPart / (OPJ_FLOAT64)freq.QuadPart) : 0; #else - /* Unix or Linux: use resource usage */ + /* Unix or Linux: use resource usage */ struct rusage t; OPJ_FLOAT64 procTime; /* (1) Get the rusage data structure at this moment (man getrusage) */ getrusage(0,&t); /* (2) What is the elapsed time ? - CPU time = User time + System time */ - /* (2a) Get the seconds */ + /* (2a) Get the seconds */ procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec); /* (2b) More precisely! Get the microseconds part ! */ return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; @@ -901,275 +891,277 @@ OPJ_FLOAT64 opj_clock(void) { /** sample error callback expecting a FILE* client object */ -static void error_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[ERROR] %s", msg); +static void error_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -static void warning_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[WARNING] %s", msg); +static void warning_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[WARNING] %s", msg); } /** sample debug callback expecting no client object */ -static void info_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[INFO] %s", msg); +static void info_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[INFO] %s", msg); } static void set_default_parameters(opj_decompress_parameters* parameters) { - if (parameters) { - memset(parameters, 0, sizeof(opj_decompress_parameters)); - - /* default decoding parameters (command line specific) */ - parameters->decod_format = -1; - parameters->cod_format = -1; - - /* default decoding parameters (core) */ - opj_set_default_decoder_parameters(&(parameters->core)); - } + if (parameters) { + memset(parameters, 0, sizeof(opj_decompress_parameters)); + + /* default decoding parameters (command line specific) */ + parameters->decod_format = -1; + parameters->cod_format = -1; + + /* default decoding parameters (core) */ + opj_set_default_decoder_parameters(&(parameters->core)); + } } static void destroy_parameters(opj_decompress_parameters* parameters) { - if (parameters) { - if (parameters->precision) { - free(parameters->precision); - parameters->precision = NULL; - } - } + if (parameters) { + if (parameters->precision) { + free(parameters->precision); + parameters->precision = NULL; + } + } } /* -------------------------------------------------------------------------- */ static opj_image_t* convert_gray_to_rgb(opj_image_t* original) { - OPJ_UINT32 compno; - opj_image_t* l_new_image = NULL; - opj_image_cmptparm_t* l_new_components = NULL; - - l_new_components = (opj_image_cmptparm_t*)malloc((original->numcomps + 2U) * sizeof(opj_image_cmptparm_t)); - if (l_new_components == NULL) { - fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n"); - opj_image_destroy(original); - return NULL; - } - - l_new_components[0].bpp = l_new_components[1].bpp = l_new_components[2].bpp = original->comps[0].bpp; - l_new_components[0].dx = l_new_components[1].dx = l_new_components[2].dx = original->comps[0].dx; - l_new_components[0].dy = l_new_components[1].dy = l_new_components[2].dy = original->comps[0].dy; - l_new_components[0].h = l_new_components[1].h = l_new_components[2].h = original->comps[0].h; - l_new_components[0].w = l_new_components[1].w = l_new_components[2].w = original->comps[0].w; - l_new_components[0].prec = l_new_components[1].prec = l_new_components[2].prec = original->comps[0].prec; - l_new_components[0].sgnd = l_new_components[1].sgnd = l_new_components[2].sgnd = original->comps[0].sgnd; - l_new_components[0].x0 = l_new_components[1].x0 = l_new_components[2].x0 = original->comps[0].x0; - l_new_components[0].y0 = l_new_components[1].y0 = l_new_components[2].y0 = original->comps[0].y0; - - for(compno = 1U; compno < original->numcomps; ++compno) { - l_new_components[compno+2U].bpp = original->comps[compno].bpp; - l_new_components[compno+2U].dx = original->comps[compno].dx; - l_new_components[compno+2U].dy = original->comps[compno].dy; - l_new_components[compno+2U].h = original->comps[compno].h; - l_new_components[compno+2U].w = original->comps[compno].w; - l_new_components[compno+2U].prec = original->comps[compno].prec; - l_new_components[compno+2U].sgnd = original->comps[compno].sgnd; - l_new_components[compno+2U].x0 = original->comps[compno].x0; - l_new_components[compno+2U].y0 = original->comps[compno].y0; - } - - l_new_image = opj_image_create(original->numcomps + 2U, l_new_components, OPJ_CLRSPC_SRGB); - free(l_new_components); - if (l_new_image == NULL) { - fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n"); - opj_image_destroy(original); - return NULL; - } - - l_new_image->x0 = original->x0; - l_new_image->x1 = original->x1; - l_new_image->y0 = original->y0; - l_new_image->y1 = original->y1; - - l_new_image->comps[0].factor = l_new_image->comps[1].factor = l_new_image->comps[2].factor = original->comps[0].factor; - l_new_image->comps[0].alpha = l_new_image->comps[1].alpha = l_new_image->comps[2].alpha = original->comps[0].alpha; - l_new_image->comps[0].resno_decoded = l_new_image->comps[1].resno_decoded = l_new_image->comps[2].resno_decoded = original->comps[0].resno_decoded; - - memcpy(l_new_image->comps[0].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); - memcpy(l_new_image->comps[1].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); - memcpy(l_new_image->comps[2].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); - - for(compno = 1U; compno < original->numcomps; ++compno) { - l_new_image->comps[compno+2U].factor = original->comps[compno].factor; - l_new_image->comps[compno+2U].alpha = original->comps[compno].alpha; - l_new_image->comps[compno+2U].resno_decoded = original->comps[compno].resno_decoded; - memcpy(l_new_image->comps[compno+2U].data, original->comps[compno].data, original->comps[compno].w * original->comps[compno].h * sizeof(OPJ_INT32)); - } - opj_image_destroy(original); - return l_new_image; + OPJ_UINT32 compno; + opj_image_t* l_new_image = NULL; + opj_image_cmptparm_t* l_new_components = NULL; + + l_new_components = (opj_image_cmptparm_t*)malloc((original->numcomps + 2U) * sizeof(opj_image_cmptparm_t)); + if (l_new_components == NULL) { + fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n"); + opj_image_destroy(original); + return NULL; + } + + l_new_components[0].bpp = l_new_components[1].bpp = l_new_components[2].bpp = original->comps[0].bpp; + l_new_components[0].dx = l_new_components[1].dx = l_new_components[2].dx = original->comps[0].dx; + l_new_components[0].dy = l_new_components[1].dy = l_new_components[2].dy = original->comps[0].dy; + l_new_components[0].h = l_new_components[1].h = l_new_components[2].h = original->comps[0].h; + l_new_components[0].w = l_new_components[1].w = l_new_components[2].w = original->comps[0].w; + l_new_components[0].prec = l_new_components[1].prec = l_new_components[2].prec = original->comps[0].prec; + l_new_components[0].sgnd = l_new_components[1].sgnd = l_new_components[2].sgnd = original->comps[0].sgnd; + l_new_components[0].x0 = l_new_components[1].x0 = l_new_components[2].x0 = original->comps[0].x0; + l_new_components[0].y0 = l_new_components[1].y0 = l_new_components[2].y0 = original->comps[0].y0; + + for(compno = 1U; compno < original->numcomps; ++compno) { + l_new_components[compno+2U].bpp = original->comps[compno].bpp; + l_new_components[compno+2U].dx = original->comps[compno].dx; + l_new_components[compno+2U].dy = original->comps[compno].dy; + l_new_components[compno+2U].h = original->comps[compno].h; + l_new_components[compno+2U].w = original->comps[compno].w; + l_new_components[compno+2U].prec = original->comps[compno].prec; + l_new_components[compno+2U].sgnd = original->comps[compno].sgnd; + l_new_components[compno+2U].x0 = original->comps[compno].x0; + l_new_components[compno+2U].y0 = original->comps[compno].y0; + } + + l_new_image = opj_image_create(original->numcomps + 2U, l_new_components, OPJ_CLRSPC_SRGB); + free(l_new_components); + if (l_new_image == NULL) { + fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n"); + opj_image_destroy(original); + return NULL; + } + + l_new_image->x0 = original->x0; + l_new_image->x1 = original->x1; + l_new_image->y0 = original->y0; + l_new_image->y1 = original->y1; + + l_new_image->comps[0].factor = l_new_image->comps[1].factor = l_new_image->comps[2].factor = original->comps[0].factor; + l_new_image->comps[0].alpha = l_new_image->comps[1].alpha = l_new_image->comps[2].alpha = original->comps[0].alpha; + l_new_image->comps[0].resno_decoded = l_new_image->comps[1].resno_decoded = l_new_image->comps[2].resno_decoded = original->comps[0].resno_decoded; + + memcpy(l_new_image->comps[0].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); + memcpy(l_new_image->comps[1].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); + memcpy(l_new_image->comps[2].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); + + for(compno = 1U; compno < original->numcomps; ++compno) { + l_new_image->comps[compno+2U].factor = original->comps[compno].factor; + l_new_image->comps[compno+2U].alpha = original->comps[compno].alpha; + l_new_image->comps[compno+2U].resno_decoded = original->comps[compno].resno_decoded; + memcpy(l_new_image->comps[compno+2U].data, original->comps[compno].data, original->comps[compno].w * original->comps[compno].h * sizeof(OPJ_INT32)); + } + opj_image_destroy(original); + return l_new_image; } /* -------------------------------------------------------------------------- */ static opj_image_t* upsample_image_components(opj_image_t* original) { - opj_image_t* l_new_image = NULL; - opj_image_cmptparm_t* l_new_components = NULL; - OPJ_BOOL l_upsample_need = OPJ_FALSE; - OPJ_UINT32 compno; - - for (compno = 0U; compno < original->numcomps; ++compno) { - if (original->comps[compno].factor > 0U) { - fprintf(stderr, "ERROR -> opj_decompress: -upsample not supported with reduction\n"); - opj_image_destroy(original); - return NULL; - } - if ((original->comps[compno].dx > 1U) || (original->comps[compno].dy > 1U)) { - l_upsample_need = OPJ_TRUE; - break; - } - } - if (!l_upsample_need) { - return original; - } - /* Upsample is needed */ - l_new_components = (opj_image_cmptparm_t*)malloc(original->numcomps * sizeof(opj_image_cmptparm_t)); - if (l_new_components == NULL) { - fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for upsampled components!\n"); - opj_image_destroy(original); - return NULL; - } - - for (compno = 0U; compno < original->numcomps; ++compno) { - opj_image_cmptparm_t* l_new_cmp = &(l_new_components[compno]); - opj_image_comp_t* l_org_cmp = &(original->comps[compno]); - - l_new_cmp->bpp = l_org_cmp->bpp; - l_new_cmp->prec = l_org_cmp->prec; - l_new_cmp->sgnd = l_org_cmp->sgnd; - l_new_cmp->x0 = original->x0; - l_new_cmp->y0 = original->y0; - l_new_cmp->dx = 1; - l_new_cmp->dy = 1; - l_new_cmp->w = l_org_cmp->w; /* should be original->x1 - original->x0 for dx==1 */ - l_new_cmp->h = l_org_cmp->h; /* should be original->y1 - original->y0 for dy==0 */ - - if (l_org_cmp->dx > 1U) { - l_new_cmp->w = original->x1 - original->x0; - } - - if (l_org_cmp->dy > 1U) { - l_new_cmp->h = original->y1 - original->y0; - } - } - - l_new_image = opj_image_create(original->numcomps, l_new_components, original->color_space); - free(l_new_components); - if (l_new_image == NULL) { - fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for upsampled components!\n"); - opj_image_destroy(original); - return NULL; - } - - l_new_image->x0 = original->x0; - l_new_image->x1 = original->x1; - l_new_image->y0 = original->y0; - l_new_image->y1 = original->y1; - - for (compno = 0U; compno < original->numcomps; ++compno) { - opj_image_comp_t* l_new_cmp = &(l_new_image->comps[compno]); - opj_image_comp_t* l_org_cmp = &(original->comps[compno]); - - l_new_cmp->factor = l_org_cmp->factor; - l_new_cmp->alpha = l_org_cmp->alpha; - l_new_cmp->resno_decoded = l_org_cmp->resno_decoded; - - if ((l_org_cmp->dx > 1U) || (l_org_cmp->dy > 1U)) { - const OPJ_INT32* l_src = l_org_cmp->data; - OPJ_INT32* l_dst = l_new_cmp->data; - OPJ_UINT32 y; - OPJ_UINT32 xoff, yoff; - - /* need to take into account dx & dy */ - xoff = l_org_cmp->dx * l_org_cmp->x0 - original->x0; - yoff = l_org_cmp->dy * l_org_cmp->y0 - original->y0; - if ((xoff >= l_org_cmp->dx) || (yoff >= l_org_cmp->dy)) { - fprintf(stderr, "ERROR -> opj_decompress: Invalid image/component parameters found when upsampling\n"); - opj_image_destroy(original); - opj_image_destroy(l_new_image); - return NULL; - } - - for (y = 0U; y < yoff; ++y) { - memset(l_dst, 0U, l_new_cmp->w * sizeof(OPJ_INT32)); - l_dst += l_new_cmp->w; - } - - if(l_new_cmp->h > (l_org_cmp->dy - 1U)) { /* check subtraction overflow for really small images */ - for (; y < l_new_cmp->h - (l_org_cmp->dy - 1U); y += l_org_cmp->dy) { - OPJ_UINT32 x, dy; - OPJ_UINT32 xorg; - - xorg = 0U; - for (x = 0U; x < xoff; ++x) { - l_dst[x] = 0; - } - if (l_new_cmp->w > (l_org_cmp->dx - 1U)) { /* check subtraction overflow for really small images */ - for (; x < l_new_cmp->w - (l_org_cmp->dx - 1U); x += l_org_cmp->dx, ++xorg) { - OPJ_UINT32 dx; - for (dx = 0U; dx < l_org_cmp->dx; ++dx) { - l_dst[x + dx] = l_src[xorg]; - } - } - } - for (; x < l_new_cmp->w; ++x) { - l_dst[x] = l_src[xorg]; - } - l_dst += l_new_cmp->w; - - for (dy = 1U; dy < l_org_cmp->dy; ++dy) { - memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(OPJ_INT32)); - l_dst += l_new_cmp->w; - } - l_src += l_org_cmp->w; - } - } - if (y < l_new_cmp->h) { - OPJ_UINT32 x; - OPJ_UINT32 xorg; - - xorg = 0U; - for (x = 0U; x < xoff; ++x) { - l_dst[x] = 0; - } - if (l_new_cmp->w > (l_org_cmp->dx - 1U)) { /* check subtraction overflow for really small images */ - for (; x < l_new_cmp->w - (l_org_cmp->dx - 1U); x += l_org_cmp->dx, ++xorg) { - OPJ_UINT32 dx; - for (dx = 0U; dx < l_org_cmp->dx; ++dx) { - l_dst[x + dx] = l_src[xorg]; - } - } - } - for (; x < l_new_cmp->w; ++x) { - l_dst[x] = l_src[xorg]; - } - l_dst += l_new_cmp->w; - ++y; - for (; y < l_new_cmp->h; ++y) { - memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(OPJ_INT32)); - l_dst += l_new_cmp->w; - } - } - } - else { - memcpy(l_new_cmp->data, l_org_cmp->data, l_org_cmp->w * l_org_cmp->h * sizeof(OPJ_INT32)); - } - } - opj_image_destroy(original); - return l_new_image; + opj_image_t* l_new_image = NULL; + opj_image_cmptparm_t* l_new_components = NULL; + OPJ_BOOL l_upsample_need = OPJ_FALSE; + OPJ_UINT32 compno; + + for (compno = 0U; compno < original->numcomps; ++compno) { + if (original->comps[compno].factor > 0U) { + fprintf(stderr, "ERROR -> opj_decompress: -upsample not supported with reduction\n"); + opj_image_destroy(original); + return NULL; + } + if ((original->comps[compno].dx > 1U) || (original->comps[compno].dy > 1U)) { + l_upsample_need = OPJ_TRUE; + break; + } + } + if (!l_upsample_need) { + return original; + } + /* Upsample is needed */ + l_new_components = (opj_image_cmptparm_t*)malloc(original->numcomps * sizeof(opj_image_cmptparm_t)); + if (l_new_components == NULL) { + fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for upsampled components!\n"); + opj_image_destroy(original); + return NULL; + } + + for (compno = 0U; compno < original->numcomps; ++compno) { + opj_image_cmptparm_t* l_new_cmp = &(l_new_components[compno]); + opj_image_comp_t* l_org_cmp = &(original->comps[compno]); + + l_new_cmp->bpp = l_org_cmp->bpp; + l_new_cmp->prec = l_org_cmp->prec; + l_new_cmp->sgnd = l_org_cmp->sgnd; + l_new_cmp->x0 = original->x0; + l_new_cmp->y0 = original->y0; + l_new_cmp->dx = 1; + l_new_cmp->dy = 1; + l_new_cmp->w = l_org_cmp->w; /* should be original->x1 - original->x0 for dx==1 */ + l_new_cmp->h = l_org_cmp->h; /* should be original->y1 - original->y0 for dy==0 */ + + if (l_org_cmp->dx > 1U) { + l_new_cmp->w = original->x1 - original->x0; + } + + if (l_org_cmp->dy > 1U) { + l_new_cmp->h = original->y1 - original->y0; + } + } + + l_new_image = opj_image_create(original->numcomps, l_new_components, original->color_space); + free(l_new_components); + if (l_new_image == NULL) { + fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for upsampled components!\n"); + opj_image_destroy(original); + return NULL; + } + + l_new_image->x0 = original->x0; + l_new_image->x1 = original->x1; + l_new_image->y0 = original->y0; + l_new_image->y1 = original->y1; + + for (compno = 0U; compno < original->numcomps; ++compno) { + opj_image_comp_t* l_new_cmp = &(l_new_image->comps[compno]); + opj_image_comp_t* l_org_cmp = &(original->comps[compno]); + + l_new_cmp->factor = l_org_cmp->factor; + l_new_cmp->alpha = l_org_cmp->alpha; + l_new_cmp->resno_decoded = l_org_cmp->resno_decoded; + + if ((l_org_cmp->dx > 1U) || (l_org_cmp->dy > 1U)) { + const OPJ_INT32* l_src = l_org_cmp->data; + OPJ_INT32* l_dst = l_new_cmp->data; + OPJ_UINT32 y; + OPJ_UINT32 xoff, yoff; + + /* need to take into account dx & dy */ + xoff = l_org_cmp->dx * l_org_cmp->x0 - original->x0; + yoff = l_org_cmp->dy * l_org_cmp->y0 - original->y0; + if ((xoff >= l_org_cmp->dx) || (yoff >= l_org_cmp->dy)) { + fprintf(stderr, "ERROR -> opj_decompress: Invalid image/component parameters found when upsampling\n"); + opj_image_destroy(original); + opj_image_destroy(l_new_image); + return NULL; + } + + for (y = 0U; y < yoff; ++y) { + memset(l_dst, 0U, l_new_cmp->w * sizeof(OPJ_INT32)); + l_dst += l_new_cmp->w; + } + + if(l_new_cmp->h > (l_org_cmp->dy - 1U)) { /* check subtraction overflow for really small images */ + for (; y < l_new_cmp->h - (l_org_cmp->dy - 1U); y += l_org_cmp->dy) { + OPJ_UINT32 x, dy; + OPJ_UINT32 xorg; + + xorg = 0U; + for (x = 0U; x < xoff; ++x) { + l_dst[x] = 0; + } + if (l_new_cmp->w > (l_org_cmp->dx - 1U)) { /* check subtraction overflow for really small images */ + for (; x < l_new_cmp->w - (l_org_cmp->dx - 1U); x += l_org_cmp->dx, ++xorg) { + OPJ_UINT32 dx; + for (dx = 0U; dx < l_org_cmp->dx; ++dx) { + l_dst[x + dx] = l_src[xorg]; + } + } + } + for (; x < l_new_cmp->w; ++x) { + l_dst[x] = l_src[xorg]; + } + l_dst += l_new_cmp->w; + + for (dy = 1U; dy < l_org_cmp->dy; ++dy) { + memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(OPJ_INT32)); + l_dst += l_new_cmp->w; + } + l_src += l_org_cmp->w; + } + } + if (y < l_new_cmp->h) { + OPJ_UINT32 x; + OPJ_UINT32 xorg; + + xorg = 0U; + for (x = 0U; x < xoff; ++x) { + l_dst[x] = 0; + } + if (l_new_cmp->w > (l_org_cmp->dx - 1U)) { /* check subtraction overflow for really small images */ + for (; x < l_new_cmp->w - (l_org_cmp->dx - 1U); x += l_org_cmp->dx, ++xorg) { + OPJ_UINT32 dx; + for (dx = 0U; dx < l_org_cmp->dx; ++dx) { + l_dst[x + dx] = l_src[xorg]; + } + } + } + for (; x < l_new_cmp->w; ++x) { + l_dst[x] = l_src[xorg]; + } + l_dst += l_new_cmp->w; + ++y; + for (; y < l_new_cmp->h; ++y) { + memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(OPJ_INT32)); + l_dst += l_new_cmp->w; + } + } + } else { + memcpy(l_new_cmp->data, l_org_cmp->data, l_org_cmp->w * l_org_cmp->h * sizeof(OPJ_INT32)); + } + } + opj_image_destroy(original); + return l_new_image; } /* -------------------------------------------------------------------------- */ @@ -1179,398 +1171,381 @@ static opj_image_t* upsample_image_components(opj_image_t* original) /* -------------------------------------------------------------------------- */ int main(int argc, char **argv) { - opj_decompress_parameters parameters; /* decompression parameters */ - opj_image_t* image = NULL; - opj_stream_t *l_stream = NULL; /* Stream */ - opj_codec_t* l_codec = NULL; /* Handle to a decompressor */ - opj_codestream_index_t* cstr_index = NULL; - - OPJ_INT32 num_images, imageno; - img_fol_t img_fol; - dircnt_t *dirptr = NULL; - int failed = 0; - OPJ_FLOAT64 t, tCumulative = 0; - OPJ_UINT32 numDecompressedImages = 0; - - /* set decoding parameters to default values */ - set_default_parameters(¶meters); - - /* Initialize img_fol */ - memset(&img_fol,0,sizeof(img_fol_t)); - - /* parse input and get user encoding parameters */ - if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol) == 1) { - destroy_parameters(¶meters); - return EXIT_FAILURE; - } - - /* Initialize reading of directory */ - if(img_fol.set_imgdir==1){ - int it_image; - num_images=get_num_images(img_fol.imgdirpath); - - dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); - if(dirptr){ - dirptr->filename_buf = (char*)malloc((size_t)num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ - dirptr->filename = (char**) malloc((size_t)num_images*sizeof(char*)); - - if(!dirptr->filename_buf){ - destroy_parameters(¶meters); - return EXIT_FAILURE; - } - for(it_image=0;it_image<num_images;it_image++){ - dirptr->filename[it_image] = dirptr->filename_buf + it_image*OPJ_PATH_LEN; - } - } - if(load_images(dirptr,img_fol.imgdirpath)==1){ - destroy_parameters(¶meters); - return EXIT_FAILURE; - } - if (num_images==0){ - fprintf(stdout,"Folder is empty\n"); - destroy_parameters(¶meters); - return EXIT_FAILURE; - } - }else{ - num_images=1; - } - - /*Decoding image one by one*/ - for(imageno = 0; imageno < num_images ; imageno++) { - - fprintf(stderr,"\n"); - - if(img_fol.set_imgdir==1){ - if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { - fprintf(stderr,"skipping file...\n"); - destroy_parameters(¶meters); - continue; - } - } - - /* read the input file and put it in memory */ - /* ---------------------------------------- */ - - l_stream = opj_stream_create_default_file_stream(parameters.infile,1); - if (!l_stream){ - fprintf(stderr, "ERROR -> failed to create the stream from the file %s\n", parameters.infile); - destroy_parameters(¶meters); - return EXIT_FAILURE; - } - - /* decode the JPEG2000 stream */ - /* ---------------------- */ - - switch(parameters.decod_format) { - case J2K_CFMT: /* JPEG-2000 codestream */ - { - /* Get a decoder handle */ - l_codec = opj_create_decompress(OPJ_CODEC_J2K); - break; - } - case JP2_CFMT: /* JPEG 2000 compressed image data */ - { - /* Get a decoder handle */ - l_codec = opj_create_decompress(OPJ_CODEC_JP2); - break; - } - case JPT_CFMT: /* JPEG 2000, JPIP */ - { - /* Get a decoder handle */ - l_codec = opj_create_decompress(OPJ_CODEC_JPT); - break; - } - default: - fprintf(stderr, "skipping file..\n"); - destroy_parameters(¶meters); - opj_stream_destroy(l_stream); - continue; - } - - /* catch events using our callbacks and give a local context */ - opj_set_info_handler(l_codec, info_callback,00); - opj_set_warning_handler(l_codec, warning_callback,00); - opj_set_error_handler(l_codec, error_callback,00); - - t = opj_clock(); - - /* Setup the decoder decoding parameters using user parameters */ - if ( !opj_setup_decoder(l_codec, &(parameters.core)) ){ - fprintf(stderr, "ERROR -> opj_decompress: failed to setup the decoder\n"); - destroy_parameters(¶meters); - opj_stream_destroy(l_stream); - opj_destroy_codec(l_codec); - return EXIT_FAILURE; - } - - - /* Read the main header of the codestream and if necessary the JP2 boxes*/ - if(! opj_read_header(l_stream, l_codec, &image)){ - fprintf(stderr, "ERROR -> opj_decompress: failed to read the header\n"); - destroy_parameters(¶meters); - opj_stream_destroy(l_stream); - opj_destroy_codec(l_codec); - opj_image_destroy(image); - return EXIT_FAILURE; - } - - if (!parameters.nb_tile_to_decode) { - /* Optional if you want decode the entire image */ - if (!opj_set_decode_area(l_codec, image, (OPJ_INT32)parameters.DA_x0, - (OPJ_INT32)parameters.DA_y0, (OPJ_INT32)parameters.DA_x1, (OPJ_INT32)parameters.DA_y1)){ - fprintf(stderr, "ERROR -> opj_decompress: failed to set the decoded area\n"); - destroy_parameters(¶meters); - opj_stream_destroy(l_stream); - opj_destroy_codec(l_codec); - opj_image_destroy(image); - return EXIT_FAILURE; - } - - /* Get the decoded image */ - if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec, l_stream))) { - fprintf(stderr,"ERROR -> opj_decompress: failed to decode image!\n"); - destroy_parameters(¶meters); - opj_destroy_codec(l_codec); - opj_stream_destroy(l_stream); - opj_image_destroy(image); - return EXIT_FAILURE; - } - } - else { - - /* It is just here to illustrate how to use the resolution after set parameters */ - /*if (!opj_set_decoded_resolution_factor(l_codec, 5)) { - fprintf(stderr, "ERROR -> opj_decompress: failed to set the resolution factor tile!\n"); - opj_destroy_codec(l_codec); - opj_stream_destroy(l_stream); - opj_image_destroy(image); - return EXIT_FAILURE; - }*/ - - if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) { - fprintf(stderr, "ERROR -> opj_decompress: failed to decode tile!\n"); - destroy_parameters(¶meters); - opj_destroy_codec(l_codec); - opj_stream_destroy(l_stream); - opj_image_destroy(image); - return EXIT_FAILURE; - } - fprintf(stdout, "tile %d is decoded!\n\n", parameters.tile_index); - } - - tCumulative += opj_clock() - t; - numDecompressedImages++; - - /* Close the byte stream */ - opj_stream_destroy(l_stream); - - if( image->color_space != OPJ_CLRSPC_SYCC - && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy - && image->comps[1].dx != 1 ) - image->color_space = OPJ_CLRSPC_SYCC; - else if (image->numcomps <= 2) - image->color_space = OPJ_CLRSPC_GRAY; - - if(image->color_space == OPJ_CLRSPC_SYCC){ - color_sycc_to_rgb(image); - } - else if((image->color_space == OPJ_CLRSPC_CMYK) && (parameters.cod_format != TIF_DFMT)){ - color_cmyk_to_rgb(image); - } - else if(image->color_space == OPJ_CLRSPC_EYCC){ - color_esycc_to_rgb(image); - } - - if(image->icc_profile_buf) { + opj_decompress_parameters parameters; /* decompression parameters */ + opj_image_t* image = NULL; + opj_stream_t *l_stream = NULL; /* Stream */ + opj_codec_t* l_codec = NULL; /* Handle to a decompressor */ + opj_codestream_index_t* cstr_index = NULL; + + OPJ_INT32 num_images, imageno; + img_fol_t img_fol; + dircnt_t *dirptr = NULL; + int failed = 0; + OPJ_FLOAT64 t, tCumulative = 0; + OPJ_UINT32 numDecompressedImages = 0; + + /* set decoding parameters to default values */ + set_default_parameters(¶meters); + + /* Initialize img_fol */ + memset(&img_fol,0,sizeof(img_fol_t)); + + /* parse input and get user encoding parameters */ + if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol) == 1) { + destroy_parameters(¶meters); + return EXIT_FAILURE; + } + + /* Initialize reading of directory */ + if(img_fol.set_imgdir==1) { + int it_image; + num_images=get_num_images(img_fol.imgdirpath); + + dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); + if(dirptr) { + dirptr->filename_buf = (char*)malloc((size_t)num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ + dirptr->filename = (char**) malloc((size_t)num_images*sizeof(char*)); + + if(!dirptr->filename_buf) { + destroy_parameters(¶meters); + return EXIT_FAILURE; + } + for(it_image=0; it_image<num_images; it_image++) { + dirptr->filename[it_image] = dirptr->filename_buf + it_image*OPJ_PATH_LEN; + } + } + if(load_images(dirptr,img_fol.imgdirpath)==1) { + destroy_parameters(¶meters); + return EXIT_FAILURE; + } + if (num_images==0) { + fprintf(stdout,"Folder is empty\n"); + destroy_parameters(¶meters); + return EXIT_FAILURE; + } + } else { + num_images=1; + } + + /*Decoding image one by one*/ + for(imageno = 0; imageno < num_images ; imageno++) { + + fprintf(stderr,"\n"); + + if(img_fol.set_imgdir==1) { + if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { + fprintf(stderr,"skipping file...\n"); + destroy_parameters(¶meters); + continue; + } + } + + /* read the input file and put it in memory */ + /* ---------------------------------------- */ + + l_stream = opj_stream_create_default_file_stream(parameters.infile,1); + if (!l_stream) { + fprintf(stderr, "ERROR -> failed to create the stream from the file %s\n", parameters.infile); + destroy_parameters(¶meters); + return EXIT_FAILURE; + } + + /* decode the JPEG2000 stream */ + /* ---------------------- */ + + switch(parameters.decod_format) { + case J2K_CFMT: { /* JPEG-2000 codestream */ + /* Get a decoder handle */ + l_codec = opj_create_decompress(OPJ_CODEC_J2K); + break; + } + case JP2_CFMT: { /* JPEG 2000 compressed image data */ + /* Get a decoder handle */ + l_codec = opj_create_decompress(OPJ_CODEC_JP2); + break; + } + case JPT_CFMT: { /* JPEG 2000, JPIP */ + /* Get a decoder handle */ + l_codec = opj_create_decompress(OPJ_CODEC_JPT); + break; + } + default: + fprintf(stderr, "skipping file..\n"); + destroy_parameters(¶meters); + opj_stream_destroy(l_stream); + continue; + } + + /* catch events using our callbacks and give a local context */ + opj_set_info_handler(l_codec, info_callback,00); + opj_set_warning_handler(l_codec, warning_callback,00); + opj_set_error_handler(l_codec, error_callback,00); + + t = opj_clock(); + + /* Setup the decoder decoding parameters using user parameters */ + if ( !opj_setup_decoder(l_codec, &(parameters.core)) ) { + fprintf(stderr, "ERROR -> opj_decompress: failed to setup the decoder\n"); + destroy_parameters(¶meters); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + return EXIT_FAILURE; + } + + + /* Read the main header of the codestream and if necessary the JP2 boxes*/ + if(! opj_read_header(l_stream, l_codec, &image)) { + fprintf(stderr, "ERROR -> opj_decompress: failed to read the header\n"); + destroy_parameters(¶meters); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + opj_image_destroy(image); + return EXIT_FAILURE; + } + + if (!parameters.nb_tile_to_decode) { + /* Optional if you want decode the entire image */ + if (!opj_set_decode_area(l_codec, image, (OPJ_INT32)parameters.DA_x0, + (OPJ_INT32)parameters.DA_y0, (OPJ_INT32)parameters.DA_x1, (OPJ_INT32)parameters.DA_y1)) { + fprintf(stderr, "ERROR -> opj_decompress: failed to set the decoded area\n"); + destroy_parameters(¶meters); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + opj_image_destroy(image); + return EXIT_FAILURE; + } + + /* Get the decoded image */ + if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec, l_stream))) { + fprintf(stderr,"ERROR -> opj_decompress: failed to decode image!\n"); + destroy_parameters(¶meters); + opj_destroy_codec(l_codec); + opj_stream_destroy(l_stream); + opj_image_destroy(image); + return EXIT_FAILURE; + } + } else { + + /* It is just here to illustrate how to use the resolution after set parameters */ + /*if (!opj_set_decoded_resolution_factor(l_codec, 5)) { + fprintf(stderr, "ERROR -> opj_decompress: failed to set the resolution factor tile!\n"); + opj_destroy_codec(l_codec); + opj_stream_destroy(l_stream); + opj_image_destroy(image); + return EXIT_FAILURE; + }*/ + + if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) { + fprintf(stderr, "ERROR -> opj_decompress: failed to decode tile!\n"); + destroy_parameters(¶meters); + opj_destroy_codec(l_codec); + opj_stream_destroy(l_stream); + opj_image_destroy(image); + return EXIT_FAILURE; + } + fprintf(stdout, "tile %d is decoded!\n\n", parameters.tile_index); + } + + tCumulative += opj_clock() - t; + numDecompressedImages++; + + /* Close the byte stream */ + opj_stream_destroy(l_stream); + + if( image->color_space != OPJ_CLRSPC_SYCC + && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy + && image->comps[1].dx != 1 ) + image->color_space = OPJ_CLRSPC_SYCC; + else if (image->numcomps <= 2) + image->color_space = OPJ_CLRSPC_GRAY; + + if(image->color_space == OPJ_CLRSPC_SYCC) { + color_sycc_to_rgb(image); + } else if((image->color_space == OPJ_CLRSPC_CMYK) && (parameters.cod_format != TIF_DFMT)) { + color_cmyk_to_rgb(image); + } else if(image->color_space == OPJ_CLRSPC_EYCC) { + color_esycc_to_rgb(image); + } + + if(image->icc_profile_buf) { #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) - if(image->icc_profile_len) - color_apply_icc_profile(image); - else - color_cielab_to_rgb(image); + if(image->icc_profile_len) + color_apply_icc_profile(image); + else + color_cielab_to_rgb(image); #endif - free(image->icc_profile_buf); - image->icc_profile_buf = NULL; image->icc_profile_len = 0; - } - - /* Force output precision */ - /* ---------------------- */ - if (parameters.precision != NULL) - { - OPJ_UINT32 compno; - for (compno = 0; compno < image->numcomps; ++compno) - { - OPJ_UINT32 precno = compno; - OPJ_UINT32 prec; - - if (precno >= parameters.nb_precision) { - precno = parameters.nb_precision - 1U; - } - - prec = parameters.precision[precno].prec; - if (prec == 0) { - prec = image->comps[compno].prec; - } - - switch (parameters.precision[precno].mode) { - case OPJ_PREC_MODE_CLIP: - clip_component(&(image->comps[compno]), prec); - break; - case OPJ_PREC_MODE_SCALE: - scale_component(&(image->comps[compno]), prec); - break; - default: - break; - } - - } - } - - /* Upsample components */ - /* ------------------- */ - if (parameters.upsample) - { - image = upsample_image_components(image); - if (image == NULL) { - fprintf(stderr, "ERROR -> opj_decompress: failed to upsample image components!\n"); - destroy_parameters(¶meters); - opj_destroy_codec(l_codec); - return EXIT_FAILURE; - } - } - - /* Force RGB output */ - /* ---------------- */ - if (parameters.force_rgb) - { - switch (image->color_space) { - case OPJ_CLRSPC_SRGB: - break; - case OPJ_CLRSPC_GRAY: - image = convert_gray_to_rgb(image); - break; - default: - fprintf(stderr, "ERROR -> opj_decompress: don't know how to convert image to RGB colorspace!\n"); - opj_image_destroy(image); - image = NULL; - break; - } - if (image == NULL) { - fprintf(stderr, "ERROR -> opj_decompress: failed to convert to RGB image!\n"); - destroy_parameters(¶meters); - opj_destroy_codec(l_codec); - return EXIT_FAILURE; - } - } - - /* create output image */ - /* ------------------- */ - switch (parameters.cod_format) { - case PXM_DFMT: /* PNM PGM PPM */ - if (imagetopnm(image, parameters.outfile, parameters.split_pnm)) { + free(image->icc_profile_buf); + image->icc_profile_buf = NULL; + image->icc_profile_len = 0; + } + + /* Force output precision */ + /* ---------------------- */ + if (parameters.precision != NULL) { + OPJ_UINT32 compno; + for (compno = 0; compno < image->numcomps; ++compno) { + OPJ_UINT32 precno = compno; + OPJ_UINT32 prec; + + if (precno >= parameters.nb_precision) { + precno = parameters.nb_precision - 1U; + } + + prec = parameters.precision[precno].prec; + if (prec == 0) { + prec = image->comps[compno].prec; + } + + switch (parameters.precision[precno].mode) { + case OPJ_PREC_MODE_CLIP: + clip_component(&(image->comps[compno]), prec); + break; + case OPJ_PREC_MODE_SCALE: + scale_component(&(image->comps[compno]), prec); + break; + default: + break; + } + + } + } + + /* Upsample components */ + /* ------------------- */ + if (parameters.upsample) { + image = upsample_image_components(image); + if (image == NULL) { + fprintf(stderr, "ERROR -> opj_decompress: failed to upsample image components!\n"); + destroy_parameters(¶meters); + opj_destroy_codec(l_codec); + return EXIT_FAILURE; + } + } + + /* Force RGB output */ + /* ---------------- */ + if (parameters.force_rgb) { + switch (image->color_space) { + case OPJ_CLRSPC_SRGB: + break; + case OPJ_CLRSPC_GRAY: + image = convert_gray_to_rgb(image); + break; + default: + fprintf(stderr, "ERROR -> opj_decompress: don't know how to convert image to RGB colorspace!\n"); + opj_image_destroy(image); + image = NULL; + break; + } + if (image == NULL) { + fprintf(stderr, "ERROR -> opj_decompress: failed to convert to RGB image!\n"); + destroy_parameters(¶meters); + opj_destroy_codec(l_codec); + return EXIT_FAILURE; + } + } + + /* create output image */ + /* ------------------- */ + switch (parameters.cod_format) { + case PXM_DFMT: /* PNM PGM PPM */ + if (imagetopnm(image, parameters.outfile, parameters.split_pnm)) { fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; - case PGX_DFMT: /* PGX */ - if(imagetopgx(image, parameters.outfile)){ + case PGX_DFMT: /* PGX */ + if(imagetopgx(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; - case BMP_DFMT: /* BMP */ - if(imagetobmp(image, parameters.outfile)){ + case BMP_DFMT: /* BMP */ + if(imagetobmp(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; #ifdef OPJ_HAVE_LIBTIFF - case TIF_DFMT: /* TIFF */ - if(imagetotif(image, parameters.outfile)){ + case TIF_DFMT: /* TIFF */ + if(imagetotif(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; #endif /* OPJ_HAVE_LIBTIFF */ - case RAW_DFMT: /* RAW */ - if(imagetoraw(image, parameters.outfile)){ + case RAW_DFMT: /* RAW */ + if(imagetoraw(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Error generating raw file. Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; - case RAWL_DFMT: /* RAWL */ - if(imagetorawl(image, parameters.outfile)){ + case RAWL_DFMT: /* RAWL */ + if(imagetorawl(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Error generating rawl file. Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; - case TGA_DFMT: /* TGA */ - if(imagetotga(image, parameters.outfile)){ + case TGA_DFMT: /* TGA */ + if(imagetotga(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Error generating tga file. Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; #ifdef OPJ_HAVE_LIBPNG - case PNG_DFMT: /* PNG */ - if(imagetopng(image, parameters.outfile)){ + case PNG_DFMT: /* PNG */ + if(imagetopng(image, parameters.outfile)) { fprintf(stderr,"[ERROR] Error generating png file. Outfile %s not generated\n",parameters.outfile); - failed = 1; - } - else { + failed = 1; + } else { fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile); - } - break; + } + break; #endif /* OPJ_HAVE_LIBPNG */ -/* Can happen if output file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined -*/ - default: - fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); - failed = 1; - } + /* Can happen if output file is TIFF or PNG + * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined + */ + default: + fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile); + failed = 1; + } - /* free remaining structures */ - if (l_codec) { - opj_destroy_codec(l_codec); - } + /* free remaining structures */ + if (l_codec) { + opj_destroy_codec(l_codec); + } - /* free image data structure */ - opj_image_destroy(image); + /* free image data structure */ + opj_image_destroy(image); - /* destroy the codestream index */ - opj_destroy_cstr_index(&cstr_index); + /* destroy the codestream index */ + opj_destroy_cstr_index(&cstr_index); - if(failed) (void)remove(parameters.outfile); /* ignore return value */ - } - destroy_parameters(¶meters); - if (numDecompressedImages) { - fprintf(stdout, "decode time: %d ms\n", (int)( (tCumulative * 1000.0) / (OPJ_FLOAT64)numDecompressedImages)); - } - return failed ? EXIT_FAILURE : EXIT_SUCCESS; + if(failed) (void)remove(parameters.outfile); /* ignore return value */ + } + destroy_parameters(¶meters); + if (numDecompressedImages) { + fprintf(stdout, "decode time: %d ms\n", (int)( (tCumulative * 1000.0) / (OPJ_FLOAT64)numDecompressedImages)); + } + return failed ? EXIT_FAILURE : EXIT_SUCCESS; } /*end main*/ diff --git a/src/bin/jp2/opj_dump.c b/src/bin/jp2/opj_dump.c index 1e51f43c..5380f965 100644 --- a/src/bin/jp2/opj_dump.c +++ b/src/bin/jp2/opj_dump.c @@ -1,11 +1,11 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2010, Mathieu Malaterre, GDCM - * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France * Copyright (c) 2012, CS Systemes d'Information, France * All rights reserved. * @@ -59,26 +59,26 @@ #include "format_defs.h" #include "opj_string.h" -typedef struct dircnt{ - /** Buffer for holding images read from Directory*/ - char *filename_buf; - /** Pointer to the buffer*/ - char **filename; -}dircnt_t; +typedef struct dircnt { + /** Buffer for holding images read from Directory*/ + char *filename_buf; + /** Pointer to the buffer*/ + char **filename; +} dircnt_t; -typedef struct img_folder{ - /** The directory path of the folder containing input images*/ - char *imgdirpath; - /** Output format*/ - const char *out_format; - /** Enable option*/ - char set_imgdir; - /** Enable Cod Format for output*/ - char set_out_format; +typedef struct img_folder { + /** The directory path of the folder containing input images*/ + char *imgdirpath; + /** Output format*/ + const char *out_format; + /** Enable option*/ + char set_imgdir; + /** Enable Cod Format for output*/ + char set_out_format; - int flag; -}img_fol_t; + int flag; +} img_fol_t; /* -------------------------------------------------------------------------- */ /* Declarations */ @@ -91,7 +91,8 @@ static int infile_format(const char *fname); static int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol); /* -------------------------------------------------------------------------- */ -static void decode_help_display(void) { +static void decode_help_display(void) +{ fprintf(stdout,"\nThis is the opj_dump utility from the OpenJPEG project.\n" "It dumps JPEG 2000 codestream info to stdout or a given file.\n" "It has been compiled against openjp2 library v%s.\n\n",opj_version()); @@ -100,120 +101,124 @@ static void decode_help_display(void) { fprintf(stdout,"-----------\n"); fprintf(stdout,"\n"); fprintf(stdout," -ImgDir <directory>\n"); - fprintf(stdout," Image file Directory path \n"); - fprintf(stdout," -i <compressed file>\n"); - fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); - fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); - fprintf(stdout," is identified based on its suffix.\n"); - fprintf(stdout," -o <output file>\n"); - fprintf(stdout," OPTIONAL\n"); - fprintf(stdout," Output file where file info will be dump.\n"); - fprintf(stdout," By default it will be in the stdout.\n"); + fprintf(stdout," Image file Directory path \n"); + fprintf(stdout," -i <compressed file>\n"); + fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); + fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); + fprintf(stdout," is identified based on its suffix.\n"); + fprintf(stdout," -o <output file>\n"); + fprintf(stdout," OPTIONAL\n"); + fprintf(stdout," Output file where file info will be dump.\n"); + fprintf(stdout," By default it will be in the stdout.\n"); fprintf(stdout," -v "); /* FIXME WIP_MSD */ - fprintf(stdout," OPTIONAL\n"); + fprintf(stdout," OPTIONAL\n"); fprintf(stdout," Enable informative messages\n"); fprintf(stdout," By default verbose mode is off.\n"); - fprintf(stdout,"\n"); + fprintf(stdout,"\n"); } /* -------------------------------------------------------------------------- */ -static int get_num_images(char *imgdirpath){ - DIR *dir; - struct dirent* content; - int num_images = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 0; - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - num_images++; - } - closedir(dir); - return num_images; +static int get_num_images(char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int num_images = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 0; + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + num_images++; + } + closedir(dir); + return num_images; } /* -------------------------------------------------------------------------- */ -static int load_images(dircnt_t *dirptr, char *imgdirpath){ - DIR *dir; - struct dirent* content; - int i = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 1; - }else { - fprintf(stderr,"Folder opened successfully\n"); - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - - strcpy(dirptr->filename[i],content->d_name); - i++; - } - closedir(dir); - return 0; +static int load_images(dircnt_t *dirptr, char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int i = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 1; + } else { + fprintf(stderr,"Folder opened successfully\n"); + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + + strcpy(dirptr->filename[i],content->d_name); + i++; + } + closedir(dir); + return 0; } /* -------------------------------------------------------------------------- */ -static int get_file_format(const char *filename) { - unsigned int i; - static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; - static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; - const char *ext = strrchr(filename, '.'); - if (ext == NULL) - return -1; - ext++; - if(ext) { - for(i = 0; i < sizeof(format)/sizeof(*format); i++) { - if(_strnicmp(ext, extension[i], 3) == 0) { - return format[i]; - } - } - } - - return -1; +static int get_file_format(const char *filename) +{ + unsigned int i; + static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; + static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; + const char *ext = strrchr(filename, '.'); + if (ext == NULL) + return -1; + ext++; + if(ext) { + for(i = 0; i < sizeof(format)/sizeof(*format); i++) { + if(_strnicmp(ext, extension[i], 3) == 0) { + return format[i]; + } + } + } + + return -1; } /* -------------------------------------------------------------------------- */ -static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){ - char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; - char *temp_p, temp1[OPJ_PATH_LEN]=""; - - strcpy(image_filename,dirptr->filename[imageno]); - fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); - parameters->decod_format = get_file_format(image_filename); - if (parameters->decod_format == -1) - return 1; - sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); - if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infilename) != 0) { - return 1; - } - - /*Set output file*/ - strcpy(temp_ofname,strtok(image_filename,".")); - while((temp_p = strtok(NULL,".")) != NULL){ - strcat(temp_ofname,temp1); - sprintf(temp1,".%s",temp_p); - } - if(img_fol->set_out_format==1){ - sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); - if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfilename) != 0) { - return 1; - } - } - return 0; +static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters) +{ + char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; + char *temp_p, temp1[OPJ_PATH_LEN]=""; + + strcpy(image_filename,dirptr->filename[imageno]); + fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); + parameters->decod_format = get_file_format(image_filename); + if (parameters->decod_format == -1) + return 1; + sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); + if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infilename) != 0) { + return 1; + } + + /*Set output file*/ + strcpy(temp_ofname,strtok(image_filename,".")); + while((temp_p = strtok(NULL,".")) != NULL) { + strcat(temp_ofname,temp1); + sprintf(temp1,".%s",temp_p); + } + if(img_fol->set_out_format==1) { + sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); + if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), outfilename) != 0) { + return 1; + } + } + return 0; } /* -------------------------------------------------------------------------- */ @@ -224,169 +229,164 @@ static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_d static int infile_format(const char *fname) { - FILE *reader; - const char *s, *magic_s; - int ext_format, magic_format; - unsigned char buf[12]; - size_t l_nb_read; + FILE *reader; + const char *s, *magic_s; + int ext_format, magic_format; + unsigned char buf[12]; + size_t l_nb_read; - reader = fopen(fname, "rb"); + reader = fopen(fname, "rb"); - if (reader == NULL) - return -1; + if (reader == NULL) + return -1; - memset(buf, 0, 12); - l_nb_read = fread(buf, 1, 12, reader); - fclose(reader); - if (l_nb_read != 12) - return -1; + memset(buf, 0, 12); + l_nb_read = fread(buf, 1, 12, reader); + fclose(reader); + if (l_nb_read != 12) + return -1; - ext_format = get_file_format(fname); + ext_format = get_file_format(fname); - if (ext_format == JPT_CFMT) - return JPT_CFMT; + if (ext_format == JPT_CFMT) + return JPT_CFMT; - if (memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 || memcmp(buf, JP2_MAGIC, 4) == 0) { - magic_format = JP2_CFMT; - magic_s = ".jp2"; - } - else if (memcmp(buf, J2K_CODESTREAM_MAGIC, 4) == 0) { - magic_format = J2K_CFMT; - magic_s = ".j2k or .jpc or .j2c"; - } - else - return -1; + if (memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 || memcmp(buf, JP2_MAGIC, 4) == 0) { + magic_format = JP2_CFMT; + magic_s = ".jp2"; + } else if (memcmp(buf, J2K_CODESTREAM_MAGIC, 4) == 0) { + magic_format = J2K_CFMT; + magic_s = ".j2k or .jpc or .j2c"; + } else + return -1; - if (magic_format == ext_format) - return ext_format; + if (magic_format == ext_format) + return ext_format; - s = fname + strlen(fname) - 4; + s = fname + strlen(fname) - 4; - fputs("\n===========================================\n", stderr); - fprintf(stderr, "The extension of this file is incorrect.\n" - "FOUND %s. SHOULD BE %s\n", s, magic_s); - fputs("===========================================\n", stderr); + fputs("\n===========================================\n", stderr); + fprintf(stderr, "The extension of this file is incorrect.\n" + "FOUND %s. SHOULD BE %s\n", s, magic_s); + fputs("===========================================\n", stderr); - return magic_format; + return magic_format; } /* -------------------------------------------------------------------------- */ /** * Parse the command line */ /* -------------------------------------------------------------------------- */ -static int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol) { - int totlen, c; - opj_option_t long_option[]={ +static int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol) +{ + int totlen, c; + opj_option_t long_option[]= { {"ImgDir",REQ_ARG, NULL ,'y'} - }; + }; const char optlist[] = "i:o:f:hv"; - totlen=sizeof(long_option); - img_fol->set_out_format = 0; - do { - c = opj_getopt_long(argc, argv,optlist,long_option,totlen); - if (c == -1) - break; - switch (c) { - case 'i': /* input file */ - { - char *infile = opj_optarg; - parameters->decod_format = infile_format(infile); - switch(parameters->decod_format) { - case J2K_CFMT: - break; - case JP2_CFMT: - break; - case JPT_CFMT: - break; - default: - fprintf(stderr, - "[ERROR] Unknown input file format: %s \n" - " Known file formats are *.j2k, *.jp2, *.jpc or *.jpt\n", - infile); - return 1; - } - if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infile) != 0) { - fprintf(stderr, "[ERROR] Path is too long\n"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'o': /* output file */ - { - if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), opj_optarg) != 0) { - fprintf(stderr, "[ERROR] Path is too long\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - case 'f': /* flag */ - img_fol->flag = atoi(opj_optarg); + totlen=sizeof(long_option); + img_fol->set_out_format = 0; + do { + c = opj_getopt_long(argc, argv,optlist,long_option,totlen); + if (c == -1) + break; + switch (c) { + case 'i': { /* input file */ + char *infile = opj_optarg; + parameters->decod_format = infile_format(infile); + switch(parameters->decod_format) { + case J2K_CFMT: + break; + case JP2_CFMT: + break; + case JPT_CFMT: + break; + default: + fprintf(stderr, + "[ERROR] Unknown input file format: %s \n" + " Known file formats are *.j2k, *.jp2, *.jpc or *.jpt\n", + infile); + return 1; + } + if (opj_strcpy_s(parameters->infile, sizeof(parameters->infile), infile) != 0) { + fprintf(stderr, "[ERROR] Path is too long\n"); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'o': { /* output file */ + if (opj_strcpy_s(parameters->outfile, sizeof(parameters->outfile), opj_optarg) != 0) { + fprintf(stderr, "[ERROR] Path is too long\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + case 'f': /* flag */ + img_fol->flag = atoi(opj_optarg); + break; + /* ----------------------------------------------------- */ + + case 'h': /* display an help description */ + decode_help_display(); + return 1; + + /* ------------------------------------------------------ */ + + case 'y': { /* Image Directory path */ + img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); + strcpy(img_fol->imgdirpath,opj_optarg); + img_fol->set_imgdir=1; + } + break; + + /* ----------------------------------------------------- */ + + case 'v': { /* Verbose mode */ + parameters->m_verbose = 1; + } break; - /* ----------------------------------------------------- */ - - case 'h': /* display an help description */ - decode_help_display(); - return 1; - - /* ------------------------------------------------------ */ - - case 'y': /* Image Directory path */ - { - img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); - strcpy(img_fol->imgdirpath,opj_optarg); - img_fol->set_imgdir=1; - } - break; - - /* ----------------------------------------------------- */ - - case 'v': /* Verbose mode */ - { - parameters->m_verbose = 1; - } - break; - - /* ----------------------------------------------------- */ + + /* ----------------------------------------------------- */ default: fprintf(stderr, "[WARNING] An invalid option has been ignored.\n"); break; } - }while(c != -1); + } while(c != -1); - /* check for possible errors */ - if(img_fol->set_imgdir==1){ - if(!(parameters->infile[0]==0)){ + /* check for possible errors */ + if(img_fol->set_imgdir==1) { + if(!(parameters->infile[0]==0)) { fprintf(stderr, "[ERROR] options -ImgDir and -i cannot be used together.\n"); - return 1; - } - if(img_fol->set_out_format == 0){ + return 1; + } + if(img_fol->set_out_format == 0) { fprintf(stderr, "[ERROR] When -ImgDir is used, -OutFor <FORMAT> must be used.\n"); fprintf(stderr, "Only one format allowed.\n" - "Valid format are PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA.\n"); - return 1; - } - if(!(parameters->outfile[0] == 0)){ + "Valid format are PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA.\n"); + return 1; + } + if(!(parameters->outfile[0] == 0)) { fprintf(stderr, "[ERROR] options -ImgDir and -o cannot be used together\n"); - return 1; - } - }else{ - if(parameters->infile[0] == 0) { + return 1; + } + } else { + if(parameters->infile[0] == 0) { fprintf(stderr, "[ERROR] Required parameter is missing\n"); - fprintf(stderr, "Example: %s -i image.j2k\n",argv[0]); + fprintf(stderr, "Example: %s -i image.j2k\n",argv[0]); fprintf(stderr, " Help: %s -h\n",argv[0]); - return 1; - } - } + return 1; + } + } - return 0; + return 0; } /* -------------------------------------------------------------------------- */ @@ -394,23 +394,26 @@ static int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *param /** sample error debug callback expecting no client object */ -static void error_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[ERROR] %s", msg); +static void error_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[ERROR] %s", msg); } /** sample warning debug callback expecting no client object */ -static void warning_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[WARNING] %s", msg); +static void warning_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[WARNING] %s", msg); } /** sample debug callback expecting no client object */ -static void info_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[INFO] %s", msg); +static void info_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ @@ -420,178 +423,174 @@ static void info_callback(const char *msg, void *client_data) { /* -------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { - FILE *fout = NULL; + FILE *fout = NULL; - opj_dparameters_t parameters; /* Decompression parameters */ - opj_image_t* image = NULL; /* Image structure */ - opj_codec_t* l_codec = NULL; /* Handle to a decompressor */ - opj_stream_t *l_stream = NULL; /* Stream */ - opj_codestream_info_v2_t* cstr_info = NULL; - opj_codestream_index_t* cstr_index = NULL; + opj_dparameters_t parameters; /* Decompression parameters */ + opj_image_t* image = NULL; /* Image structure */ + opj_codec_t* l_codec = NULL; /* Handle to a decompressor */ + opj_stream_t *l_stream = NULL; /* Stream */ + opj_codestream_info_v2_t* cstr_info = NULL; + opj_codestream_index_t* cstr_index = NULL; - OPJ_INT32 num_images, imageno; - img_fol_t img_fol; - dircnt_t *dirptr = NULL; + OPJ_INT32 num_images, imageno; + img_fol_t img_fol; + dircnt_t *dirptr = NULL; #ifdef MSD - OPJ_BOOL l_go_on = OPJ_TRUE; - OPJ_UINT32 l_max_data_size = 1000; - OPJ_BYTE * l_data = (OPJ_BYTE *) malloc(1000); + OPJ_BOOL l_go_on = OPJ_TRUE; + OPJ_UINT32 l_max_data_size = 1000; + OPJ_BYTE * l_data = (OPJ_BYTE *) malloc(1000); #endif - /* Set decoding parameters to default values */ - opj_set_default_decoder_parameters(¶meters); - - /* Initialize img_fol */ - memset(&img_fol,0,sizeof(img_fol_t)); - img_fol.flag = OPJ_IMG_INFO | OPJ_J2K_MH_INFO | OPJ_J2K_MH_IND; - - /* Parse input and get user encoding parameters */ - if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol) == 1) { - return EXIT_FAILURE; - } - - /* Initialize reading of directory */ - if(img_fol.set_imgdir==1){ - int it_image; - num_images=get_num_images(img_fol.imgdirpath); - - dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); - if(dirptr){ - dirptr->filename_buf = (char*)malloc((size_t)num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ - dirptr->filename = (char**) malloc((size_t)num_images*sizeof(char*)); - - if(!dirptr->filename_buf){ - return EXIT_FAILURE; - } - - for(it_image=0;it_image<num_images;it_image++){ - dirptr->filename[it_image] = dirptr->filename_buf + it_image*OPJ_PATH_LEN; - } - } - if(load_images(dirptr,img_fol.imgdirpath)==1){ - return EXIT_FAILURE; - } - - if (num_images==0){ - fprintf(stdout,"Folder is empty\n"); - return EXIT_FAILURE; - } - }else{ - num_images=1; - } - - /* Try to open for writing the output file if necessary */ - if (parameters.outfile[0] != 0){ - fout = fopen(parameters.outfile,"w"); - if (!fout){ - fprintf(stderr, "ERROR -> failed to open %s for writing\n", parameters.outfile); - return EXIT_FAILURE; - } - } - else - fout = stdout; - - /* Read the header of each image one by one */ - for(imageno = 0; imageno < num_images ; imageno++){ - - fprintf(stderr,"\n"); - - if(img_fol.set_imgdir==1){ - if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { - fprintf(stderr,"skipping file...\n"); - continue; - } - } - - /* Read the input file and put it in memory */ - /* ---------------------------------------- */ - - l_stream = opj_stream_create_default_file_stream(parameters.infile,1); - if (!l_stream){ - fprintf(stderr, "ERROR -> failed to create the stream from the file %s\n",parameters.infile); - return EXIT_FAILURE; - } - - /* Read the JPEG2000 stream */ - /* ------------------------ */ - - switch(parameters.decod_format) { - case J2K_CFMT: /* JPEG-2000 codestream */ - { - /* Get a decoder handle */ - l_codec = opj_create_decompress(OPJ_CODEC_J2K); - break; - } - case JP2_CFMT: /* JPEG 2000 compressed image data */ - { - /* Get a decoder handle */ - l_codec = opj_create_decompress(OPJ_CODEC_JP2); - break; - } - case JPT_CFMT: /* JPEG 2000, JPIP */ - { - /* Get a decoder handle */ - l_codec = opj_create_decompress(OPJ_CODEC_JPT); - break; - } - default: - fprintf(stderr, "skipping file..\n"); - opj_stream_destroy(l_stream); - continue; - } - - /* catch events using our callbacks and give a local context */ - opj_set_info_handler(l_codec, info_callback,00); - opj_set_warning_handler(l_codec, warning_callback,00); - opj_set_error_handler(l_codec, error_callback,00); - - /* Setup the decoder decoding parameters using user parameters */ - if ( !opj_setup_decoder(l_codec, ¶meters) ){ - fprintf(stderr, "ERROR -> opj_dump: failed to setup the decoder\n"); - opj_stream_destroy(l_stream); - opj_destroy_codec(l_codec); - fclose(fout); - return EXIT_FAILURE; - } - - /* Read the main header of the codestream and if necessary the JP2 boxes*/ - if(! opj_read_header(l_stream, l_codec, &image)){ - fprintf(stderr, "ERROR -> opj_dump: failed to read the header\n"); - opj_stream_destroy(l_stream); - opj_destroy_codec(l_codec); - opj_image_destroy(image); - fclose(fout); - return EXIT_FAILURE; - } - - opj_dump_codec(l_codec, img_fol.flag, fout ); - - cstr_info = opj_get_cstr_info(l_codec); - - cstr_index = opj_get_cstr_index(l_codec); - - /* close the byte stream */ - opj_stream_destroy(l_stream); - - /* free remaining structures */ - if (l_codec) { - opj_destroy_codec(l_codec); - } - - /* destroy the image header */ - opj_image_destroy(image); - - /* destroy the codestream index */ - opj_destroy_cstr_index(&cstr_index); - - /* destroy the codestream info */ - opj_destroy_cstr_info(&cstr_info); - - } - - /* Close the output file */ - fclose(fout); - - return EXIT_SUCCESS; + /* Set decoding parameters to default values */ + opj_set_default_decoder_parameters(¶meters); + + /* Initialize img_fol */ + memset(&img_fol,0,sizeof(img_fol_t)); + img_fol.flag = OPJ_IMG_INFO | OPJ_J2K_MH_INFO | OPJ_J2K_MH_IND; + + /* Parse input and get user encoding parameters */ + if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol) == 1) { + return EXIT_FAILURE; + } + + /* Initialize reading of directory */ + if(img_fol.set_imgdir==1) { + int it_image; + num_images=get_num_images(img_fol.imgdirpath); + + dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); + if(dirptr) { + dirptr->filename_buf = (char*)malloc((size_t)num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ + dirptr->filename = (char**) malloc((size_t)num_images*sizeof(char*)); + + if(!dirptr->filename_buf) { + return EXIT_FAILURE; + } + + for(it_image=0; it_image<num_images; it_image++) { + dirptr->filename[it_image] = dirptr->filename_buf + it_image*OPJ_PATH_LEN; + } + } + if(load_images(dirptr,img_fol.imgdirpath)==1) { + return EXIT_FAILURE; + } + + if (num_images==0) { + fprintf(stdout,"Folder is empty\n"); + return EXIT_FAILURE; + } + } else { + num_images=1; + } + + /* Try to open for writing the output file if necessary */ + if (parameters.outfile[0] != 0) { + fout = fopen(parameters.outfile,"w"); + if (!fout) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", parameters.outfile); + return EXIT_FAILURE; + } + } else + fout = stdout; + + /* Read the header of each image one by one */ + for(imageno = 0; imageno < num_images ; imageno++) { + + fprintf(stderr,"\n"); + + if(img_fol.set_imgdir==1) { + if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { + fprintf(stderr,"skipping file...\n"); + continue; + } + } + + /* Read the input file and put it in memory */ + /* ---------------------------------------- */ + + l_stream = opj_stream_create_default_file_stream(parameters.infile,1); + if (!l_stream) { + fprintf(stderr, "ERROR -> failed to create the stream from the file %s\n",parameters.infile); + return EXIT_FAILURE; + } + + /* Read the JPEG2000 stream */ + /* ------------------------ */ + + switch(parameters.decod_format) { + case J2K_CFMT: { /* JPEG-2000 codestream */ + /* Get a decoder handle */ + l_codec = opj_create_decompress(OPJ_CODEC_J2K); + break; + } + case JP2_CFMT: { /* JPEG 2000 compressed image data */ + /* Get a decoder handle */ + l_codec = opj_create_decompress(OPJ_CODEC_JP2); + break; + } + case JPT_CFMT: { /* JPEG 2000, JPIP */ + /* Get a decoder handle */ + l_codec = opj_create_decompress(OPJ_CODEC_JPT); + break; + } + default: + fprintf(stderr, "skipping file..\n"); + opj_stream_destroy(l_stream); + continue; + } + + /* catch events using our callbacks and give a local context */ + opj_set_info_handler(l_codec, info_callback,00); + opj_set_warning_handler(l_codec, warning_callback,00); + opj_set_error_handler(l_codec, error_callback,00); + + /* Setup the decoder decoding parameters using user parameters */ + if ( !opj_setup_decoder(l_codec, ¶meters) ) { + fprintf(stderr, "ERROR -> opj_dump: failed to setup the decoder\n"); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + fclose(fout); + return EXIT_FAILURE; + } + + /* Read the main header of the codestream and if necessary the JP2 boxes*/ + if(! opj_read_header(l_stream, l_codec, &image)) { + fprintf(stderr, "ERROR -> opj_dump: failed to read the header\n"); + opj_stream_destroy(l_stream); + opj_destroy_codec(l_codec); + opj_image_destroy(image); + fclose(fout); + return EXIT_FAILURE; + } + + opj_dump_codec(l_codec, img_fol.flag, fout ); + + cstr_info = opj_get_cstr_info(l_codec); + + cstr_index = opj_get_cstr_index(l_codec); + + /* close the byte stream */ + opj_stream_destroy(l_stream); + + /* free remaining structures */ + if (l_codec) { + opj_destroy_codec(l_codec); + } + + /* destroy the image header */ + opj_image_destroy(image); + + /* destroy the codestream index */ + opj_destroy_cstr_index(&cstr_index); + + /* destroy the codestream info */ + opj_destroy_cstr_info(&cstr_info); + + } + + /* Close the output file */ + fclose(fout); + + return EXIT_SUCCESS; } diff --git a/src/bin/jp2/windirent.h b/src/bin/jp2/windirent.h index bef28194..b6e9de49 100644 --- a/src/bin/jp2/windirent.h +++ b/src/bin/jp2/windirent.h @@ -1,9 +1,9 @@ /* * uce-dirent.h - operating system independent dirent implementation - * + * * Copyright (C) 1998-2002 Toni Ronkko - * + * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * ``Software''), to deal in the Software without restriction, including @@ -11,10 +11,10 @@ * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -22,8 +22,8 @@ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. - * - * + * + * * May 28 1998, Toni Ronkko <tronkko@messi.uku.fi> * * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ @@ -59,7 +59,7 @@ * Revision 1.1 1998/07/04 16:27:51 tr * Initial revision * - * + * * MSVC 1.0 scans automatic dependencies incorrectly when your project * contains this very header. The problem is that MSVC cannot handle * include directives inside #if..#endif block those are never entered. @@ -106,14 +106,14 @@ */ #if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) # if defined(_MSC_VER) /* Microsoft C/C++ */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__MINGW32__) /* MinGW */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__BORLANDC__) /* Borland C/C++ */ # define HAVE_DIRENT_H # define VOID_CLOSEDIR # elif defined(__TURBOC__) /* Borland Turbo C */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__WATCOMC__) /* Watcom C/C++ */ # define HAVE_DIRECT_H # elif defined(__apollo) /* Apollo */ @@ -172,7 +172,7 @@ #elif defined(MSDOS) || defined(WIN32) - /* figure out type of underlaying directory interface to be used */ +/* figure out type of underlaying directory interface to be used */ # if defined(WIN32) # define DIRENT_WIN32_INTERFACE # elif defined(MSDOS) @@ -181,7 +181,7 @@ # error "missing native dirent interface" # endif - /*** WIN32 specifics ***/ +/*** WIN32 specifics ***/ # if defined(DIRENT_WIN32_INTERFACE) # include <windows.h> # if !defined(DIRENT_MAXNAMLEN) @@ -189,11 +189,11 @@ # endif - /*** MS-DOS specifics ***/ +/*** MS-DOS specifics ***/ # elif defined(DIRENT_MSDOS_INTERFACE) # include <dos.h> - /* Borland defines file length macros in dir.h */ +/* Borland defines file length macros in dir.h */ # if defined(__BORLANDC__) # include <dir.h> # if !defined(DIRENT_MAXNAMLEN) @@ -203,7 +203,7 @@ # define _find_t find_t # endif - /* Turbo C defines ffblk structure in dir.h */ +/* Turbo C defines ffblk structure in dir.h */ # elif defined(__TURBOC__) # include <dir.h> # if !defined(DIRENT_MAXNAMLEN) @@ -211,13 +211,13 @@ # endif # define DIRENT_USE_FFBLK - /* MSVC */ +/* MSVC */ # elif defined(_MSC_VER) # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (12) # endif - /* Watcom */ +/* Watcom */ # elif defined(__WATCOMC__) # if !defined(DIRENT_MAXNAMLEN) # if defined(__OS2__) || defined(__NT__) @@ -230,7 +230,7 @@ # endif # endif - /*** generic MS-DOS and MS-Windows stuff ***/ +/*** generic MS-DOS and MS-Windows stuff ***/ # if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) # define NAME_MAX DIRENT_MAXNAMLEN # endif @@ -239,16 +239,16 @@ # endif - /* - * Substitute for real dirent structure. Note that `d_name' field is a - * true character array although we have it copied in the implementation - * dependent data. We could save some memory if we had declared `d_name' - * as a pointer referring the name within implementation dependent data. - * We have not done that since some code may rely on sizeof(d_name) to be - * something other than four. Besides, directory entries are typically so - * small that it takes virtually no time to copy them from place to place. - */ - typedef struct dirent { +/* + * Substitute for real dirent structure. Note that `d_name' field is a + * true character array although we have it copied in the implementation + * dependent data. We could save some memory if we had declared `d_name' + * as a pointer referring the name within implementation dependent data. + * We have not done that since some code may rely on sizeof(d_name) to be + * something other than four. Besides, directory entries are typically so + * small that it takes virtually no time to copy them from place to place. + */ +typedef struct dirent { char d_name[NAME_MAX + 1]; /*** Operating system specific part ***/ @@ -261,21 +261,21 @@ struct _find_t data; # endif # endif - } dirent; +} dirent; - /* DIR substitute structure containing directory name. The name is - * essential for the operation of ``rewinndir'' function. */ - typedef struct DIR { +/* DIR substitute structure containing directory name. The name is + * essential for the operation of ``rewinndir'' function. */ +typedef struct DIR { char *dirname; /* directory being scanned */ dirent current; /* current entry */ int dirent_filled; /* is current un-processed? */ - /*** Operating system specific part ***/ + /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) HANDLE search_handle; # elif defined(DIRENT_MSDOS_INTERFACE) # endif - } DIR; +} DIR; # ifdef __cplusplus extern "C" { @@ -325,7 +325,7 @@ static void _setdirname (struct DIR *dirp); * internal working area that is used for retrieving individual directory * entries. The internal working area has no fields of your interest. * - * <ret>Returns a pointer to the internal working area or NULL in case the + * <ret>Returns a pointer to the internal working area or NULL in case the * directory stream could not be opened. Global `errno' variable will set * in case of error as follows: * @@ -344,46 +344,45 @@ static void _setdirname (struct DIR *dirp); */ static DIR *opendir(const char *dirname) { - DIR *dirp; - assert (dirname != NULL); - - dirp = (DIR*)malloc (sizeof (struct DIR)); - if (dirp != NULL) { - char *p; - - /* allocate room for directory name */ - dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); - if (dirp->dirname == NULL) { - /* failed to duplicate directory name. errno set by malloc() */ - free (dirp); - return NULL; - } - /* Copy directory name while appending directory separator and "*.*". - * Directory separator is not appended if the name already ends with - * drive or directory separator. Directory separator is assumed to be - * '/' or '\' and drive separator is assumed to be ':'. */ - strcpy (dirp->dirname, dirname); - p = strchr (dirp->dirname, '\0'); - if (dirp->dirname < p && - *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') - { - strcpy (p++, "\\"); - } + DIR *dirp; + assert (dirname != NULL); + + dirp = (DIR*)malloc (sizeof (struct DIR)); + if (dirp != NULL) { + char *p; + + /* allocate room for directory name */ + dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); + if (dirp->dirname == NULL) { + /* failed to duplicate directory name. errno set by malloc() */ + free (dirp); + return NULL; + } + /* Copy directory name while appending directory separator and "*.*". + * Directory separator is not appended if the name already ends with + * drive or directory separator. Directory separator is assumed to be + * '/' or '\' and drive separator is assumed to be ':'. */ + strcpy (dirp->dirname, dirname); + p = strchr (dirp->dirname, '\0'); + if (dirp->dirname < p && + *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { + strcpy (p++, "\\"); + } # ifdef DIRENT_WIN32_INTERFACE - strcpy (p, "*"); /*scan files with and without extension in win32*/ + strcpy (p, "*"); /*scan files with and without extension in win32*/ # else - strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ + strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ # endif - /* open stream */ - if (_initdir (dirp) == 0) { - /* initialization failed */ - free (dirp->dirname); - free (dirp); - return NULL; + /* open stream */ + if (_initdir (dirp) == 0) { + /* initialization failed */ + free (dirp->dirname); + free (dirp); + return NULL; + } } - } - return dirp; + return dirp; } @@ -436,55 +435,55 @@ static DIR *opendir(const char *dirname) static struct dirent * readdir (DIR *dirp) { - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return NULL; - } + assert(dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return NULL; + } #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* directory stream was opened/rewound incorrectly or it ended normally */ - errno = EBADF; - return NULL; - } + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* directory stream was opened/rewound incorrectly or it ended normally */ + errno = EBADF; + return NULL; + } #endif - if (dirp->dirent_filled != 0) { - /* - * Directory entry has already been retrieved and there is no need to - * retrieve a new one. Directory entry will be retrieved in advance - * when the user calls readdir function for the first time. This is so - * because real dirent has separate functions for opening and reading - * the stream whereas Win32 and DOS dirents open the stream - * automatically when we retrieve the first file. Therefore, we have to - * save the first file when opening the stream and later we have to - * return the saved entry when the user tries to read the first entry. - */ - dirp->dirent_filled = 0; - } else { - /* fill in entry and return that */ + if (dirp->dirent_filled != 0) { + /* + * Directory entry has already been retrieved and there is no need to + * retrieve a new one. Directory entry will be retrieved in advance + * when the user calls readdir function for the first time. This is so + * because real dirent has separate functions for opening and reading + * the stream whereas Win32 and DOS dirents open the stream + * automatically when we retrieve the first file. Therefore, we have to + * save the first file when opening the stream and later we have to + * return the saved entry when the user tries to read the first entry. + */ + dirp->dirent_filled = 0; + } else { + /* fill in entry and return that */ #if defined(DIRENT_WIN32_INTERFACE) - if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { - /* Last file has been processed or an error occurred */ - FindClose (dirp->search_handle); - dirp->search_handle = INVALID_HANDLE_VALUE; - errno = ENOENT; - return NULL; - } + if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { + /* Last file has been processed or an error occurred */ + FindClose (dirp->search_handle); + dirp->search_handle = INVALID_HANDLE_VALUE; + errno = ENOENT; + return NULL; + } # elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findnext (&dirp->current.data) != 0) { - /* _dos_findnext and findnext will set errno to ENOENT when no - * more entries could be retrieved. */ - return NULL; - } + if (_dos_findnext (&dirp->current.data) != 0) { + /* _dos_findnext and findnext will set errno to ENOENT when no + * more entries could be retrieved. */ + return NULL; + } # endif - _setdirname (dirp); - assert (dirp->dirent_filled == 0); - } - return &dirp->current; + _setdirname (dirp); + assert (dirp->dirent_filled == 0); + } + return &dirp->current; } @@ -509,37 +508,37 @@ readdir (DIR *dirp) */ static int closedir (DIR *dirp) -{ - int retcode = 0; - - /* make sure that dirp points to legal structure */ - assert (dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return -1; - } - - /* free directory name and search handles */ - if (dirp->dirname != NULL) free (dirp->dirname); +{ + int retcode = 0; + + /* make sure that dirp points to legal structure */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return -1; + } + + /* free directory name and search handles */ + if (dirp->dirname != NULL) free (dirp->dirname); #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose (dirp->search_handle) == FALSE) { - /* Unknown error */ - retcode = -1; - errno = EBADF; + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + retcode = -1; + errno = EBADF; + } } - } -#endif +#endif - /* clear dirp structure to make sure that it cannot be used anymore*/ - memset (dirp, 0, sizeof (*dirp)); + /* clear dirp structure to make sure that it cannot be used anymore*/ + memset (dirp, 0, sizeof (*dirp)); # if defined(DIRENT_WIN32_INTERFACE) - dirp->search_handle = INVALID_HANDLE_VALUE; + dirp->search_handle = INVALID_HANDLE_VALUE; # endif - free (dirp); - return retcode; + free (dirp); + return retcode; } @@ -566,31 +565,31 @@ closedir (DIR *dirp) */ static void rewinddir (DIR *dirp) -{ - /* make sure that dirp is legal */ - assert (dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return; - } - assert (dirp->dirname != NULL); - - /* close previous stream */ +{ + /* make sure that dirp is legal */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return; + } + assert (dirp->dirname != NULL); + + /* close previous stream */ #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose (dirp->search_handle) == FALSE) { - /* Unknown error */ - errno = EBADF; + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + errno = EBADF; + } } - } #endif - /* re-open previous stream */ - if (_initdir (dirp) == 0) { - /* initialization failed but we cannot deal with error. User will notice - * error later when she tries to retrieve first directory enty. */ - /*EMPTY*/; - } + /* re-open previous stream */ + if (_initdir (dirp) == 0) { + /* initialization failed but we cannot deal with error. User will notice + * error later when she tries to retrieve first directory enty. */ + /*EMPTY*/; + } } @@ -600,37 +599,36 @@ rewinddir (DIR *dirp) */ static int _initdir (DIR *dirp) -{ - assert (dirp != NULL); - assert (dirp->dirname != NULL); - dirp->dirent_filled = 0; +{ + assert (dirp != NULL); + assert (dirp->dirname != NULL); + dirp->dirent_filled = 0; # if defined(DIRENT_WIN32_INTERFACE) - /* Open stream and retrieve first file */ - dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* something went wrong but we don't know what. GetLastError() could - * give us more information about the error, but then we should map - * the error code into errno. */ - errno = ENOENT; - return 0; - } + /* Open stream and retrieve first file */ + dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* something went wrong but we don't know what. GetLastError() could + * give us more information about the error, but then we should map + * the error code into errno. */ + errno = ENOENT; + return 0; + } # elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findfirst (dirp->dirname, - _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, - &dirp->current.data) != 0) - { - /* _dos_findfirst and findfirst will set errno to ENOENT when no - * more entries could be retrieved. */ - return 0; - } + if (_dos_findfirst (dirp->dirname, + _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, + &dirp->current.data) != 0) { + /* _dos_findfirst and findfirst will set errno to ENOENT when no + * more entries could be retrieved. */ + return 0; + } # endif - /* initialize DIR and it's first entry */ - _setdirname (dirp); - dirp->dirent_filled = 1; - return 1; + /* initialize DIR and it's first entry */ + _setdirname (dirp); + dirp->dirent_filled = 1; + return 1; } @@ -641,14 +639,14 @@ static const char * _getdirname (const struct dirent *dp) { #if defined(DIRENT_WIN32_INTERFACE) - return dp->data.cFileName; - + return dp->data.cFileName; + #elif defined(DIRENT_USE_FFBLK) - return dp->data.ff_name; - + return dp->data.ff_name; + #else - return dp->data.name; -#endif + return dp->data.name; +#endif } @@ -656,16 +654,17 @@ _getdirname (const struct dirent *dp) * Copy name of implementation dependent directory entry to the d_name field. */ static void -_setdirname (struct DIR *dirp) { - /* make sure that d_name is long enough */ - assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); - - strncpy (dirp->current.d_name, - _getdirname (&dirp->current), - NAME_MAX); - dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ +_setdirname (struct DIR *dirp) +{ + /* make sure that d_name is long enough */ + assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); + + strncpy (dirp->current.d_name, + _getdirname (&dirp->current), + NAME_MAX); + dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ } - + # ifdef __cplusplus } # endif diff --git a/src/bin/jp3d/convert.c b/src/bin/jp3d/convert.c index e50f74a7..b11b39d1 100755 --- a/src/bin/jp3d/convert.c +++ b/src/bin/jp3d/convert.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -45,20 +45,21 @@ -void dump_volume(FILE *fd, opj_volume_t * vol) { - int compno; - fprintf(fd, "volume {\n"); - fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d\n", vol->x0, vol->y0, vol->z0,vol->x1, vol->y1, vol->z1); - fprintf(fd, " numcomps=%d\n", vol->numcomps); - for (compno = 0; compno < vol->numcomps; compno++) { - opj_volume_comp_t *comp = &vol->comps[compno]; - fprintf(fd, " comp %d {\n", compno); - fprintf(fd, " dx=%d, dy=%d, dz=%d\n", comp->dx, comp->dy, comp->dz); - fprintf(fd, " prec=%d\n", comp->prec); - fprintf(fd, " sgnd=%d\n", comp->sgnd); - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); +void dump_volume(FILE *fd, opj_volume_t * vol) +{ + int compno; + fprintf(fd, "volume {\n"); + fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d\n", vol->x0, vol->y0, vol->z0,vol->x1, vol->y1, vol->z1); + fprintf(fd, " numcomps=%d\n", vol->numcomps); + for (compno = 0; compno < vol->numcomps; compno++) { + opj_volume_comp_t *comp = &vol->comps[compno]; + fprintf(fd, " comp %d {\n", compno); + fprintf(fd, " dx=%d, dy=%d, dz=%d\n", comp->dx, comp->dy, comp->dz); + fprintf(fd, " prec=%d\n", comp->prec); + fprintf(fd, " sgnd=%d\n", comp->sgnd); + fprintf(fd, " }\n"); + } + fprintf(fd, "}\n"); } /* @@ -66,12 +67,13 @@ void dump_volume(FILE *fd, opj_volume_t * vol) { * * log2(a) */ -static int int_floorlog2(int a) { - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; +static int int_floorlog2(int a) +{ + int l; + for (l = 0; a > 1; l++) { + a >>= 1; + } + return l; } /* @@ -79,8 +81,9 @@ static int int_floorlog2(int a) { * * a divided by 2^b */ -static int int_ceildivpow2(int a, int b) { - return (a + (1 << b) - 1) >> b; +static int int_ceildivpow2(int a, int b) +{ + return (a + (1 << b) - 1) >> b; } /* @@ -88,8 +91,9 @@ static int int_ceildivpow2(int a, int b) { * * a divided by b */ -static int int_ceildiv(int a, int b) { - return (a + b - 1) / b; +static int int_ceildiv(int a, int b) +{ + return (a + b - 1) / b; } @@ -102,362 +106,364 @@ PGX IMAGE FORMAT unsigned char readuchar(FILE * f) { - unsigned char c1; - fread(&c1, 1, 1, f); - return c1; + unsigned char c1; + fread(&c1, 1, 1, f); + return c1; } unsigned short readushort(FILE * f, int bigendian) { - unsigned char c1, c2; - fread(&c1, 1, 1, f); - fread(&c2, 1, 1, f); - if (bigendian) - return (c1 << 8) + c2; - else - return (c2 << 8) + c1; + unsigned char c1, c2; + fread(&c1, 1, 1, f); + fread(&c2, 1, 1, f); + if (bigendian) + return (c1 << 8) + c2; + else + return (c2 << 8) + c1; } unsigned int readuint(FILE * f, int bigendian) { - unsigned char c1, c2, c3, c4; - fread(&c1, 1, 1, f); - fread(&c2, 1, 1, f); - fread(&c3, 1, 1, f); - fread(&c4, 1, 1, f); - if (bigendian) - return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; - else - return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; + unsigned char c1, c2, c3, c4; + fread(&c1, 1, 1, f); + fread(&c2, 1, 1, f); + fread(&c3, 1, 1, f); + fread(&c4, 1, 1, f); + if (bigendian) + return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; + else + return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; } /*****************************************/ static unsigned short ShortSwap(unsigned short v) { - unsigned char c1, c2; - c1 = v & 0xff; - c2 = (v >> 8) & 0xff; - return (c1 << 8) + c2; + unsigned char c1, c2; + c1 = v & 0xff; + c2 = (v >> 8) & 0xff; + return (c1 << 8) + c2; } static unsigned int LongSwap (unsigned int i) { - unsigned char b1, b2, b3, b4; - b1 = i & 255; - b2 = ( i >> 8 ) & 255; - b3 = ( i>>16 ) & 255; - b4 = ( i>>24 ) & 255; - return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4; + unsigned char b1, b2, b3, b4; + b1 = i & 255; + b2 = ( i >> 8 ) & 255; + b3 = ( i>>16 ) & 255; + b4 = ( i>>24 ) & 255; + return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4; } /*****************************************/ -opj_volume_t* pgxtovolume(char *relpath, opj_cparameters_t *parameters) { - - FILE *f = NULL; - int w, h, prec; - unsigned long offset; - int i, s, numcomps, maxvalue, sliceno, slicepos, maxslice = 0; - - OPJ_COLOR_SPACE color_space; - opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_volume_t * volume = NULL; - - char endian1,endian2,sign; - char signtmp[32]; - char temp[32]; - opj_volume_comp_t *comp = NULL; - - DIR *dirp; +opj_volume_t* pgxtovolume(char *relpath, opj_cparameters_t *parameters) +{ + + FILE *f = NULL; + int w, h, prec; + unsigned long offset; + int i, s, numcomps, maxvalue, sliceno, slicepos, maxslice = 0; + + OPJ_COLOR_SPACE color_space; + opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ + opj_volume_t * volume = NULL; + + char endian1,endian2,sign; + char signtmp[32]; + char temp[32]; + opj_volume_comp_t *comp = NULL; + + DIR *dirp; struct dirent *direntp; - - char *tmp = NULL, *tmp2 = NULL, - *point = NULL, *pgx = NULL; - char tmpdirpath[MAX_PATH]; - char dirpath[MAX_PATH]; - char pattern[MAX_PATH]; - char pgxfiles[MAX_SLICES][MAX_PATH]; - int pgxslicepos[MAX_SLICES]; - char tmpno[3]; - - numcomps = 1; - color_space = CLRSPC_GRAY; - sliceno = 0; - maxvalue = 0; - memset(pgxfiles, 0, MAX_SLICES * MAX_PATH * sizeof(char)); - memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); - - /* Separación del caso de un único slice frente al de muchos */ - if ((tmp = strrchr(relpath,'-')) == NULL){ - /*fprintf(stdout,"[INFO] A volume of only one slice....\n");*/ - sliceno = 1; - maxslice = 1; - strcpy(pgxfiles[0],relpath); - - } else { - /*Fetch only the path */ - strcpy(tmpdirpath,relpath); - if ((tmp = strrchr(tmpdirpath,'/')) != NULL){ - tmp++; *tmp='\0'; - strcpy(dirpath,tmpdirpath); - } else { - strcpy(dirpath,"./"); - } - - /*Fetch the pattern of the volume slices*/ - if ((tmp = strrchr (relpath,'/')) != NULL) - tmp++; - else - tmp = relpath; + + char *tmp = NULL, *tmp2 = NULL, + *point = NULL, *pgx = NULL; + char tmpdirpath[MAX_PATH]; + char dirpath[MAX_PATH]; + char pattern[MAX_PATH]; + char pgxfiles[MAX_SLICES][MAX_PATH]; + int pgxslicepos[MAX_SLICES]; + char tmpno[3]; + + numcomps = 1; + color_space = CLRSPC_GRAY; + sliceno = 0; + maxvalue = 0; + memset(pgxfiles, 0, MAX_SLICES * MAX_PATH * sizeof(char)); + memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); + + /* Separación del caso de un único slice frente al de muchos */ + if ((tmp = strrchr(relpath,'-')) == NULL) { + /*fprintf(stdout,"[INFO] A volume of only one slice....\n");*/ + sliceno = 1; + maxslice = 1; + strcpy(pgxfiles[0],relpath); + + } else { + /*Fetch only the path */ + strcpy(tmpdirpath,relpath); + if ((tmp = strrchr(tmpdirpath,'/')) != NULL) { + tmp++; + *tmp='\0'; + strcpy(dirpath,tmpdirpath); + } else { + strcpy(dirpath,"./"); + } + + /*Fetch the pattern of the volume slices*/ + if ((tmp = strrchr (relpath,'/')) != NULL) + tmp++; + else + tmp = relpath; if ((tmp2 = strrchr(tmp,'-')) != NULL) *tmp2='\0'; - else{ - fprintf(stdout, "[ERROR] tmp2 ha dado null. no ha encontrado el * %s %s",tmp,relpath); - return NULL; - } + else { + fprintf(stdout, "[ERROR] tmp2 ha dado null. no ha encontrado el * %s %s",tmp,relpath); + return NULL; + } strcpy(pattern,tmp); - dirp = opendir( dirpath ); - if (dirp == NULL){ - fprintf(stdout, "[ERROR] Infile must be a .pgx file or a directory that contain pgx files"); - return NULL; - } - - /*Read all .pgx files of directory */ - while ( (direntp = readdir( dirp )) != NULL ) - { - /* Found a directory, but ignore . and .. */ - if(strcmp(".",direntp->d_name) == 0 || strcmp("..",direntp->d_name) == 0) - continue; - - if( ((pgx = strstr(direntp->d_name,pattern)) != NULL) && ((tmp2 = strstr(direntp->d_name,".pgx")) != NULL) ){ - - strcpy(tmp,dirpath); - tmp = strcat(tmp,direntp->d_name); - - /*Obtenemos el index de la secuencia de slices*/ - if ((tmp2 = strpbrk (direntp->d_name, "0123456789")) == NULL) - continue; - i = 0; - while (tmp2 != NULL) { - tmpno[i++] = *tmp2; - point = tmp2; - tmp2 = strpbrk (tmp2+1,"0123456789"); - }tmpno[i]='\0'; - - /*Comprobamos que no estamos leyendo algo raro como pattern.jp3d*/ - if ((point = strpbrk (point,".")) == NULL){ - break; - } - /*Slicepos --> index de slice; Sliceno --> no de slices hasta el momento*/ - slicepos = atoi(tmpno); - pgxslicepos[sliceno] = slicepos - 1; - sliceno++; - if (slicepos>maxslice) - maxslice = slicepos; - - /*Colocamos el slices en su posicion correspondiente*/ - strcpy(pgxfiles[slicepos-1],tmp); - } - } - - }/* else if pattern*.pgx */ - - if (!sliceno) { - fprintf(stdout,"[ERROR] No slices with this pattern founded !! Please check input volume name\n"); - return NULL; - } - /*if ( maxslice != sliceno) { - fprintf(stdout,"[ERROR] Slices are not sequentially numbered !! Please rename them accordingly\n"); - return NULL; - }*/ - - for (s=0;s<sliceno;s++) - { - int pos = maxslice == sliceno ? s: pgxslicepos[s]; - f = fopen(pgxfiles[pos], "rb"); - if (!f) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !\n", pgxfiles[s]); - return NULL; - } - fprintf(stdout, "[INFO] Loading %s \n",pgxfiles[pos]); - - fseek(f, 0, SEEK_SET); - fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h); - - i=0; - sign='+'; - while (signtmp[i]!='\0') { - if (signtmp[i]=='-') sign='-'; - i++; - } - - fgetc(f); - if (endian1=='M' && endian2=='L') { - cmptparm.bigendian = 1; - } else if (endian2=='M' && endian1=='L') { - cmptparm.bigendian = 0; - } else { - fprintf(stdout, "[ERROR] Bad pgx header, please check input file\n"); - return NULL; - } - - if (s==0){ - /* initialize volume component */ - - cmptparm.x0 = parameters->volume_offset_x0; - cmptparm.y0 = parameters->volume_offset_y0; - cmptparm.z0 = parameters->volume_offset_z0; - cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; - cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; - cmptparm.l = !cmptparm.z0 ? (sliceno - 1) * parameters->subsampling_dz + 1 : cmptparm.z0 + (sliceno - 1) * parameters->subsampling_dz + 1; - - if (sign == '-') { - cmptparm.sgnd = 1; - } else { - cmptparm.sgnd = 0; - } - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.dcoffset = parameters->dcoffset; - cmptparm.dx = parameters->subsampling_dx; - cmptparm.dy = parameters->subsampling_dy; - cmptparm.dz = parameters->subsampling_dz; - - /* create the volume */ - volume = opj_volume_create(numcomps, &cmptparm, color_space); - if(!volume) { - fclose(f); - return NULL; - } - /* set volume offset and reference grid */ - volume->x0 = cmptparm.x0; - volume->y0 = cmptparm.y0; - volume->z0 = cmptparm.z0; - volume->x1 = cmptparm.w; - volume->y1 = cmptparm.h; - volume->z1 = cmptparm.l; - - /* set volume data :only one component, that is a volume*/ - comp = &volume->comps[0]; - - }/*if sliceno==1*/ - - offset = w * h * s; - - for (i = 0; i < w * h; i++) { - int v; - if (comp->prec <= 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, cmptparm.bigendian); - } else { - v = (short) readushort(f, cmptparm.bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, cmptparm.bigendian); - } else { - v = (int) readuint(f, cmptparm.bigendian); - } - } - if (v > maxvalue) - maxvalue = v; - comp->data[i + offset] = v; - - } - fclose(f); - } /* for s --> sliceno*/ - comp->bpp = int_floorlog2(maxvalue) + 1; - if (sliceno != 1) - closedir( dirp ); - /*dump_volume(stdout, volume);*/ - return volume; + dirp = opendir( dirpath ); + if (dirp == NULL) { + fprintf(stdout, "[ERROR] Infile must be a .pgx file or a directory that contain pgx files"); + return NULL; + } + + /*Read all .pgx files of directory */ + while ( (direntp = readdir( dirp )) != NULL ) { + /* Found a directory, but ignore . and .. */ + if(strcmp(".",direntp->d_name) == 0 || strcmp("..",direntp->d_name) == 0) + continue; + + if( ((pgx = strstr(direntp->d_name,pattern)) != NULL) && ((tmp2 = strstr(direntp->d_name,".pgx")) != NULL) ) { + + strcpy(tmp,dirpath); + tmp = strcat(tmp,direntp->d_name); + + /*Obtenemos el index de la secuencia de slices*/ + if ((tmp2 = strpbrk (direntp->d_name, "0123456789")) == NULL) + continue; + i = 0; + while (tmp2 != NULL) { + tmpno[i++] = *tmp2; + point = tmp2; + tmp2 = strpbrk (tmp2+1,"0123456789"); + } + tmpno[i]='\0'; + + /*Comprobamos que no estamos leyendo algo raro como pattern.jp3d*/ + if ((point = strpbrk (point,".")) == NULL) { + break; + } + /*Slicepos --> index de slice; Sliceno --> no de slices hasta el momento*/ + slicepos = atoi(tmpno); + pgxslicepos[sliceno] = slicepos - 1; + sliceno++; + if (slicepos>maxslice) + maxslice = slicepos; + + /*Colocamos el slices en su posicion correspondiente*/ + strcpy(pgxfiles[slicepos-1],tmp); + } + } + + }/* else if pattern*.pgx */ + + if (!sliceno) { + fprintf(stdout,"[ERROR] No slices with this pattern founded !! Please check input volume name\n"); + return NULL; + } + /*if ( maxslice != sliceno) { + fprintf(stdout,"[ERROR] Slices are not sequentially numbered !! Please rename them accordingly\n"); + return NULL; + }*/ + + for (s=0; s<sliceno; s++) { + int pos = maxslice == sliceno ? s: pgxslicepos[s]; + f = fopen(pgxfiles[pos], "rb"); + if (!f) { + fprintf(stdout, "[ERROR] Failed to open %s for reading !\n", pgxfiles[s]); + return NULL; + } + fprintf(stdout, "[INFO] Loading %s \n",pgxfiles[pos]); + + fseek(f, 0, SEEK_SET); + fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h); + + i=0; + sign='+'; + while (signtmp[i]!='\0') { + if (signtmp[i]=='-') sign='-'; + i++; + } + + fgetc(f); + if (endian1=='M' && endian2=='L') { + cmptparm.bigendian = 1; + } else if (endian2=='M' && endian1=='L') { + cmptparm.bigendian = 0; + } else { + fprintf(stdout, "[ERROR] Bad pgx header, please check input file\n"); + return NULL; + } + + if (s==0) { + /* initialize volume component */ + + cmptparm.x0 = parameters->volume_offset_x0; + cmptparm.y0 = parameters->volume_offset_y0; + cmptparm.z0 = parameters->volume_offset_z0; + cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; + cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; + cmptparm.l = !cmptparm.z0 ? (sliceno - 1) * parameters->subsampling_dz + 1 : cmptparm.z0 + (sliceno - 1) * parameters->subsampling_dz + 1; + + if (sign == '-') { + cmptparm.sgnd = 1; + } else { + cmptparm.sgnd = 0; + } + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.dcoffset = parameters->dcoffset; + cmptparm.dx = parameters->subsampling_dx; + cmptparm.dy = parameters->subsampling_dy; + cmptparm.dz = parameters->subsampling_dz; + + /* create the volume */ + volume = opj_volume_create(numcomps, &cmptparm, color_space); + if(!volume) { + fclose(f); + return NULL; + } + /* set volume offset and reference grid */ + volume->x0 = cmptparm.x0; + volume->y0 = cmptparm.y0; + volume->z0 = cmptparm.z0; + volume->x1 = cmptparm.w; + volume->y1 = cmptparm.h; + volume->z1 = cmptparm.l; + + /* set volume data :only one component, that is a volume*/ + comp = &volume->comps[0]; + + }/*if sliceno==1*/ + + offset = w * h * s; + + for (i = 0; i < w * h; i++) { + int v; + if (comp->prec <= 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, cmptparm.bigendian); + } else { + v = (short) readushort(f, cmptparm.bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, cmptparm.bigendian); + } else { + v = (int) readuint(f, cmptparm.bigendian); + } + } + if (v > maxvalue) + maxvalue = v; + comp->data[i + offset] = v; + + } + fclose(f); + } /* for s --> sliceno*/ + comp->bpp = int_floorlog2(maxvalue) + 1; + if (sliceno != 1) + closedir( dirp ); + /*dump_volume(stdout, volume);*/ + return volume; } -int volumetopgx(opj_volume_t * volume, char *outfile) { - int w, wr, wrr, h, hr, hrr, l, lr, lrr; - int i, j, compno, offset, sliceno; - FILE *fdest = NULL; - - for (compno = 0; compno < volume->numcomps; compno++) { - opj_volume_comp_t *comp = &volume->comps[compno]; - char name[256]; - int nbytes = 0; - char *tmp = outfile; - while (*tmp) { - tmp++; - } - while (*tmp!='.') { - tmp--; - } - *tmp='\0'; - for(sliceno = 0; sliceno < volume->z1 - volume->z0; sliceno++) { - - if (volume->numcomps > 1) { - sprintf(name, "%s%d-%d.pgx", outfile, sliceno+1, compno); - } else if ((volume->z1 - volume->z0) > 1) { - sprintf(name, "%s%d.pgx", outfile, sliceno+1); - } else { - sprintf(name, "%s.pgx", outfile); - } - - fdest = fopen(name, "wb"); - if (!fdest) { - fprintf(stdout, "[ERROR] Failed to open %s for writing \n", name); - return 1; - } - - fprintf(stdout,"[INFO] Writing in %s (%s)\n",name,volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); - - w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); - wr = volume->comps[compno].w; - wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); - - h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); - hr = volume->comps[compno].h; - hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); - - l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); - lr = volume->comps[compno].l; - lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); - - fprintf(fdest, "PG %c%c %c%d %d %d\n", comp->bigendian ? 'M':'L', comp->bigendian ? 'L':'M',comp->sgnd ? '-' : '+', comp->prec, wr, hr); - if (comp->prec <= 8) { - nbytes = 1; - } else if (comp->prec <= 16) { - nbytes = 2; - } else { - nbytes = 4; - } - - offset = (sliceno / lrr * l) + (sliceno % lrr); - offset = wrr * hrr * offset; - /*fprintf(stdout,"%d %d %d %d\n",offset,wrr*hrr,wrr,w);*/ - for (i = 0; i < wrr * hrr; i++) { - int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; - if (volume->comps[0].bigendian) { - for (j = nbytes - 1; j >= 0; j--) { +int volumetopgx(opj_volume_t * volume, char *outfile) +{ + int w, wr, wrr, h, hr, hrr, l, lr, lrr; + int i, j, compno, offset, sliceno; + FILE *fdest = NULL; + + for (compno = 0; compno < volume->numcomps; compno++) { + opj_volume_comp_t *comp = &volume->comps[compno]; + char name[256]; + int nbytes = 0; + char *tmp = outfile; + while (*tmp) { + tmp++; + } + while (*tmp!='.') { + tmp--; + } + *tmp='\0'; + for(sliceno = 0; sliceno < volume->z1 - volume->z0; sliceno++) { + + if (volume->numcomps > 1) { + sprintf(name, "%s%d-%d.pgx", outfile, sliceno+1, compno); + } else if ((volume->z1 - volume->z0) > 1) { + sprintf(name, "%s%d.pgx", outfile, sliceno+1); + } else { + sprintf(name, "%s.pgx", outfile); + } + + fdest = fopen(name, "wb"); + if (!fdest) { + fprintf(stdout, "[ERROR] Failed to open %s for writing \n", name); + return 1; + } + + fprintf(stdout,"[INFO] Writing in %s (%s)\n",name,volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); + + w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); + wr = volume->comps[compno].w; + wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); + + h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); + hr = volume->comps[compno].h; + hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); + + l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); + lr = volume->comps[compno].l; + lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); + + fprintf(fdest, "PG %c%c %c%d %d %d\n", comp->bigendian ? 'M':'L', comp->bigendian ? 'L':'M',comp->sgnd ? '-' : '+', comp->prec, wr, hr); + if (comp->prec <= 8) { + nbytes = 1; + } else if (comp->prec <= 16) { + nbytes = 2; + } else { + nbytes = 4; + } + + offset = (sliceno / lrr * l) + (sliceno % lrr); + offset = wrr * hrr * offset; + /*fprintf(stdout,"%d %d %d %d\n",offset,wrr*hrr,wrr,w);*/ + for (i = 0; i < wrr * hrr; i++) { + int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; + if (volume->comps[0].bigendian) { + for (j = nbytes - 1; j >= 0; j--) { char byte = (char) ((v >> (j * 8)) & 0xff); fwrite(&byte, 1, 1, fdest); - } - } else { - for (j = 0; j <= nbytes - 1; j++) { + } + } else { + for (j = 0; j <= nbytes - 1; j++) { char byte = (char) ((v >> (j * 8)) & 0xff); - fwrite(&byte, 1, 1, fdest); - } - } - } + fwrite(&byte, 1, 1, fdest); + } + } + } - fclose(fdest); - }/*for sliceno*/ - }/*for compno*/ + fclose(fdest); + }/*for sliceno*/ + }/*for compno*/ - return 0; + return 0; } /* -->> -->> -->> -->> @@ -466,537 +472,541 @@ BIN IMAGE FORMAT <<-- <<-- <<-- <<-- */ -opj_volume_t* bintovolume(char *filename, char *fileimg, opj_cparameters_t *parameters) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - int subsampling_dz = parameters->subsampling_dz; - - int i, compno, w, h, l, numcomps = 1; - int prec, max = 0; - -/* char temp[32];*/ - char line[100]; - int bigendian; - - FILE *f = NULL; - FILE *fimg = NULL; - OPJ_COLOR_SPACE color_space; - opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_volume_t * volume = NULL; - opj_volume_comp_t *comp = NULL; - - bigendian = 0; - color_space = CLRSPC_GRAY; - - fimg = fopen(fileimg,"r"); - if (!fimg) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", fileimg); - return 0; - } - - fseek(fimg, 0, SEEK_SET); - while (!feof(fimg)) { +opj_volume_t* bintovolume(char *filename, char *fileimg, opj_cparameters_t *parameters) +{ + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + int subsampling_dz = parameters->subsampling_dz; + + int i, compno, w, h, l, numcomps = 1; + int prec, max = 0; + + /* char temp[32];*/ + char line[100]; + int bigendian; + + FILE *f = NULL; + FILE *fimg = NULL; + OPJ_COLOR_SPACE color_space; + opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ + opj_volume_t * volume = NULL; + opj_volume_comp_t *comp = NULL; + + bigendian = 0; + color_space = CLRSPC_GRAY; + + fimg = fopen(fileimg,"r"); + if (!fimg) { + fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", fileimg); + return 0; + } + + fseek(fimg, 0, SEEK_SET); + while (!feof(fimg)) { fgets(line,100,fimg); - /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ - if (strncmp(line,"Bpp",3) == 0){ - sscanf(line,"%*s%*[ \t]%d",&prec); - } else if (strncmp(line,"Color",5) == 0){ - sscanf(line, "%*s%*[ \t]%d",&color_space); - } else if (strncmp(line,"Dim",3) == 0){ - sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); - } - } - /*fscanf(fimg, "Bpp%[ \t]%d%[ \t\n]",temp,&prec,temp);*/ - /*fscanf(fimg, "Color Map%[ \t]%d%[ \n\t]Dimensions%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&color_space,temp,temp,&w,temp,&h,temp,&l,temp);*/ - /*fscanf(fimg, "Resolution(mm)%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&subsampling_dx,temp,&subsampling_dy,temp,&subsampling_dz,temp);*/ - - #ifdef VERBOSE - fprintf(stdout, "[INFO] %d \t %d %d %d \t %3.2f %2.2f %2.2f \t %d \n",color_space,w,h,l,subsampling_dx,subsampling_dy,subsampling_dz,prec); - #endif - fclose(fimg); - - /* initialize volume components */ - memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); - - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.sgnd = 0; - cmptparm.bigendian = bigendian; - cmptparm.dcoffset = parameters->dcoffset; - cmptparm.dx = subsampling_dx; - cmptparm.dy = subsampling_dy; - cmptparm.dz = subsampling_dz; - cmptparm.w = w; - cmptparm.h = h; - cmptparm.l = l; - - /* create the volume */ - volume = opj_volume_create(numcomps, &cmptparm, color_space); - if(!volume) { - fprintf(stdout,"[ERROR] Unable to create volume"); - fclose(f); - return NULL; - } - - /* set volume offset and reference grid */ - volume->x0 = parameters->volume_offset_x0; - volume->y0 = parameters->volume_offset_y0; - volume->z0 = parameters->volume_offset_z0; - volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; - volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; - volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; - - /* set volume data */ - f = fopen(filename, "rb"); - if (!f) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", filename); - return 0; - } - - /* BINARY */ - for (compno = 0; compno < volume->numcomps; compno++) { - int whl = w * h * l; - /* set volume data */ - comp = &volume->comps[compno]; - - /*if (comp->prec <= 8) { - if (!comp->sgnd) { + /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ + if (strncmp(line,"Bpp",3) == 0) { + sscanf(line,"%*s%*[ \t]%d",&prec); + } else if (strncmp(line,"Color",5) == 0) { + sscanf(line, "%*s%*[ \t]%d",&color_space); + } else if (strncmp(line,"Dim",3) == 0) { + sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); + } + } + /*fscanf(fimg, "Bpp%[ \t]%d%[ \t\n]",temp,&prec,temp);*/ + /*fscanf(fimg, "Color Map%[ \t]%d%[ \n\t]Dimensions%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&color_space,temp,temp,&w,temp,&h,temp,&l,temp);*/ + /*fscanf(fimg, "Resolution(mm)%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&subsampling_dx,temp,&subsampling_dy,temp,&subsampling_dz,temp);*/ + +#ifdef VERBOSE + fprintf(stdout, "[INFO] %d \t %d %d %d \t %3.2f %2.2f %2.2f \t %d \n",color_space,w,h,l,subsampling_dx,subsampling_dy,subsampling_dz,prec); +#endif + fclose(fimg); + + /* initialize volume components */ + memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); + + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.sgnd = 0; + cmptparm.bigendian = bigendian; + cmptparm.dcoffset = parameters->dcoffset; + cmptparm.dx = subsampling_dx; + cmptparm.dy = subsampling_dy; + cmptparm.dz = subsampling_dz; + cmptparm.w = w; + cmptparm.h = h; + cmptparm.l = l; + + /* create the volume */ + volume = opj_volume_create(numcomps, &cmptparm, color_space); + if(!volume) { + fprintf(stdout,"[ERROR] Unable to create volume"); + fclose(f); + return NULL; + } + + /* set volume offset and reference grid */ + volume->x0 = parameters->volume_offset_x0; + volume->y0 = parameters->volume_offset_y0; + volume->z0 = parameters->volume_offset_z0; + volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; + volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; + volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; + + /* set volume data */ + f = fopen(filename, "rb"); + if (!f) { + fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", filename); + return 0; + } + + /* BINARY */ + for (compno = 0; compno < volume->numcomps; compno++) { + int whl = w * h * l; + /* set volume data */ + comp = &volume->comps[compno]; + + /*if (comp->prec <= 8) { + if (!comp->sgnd) { unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - char *data = (char *) malloc(whl); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + char *data = (char *) malloc(whl); + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - - for (i = 0; i < whl; i++) { - if (bigendian) //(c1 << 8) + c2; - comp->data[i] = data[i]; - else{ //(c2 << 8) + c1; - comp->data[i] = ShortSwap(data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - short *data = (short *) malloc(whl); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (bigendian){ //(c1 << 8) + c2; - comp->data[i] = data[i]; - }else{ //(c2 << 8) + c1; - comp->data[i] = (short) ShortSwap((unsigned short) data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else { - if (!comp->sgnd) { + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + + for (i = 0; i < whl; i++) { + if (bigendian) //(c1 << 8) + c2; + comp->data[i] = data[i]; + else{ //(c2 << 8) + c1; + comp->data[i] = ShortSwap(data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + short *data = (short *) malloc(whl); + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (bigendian){ //(c1 << 8) + c2; + comp->data[i] = data[i]; + }else{ //(c2 << 8) + c1; + comp->data[i] = (short) ShortSwap((unsigned short) data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else { + if (!comp->sgnd) { unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); - int leido = fread(data, 4, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = LongSwap(data[i]); - else - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - int leido = fread(comp->data, 4, whl, f); - if (!leido) { - fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); - if (comp->data[i] > max) - max = comp->data[i]; - } - } - }*/ - - for (i = 0; i < whl; i++) { - int v; - if (comp->prec <= 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, bigendian); - } else { - v = (short) readushort(f, bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, bigendian); - } else { - v = (int) readuint(f, bigendian); - } - } - if (v > max) - max = v; - comp->data[i] = v; - } - comp->bpp = int_floorlog2(max) + 1; - } - fclose(f); - return volume; + int leido = fread(data, 4, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = LongSwap(data[i]); + else + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + int leido = fread(comp->data, 4, whl, f); + if (!leido) { + fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); + if (comp->data[i] > max) + max = comp->data[i]; + } + } + }*/ + + for (i = 0; i < whl; i++) { + int v; + if (comp->prec <= 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, bigendian); + } else { + v = (short) readushort(f, bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, bigendian); + } else { + v = (int) readuint(f, bigendian); + } + } + if (v > max) + max = v; + comp->data[i] = v; + } + comp->bpp = int_floorlog2(max) + 1; + } + fclose(f); + return volume; } -int volumetobin(opj_volume_t * volume, char *outfile) { - int w, wr, wrr, h, hr, hrr, l, lr, lrr, max; - int i,j, compno, nbytes; - int offset, sliceno; - FILE *fdest = NULL; - FILE *fimgdest = NULL; -/* char *imgtemp;*/ - char name[256]; - - for (compno = 0; compno < 1; compno++) { /*Only one component*/ - - fdest = fopen(outfile, "wb"); - if (!fdest) { - fprintf(stdout, "[ERROR] Failed to open %s for writing\n", outfile); - return 1; - } +int volumetobin(opj_volume_t * volume, char *outfile) +{ + int w, wr, wrr, h, hr, hrr, l, lr, lrr, max; + int i,j, compno, nbytes; + int offset, sliceno; + FILE *fdest = NULL; + FILE *fimgdest = NULL; + /* char *imgtemp;*/ + char name[256]; + + for (compno = 0; compno < 1; compno++) { /*Only one component*/ + + fdest = fopen(outfile, "wb"); + if (!fdest) { + fprintf(stdout, "[ERROR] Failed to open %s for writing\n", outfile); + return 1; + } fprintf(stdout,"[INFO] Writing outfile %s (%s) \n",outfile, volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); - w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); - wr = volume->comps[compno].w; - wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); - - h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); - hr = volume->comps[compno].h; - hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); - - l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); - lr = volume->comps[compno].l; - lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); - - max = (volume->comps[compno].prec <= 8) ? 255 : (1 << volume->comps[compno].prec) - 1; - - volume->comps[compno].x0 = int_ceildivpow2(volume->comps[compno].x0 - int_ceildiv(volume->x0, volume->comps[compno].dx), volume->comps[compno].factor[0]); - volume->comps[compno].y0 = int_ceildivpow2(volume->comps[compno].y0 - int_ceildiv(volume->y0, volume->comps[compno].dy), volume->comps[compno].factor[1]); - volume->comps[compno].z0 = int_ceildivpow2(volume->comps[compno].z0 - int_ceildiv(volume->z0, volume->comps[compno].dz), volume->comps[compno].factor[2]); - - if (volume->comps[0].prec <= 8) { - nbytes = 1; - } else if (volume->comps[0].prec <= 16) { - nbytes = 2; - } else { - nbytes = 4; - } - - /*fprintf(stdout,"w %d wr %d wrr %d h %d hr %d hrr %d l %d lr %d lrr %d max %d nbytes %d\n Factor %d %d %d",w,wr,wrr,h,hr,hrr,l,lr,lrr,max,nbytes,volume->comps[compno].factor[0],volume->comps[compno].factor[1],volume->comps[compno].factor[2]);*/ - - for(sliceno = 0; sliceno < lrr; sliceno++) { - offset = (sliceno / lrr * l) + (sliceno % lrr); + w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); + wr = volume->comps[compno].w; + wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); + + h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); + hr = volume->comps[compno].h; + hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); + + l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); + lr = volume->comps[compno].l; + lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); + + max = (volume->comps[compno].prec <= 8) ? 255 : (1 << volume->comps[compno].prec) - 1; + + volume->comps[compno].x0 = int_ceildivpow2(volume->comps[compno].x0 - int_ceildiv(volume->x0, volume->comps[compno].dx), volume->comps[compno].factor[0]); + volume->comps[compno].y0 = int_ceildivpow2(volume->comps[compno].y0 - int_ceildiv(volume->y0, volume->comps[compno].dy), volume->comps[compno].factor[1]); + volume->comps[compno].z0 = int_ceildivpow2(volume->comps[compno].z0 - int_ceildiv(volume->z0, volume->comps[compno].dz), volume->comps[compno].factor[2]); + + if (volume->comps[0].prec <= 8) { + nbytes = 1; + } else if (volume->comps[0].prec <= 16) { + nbytes = 2; + } else { + nbytes = 4; + } + + /*fprintf(stdout,"w %d wr %d wrr %d h %d hr %d hrr %d l %d lr %d lrr %d max %d nbytes %d\n Factor %d %d %d",w,wr,wrr,h,hr,hrr,l,lr,lrr,max,nbytes,volume->comps[compno].factor[0],volume->comps[compno].factor[1],volume->comps[compno].factor[2]);*/ + + for(sliceno = 0; sliceno < lrr; sliceno++) { + offset = (sliceno / lrr * l) + (sliceno % lrr); offset = wrr * hrr * offset; - for (i = 0; i < wrr * hrr; i++) { - int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; - if (volume->comps[0].bigendian) { - for (j = nbytes - 1; j >= 0; j--) { + for (i = 0; i < wrr * hrr; i++) { + int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; + if (volume->comps[0].bigendian) { + for (j = nbytes - 1; j >= 0; j--) { char byte = (char) ((v >> (j * 8)) & 0xff); fwrite(&byte, 1, 1, fdest); - } - } else { - for (j = 0; j <= nbytes - 1; j++) { + } + } else { + for (j = 0; j <= nbytes - 1; j++) { char byte = (char) ((v >> (j * 8)) & 0xff); - fwrite(&byte, 1, 1, fdest); - } - } - } - } - - } - - fclose(fdest); - - sprintf(name,"%s.img",outfile); - fimgdest = fopen(name, "w"); - if (!fimgdest) { - fprintf(stdout, "[ERROR] Failed to open %s for writing\n", name); - return 1; - } - fprintf(fimgdest, "Bpp\t%d\nColor Map\t2\nDimensions\t%d\t%d\t%d\nResolution(mm)\t%d\t%d\t%d\t\n", - volume->comps[0].prec,wrr,hrr,lrr,volume->comps[0].dx,volume->comps[0].dy,volume->comps[0].dz); - - fclose(fimgdest); - return 0; + fwrite(&byte, 1, 1, fdest); + } + } + } + } + + } + + fclose(fdest); + + sprintf(name,"%s.img",outfile); + fimgdest = fopen(name, "w"); + if (!fimgdest) { + fprintf(stdout, "[ERROR] Failed to open %s for writing\n", name); + return 1; + } + fprintf(fimgdest, "Bpp\t%d\nColor Map\t2\nDimensions\t%d\t%d\t%d\nResolution(mm)\t%d\t%d\t%d\t\n", + volume->comps[0].prec,wrr,hrr,lrr,volume->comps[0].dx,volume->comps[0].dy,volume->comps[0].dz); + + fclose(fimgdest); + return 0; } /* -->> -->> -->> -->> IMG IMAGE FORMAT <<-- <<-- <<-- <<-- */ -opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - int subsampling_dz = parameters->subsampling_dz; - - int i, compno, w, h, l, numcomps = 1; - int prec, max = 0, min = 0; - float dx, dy, dz; - char filename[100], tmpdirpath[100], dirpath[100], *tmp; - char line[100], datatype[100]; - int bigendian; - - FILE *f = NULL; - FILE *fimg = NULL; - OPJ_COLOR_SPACE color_space; - opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_volume_t * volume = NULL; - opj_volume_comp_t *comp = NULL; - - bigendian = 0; - color_space = CLRSPC_GRAY; - - fimg = fopen(fileimg,"r"); - if (!fimg) { - fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", fileimg); - return 0; - } - - /*Fetch only the path */ - strcpy(tmpdirpath,fileimg); - if ((tmp = strrchr(tmpdirpath,'/')) != NULL){ - tmp++; *tmp='\0'; - strcpy(dirpath,tmpdirpath); - } else { - strcpy(dirpath,"./"); - } - - fseek(fimg, 0, SEEK_SET); - while (!feof(fimg)) { +opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters) +{ + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + int subsampling_dz = parameters->subsampling_dz; + + int i, compno, w, h, l, numcomps = 1; + int prec, max = 0, min = 0; + float dx, dy, dz; + char filename[100], tmpdirpath[100], dirpath[100], *tmp; + char line[100], datatype[100]; + int bigendian; + + FILE *f = NULL; + FILE *fimg = NULL; + OPJ_COLOR_SPACE color_space; + opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ + opj_volume_t * volume = NULL; + opj_volume_comp_t *comp = NULL; + + bigendian = 0; + color_space = CLRSPC_GRAY; + + fimg = fopen(fileimg,"r"); + if (!fimg) { + fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", fileimg); + return 0; + } + + /*Fetch only the path */ + strcpy(tmpdirpath,fileimg); + if ((tmp = strrchr(tmpdirpath,'/')) != NULL) { + tmp++; + *tmp='\0'; + strcpy(dirpath,tmpdirpath); + } else { + strcpy(dirpath,"./"); + } + + fseek(fimg, 0, SEEK_SET); + while (!feof(fimg)) { fgets(line,100,fimg); - /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ - if (strncmp(line,"Image",5) == 0){ - sscanf(line,"%*s%*[ \t]%s",datatype); - } else if (strncmp(line,"File",4) == 0){ - sscanf(line,"%*s %*s%*[ \t]%s",filename); - strcat(dirpath, filename); - strcpy(filename,dirpath); - } else if (strncmp(line,"Min",3) == 0){ - sscanf(line,"%*s %*s%*[ \t]%d%*[ \t]%d",&min,&max); - prec = int_floorlog2(max - min + 1); - } else if (strncmp(line,"Bpp",3) == 0){ - sscanf(line,"%*s%*[ \t]%d",&prec); - } else if (strncmp(line,"Color",5) == 0){ - sscanf(line, "%*s %*s%*[ \t]%d",&color_space); - } else if (strncmp(line,"Dim",3) == 0){ - sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); - } else if (strncmp(line,"Res",3) == 0){ - sscanf(line,"%*s%*[ \t]%f%*[ \t]%f%*[ \t]%f",&dx,&dy,&dz); - } - - } - #ifdef VERBOSE - fprintf(stdout, "[INFO] %s %d \t %d %d %d \t %f %f %f \t %d %d %d \n",filename,color_space,w,h,l,dx,dy,dz,max,min,prec); - #endif - fclose(fimg); - - /* error control */ - if ( !prec || !w || !h || !l ){ - fprintf(stderr,"[ERROR] Unable to read IMG file correctly. Found some null values."); - return NULL; - } - - /* initialize volume components */ - memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); - - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.sgnd = 0; - cmptparm.bigendian = bigendian; - cmptparm.dcoffset = parameters->dcoffset; - cmptparm.dx = subsampling_dx; - cmptparm.dy = subsampling_dy; - cmptparm.dz = subsampling_dz; - cmptparm.w = w; - cmptparm.h = h; - cmptparm.l = l; - - /* create the volume */ - volume = opj_volume_create(numcomps, &cmptparm, color_space); - if(!volume) { - fprintf(stdout,"[ERROR] Unable to create volume"); - return NULL; - } - - /* set volume offset and reference grid */ - volume->x0 = parameters->volume_offset_x0; - volume->y0 = parameters->volume_offset_y0; - volume->z0 = parameters->volume_offset_z0; - volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; - volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; - volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; - - max = 0; - /* set volume data */ - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", filename); - fclose(f); - return 0; - } - - /* BINARY */ - for (compno = 0; compno < volume->numcomps; compno++) { - int whl = w * h * l; - /* set volume data */ - comp = &volume->comps[compno]; - - /*if (comp->prec <= 8) { - if (!comp->sgnd) { + /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ + if (strncmp(line,"Image",5) == 0) { + sscanf(line,"%*s%*[ \t]%s",datatype); + } else if (strncmp(line,"File",4) == 0) { + sscanf(line,"%*s %*s%*[ \t]%s",filename); + strcat(dirpath, filename); + strcpy(filename,dirpath); + } else if (strncmp(line,"Min",3) == 0) { + sscanf(line,"%*s %*s%*[ \t]%d%*[ \t]%d",&min,&max); + prec = int_floorlog2(max - min + 1); + } else if (strncmp(line,"Bpp",3) == 0) { + sscanf(line,"%*s%*[ \t]%d",&prec); + } else if (strncmp(line,"Color",5) == 0) { + sscanf(line, "%*s %*s%*[ \t]%d",&color_space); + } else if (strncmp(line,"Dim",3) == 0) { + sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); + } else if (strncmp(line,"Res",3) == 0) { + sscanf(line,"%*s%*[ \t]%f%*[ \t]%f%*[ \t]%f",&dx,&dy,&dz); + } + + } +#ifdef VERBOSE + fprintf(stdout, "[INFO] %s %d \t %d %d %d \t %f %f %f \t %d %d %d \n",filename,color_space,w,h,l,dx,dy,dz,max,min,prec); +#endif + fclose(fimg); + + /* error control */ + if ( !prec || !w || !h || !l ) { + fprintf(stderr,"[ERROR] Unable to read IMG file correctly. Found some null values."); + return NULL; + } + + /* initialize volume components */ + memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); + + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.sgnd = 0; + cmptparm.bigendian = bigendian; + cmptparm.dcoffset = parameters->dcoffset; + cmptparm.dx = subsampling_dx; + cmptparm.dy = subsampling_dy; + cmptparm.dz = subsampling_dz; + cmptparm.w = w; + cmptparm.h = h; + cmptparm.l = l; + + /* create the volume */ + volume = opj_volume_create(numcomps, &cmptparm, color_space); + if(!volume) { + fprintf(stdout,"[ERROR] Unable to create volume"); + return NULL; + } + + /* set volume offset and reference grid */ + volume->x0 = parameters->volume_offset_x0; + volume->y0 = parameters->volume_offset_y0; + volume->z0 = parameters->volume_offset_z0; + volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; + volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; + volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; + + max = 0; + /* set volume data */ + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", filename); + fclose(f); + return 0; + } + + /* BINARY */ + for (compno = 0; compno < volume->numcomps; compno++) { + int whl = w * h * l; + /* set volume data */ + comp = &volume->comps[compno]; + + /*if (comp->prec <= 8) { + if (!comp->sgnd) { unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - char *data = (char *) malloc(whl); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + char *data = (char *) malloc(whl); + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - - for (i = 0; i < whl; i++) { - if (bigendian) //(c1 << 8) + c2; - comp->data[i] = data[i]; - else{ //(c2 << 8) + c1; - comp->data[i] = ShortSwap(data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - short *data = (short *) malloc(whl); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (bigendian){ //(c1 << 8) + c2; - comp->data[i] = data[i]; - }else{ //(c2 << 8) + c1; - comp->data[i] = (short) ShortSwap((unsigned short) data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else { - if (!comp->sgnd) { + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + + for (i = 0; i < whl; i++) { + if (bigendian) //(c1 << 8) + c2; + comp->data[i] = data[i]; + else{ //(c2 << 8) + c1; + comp->data[i] = ShortSwap(data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + short *data = (short *) malloc(whl); + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (bigendian){ //(c1 << 8) + c2; + comp->data[i] = data[i]; + }else{ //(c2 << 8) + c1; + comp->data[i] = (short) ShortSwap((unsigned short) data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else { + if (!comp->sgnd) { unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); - int leido = fread(data, 4, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = LongSwap(data[i]); - else - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - int leido = fread(comp->data, 4, whl, f); - if (!leido) { - fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); - if (comp->data[i] > max) - max = comp->data[i]; - } - } - }*/ - - for (i = 0; i < whl; i++) { - int v; - if (comp->prec <= 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, bigendian); - } else { - v = (short) readushort(f, bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, bigendian); - } else { - v = (int) readuint(f, bigendian); - } - } - if (v > max) - max = v; - comp->data[i] = v; - } - comp->bpp = int_floorlog2(max) + 1; - } - fclose(f); - return volume; + int leido = fread(data, 4, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = LongSwap(data[i]); + else + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + int leido = fread(comp->data, 4, whl, f); + if (!leido) { + fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); + if (comp->data[i] > max) + max = comp->data[i]; + } + } + }*/ + + for (i = 0; i < whl; i++) { + int v; + if (comp->prec <= 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, bigendian); + } else { + v = (short) readushort(f, bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, bigendian); + } else { + v = (int) readuint(f, bigendian); + } + } + if (v > max) + max = v; + comp->data[i] = v; + } + comp->bpp = int_floorlog2(max) + 1; + } + fclose(f); + return volume; } diff --git a/src/bin/jp3d/convert.h b/src/bin/jp3d/convert.h index 85885561..a7b77ee8 100755 --- a/src/bin/jp3d/convert.h +++ b/src/bin/jp3d/convert.h @@ -1,51 +1,51 @@ -/*
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
- * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __JP3D_CONVERT_H
-#define __JP3D_CONVERT_H
-
-/**
-Load a single volume component encoded in PGX file format
-@param filename Name of the PGX file to load
-@param parameters *List ?*
-@return Returns a greyscale volume if successful, returns NULL otherwise
-*/
-opj_volume_t* pgxtovolume(char *filename, opj_cparameters_t *parameters);
-
-int volumetopgx(opj_volume_t *volume, char *outfile);
-
-opj_volume_t* bintovolume(char *filename,char *fileimg, opj_cparameters_t *parameters);
-
-int volumetobin(opj_volume_t *volume, char *outfile);
-
-opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters);
-
-#endif /* __J2K_CONVERT_H */
-
+/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __JP3D_CONVERT_H +#define __JP3D_CONVERT_H + +/** +Load a single volume component encoded in PGX file format +@param filename Name of the PGX file to load +@param parameters *List ?* +@return Returns a greyscale volume if successful, returns NULL otherwise +*/ +opj_volume_t* pgxtovolume(char *filename, opj_cparameters_t *parameters); + +int volumetopgx(opj_volume_t *volume, char *outfile); + +opj_volume_t* bintovolume(char *filename,char *fileimg, opj_cparameters_t *parameters); + +int volumetobin(opj_volume_t *volume, char *outfile); + +opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters); + +#endif /* __J2K_CONVERT_H */ + diff --git a/src/bin/jp3d/getopt.c b/src/bin/jp3d/getopt.c index 69addc97..a7a2269e 100755 --- a/src/bin/jp3d/getopt.c +++ b/src/bin/jp3d/getopt.c @@ -1,109 +1,110 @@ -/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* last review : october 29th, 2002 */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int opterr = 1, /* if error message should be printed */
- optind = 1, /* index into parent argv vector */
- optopt, /* character checked for validity */
- optreset; /* reset getopt */
-char *optarg; /* argument associated with option */
-
-#define BADCH (int)'?'
-#define BADARG (int)':'
-#define EMSG ""
-
-/*
- * getopt --
- * Parse argc/argv argument vector.
- */
-int getopt(int nargc, char *const *nargv, const char *ostr) {
-
- # define __progname nargv[0] /* program name */
-
- static char *place = EMSG; /* option letter processing */
- char *oli; /* option letter list index */
-
- if (optreset || !*place) { /* update scanning pointer */
- optreset = 0;
- if (optind >= nargc || *(place = nargv[optind]) != '-') {
- place = EMSG;
- return (-1);
- }
- if (place[1] && *++place == '-') { /* found "--" */
- ++optind;
- place = EMSG;
- return (-1);
- }
- } /* option letter okay? */
-
- if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) {
- /* if the user didn't specify '-' as an option, assume it means -1. */
- if (optopt == (int) '-')
- return (-1);
- if (!*place)
- ++optind;
- if (opterr && *ostr != ':')
- (void) fprintf(stdout,"[ERROR] %s: illegal option -- %c\n", __progname, optopt);
- return (BADCH);
- }
-
- if (*++oli != ':') { /* don't need argument */
- optarg = NULL;
- if (!*place)
- ++optind;
- } else { /* need an argument */
- if (*place) /* no white space */
- optarg = place;
- else if (nargc <= ++optind) { /* no arg */
- place = EMSG;
- if (*ostr == ':')
- return (BADARG);
- if (opterr)
- (void) fprintf(stdout, "[ERROR] %s: option requires an argument -- %c\n", __progname, optopt);
- return (BADCH);
- } else /* white space */
- optarg = nargv[optind];
- place = EMSG;
- ++optind;
- }
- return (optopt); /* dump back option letter */
-}
+/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* last review : october 29th, 2002 */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; +#endif /* LIBC_SCCS and not lint */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int getopt(int nargc, char *const *nargv, const char *ostr) +{ + +# define __progname nargv[0] /* program name */ + + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc || *(place = nargv[optind]) != '-') { + place = EMSG; + return (-1); + } + if (place[1] && *++place == '-') { /* found "--" */ + ++optind; + place = EMSG; + return (-1); + } + } /* option letter okay? */ + + if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) { + /* if the user didn't specify '-' as an option, assume it means -1. */ + if (optopt == (int) '-') + return (-1); + if (!*place) + ++optind; + if (opterr && *ostr != ':') + (void) fprintf(stdout,"[ERROR] %s: illegal option -- %c\n", __progname, optopt); + return (BADCH); + } + + if (*++oli != ':') { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } else { /* need an argument */ + if (*place) /* no white space */ + optarg = place; + else if (nargc <= ++optind) { /* no arg */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) + (void) fprintf(stdout, "[ERROR] %s: option requires an argument -- %c\n", __progname, optopt); + return (BADCH); + } else /* white space */ + optarg = nargv[optind]; + place = EMSG; + ++optind; + } + return (optopt); /* dump back option letter */ +} diff --git a/src/bin/jp3d/getopt.h b/src/bin/jp3d/getopt.h index 23299d1b..ab9c1a7b 100755 --- a/src/bin/jp3d/getopt.h +++ b/src/bin/jp3d/getopt.h @@ -1,14 +1,14 @@ -/* last review : october 29th, 2002 */
-
-#ifndef _GETOPT_H_
-#define _GETOPT_H_
-
-extern int opterr;
-extern int optind;
-extern int optopt;
-extern int optreset;
-extern char *optarg;
-
-extern int getopt(int nargc, char *const *nargv, const char *ostr);
-
-#endif /* _GETOPT_H_ */
+/* last review : october 29th, 2002 */ + +#ifndef _GETOPT_H_ +#define _GETOPT_H_ + +extern int opterr; +extern int optind; +extern int optopt; +extern int optreset; +extern char *optarg; + +extern int getopt(int nargc, char *const *nargv, const char *ostr); + +#endif /* _GETOPT_H_ */ diff --git a/src/bin/jp3d/opj_jp3d_compress.c b/src/bin/jp3d/opj_jp3d_compress.c index b774e149..8237f98e 100755 --- a/src/bin/jp3d/opj_jp3d_compress.c +++ b/src/bin/jp3d/opj_jp3d_compress.c @@ -1,907 +1,892 @@ -/*
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
- * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "opj_config.h"
-#include "openjp3d.h"
-#include "opj_getopt.h"
-#include "convert.h"
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
-#endif /* _WIN32 */
-
-/* ----------------------------------------------------------------------- */
-
-void encode_help_display() {
- fprintf(stdout,"List of parameters for the JPEG2000 Part 10 encoder:\n");
- fprintf(stdout,"------------\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"Required Parameters (except with -h):\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-i : source file (-i source.bin or source*.pgx) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-m : source characteristics file (-m imgfile.img) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-o : destination file (-o dest.jp3d) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"Optional Parameters:\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-h : display the help information \n ");
- fprintf(stdout,"\n");
- fprintf(stdout,"-n : number of resolutions (-n 3,3,3) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-I : use the irreversible transforms: ICT + DWT 9-7 (-I) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-C : coding algorithm (-C 2EB) [2EB, 3EB] \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n ");
- fprintf(stdout," - The rate specified for each quality level is the desired compression factor.\n");
- fprintf(stdout," - Rate 1 means lossless compression\n");
- fprintf(stdout," (options -r and -q cannot be used together)\n ");
- fprintf(stdout,"\n");
- fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n ");
- fprintf(stdout," (options -r and -q cannot be used together)\n ");
- fprintf(stdout,"\n");
- fprintf(stdout,"-b : size of code block (-b 32,32,32) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-c : size of precinct (-c 128,128,128) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-t : size of tile (-t 512,512,512) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-s : subsampling factor (-s 2,2,2) [-s X,Y,Z] \n");
- fprintf(stdout," - Remark: subsampling bigger than 2 can produce error\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-SOP : write SOP marker before each packet \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-EPH : write EPH marker after each header packet \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-M : code-block style (-M 0) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n");
- fprintf(stdout," 8=VSC 16=PTERM 32=SEGSYM 64=3DCTXT] \n");
- fprintf(stdout," Indicate multiple modes by adding their values. \n");
- fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-D : define DC offset (-D 12) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n");
- fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n");
- fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-d : offset of the origin of the volume (-d 150,300,100) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"-l : offset of the origin of the tiles (-l 100,75,25) \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"DEFAULT CODING:\n");
- fprintf(stdout,"------------\n");
- fprintf(stdout,"\n");
- fprintf(stdout," * Lossless\n");
- fprintf(stdout," * 1 tile\n");
- fprintf(stdout," * Size of precinct : 2^15 x 2^15 x 2^15 (means 1 precinct)\n");
- fprintf(stdout," * Size of code-block : 64 x 64 x 64\n");
- fprintf(stdout," * Number of resolutions in x, y and z axis: 3\n");
- fprintf(stdout," * No SOP marker in the codestream\n");
- fprintf(stdout," * No EPH marker in the codestream\n");
- fprintf(stdout," * No sub-sampling in x, y or z direction\n");
- fprintf(stdout," * No mode switch activated\n");
- fprintf(stdout," * Progression order: LRCP\n");
- fprintf(stdout," * No index file\n");
- fprintf(stdout," * No ROI upshifted\n");
- fprintf(stdout," * No offset of the origin of the volume\n");
- fprintf(stdout," * No offset of the origin of the tiles\n");
- fprintf(stdout," * Reversible DWT 5-3 on each 2D slice\n");
- fprintf(stdout," * Coding algorithm: 2D-EBCOT \n");
- fprintf(stdout,"\n");
- fprintf(stdout,"REMARKS:\n");
- fprintf(stdout,"---------\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"- The markers written to the main_header are : SOC SIZ COD QCD COM.\n");
- fprintf(stdout,"- COD and QCD markers will never appear in the tile_header.\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"- You need enough disk space memory (twice the original) to encode \n");
- fprintf(stdout,"the volume,i.e. for a 1.5 GB volume you need a minimum of 3GB of disk memory)\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"- When loading *.pgx files, a relative path to directory is needed for input argument \n");
- fprintf(stdout," followed by the common prefix of the slices and a '*' character representing sequential numeration.\n");
- fprintf(stdout,"( -i relativepath/slices*.pgx )\n");
- fprintf(stdout,"\n");
- fprintf(stdout," - The index file has the structure below:\n");
- fprintf(stdout,"\n");
- fprintf(stdout,"\t Image_height Image_width Image_depth\n");
- fprintf(stdout,"\t Progression order: 0 (LRCP)\n");
- fprintf(stdout,"\t Tiles_size_X Tiles_size_Y Tiles_size_Z\n");
- fprintf(stdout,"\t Components_nb\n");
- fprintf(stdout,"\t Layers_nb\n");
- fprintf(stdout,"\t Decomposition_levels\n");
- fprintf(stdout,"\t [Precincts_size_X_res_Nr Precincts_size_Y_res_Nr Precincts_size_Z_res_Nr]\n\t ...\n");
- fprintf(stdout,"\t [Precincts_size_X_res_0 Precincts_size_Y_res_0 Precincts_size_Z_res_0]\n");
- fprintf(stdout,"\t Main_header_end_position\n");
- fprintf(stdout,"\t Codestream_size\n");
- fprintf(stdout,"\t Tile_0 [start_pos end_header end_pos TotalDisto NumPix MaxMSE]\n");
- fprintf(stdout,"\t ...\n");
- fprintf(stdout,"\t Tile_Nt [ '' '' '' '' '' '' ]\n");
- fprintf(stdout,"\t Tpacket_0 [Tile layer res. comp. prec. start_pos end_pos disto]\n");
- fprintf(stdout,"\t ...\n");
- fprintf(stdout,"\t Tpacket_Np ['' '' '' '' '' '' '' '' ]\n");
- fprintf(stdout,"\t MaxDisto\n");
- fprintf(stdout,"\t TotalDisto\n\n");
- fprintf(stdout,"\n");
-
-}
-
-OPJ_PROG_ORDER give_progression(char progression[4]) {
- if(strncmp(progression, "LRCP", 4) == 0) {
- return LRCP;
- }
- if(strncmp(progression, "RLCP", 4) == 0) {
- return RLCP;
- }
- if(strncmp(progression, "RPCL", 4) == 0) {
- return RPCL;
- }
- if(strncmp(progression, "PCRL", 4) == 0) {
- return PCRL;
- }
- if(strncmp(progression, "CPRL", 4) == 0) {
- return CPRL;
- }
-
- return PROG_UNKNOWN;
-}
-
-OPJ_TRANSFORM give_transform(char transform[4]) {
- if(strncmp(transform, "2DWT", 4) == 0) {
- return TRF_2D_DWT;
- }
- if(strncmp(transform, "3DWT", 4) == 0) {
- return TRF_3D_DWT;
- }
- return TRF_UNKNOWN;
-}
-
-OPJ_ENTROPY_CODING give_coding(char coding[3]) {
-
- if(strncmp(coding, "2EB", 3) == 0) {
- return ENCOD_2EB;
- }
- if(strncmp(coding, "3EB", 3) == 0) {
- return ENCOD_3EB;
- }
- /*if(strncmp(coding, "2GR", 3) == 0) {
- return ENCOD_2GR;
- }
- if(strncmp(coding, "3GR", 3) == 0) {
- return ENCOD_3GR;
- }*/
-
- return ENCOD_UNKNOWN;
-}
-
-int get_file_format(char *filename) {
- int i;
- static const char *extension[] = {"pgx", "bin", "img", "j3d", "jp3d", "j2k"};
- static const int format[] = { PGX_DFMT, BIN_DFMT, IMG_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT};
- char * ext = strrchr(filename, '.');
- if (ext) {
- ext++;
- for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
- if(strnicmp(ext, extension[i], 3) == 0) {
- return format[i];
- }
- }
- }
-
- return -1;
-}
-
-/* ------------------------------------------------------------------------------------ */
-
-int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) {
- int i, value;
-
- /* parse the command line */
-
- while (1) {
- int c = opj_getopt(argc, argv, "i:m:o:r:q:f:t:n:c:b:x:p:s:d:hP:S:E:M:D:R:l:T:C:A:I");
- if (c == -1)
- break;
- switch (c) {
- case 'i': /* input file */
- {
- char *infile = opj_optarg;
- parameters->decod_format = get_file_format(infile);
- switch(parameters->decod_format) {
- case PGX_DFMT:
- case BIN_DFMT:
- case IMG_DFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unrecognized format for infile : %s [accept only *.pgx or *.bin] !!\n\n", infile);
- return 1;
- break;
- }
- strncpy(parameters->infile, infile, MAX_PATH);
- fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile);
-
- }
- break;
-
- /* ----------------------------------------------------- */
- case 'm': /* input IMG file */
- {
- char *imgfile = opj_optarg;
- int imgformat = get_file_format(imgfile);
- switch(imgformat) {
- case IMG_DFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", imgfile);
- return 1;
- break;
- }
- strncpy(parameters->imgfile, imgfile, MAX_PATH);
- fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, imgformat);
- }
- break;
-
- /* ----------------------------------------------------- */
- case 'o': /* output file */
- {
- char *outfile = opj_optarg;
- parameters->cod_format = get_file_format(outfile);
- switch(parameters->cod_format) {
- case J3D_CFMT:
- case J2K_CFMT:
- case LSE_CFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unknown output format volume %s [only *.j2k, *.lse3d or *.jp3d]!! \n", outfile);
- return 1;
- break;
- }
- strncpy(parameters->outfile, outfile, MAX_PATH);
- fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile);
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'r': /* define compression rates for each layer */
- {
- char *s = opj_optarg;
- while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) {
- parameters->tcp_numlayers++;
- while (*s && *s != ',') {
- s++;
- }
- if (!*s)
- break;
- s++;
- }
- parameters->cp_disto_alloc = 1;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'q': /* define distorsion (PSNR) for each layer */
- {
- char *s = opj_optarg;
- while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) {
- parameters->tcp_numlayers++;
- while (*s && *s != ',') {
- s++;
- }
- if (!*s)
- break;
- s++;
- }
- parameters->cp_fixed_quality = 1;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'f':
- {
- fprintf(stdout, "/---------------------------------------------------\\\n");
- fprintf(stdout, "| Fixed layer allocation option not implemented !! |\n");
- fprintf(stdout, "\\---------------------------------------------------/\n");
- /*int *row = NULL, *col = NULL;
- int numlayers = 0, matrix_width = 0;
-
- char *s = opj_optarg;
- sscanf(s, "%d", &numlayers);
- s++;
- if (numlayers > 9)
- s++;
-
- parameters->tcp_numlayers = numlayers;
- matrix_width = parameters->numresolution[0] + parameters->numresolution[1] + parameters->numresolution[2];
- parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));
- s = s + 2;
-
- for (i = 0; i < numlayers; i++) {
- row = ¶meters->cp_matrice[i * matrix_width];
- col = row;
- parameters->tcp_rates[i] = 1;
- sscanf(s, "%d,", &col[0]);
- s += 2;
- if (col[0] > 9)
- s++;
- col[1] = 0;
- col[2] = 0;
- for (j = 1; j < matrix_width; j++) {
- col += 3; j+=2;
- sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]);
- s += 6;
- if (col[0] > 9)
- s++;
- if (col[1] > 9)
- s++;
- if (col[2] > 9)
- s++;
- }
- if (i < numlayers - 1)
- s++;
- }
- parameters->cp_fixed_alloc = 1; */
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 't': /* tiles */
- {
- if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy, ¶meters->cp_tdz) !=3) {
- fprintf(stdout, "[ERROR] '-t' 'dimensions of tiles' argument error ! [-t tdx,tdy,tdz]\n");
- return 1;
- }
- parameters->tile_size_on = true;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'n': /* resolution */
- {
- int aux;
- aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->numresolution[0], ¶meters->numresolution[1], ¶meters->numresolution[2]);
- if (aux == 2)
- parameters->numresolution[2] = 1;
- else if (aux == 1) {
- parameters->numresolution[1] = parameters->numresolution[0];
- parameters->numresolution[2] = 1;
- }else if (aux == 0){
- parameters->numresolution[0] = 1;
- parameters->numresolution[1] = 1;
- parameters->numresolution[2] = 1;
- }
- }
- break;
-
- /* ----------------------------------------------------- */
- case 'c': /* precinct dimension */
- {
- char sep;
- int res_spec = 0;
- int aux;
- char *s = opj_optarg;
- do {
- sep = 0;
- aux = sscanf(s, "[%d,%d,%d]%c", ¶meters->prct_init[0][res_spec], ¶meters->prct_init[1][res_spec], ¶meters->prct_init[2][res_spec], &sep);
- if (sep == ',' && aux != 4) {
- fprintf(stdout, "[ERROR] '-c' 'dimensions of precincts' argument error ! [-c [prcx_res0,prcy_res0,prcz_res0],...,[prcx_resN,prcy_resN,prcz_resN]]\n");
- return 1;
- }
- parameters->csty |= 0x01;
- res_spec++;
- s = strpbrk(s, "]") + 2;
- }
- while (sep == ',');
- parameters->res_spec = res_spec; /* number of precinct size specifications */
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'b': /* code-block dimension */
- {
- int cblockw_init = 0, cblockh_init = 0, cblockl_init = 0;
- if (sscanf(opj_optarg, "%d,%d,%d", &cblockw_init, &cblockh_init, &cblockl_init) != 3) {
- fprintf(stdout, "[ERROR] '-b' 'dimensions of codeblocks' argument error ! [-b cblkx,cblky,cblkz]\n");
- return 1;
- }
- if (cblockw_init * cblockh_init * cblockl_init > (1<<18) || cblockw_init > 1024 || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4 || cblockl_init > 1024 || cblockl_init < 4) {
- fprintf(stdout,"[ERROR] Size of code_block error (option -b) !!\n\nRestriction :\n * width*height*length<=4096\n * 4<=width,height,length<= 1024\n\n");
- return 1;
- }
- parameters->cblock_init[0] = cblockw_init;
- parameters->cblock_init[1] = cblockh_init;
- parameters->cblock_init[2] = cblockl_init;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'x': /* creation of index file */
- {
- char *index = opj_optarg;
- strncpy(parameters->index, index, MAX_PATH);
- parameters->index_on = 1;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'p': /* progression order */
- {
- char progression[4];
-
- strncpy(progression, opj_optarg, 4);
- parameters->prog_order = give_progression(progression);
- if (parameters->prog_order == -1) {
- fprintf(stdout, "[ERROR] Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n");
- return 1;
- }
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 's': /* subsampling factor */
- {
- if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->subsampling_dx, ¶meters->subsampling_dy, ¶meters->subsampling_dz) != 3) {
- fprintf(stdout, "[ERROR] '-s' sub-sampling argument error ! [-s dx,dy,dz]\n");
- return 1;
- }
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'd': /* coordonnate of the reference grid */
- {
- if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->volume_offset_x0, ¶meters->volume_offset_y0, ¶meters->volume_offset_z0) != 3) {
- fprintf(stdout, "[ERROR] -d 'coordonnate of the reference grid' argument error !! [-d x0,y0,z0]\n");
- return 1;
- }
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'h': /* display an help description */
- {
- encode_help_display();
- return 1;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'P': /* POC */
- {
- int numpocs = 0; /* number of progression order change (POC) default 0 */
- opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */
-
- char *s = opj_optarg;
- POC = parameters->POC;
-
- fprintf(stdout, "/----------------------------------\\\n");
- fprintf(stdout, "| POC option not fully tested !! |\n");
- fprintf(stdout, "\\----------------------------------/\n");
-
- while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile,
- &POC[numpocs].resno0, &POC[numpocs].compno0,
- &POC[numpocs].layno1, &POC[numpocs].resno1,
- &POC[numpocs].compno1, POC[numpocs].progorder) == 7) {
- POC[numpocs].prg = give_progression(POC[numpocs].progorder);
- /* POC[numpocs].tile; */
- numpocs++;
- while (*s && *s != '/') {
- s++;
- }
- if (!*s) {
- break;
- }
- s++;
- }
- parameters->numpocs = numpocs;
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'S': /* SOP marker */
- {
- parameters->csty |= 0x02;
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'E': /* EPH marker */
- {
- parameters->csty |= 0x04;
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'M': /* Codification mode switch */
- {
- fprintf(stdout, "[INFO] Mode switch option not fully tested !!\n");
- value = 0;
- if (sscanf(opj_optarg, "%d", &value) == 1) {
- for (i = 0; i <= 6; i++) {
- int cache = value & (1 << i);
- if (cache)
- parameters->mode |= (1 << i);
- }
- }
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'D': /* DCO */
- {
- if (sscanf(opj_optarg, "%d", ¶meters->dcoffset) != 1) {
- fprintf(stdout, "[ERROR] DC offset error !! [-D %d]\n",parameters->dcoffset);
- return 1;
- }
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'R': /* ROI */
- {
- if (sscanf(opj_optarg, "OI:c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) {
- fprintf(stdout, "[ERROR] ROI error !! [-ROI:c='compno',U='shift']\n");
- return 1;
- }
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'l': /* Tile offset */
- {
- if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0, ¶meters->cp_tz0) != 3) {
- fprintf(stdout, "[ERROR] -l 'tile offset' argument error !! [-l X0,Y0,Z0]");
- return 1;
- }
- }
- break;
-
- /* ------------------------------------------------------
-
- case 'T': // Tranformation of original data (2D-DWT/3D-DWT/3D-RLS/2D-DWT+1D-RLS)
- {
- char transform[4];
-
- strncpy(transform, opj_optarg, 4);
- parameters->transform_format = give_transform(transform);
- if (parameters->transform_format == -1) {
- fprintf(stdout, "[ERROR] -T 'Transform domain' argument error !! [-T 2DWT, 3DWT, 3RLS or 3LSE only]");
- return 1;
- }
- }
- break;
-
- ------------------------------------------------------ */
-
- case 'C': /* Coding of transformed data */
- {
- char coding[3];
-
- strncpy(coding, opj_optarg, 3);
- parameters->encoding_format = give_coding(coding);
- if (parameters->encoding_format == -1) {
- fprintf(stdout, "[ERROR] -C 'Coding algorithm' argument error !! [-C 2EB, 3EB, 2GR, 3GR or GRI only]");
- return 1;
- }
- }
- break;
-
- /* ------------------------------------------------------ */
-
- case 'I': /* reversible or not */
- {
- parameters->irreversible = 1;
- }
- break;
-
- default:
- fprintf(stdout, "[ERROR] This option is not valid \"-%c %s\"\n", c, opj_optarg);
- return 1;
- }
- }
-
- /* check for possible errors */
-
- if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
- fprintf(stdout, "usage: jp3d_vm_enc -i volume-file -o jp3d-file (+ options)\n");
- return 1;
- }
-
- if((parameters->decod_format == BIN_DFMT) && (parameters->imgfile[0] == 0)) {
- fprintf(stdout, "usage: jp3d_vm_enc -i bin-volume-file -m img-file -o jp3d-file (+ options)\n");
- return 1;
- }
-
- if((parameters->decod_format != BIN_DFMT) && (parameters->decod_format != PGX_DFMT) && (parameters->decod_format != IMG_DFMT)) {
- fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n");
- return 1;
- }
- if((parameters->cod_format != J3D_CFMT) && (parameters->cod_format != J2K_CFMT)) {
- fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n");
- return 1;
- }
-
- if((parameters->encoding_format == ENCOD_2GR || parameters->encoding_format == ENCOD_3GR) && parameters->transform_format != TRF_3D_LSE && parameters->transform_format != TRF_3D_RLS) {
- fprintf(stdout, "[ERROR] Entropy coding options -C [2GR,3GR] are only compatible with predictive-based transform algorithms: -T [3RLS,3LSE].\n");
- return 1;
- }
- if (parameters->encoding_format == ENCOD_3EB)
- parameters->mode |= (1 << 6);
-
- if ((parameters->mode >> 6) & 1) {
- parameters->encoding_format = ENCOD_3EB;
- }
-
- if((parameters->numresolution[2] == 0 || (parameters->numresolution[1] == 0) || (parameters->numresolution[0] == 0))) {
- fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions must be greater than 1 in order to perform DWT.\n");
- return 1;
- }
- if (parameters->numresolution[1] != parameters->numresolution[0]) {
- fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in X and Y axis must be the same in this implementation.\n");
- return 1;
- }
-
- if (parameters->numresolution[2] > parameters->numresolution[0]) {
- fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in Z axis must be lower than in X-Y axis.\n");
- return 1;
- }
-
- if (parameters->dcoffset >= 128 && parameters->dcoffset <= -128) {
- fprintf(stdout, "[ERROR] -D 'DC offset' argument error ! Value must be -128<=DCO<=128.\n");
- return 1;
- }
-
- if(parameters->numresolution[2] != 1) {
- parameters->transform_format = TRF_3D_DWT;
- /*fprintf(stdout, "[Warning] Resolution level in axial dim > 1 : 3D-DWT will be performed... \n");*/
- } else if (parameters->numresolution[2] == 1) {
- parameters->transform_format = TRF_2D_DWT;
- /*fprintf(stdout, "[Warning] Resolution level in axial dim == 1 : 2D-DWT will be performed... \n");*/
- }
-
- if ((parameters->cod_format == J2K_CFMT) && (parameters->transform_format != TRF_2D_DWT || parameters->encoding_format != ENCOD_2EB)) {
- fprintf(stdout, "[WARNING] Incompatible options -o *.j2k and defined transform or encoding algorithm. Latter will be ignored\n");
- parameters->transform_format = TRF_2D_DWT;
- parameters->encoding_format = ENCOD_2EB;
- }
-
- if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_quality))) {
- fprintf(stdout, "[ERROR] Options -r and -q cannot be used together !!\n");
- return 1;
- } /* mod fixed_quality */
-
- /* if no rate entered, lossless by default */
- if (parameters->tcp_numlayers == 0) {
- parameters->tcp_rates[0] = 0.0; /* MOD antonin : losslessbug */
- parameters->tcp_numlayers++;
- parameters->cp_disto_alloc = 1;
- }
-
- if((parameters->cp_tx0 > parameters->volume_offset_x0) || (parameters->cp_ty0 > parameters->volume_offset_y0) || (parameters->cp_tz0 > parameters->volume_offset_z0)) {
- fprintf(stdout, "[ERROR] Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) TZO(%d)<=IMG_Z0(%d)\n",
- parameters->cp_tx0, parameters->volume_offset_x0, parameters->cp_ty0, parameters->volume_offset_y0,
- parameters->cp_tz0, parameters->volume_offset_z0);
- return 1;
- }
-
- for (i = 0; i < parameters->numpocs; i++) {
- if (parameters->POC[i].prg == -1) {
- fprintf(stdout,"[ERROR] Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",i + 1);
- }
- }
- return 0;
-}
-
-/* -------------------------------------------------------------------------- */
-
-/**
-sample error callback expecting a FILE* client object
-*/
-void error_callback(const char *msg, void *client_data) {
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-void warning_callback(const char *msg, void *client_data) {
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-/**
-sample debug callback expecting a FILE* client object
-*/
-void info_callback(const char *msg, void *client_data) {
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[INFO] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-int main(int argc, char **argv) {
- bool bSuccess;
- bool delete_comment = true;
- opj_cparameters_t parameters; /* compression parameters */
- opj_event_mgr_t event_mgr; /* event manager */
- opj_volume_t *volume = NULL;
-
- /*
- configure the event callbacks (not required)
- setting of each callback is optionnal
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
- /* set encoding parameters to default values */
- opj_set_default_encoder_parameters(¶meters);
-
- /* parse input and get user encoding parameters */
- if(parse_cmdline_encoder(argc, argv, ¶meters) == 1) {
- return 0;
- }
-
- if(parameters.cp_comment == NULL) {
- parameters.cp_comment = "Created by OpenJPEG version JP3D";
- /* no need to delete parameters.cp_comment on exit */
- delete_comment = false;
- }
-
- /* encode the destination volume */
- /* ---------------------------- */
- if (parameters.cod_format == J3D_CFMT || parameters.cod_format == J2K_CFMT) {
- int codestream_length, pixels, bitsin;
- opj_cio_t *cio = NULL;
- FILE *f = NULL;
- opj_cinfo_t* cinfo = NULL;
-
- /* decode the source volume */
- /* ----------------------- */
- switch (parameters.decod_format) {
- case PGX_DFMT:
- fprintf(stdout, "[INFO] Loading pgx file(s)\n");
- volume = pgxtovolume(parameters.infile, ¶meters);
- if (!volume) {
- fprintf(stdout, "[ERROR] Unable to load pgx files\n");
- return 1;
- }
- break;
-
- case BIN_DFMT:
- fprintf(stdout, "[INFO] Loading bin file\n");
- volume = bintovolume(parameters.infile, parameters.imgfile, ¶meters);
- if (!volume) {
- fprintf(stdout, "[ERROR] Unable to load bin file\n");
- return 1;
- }
- break;
-
- case IMG_DFMT:
- fprintf(stdout, "[INFO] Loading img file\n");
- volume = imgtovolume(parameters.infile, ¶meters);
- if (!volume) {
- fprintf(stderr, "[ERROR] Unable to load img file\n");
- return 1;
- }
- break;
- }
-
- /* get a JP3D or J2K compressor handle */
- if (parameters.cod_format == J3D_CFMT)
- cinfo = opj_create_compress(CODEC_J3D);
- else if (parameters.cod_format == J2K_CFMT)
- cinfo = opj_create_compress(CODEC_J2K);
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stdout);
-
- /* setup the encoder parameters using the current volume and using user parameters */
- opj_setup_encoder(cinfo, ¶meters, volume);
-
- /* open a byte stream for writing */
- /* allocate memory for all tiles */
- cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
-
- /* encode the volume */
- /*fprintf(stdout, "[INFO] Encode the volume\n");*/
- bSuccess = opj_encode(cinfo, cio, volume, parameters.index);
- if (!bSuccess) {
- opj_cio_close(cio);
- fprintf(stdout, "[ERROR] Failed to encode volume\n");
- return 1;
- }
- codestream_length = cio_tell(cio);
- pixels =(volume->x1 - volume->x0) * (volume->y1 - volume->y0) * (volume->z1 - volume->z0);
- bitsin = pixels * volume->comps[0].prec;
- fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n Codestream: %d B, Ratio: %5.3f bpv, (%5.3f : 1) \n",
- (volume->x1 - volume->x0),(volume->y1 - volume->y0),(volume->z1 - volume->z0),volume->comps[0].prec,
- codestream_length, ((double)codestream_length * 8.0/(double)pixels), ((double)bitsin/(8.0*(double)codestream_length)));
-
- /* write the buffer to disk */
- f = fopen(parameters.outfile, "wb");
- if (!f) {
- fprintf(stdout, "[ERROR] Failed to open %s for writing\n", parameters.outfile);
- return 1;
- }
- fwrite(cio->buffer, 1, codestream_length, f);
- fclose(f);
-
- /* close and free the byte stream */
- opj_cio_close(cio);
-
- /* free remaining compression structures */
- opj_destroy_compress(cinfo);
- } else {
- fprintf(stdout, "[ERROR] Cod_format != JP3d !!! \n");
- return 1;
- }
-
- /* free user parameters structure */
- if(delete_comment) {
- if(parameters.cp_comment) free(parameters.cp_comment);
- }
- if(parameters.cp_matrice) free(parameters.cp_matrice);
-
- /* free volume data */
- opj_volume_destroy(volume);
-
- return 0;
-}
+/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "opj_config.h" +#include "openjp3d.h" +#include "opj_getopt.h" +#include "convert.h" + +#ifdef _WIN32 +#include <windows.h> +#else +#define stricmp strcasecmp +#define strnicmp strncasecmp +#endif /* _WIN32 */ + +/* ----------------------------------------------------------------------- */ + +void encode_help_display() +{ + fprintf(stdout,"List of parameters for the JPEG2000 Part 10 encoder:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Required Parameters (except with -h):\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-i : source file (-i source.bin or source*.pgx) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-m : source characteristics file (-m imgfile.img) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-o : destination file (-o dest.jp3d) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Optional Parameters:\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-h : display the help information \n "); + fprintf(stdout,"\n"); + fprintf(stdout,"-n : number of resolutions (-n 3,3,3) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-I : use the irreversible transforms: ICT + DWT 9-7 (-I) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-C : coding algorithm (-C 2EB) [2EB, 3EB] \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); + fprintf(stdout," - The rate specified for each quality level is the desired compression factor.\n"); + fprintf(stdout," - Rate 1 means lossless compression\n"); + fprintf(stdout," (options -r and -q cannot be used together)\n "); + fprintf(stdout,"\n"); + fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); + fprintf(stdout," (options -r and -q cannot be used together)\n "); + fprintf(stdout,"\n"); + fprintf(stdout,"-b : size of code block (-b 32,32,32) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-c : size of precinct (-c 128,128,128) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-t : size of tile (-t 512,512,512) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-s : subsampling factor (-s 2,2,2) [-s X,Y,Z] \n"); + fprintf(stdout," - Remark: subsampling bigger than 2 can produce error\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-SOP : write SOP marker before each packet \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-M : code-block style (-M 0) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); + fprintf(stdout," 8=VSC 16=PTERM 32=SEGSYM 64=3DCTXT] \n"); + fprintf(stdout," Indicate multiple modes by adding their values. \n"); + fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-D : define DC offset (-D 12) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); + fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n"); + fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-d : offset of the origin of the volume (-d 150,300,100) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-l : offset of the origin of the tiles (-l 100,75,25) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"DEFAULT CODING:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout," * Lossless\n"); + fprintf(stdout," * 1 tile\n"); + fprintf(stdout," * Size of precinct : 2^15 x 2^15 x 2^15 (means 1 precinct)\n"); + fprintf(stdout," * Size of code-block : 64 x 64 x 64\n"); + fprintf(stdout," * Number of resolutions in x, y and z axis: 3\n"); + fprintf(stdout," * No SOP marker in the codestream\n"); + fprintf(stdout," * No EPH marker in the codestream\n"); + fprintf(stdout," * No sub-sampling in x, y or z direction\n"); + fprintf(stdout," * No mode switch activated\n"); + fprintf(stdout," * Progression order: LRCP\n"); + fprintf(stdout," * No index file\n"); + fprintf(stdout," * No ROI upshifted\n"); + fprintf(stdout," * No offset of the origin of the volume\n"); + fprintf(stdout," * No offset of the origin of the tiles\n"); + fprintf(stdout," * Reversible DWT 5-3 on each 2D slice\n"); + fprintf(stdout," * Coding algorithm: 2D-EBCOT \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"REMARKS:\n"); + fprintf(stdout,"---------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"- The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); + fprintf(stdout,"- COD and QCD markers will never appear in the tile_header.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"- You need enough disk space memory (twice the original) to encode \n"); + fprintf(stdout,"the volume,i.e. for a 1.5 GB volume you need a minimum of 3GB of disk memory)\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"- When loading *.pgx files, a relative path to directory is needed for input argument \n"); + fprintf(stdout," followed by the common prefix of the slices and a '*' character representing sequential numeration.\n"); + fprintf(stdout,"( -i relativepath/slices*.pgx )\n"); + fprintf(stdout,"\n"); + fprintf(stdout," - The index file has the structure below:\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"\t Image_height Image_width Image_depth\n"); + fprintf(stdout,"\t Progression order: 0 (LRCP)\n"); + fprintf(stdout,"\t Tiles_size_X Tiles_size_Y Tiles_size_Z\n"); + fprintf(stdout,"\t Components_nb\n"); + fprintf(stdout,"\t Layers_nb\n"); + fprintf(stdout,"\t Decomposition_levels\n"); + fprintf(stdout,"\t [Precincts_size_X_res_Nr Precincts_size_Y_res_Nr Precincts_size_Z_res_Nr]\n\t ...\n"); + fprintf(stdout,"\t [Precincts_size_X_res_0 Precincts_size_Y_res_0 Precincts_size_Z_res_0]\n"); + fprintf(stdout,"\t Main_header_end_position\n"); + fprintf(stdout,"\t Codestream_size\n"); + fprintf(stdout,"\t Tile_0 [start_pos end_header end_pos TotalDisto NumPix MaxMSE]\n"); + fprintf(stdout,"\t ...\n"); + fprintf(stdout,"\t Tile_Nt [ '' '' '' '' '' '' ]\n"); + fprintf(stdout,"\t Tpacket_0 [Tile layer res. comp. prec. start_pos end_pos disto]\n"); + fprintf(stdout,"\t ...\n"); + fprintf(stdout,"\t Tpacket_Np ['' '' '' '' '' '' '' '' ]\n"); + fprintf(stdout,"\t MaxDisto\n"); + fprintf(stdout,"\t TotalDisto\n\n"); + fprintf(stdout,"\n"); + +} + +OPJ_PROG_ORDER give_progression(char progression[4]) +{ + if(strncmp(progression, "LRCP", 4) == 0) { + return LRCP; + } + if(strncmp(progression, "RLCP", 4) == 0) { + return RLCP; + } + if(strncmp(progression, "RPCL", 4) == 0) { + return RPCL; + } + if(strncmp(progression, "PCRL", 4) == 0) { + return PCRL; + } + if(strncmp(progression, "CPRL", 4) == 0) { + return CPRL; + } + + return PROG_UNKNOWN; +} + +OPJ_TRANSFORM give_transform(char transform[4]) +{ + if(strncmp(transform, "2DWT", 4) == 0) { + return TRF_2D_DWT; + } + if(strncmp(transform, "3DWT", 4) == 0) { + return TRF_3D_DWT; + } + return TRF_UNKNOWN; +} + +OPJ_ENTROPY_CODING give_coding(char coding[3]) +{ + + if(strncmp(coding, "2EB", 3) == 0) { + return ENCOD_2EB; + } + if(strncmp(coding, "3EB", 3) == 0) { + return ENCOD_3EB; + } + /*if(strncmp(coding, "2GR", 3) == 0) { + return ENCOD_2GR; + } + if(strncmp(coding, "3GR", 3) == 0) { + return ENCOD_3GR; + }*/ + + return ENCOD_UNKNOWN; +} + +int get_file_format(char *filename) +{ + int i; + static const char *extension[] = {"pgx", "bin", "img", "j3d", "jp3d", "j2k"}; + static const int format[] = { PGX_DFMT, BIN_DFMT, IMG_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT}; + char * ext = strrchr(filename, '.'); + if (ext) { + ext++; + for(i = 0; i < sizeof(format)/sizeof(*format); i++) { + if(strnicmp(ext, extension[i], 3) == 0) { + return format[i]; + } + } + } + + return -1; +} + +/* ------------------------------------------------------------------------------------ */ + +int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) +{ + int i, value; + + /* parse the command line */ + + while (1) { + int c = opj_getopt(argc, argv, "i:m:o:r:q:f:t:n:c:b:x:p:s:d:hP:S:E:M:D:R:l:T:C:A:I"); + if (c == -1) + break; + switch (c) { + case 'i': { /* input file */ + char *infile = opj_optarg; + parameters->decod_format = get_file_format(infile); + switch(parameters->decod_format) { + case PGX_DFMT: + case BIN_DFMT: + case IMG_DFMT: + break; + default: + fprintf(stdout, "[ERROR] Unrecognized format for infile : %s [accept only *.pgx or *.bin] !!\n\n", infile); + return 1; + break; + } + strncpy(parameters->infile, infile, MAX_PATH); + fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile); + + } + break; + + /* ----------------------------------------------------- */ + case 'm': { /* input IMG file */ + char *imgfile = opj_optarg; + int imgformat = get_file_format(imgfile); + switch(imgformat) { + case IMG_DFMT: + break; + default: + fprintf(stdout, "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", imgfile); + return 1; + break; + } + strncpy(parameters->imgfile, imgfile, MAX_PATH); + fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, imgformat); + } + break; + + /* ----------------------------------------------------- */ + case 'o': { /* output file */ + char *outfile = opj_optarg; + parameters->cod_format = get_file_format(outfile); + switch(parameters->cod_format) { + case J3D_CFMT: + case J2K_CFMT: + case LSE_CFMT: + break; + default: + fprintf(stdout, "[ERROR] Unknown output format volume %s [only *.j2k, *.lse3d or *.jp3d]!! \n", outfile); + return 1; + break; + } + strncpy(parameters->outfile, outfile, MAX_PATH); + fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile); + } + break; + + /* ----------------------------------------------------- */ + + case 'r': { /* define compression rates for each layer */ + char *s = opj_optarg; + while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { + parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + parameters->cp_disto_alloc = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'q': { /* define distorsion (PSNR) for each layer */ + char *s = opj_optarg; + while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { + parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + parameters->cp_fixed_quality = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'f': { + fprintf(stdout, "/---------------------------------------------------\\\n"); + fprintf(stdout, "| Fixed layer allocation option not implemented !! |\n"); + fprintf(stdout, "\\---------------------------------------------------/\n"); + /*int *row = NULL, *col = NULL; + int numlayers = 0, matrix_width = 0; + + char *s = opj_optarg; + sscanf(s, "%d", &numlayers); + s++; + if (numlayers > 9) + s++; + + parameters->tcp_numlayers = numlayers; + matrix_width = parameters->numresolution[0] + parameters->numresolution[1] + parameters->numresolution[2]; + parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); + s = s + 2; + + for (i = 0; i < numlayers; i++) { + row = ¶meters->cp_matrice[i * matrix_width]; + col = row; + parameters->tcp_rates[i] = 1; + sscanf(s, "%d,", &col[0]); + s += 2; + if (col[0] > 9) + s++; + col[1] = 0; + col[2] = 0; + for (j = 1; j < matrix_width; j++) { + col += 3; j+=2; + sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); + s += 6; + if (col[0] > 9) + s++; + if (col[1] > 9) + s++; + if (col[2] > 9) + s++; + } + if (i < numlayers - 1) + s++; + } + parameters->cp_fixed_alloc = 1; */ + } + break; + + /* ----------------------------------------------------- */ + + case 't': { /* tiles */ + if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy, ¶meters->cp_tdz) !=3) { + fprintf(stdout, "[ERROR] '-t' 'dimensions of tiles' argument error ! [-t tdx,tdy,tdz]\n"); + return 1; + } + parameters->tile_size_on = true; + } + break; + + /* ----------------------------------------------------- */ + + case 'n': { /* resolution */ + int aux; + aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->numresolution[0], ¶meters->numresolution[1], ¶meters->numresolution[2]); + if (aux == 2) + parameters->numresolution[2] = 1; + else if (aux == 1) { + parameters->numresolution[1] = parameters->numresolution[0]; + parameters->numresolution[2] = 1; + } else if (aux == 0) { + parameters->numresolution[0] = 1; + parameters->numresolution[1] = 1; + parameters->numresolution[2] = 1; + } + } + break; + + /* ----------------------------------------------------- */ + case 'c': { /* precinct dimension */ + char sep; + int res_spec = 0; + int aux; + char *s = opj_optarg; + do { + sep = 0; + aux = sscanf(s, "[%d,%d,%d]%c", ¶meters->prct_init[0][res_spec], ¶meters->prct_init[1][res_spec], ¶meters->prct_init[2][res_spec], &sep); + if (sep == ',' && aux != 4) { + fprintf(stdout, "[ERROR] '-c' 'dimensions of precincts' argument error ! [-c [prcx_res0,prcy_res0,prcz_res0],...,[prcx_resN,prcy_resN,prcz_resN]]\n"); + return 1; + } + parameters->csty |= 0x01; + res_spec++; + s = strpbrk(s, "]") + 2; + } while (sep == ','); + parameters->res_spec = res_spec; /* number of precinct size specifications */ + } + break; + + /* ----------------------------------------------------- */ + + case 'b': { /* code-block dimension */ + int cblockw_init = 0, cblockh_init = 0, cblockl_init = 0; + if (sscanf(opj_optarg, "%d,%d,%d", &cblockw_init, &cblockh_init, &cblockl_init) != 3) { + fprintf(stdout, "[ERROR] '-b' 'dimensions of codeblocks' argument error ! [-b cblkx,cblky,cblkz]\n"); + return 1; + } + if (cblockw_init * cblockh_init * cblockl_init > (1<<18) || cblockw_init > 1024 || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4 || cblockl_init > 1024 || cblockl_init < 4) { + fprintf(stdout,"[ERROR] Size of code_block error (option -b) !!\n\nRestriction :\n * width*height*length<=4096\n * 4<=width,height,length<= 1024\n\n"); + return 1; + } + parameters->cblock_init[0] = cblockw_init; + parameters->cblock_init[1] = cblockh_init; + parameters->cblock_init[2] = cblockl_init; + } + break; + + /* ----------------------------------------------------- */ + + case 'x': { /* creation of index file */ + char *index = opj_optarg; + strncpy(parameters->index, index, MAX_PATH); + parameters->index_on = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'p': { /* progression order */ + char progression[4]; + + strncpy(progression, opj_optarg, 4); + parameters->prog_order = give_progression(progression); + if (parameters->prog_order == -1) { + fprintf(stdout, "[ERROR] Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 's': { /* subsampling factor */ + if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->subsampling_dx, ¶meters->subsampling_dy, ¶meters->subsampling_dz) != 3) { + fprintf(stdout, "[ERROR] '-s' sub-sampling argument error ! [-s dx,dy,dz]\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'd': { /* coordonnate of the reference grid */ + if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->volume_offset_x0, ¶meters->volume_offset_y0, ¶meters->volume_offset_z0) != 3) { + fprintf(stdout, "[ERROR] -d 'coordonnate of the reference grid' argument error !! [-d x0,y0,z0]\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'h': { /* display an help description */ + encode_help_display(); + return 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'P': { /* POC */ + int numpocs = 0; /* number of progression order change (POC) default 0 */ + opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ + + char *s = opj_optarg; + POC = parameters->POC; + + fprintf(stdout, "/----------------------------------\\\n"); + fprintf(stdout, "| POC option not fully tested !! |\n"); + fprintf(stdout, "\\----------------------------------/\n"); + + while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile, + &POC[numpocs].resno0, &POC[numpocs].compno0, + &POC[numpocs].layno1, &POC[numpocs].resno1, + &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { + POC[numpocs].prg = give_progression(POC[numpocs].progorder); + /* POC[numpocs].tile; */ + numpocs++; + while (*s && *s != '/') { + s++; + } + if (!*s) { + break; + } + s++; + } + parameters->numpocs = numpocs; + } + break; + + /* ------------------------------------------------------ */ + + case 'S': { /* SOP marker */ + parameters->csty |= 0x02; + } + break; + + /* ------------------------------------------------------ */ + + case 'E': { /* EPH marker */ + parameters->csty |= 0x04; + } + break; + + /* ------------------------------------------------------ */ + + case 'M': { /* Codification mode switch */ + fprintf(stdout, "[INFO] Mode switch option not fully tested !!\n"); + value = 0; + if (sscanf(opj_optarg, "%d", &value) == 1) { + for (i = 0; i <= 6; i++) { + int cache = value & (1 << i); + if (cache) + parameters->mode |= (1 << i); + } + } + } + break; + + /* ------------------------------------------------------ */ + + case 'D': { /* DCO */ + if (sscanf(opj_optarg, "%d", ¶meters->dcoffset) != 1) { + fprintf(stdout, "[ERROR] DC offset error !! [-D %d]\n",parameters->dcoffset); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'R': { /* ROI */ + if (sscanf(opj_optarg, "OI:c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) { + fprintf(stdout, "[ERROR] ROI error !! [-ROI:c='compno',U='shift']\n"); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'l': { /* Tile offset */ + if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0, ¶meters->cp_tz0) != 3) { + fprintf(stdout, "[ERROR] -l 'tile offset' argument error !! [-l X0,Y0,Z0]"); + return 1; + } + } + break; + + /* ------------------------------------------------------ + + case 'T': // Tranformation of original data (2D-DWT/3D-DWT/3D-RLS/2D-DWT+1D-RLS) + { + char transform[4]; + + strncpy(transform, opj_optarg, 4); + parameters->transform_format = give_transform(transform); + if (parameters->transform_format == -1) { + fprintf(stdout, "[ERROR] -T 'Transform domain' argument error !! [-T 2DWT, 3DWT, 3RLS or 3LSE only]"); + return 1; + } + } + break; + + ------------------------------------------------------ */ + + case 'C': { /* Coding of transformed data */ + char coding[3]; + + strncpy(coding, opj_optarg, 3); + parameters->encoding_format = give_coding(coding); + if (parameters->encoding_format == -1) { + fprintf(stdout, "[ERROR] -C 'Coding algorithm' argument error !! [-C 2EB, 3EB, 2GR, 3GR or GRI only]"); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'I': { /* reversible or not */ + parameters->irreversible = 1; + } + break; + + default: + fprintf(stdout, "[ERROR] This option is not valid \"-%c %s\"\n", c, opj_optarg); + return 1; + } + } + + /* check for possible errors */ + + if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { + fprintf(stdout, "usage: jp3d_vm_enc -i volume-file -o jp3d-file (+ options)\n"); + return 1; + } + + if((parameters->decod_format == BIN_DFMT) && (parameters->imgfile[0] == 0)) { + fprintf(stdout, "usage: jp3d_vm_enc -i bin-volume-file -m img-file -o jp3d-file (+ options)\n"); + return 1; + } + + if((parameters->decod_format != BIN_DFMT) && (parameters->decod_format != PGX_DFMT) && (parameters->decod_format != IMG_DFMT)) { + fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); + return 1; + } + if((parameters->cod_format != J3D_CFMT) && (parameters->cod_format != J2K_CFMT)) { + fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); + return 1; + } + + if((parameters->encoding_format == ENCOD_2GR || parameters->encoding_format == ENCOD_3GR) && parameters->transform_format != TRF_3D_LSE && parameters->transform_format != TRF_3D_RLS) { + fprintf(stdout, "[ERROR] Entropy coding options -C [2GR,3GR] are only compatible with predictive-based transform algorithms: -T [3RLS,3LSE].\n"); + return 1; + } + if (parameters->encoding_format == ENCOD_3EB) + parameters->mode |= (1 << 6); + + if ((parameters->mode >> 6) & 1) { + parameters->encoding_format = ENCOD_3EB; + } + + if((parameters->numresolution[2] == 0 || (parameters->numresolution[1] == 0) || (parameters->numresolution[0] == 0))) { + fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions must be greater than 1 in order to perform DWT.\n"); + return 1; + } + if (parameters->numresolution[1] != parameters->numresolution[0]) { + fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in X and Y axis must be the same in this implementation.\n"); + return 1; + } + + if (parameters->numresolution[2] > parameters->numresolution[0]) { + fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in Z axis must be lower than in X-Y axis.\n"); + return 1; + } + + if (parameters->dcoffset >= 128 && parameters->dcoffset <= -128) { + fprintf(stdout, "[ERROR] -D 'DC offset' argument error ! Value must be -128<=DCO<=128.\n"); + return 1; + } + + if(parameters->numresolution[2] != 1) { + parameters->transform_format = TRF_3D_DWT; + /*fprintf(stdout, "[Warning] Resolution level in axial dim > 1 : 3D-DWT will be performed... \n");*/ + } else if (parameters->numresolution[2] == 1) { + parameters->transform_format = TRF_2D_DWT; + /*fprintf(stdout, "[Warning] Resolution level in axial dim == 1 : 2D-DWT will be performed... \n");*/ + } + + if ((parameters->cod_format == J2K_CFMT) && (parameters->transform_format != TRF_2D_DWT || parameters->encoding_format != ENCOD_2EB)) { + fprintf(stdout, "[WARNING] Incompatible options -o *.j2k and defined transform or encoding algorithm. Latter will be ignored\n"); + parameters->transform_format = TRF_2D_DWT; + parameters->encoding_format = ENCOD_2EB; + } + + if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_quality))) { + fprintf(stdout, "[ERROR] Options -r and -q cannot be used together !!\n"); + return 1; + } /* mod fixed_quality */ + + /* if no rate entered, lossless by default */ + if (parameters->tcp_numlayers == 0) { + parameters->tcp_rates[0] = 0.0; /* MOD antonin : losslessbug */ + parameters->tcp_numlayers++; + parameters->cp_disto_alloc = 1; + } + + if((parameters->cp_tx0 > parameters->volume_offset_x0) || (parameters->cp_ty0 > parameters->volume_offset_y0) || (parameters->cp_tz0 > parameters->volume_offset_z0)) { + fprintf(stdout, "[ERROR] Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) TZO(%d)<=IMG_Z0(%d)\n", + parameters->cp_tx0, parameters->volume_offset_x0, parameters->cp_ty0, parameters->volume_offset_y0, + parameters->cp_tz0, parameters->volume_offset_z0); + return 1; + } + + for (i = 0; i < parameters->numpocs; i++) { + if (parameters->POC[i].prg == -1) { + fprintf(stdout,"[ERROR] Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",i + 1); + } + } + return 0; +} + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + +int main(int argc, char **argv) +{ + bool bSuccess; + bool delete_comment = true; + opj_cparameters_t parameters; /* compression parameters */ + opj_event_mgr_t event_mgr; /* event manager */ + opj_volume_t *volume = NULL; + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* set encoding parameters to default values */ + opj_set_default_encoder_parameters(¶meters); + + /* parse input and get user encoding parameters */ + if(parse_cmdline_encoder(argc, argv, ¶meters) == 1) { + return 0; + } + + if(parameters.cp_comment == NULL) { + parameters.cp_comment = "Created by OpenJPEG version JP3D"; + /* no need to delete parameters.cp_comment on exit */ + delete_comment = false; + } + + /* encode the destination volume */ + /* ---------------------------- */ + if (parameters.cod_format == J3D_CFMT || parameters.cod_format == J2K_CFMT) { + int codestream_length, pixels, bitsin; + opj_cio_t *cio = NULL; + FILE *f = NULL; + opj_cinfo_t* cinfo = NULL; + + /* decode the source volume */ + /* ----------------------- */ + switch (parameters.decod_format) { + case PGX_DFMT: + fprintf(stdout, "[INFO] Loading pgx file(s)\n"); + volume = pgxtovolume(parameters.infile, ¶meters); + if (!volume) { + fprintf(stdout, "[ERROR] Unable to load pgx files\n"); + return 1; + } + break; + + case BIN_DFMT: + fprintf(stdout, "[INFO] Loading bin file\n"); + volume = bintovolume(parameters.infile, parameters.imgfile, ¶meters); + if (!volume) { + fprintf(stdout, "[ERROR] Unable to load bin file\n"); + return 1; + } + break; + + case IMG_DFMT: + fprintf(stdout, "[INFO] Loading img file\n"); + volume = imgtovolume(parameters.infile, ¶meters); + if (!volume) { + fprintf(stderr, "[ERROR] Unable to load img file\n"); + return 1; + } + break; + } + + /* get a JP3D or J2K compressor handle */ + if (parameters.cod_format == J3D_CFMT) + cinfo = opj_create_compress(CODEC_J3D); + else if (parameters.cod_format == J2K_CFMT) + cinfo = opj_create_compress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stdout); + + /* setup the encoder parameters using the current volume and using user parameters */ + opj_setup_encoder(cinfo, ¶meters, volume); + + /* open a byte stream for writing */ + /* allocate memory for all tiles */ + cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); + + /* encode the volume */ + /*fprintf(stdout, "[INFO] Encode the volume\n");*/ + bSuccess = opj_encode(cinfo, cio, volume, parameters.index); + if (!bSuccess) { + opj_cio_close(cio); + fprintf(stdout, "[ERROR] Failed to encode volume\n"); + return 1; + } + codestream_length = cio_tell(cio); + pixels =(volume->x1 - volume->x0) * (volume->y1 - volume->y0) * (volume->z1 - volume->z0); + bitsin = pixels * volume->comps[0].prec; + fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n Codestream: %d B, Ratio: %5.3f bpv, (%5.3f : 1) \n", + (volume->x1 - volume->x0),(volume->y1 - volume->y0),(volume->z1 - volume->z0),volume->comps[0].prec, + codestream_length, ((double)codestream_length * 8.0/(double)pixels), ((double)bitsin/(8.0*(double)codestream_length))); + + /* write the buffer to disk */ + f = fopen(parameters.outfile, "wb"); + if (!f) { + fprintf(stdout, "[ERROR] Failed to open %s for writing\n", parameters.outfile); + return 1; + } + fwrite(cio->buffer, 1, codestream_length, f); + fclose(f); + + /* close and free the byte stream */ + opj_cio_close(cio); + + /* free remaining compression structures */ + opj_destroy_compress(cinfo); + } else { + fprintf(stdout, "[ERROR] Cod_format != JP3d !!! \n"); + return 1; + } + + /* free user parameters structure */ + if(delete_comment) { + if(parameters.cp_comment) free(parameters.cp_comment); + } + if(parameters.cp_matrice) free(parameters.cp_matrice); + + /* free volume data */ + opj_volume_destroy(volume); + + return 0; +} diff --git a/src/bin/jp3d/opj_jp3d_decompress.c b/src/bin/jp3d/opj_jp3d_decompress.c index c2cdb321..4eb2539e 100755 --- a/src/bin/jp3d/opj_jp3d_decompress.c +++ b/src/bin/jp3d/opj_jp3d_decompress.c @@ -1,542 +1,548 @@ -/*
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
- * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include "opj_config.h"
-#include "openjp3d.h"
-#include "opj_getopt.h"
-#include "convert.h"
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
-#endif /* _WIN32 */
-
-/* ----------------------------------------------------------------------- */
-static double calc_PSNR(opj_volume_t *original, opj_volume_t *decoded)
-{
- int max, i, k, compno = 0, size;
- double sum, total = 0;
- int global = 1;
-
- max = (original->comps[compno].prec <= 8) ? 255 : (1 << original->comps[compno].prec) - 1;
- if (global) {
- size = (original->x1 - original->x0) * (original->y1 - original->y0) * (original->z1 - original->z0);
-
- for (compno = 0; compno < original->numcomps; compno++) {
- for(sum = 0, i = 0; i < size; ++i) {
- if ((decoded->comps[compno].data[i] < 0) || (decoded->comps[compno].data[i] > max))
- fprintf(stdout,"[WARNING] Data out of range during PSNR computing...\n");
- else
- sum += (original->comps[compno].data[i] - decoded->comps[compno].data[i]) * (original->comps[compno].data[i] - decoded->comps[compno].data[i]);
- }
- }
- sum /= size;
- total = ((sum==0.0) ? 0.0 : 10 * log10(max * max / sum));
- } else {
- size = (original->x1 - original->x0) * (original->y1 - original->y0);
-
- for (k = 0; k < original->z1 - original->z0; k++) {
- int offset = k * size;
- for (sum = 0, compno = 0; compno < original->numcomps; compno++) {
- for(i = 0; i < size; ++i) {
- if ((decoded->comps[compno].data[i + offset] < 0) || (decoded->comps[compno].data[i + offset] > max))
- fprintf(stdout,"[WARNING] Data out of range during PSNR computing...\n");
- else
- sum += (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i + offset]) * (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i + offset]);
- }
- }
- sum /= size;
- total = total + ((sum==0.0) ? 0.0 : 10 * log10(max * max / sum));
- }
-
- }
- if(total == 0) /* perfect reconstruction, PSNR should return infinity */
- return -1.0;
-
- return total;
- /*return 20 * log10((max - 1) / sqrt(sum));*/
-}
-
-static double calc_SSIM(opj_volume_t *original, opj_volume_t *decoded)
-{
- int max, i, compno = 0, size, sizeM;
- double sum;
- double mux = 0.0, muy = 0.0, sigmax = 0.0, sigmay = 0.0,
- sigmaxy = 0.0/*, structx = 0.0, structy = 0.0*/;
- double lcomp,ccomp,scomp;
- double C1,C2,C3;
-
- max = (original->comps[compno].prec <= 8) ? 255 : (1 << original->comps[compno].prec) - 1;
- size = (original->x1 - original->x0) * (original->y1 - original->y0) * (original->z1 - original->z0);
-
- /*MSSIM*/
-
-/* sizeM = size / (original->z1 - original->z0);*/
-
- sizeM = size;
- for(sum = 0, i = 0; i < sizeM; ++i) {
- /* First, the luminance of each signal is compared.*/
- mux += original->comps[compno].data[i];
- muy += decoded->comps[compno].data[i];
- }
- mux /= sizeM;
- muy /= sizeM;
-
- /*We use the standard deviation (the square root of variance) as an estimate of the signal contrast.*/
- for(sum = 0, i = 0; i < sizeM; ++i) {
- /* First, the luminance of each signal is compared.*/
- sigmax += (original->comps[compno].data[i] - mux) * (original->comps[compno].data[i] - mux);
- sigmay += (decoded->comps[compno].data[i] - muy) * (decoded->comps[compno].data[i] - muy);
- sigmaxy += (original->comps[compno].data[i] - mux) * (decoded->comps[compno].data[i] - muy);
- }
- sigmax /= sizeM - 1;
- sigmay /= sizeM - 1;
- sigmaxy /= sizeM - 1;
-
- sigmax = sqrt(sigmax);
- sigmay = sqrt(sigmay);
- sigmaxy = sqrt(sigmaxy);
-
- /*Third, the signal is normalized (divided) by its own standard deviation, */
- /*so that the two signals being compared have unit standard deviation.*/
-
- /*Luminance comparison*/
- C1 = (0.01 * max) * (0.01 * max);
- lcomp = ((2 * mux * muy) + C1)/((mux*mux) + (muy*mux) + C1);
- /*Constrast comparison*/
- C2 = (0.03 * max) * (0.03 * max);
- ccomp = ((2 * sigmax * sigmay) + C2)/((sigmax*sigmax) + (sigmay*sigmay) + C2);
- /*Structure comparison*/
- C3 = C2 / 2;
- scomp = (sigmaxy + C3) / (sigmax * sigmay + C3);
- /*Similarity measure*/
-
- sum = lcomp * ccomp * scomp;
- return sum;
-}
-
-void decode_help_display() {
- fprintf(stdout,"HELP\n----\n\n");
- fprintf(stdout,"- the -h option displays this help information on screen\n\n");
-
- fprintf(stdout,"List of parameters for the JPEG 2000 encoder:\n");
- fprintf(stdout,"\n");
- fprintf(stdout," Required arguments \n");
- fprintf(stdout," ---------------------------- \n");
- fprintf(stdout," -i <compressed file> ( *.jp3d, *.j3d )\n");
- fprintf(stdout," Currently accepts J3D-files. The file type is identified based on its suffix.\n");
- fprintf(stdout," -o <decompressed file> ( *.pgx, *.bin )\n");
- fprintf(stdout," Currently accepts PGX-files and BIN-files. Binary data is written to the file (not ascii). \n");
- fprintf(stdout," If a PGX filename is given, there will be as many output files as slices; \n");
- fprintf(stdout," an indice starting from 0 will then be appended to the output filename,\n");
- fprintf(stdout," just before the \"pgx\" extension.\n");
- fprintf(stdout," -m <characteristics file> ( *.img ) \n");
- fprintf(stdout," Required only for BIN-files. Ascii data of volume characteristics is written. \n");
- fprintf(stdout,"\n");
- fprintf(stdout," Optional \n");
- fprintf(stdout," ---------------------------- \n");
- fprintf(stdout," -h \n ");
- fprintf(stdout," Display the help information\n");
- fprintf(stdout," -r <RFx,RFy,RFz>\n");
- fprintf(stdout," Set the number of highest resolution levels to be discarded on each dimension. \n");
- fprintf(stdout," The volume resolution is effectively divided by 2 to the power of the\n");
- fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n");
- fprintf(stdout," smallest total number of decomposition levels among tiles.\n");
- fprintf(stdout," -l <number of quality layers to decode>\n");
- fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n");
- fprintf(stdout," less quality layers than the specified number, all the quality layers\n");
- fprintf(stdout," are decoded. \n");
- fprintf(stdout," -O original-file \n");
- fprintf(stdout," This option offers the possibility to compute some quality results \n");
- fprintf(stdout," for the decompressed volume, like the PSNR value achieved or the global SSIM value. \n");
- fprintf(stdout," Needs the original file in order to compare with the new one.\n");
- fprintf(stdout," NOTE: Only valid when -r option is 0,0,0 (both original and decompressed volumes have same resolutions) \n");
- fprintf(stdout," NOTE: If original file is .BIN file, the volume characteristics file shall be defined with the -m option. \n");
- fprintf(stdout," (i.e. -O original-BIN-file -m original-IMG-file) \n");
- fprintf(stdout," -BE \n");
- fprintf(stdout," Define that the recovered volume data will be saved with big endian byte order.\n");
- fprintf(stdout," By default, little endian byte order is used.\n");
- fprintf(stdout,"\n");
-}
-
-/* -------------------------------------------------------------------------- */
-
-int get_file_format(char *filename) {
- int i;
- static const char *extension[] = {"pgx", "bin", "j3d", "jp3d", "j2k", "img"};
- static const int format[] = { PGX_DFMT, BIN_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT, IMG_DFMT};
- char * ext = strrchr(filename, '.');
- if(ext) {
- ext++;
- for(i = 0; i < sizeof(format) / sizeof(format[0]); i++) {
- if(strnicmp(ext, extension[i], 3) == 0) {
- return format[i];
- }
- }
- }
-
- return -1;
-}
-
-/* -------------------------------------------------------------------------- */
-
-int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) {
- /* parse the command line */
-
- while (1) {
- int c = opj_getopt(argc, argv, "i:o:O:r:l:B:m:h");
- if (c == -1)
- break;
- switch (c) {
- case 'i': /* input file */
- {
- char *infile = opj_optarg;
- parameters->decod_format = get_file_format(infile);
- switch(parameters->decod_format) {
- case J3D_CFMT:
- case J2K_CFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unknown format for infile %s [only *.j3d]!! \n", infile);
- return 1;
- break;
- }
- strncpy(parameters->infile, infile, MAX_PATH);
- fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile);
-
- }
- break;
-
- case 'm': /* img file */
- {
- char *imgfile = opj_optarg;
- int imgformat = get_file_format(imgfile);
- switch(imgformat) {
- case IMG_DFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", imgfile);
- return 1;
- break;
- }
- strncpy(parameters->imgfile, imgfile, MAX_PATH);
- fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, imgformat);
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'o': /* output file */
- {
- char *outfile = opj_optarg;
- parameters->cod_format = get_file_format(outfile);
- switch(parameters->cod_format) {
- case PGX_DFMT:
- case BIN_DFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unrecognized format for outfile : %s [accept only *.pgx or *.bin] !!\n\n", outfile);
- return 1;
- break;
- }
- strncpy(parameters->outfile, outfile, MAX_PATH);
- fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile);
-
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'O': /* Original image for PSNR computing */
- {
- char *original = opj_optarg;
- parameters->orig_format = get_file_format(original);
- switch(parameters->orig_format) {
- case PGX_DFMT:
- case BIN_DFMT:
- break;
- default:
- fprintf(stdout, "[ERROR] Unrecognized format for original file : %s [accept only *.pgx or *.bin] !!\n\n", original);
- return 1;
- break;
- }
- strncpy(parameters->original, original, MAX_PATH);
- fprintf(stdout, "[INFO] Original file: %s \n", parameters->original);
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'r': /* reduce option */
- {
- /*sscanf(opj_optarg, "%d, %d, %d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]);*/
- int aux;
- aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]);
- if (aux == 2)
- parameters->cp_reduce[2] = 0;
- else if (aux == 1) {
- parameters->cp_reduce[1] = parameters->cp_reduce[0];
- parameters->cp_reduce[2] = 0;
- }else if (aux == 0){
- parameters->cp_reduce[0] = 0;
- parameters->cp_reduce[1] = 0;
- parameters->cp_reduce[2] = 0;
- }
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'l': /* layering option */
- {
- sscanf(opj_optarg, "%d", ¶meters->cp_layer);
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'B': /* BIGENDIAN vs. LITTLEENDIAN */
- {
- parameters->bigendian = 1;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'L': /* BIGENDIAN vs. LITTLEENDIAN */
- {
- parameters->decod_format = LSE_CFMT;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- case 'h': /* display an help description */
- {
- decode_help_display();
- return 1;
- }
- break;
-
- /* ----------------------------------------------------- */
-
- default:
- fprintf(stdout,"[WARNING] This option is not valid \"-%c %s\"\n",c, opj_optarg);
- break;
- }
- }
-
- /* check for possible errors */
-
- if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
- fprintf(stdout,"[ERROR] At least one required argument is missing\n Check jp3d_to_volume -help for usage information\n");
- return 1;
- }
-
- return 0;
-}
-
-/* -------------------------------------------------------------------------- */
-
-/**
-sample error callback expecting a FILE* client object
-*/
-void error_callback(const char *msg, void *client_data) {
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-void warning_callback(const char *msg, void *client_data) {
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-/**
-sample debug callback expecting no client object
-*/
-void info_callback(const char *msg, void *client_data) {
- fprintf(stdout, "[INFO] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-int main(int argc, char **argv) {
-
- opj_dparameters_t parameters; /* decompression parameters */
- opj_event_mgr_t event_mgr; /* event manager */
- opj_volume_t *volume = NULL;
-
- opj_volume_t *original = NULL;
- opj_cparameters_t cparameters; /* original parameters */
-
- FILE *fsrc = NULL;
- unsigned char *src = NULL;
- int file_length;
- int decodeok;
- double psnr, ssim;
-
- opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
- opj_cio_t *cio = NULL;
-
- /* configure the event callbacks (not required) */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
- /* set decoding parameters to default values */
- opj_set_default_decoder_parameters(¶meters);
-
- /* parse input and get user decoding parameters */
- strcpy(parameters.original,"NULL");
- strcpy(parameters.imgfile,"NULL");
- if(parse_cmdline_decoder(argc, argv, ¶meters) == 1) {
- return 0;
- }
-
- /* read the input file and put it in memory */
- /* ---------------------------------------- */
- fprintf(stdout, "[INFO] Loading %s file \n",parameters.decod_format==J3D_CFMT ? ".jp3d" : ".j2k");
- fsrc = fopen(parameters.infile, "rb");
- if (!fsrc) {
- fprintf(stdout, "[ERROR] Failed to open %s for reading\n", parameters.infile);
- return 1;
- }
- fseek(fsrc, 0, SEEK_END);
- file_length = ftell(fsrc);
- fseek(fsrc, 0, SEEK_SET);
- src = (unsigned char *) malloc(file_length);
- fread(src, 1, file_length, fsrc);
- fclose(fsrc);
-
- /* decode the code-stream */
- /* ---------------------- */
- if (parameters.decod_format == J3D_CFMT || parameters.decod_format == J2K_CFMT) {
- /* get a JP3D or J2K decoder handle */
- if (parameters.decod_format == J3D_CFMT)
- dinfo = opj_create_decompress(CODEC_J3D);
- else if (parameters.decod_format == J2K_CFMT)
- dinfo = opj_create_decompress(CODEC_J2K);
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
-
- /* setup the decoder decoding parameters using user parameters */
- opj_setup_decoder(dinfo, ¶meters);
-
- /* open a byte stream */
- cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
-
- /* decode the stream and fill the volume structure */
- volume = opj_decode(dinfo, cio);
- if(!volume) {
- fprintf(stdout, "[ERROR] jp3d_to_volume: failed to decode volume!\n");
- opj_destroy_decompress(dinfo);
- opj_cio_close(cio);
- return 1;
- }
-
- /* close the byte stream */
- opj_cio_close(cio);
- }
-
- /* free the memory containing the code-stream */
- free(src);
- src = NULL;
-
- /* create output volume */
- /* ------------------- */
-
- switch (parameters.cod_format) {
- case PGX_DFMT: /* PGX */
- decodeok = volumetopgx(volume, parameters.outfile);
- if (decodeok)
- fprintf(stdout,"[ERROR] Unable to write decoded volume into pgx files\n");
- break;
-
- case BIN_DFMT: /* BMP */
- decodeok = volumetobin(volume, parameters.outfile);
- if (decodeok)
- fprintf(stdout,"[ERROR] Unable to write decoded volume into pgx files\n");
- break;
- }
- switch (parameters.orig_format) {
- case PGX_DFMT: /* PGX */
- if (strcmp("NULL",parameters.original) != 0){
- fprintf(stdout,"Loading original file %s \n",parameters.original);
- cparameters.subsampling_dx = 1; cparameters.subsampling_dy = 1; cparameters.subsampling_dz = 1;
- cparameters.volume_offset_x0 = 0;cparameters.volume_offset_y0 = 0;cparameters.volume_offset_z0 = 0;
- original = pgxtovolume(parameters.original,&cparameters);
- }
- break;
-
- case BIN_DFMT: /* BMP */
- if (strcmp("NULL",parameters.original) != 0 && strcmp("NULL",parameters.imgfile) != 0){
- fprintf(stdout,"Loading original file %s %s\n",parameters.original,parameters.imgfile);
- cparameters.subsampling_dx = 1; cparameters.subsampling_dy = 1; cparameters.subsampling_dz = 1;
- cparameters.volume_offset_x0 = 0;cparameters.volume_offset_y0 = 0;cparameters.volume_offset_z0 = 0;
- original = bintovolume(parameters.original,parameters.imgfile,&cparameters);
- }
- break;
- }
-
- fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n ",
- (volume->comps[0].w >> volume->comps[0].factor[0]),
- (volume->comps[0].h >> volume->comps[0].factor[1]),
- (volume->comps[0].l >> volume->comps[0].factor[2]),
- volume->comps[0].prec);
-
- if(original){
- psnr = calc_PSNR(original,volume);
- ssim = calc_SSIM(original,volume);
- if (psnr < 0.0)
- fprintf(stdout, " PSNR: Inf , SSMI %f -- Perfect reconstruction!\n",ssim);
- else
- fprintf(stdout, " PSNR: %f , SSIM %f \n",psnr,ssim);
- }
- /* free remaining structures */
- if(dinfo) {
- opj_destroy_decompress(dinfo);
- }
-
- /* free volume data structure */
- opj_volume_destroy(volume);
-
- return 0;
-}
-
+/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <math.h> + +#include "opj_config.h" +#include "openjp3d.h" +#include "opj_getopt.h" +#include "convert.h" + +#ifdef _WIN32 +#include <windows.h> +#else +#define stricmp strcasecmp +#define strnicmp strncasecmp +#endif /* _WIN32 */ + +/* ----------------------------------------------------------------------- */ +static double calc_PSNR(opj_volume_t *original, opj_volume_t *decoded) +{ + int max, i, k, compno = 0, size; + double sum, total = 0; + int global = 1; + + max = (original->comps[compno].prec <= 8) ? 255 : (1 << original->comps[compno].prec) - 1; + if (global) { + size = (original->x1 - original->x0) * (original->y1 - original->y0) * (original->z1 - original->z0); + + for (compno = 0; compno < original->numcomps; compno++) { + for(sum = 0, i = 0; i < size; ++i) { + if ((decoded->comps[compno].data[i] < 0) || (decoded->comps[compno].data[i] > max)) + fprintf(stdout,"[WARNING] Data out of range during PSNR computing...\n"); + else + sum += (original->comps[compno].data[i] - decoded->comps[compno].data[i]) * (original->comps[compno].data[i] - decoded->comps[compno].data[i]); + } + } + sum /= size; + total = ((sum==0.0) ? 0.0 : 10 * log10(max * max / sum)); + } else { + size = (original->x1 - original->x0) * (original->y1 - original->y0); + + for (k = 0; k < original->z1 - original->z0; k++) { + int offset = k * size; + for (sum = 0, compno = 0; compno < original->numcomps; compno++) { + for(i = 0; i < size; ++i) { + if ((decoded->comps[compno].data[i + offset] < 0) || (decoded->comps[compno].data[i + offset] > max)) + fprintf(stdout,"[WARNING] Data out of range during PSNR computing...\n"); + else + sum += (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i + offset]) * (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i + offset]); + } + } + sum /= size; + total = total + ((sum==0.0) ? 0.0 : 10 * log10(max * max / sum)); + } + + } + if(total == 0) /* perfect reconstruction, PSNR should return infinity */ + return -1.0; + + return total; + /*return 20 * log10((max - 1) / sqrt(sum));*/ +} + +static double calc_SSIM(opj_volume_t *original, opj_volume_t *decoded) +{ + int max, i, compno = 0, size, sizeM; + double sum; + double mux = 0.0, muy = 0.0, sigmax = 0.0, sigmay = 0.0, + sigmaxy = 0.0/*, structx = 0.0, structy = 0.0*/; + double lcomp,ccomp,scomp; + double C1,C2,C3; + + max = (original->comps[compno].prec <= 8) ? 255 : (1 << original->comps[compno].prec) - 1; + size = (original->x1 - original->x0) * (original->y1 - original->y0) * (original->z1 - original->z0); + + /*MSSIM*/ + + /* sizeM = size / (original->z1 - original->z0);*/ + + sizeM = size; + for(sum = 0, i = 0; i < sizeM; ++i) { + /* First, the luminance of each signal is compared.*/ + mux += original->comps[compno].data[i]; + muy += decoded->comps[compno].data[i]; + } + mux /= sizeM; + muy /= sizeM; + + /*We use the standard deviation (the square root of variance) as an estimate of the signal contrast.*/ + for(sum = 0, i = 0; i < sizeM; ++i) { + /* First, the luminance of each signal is compared.*/ + sigmax += (original->comps[compno].data[i] - mux) * (original->comps[compno].data[i] - mux); + sigmay += (decoded->comps[compno].data[i] - muy) * (decoded->comps[compno].data[i] - muy); + sigmaxy += (original->comps[compno].data[i] - mux) * (decoded->comps[compno].data[i] - muy); + } + sigmax /= sizeM - 1; + sigmay /= sizeM - 1; + sigmaxy /= sizeM - 1; + + sigmax = sqrt(sigmax); + sigmay = sqrt(sigmay); + sigmaxy = sqrt(sigmaxy); + + /*Third, the signal is normalized (divided) by its own standard deviation, */ + /*so that the two signals being compared have unit standard deviation.*/ + + /*Luminance comparison*/ + C1 = (0.01 * max) * (0.01 * max); + lcomp = ((2 * mux * muy) + C1)/((mux*mux) + (muy*mux) + C1); + /*Constrast comparison*/ + C2 = (0.03 * max) * (0.03 * max); + ccomp = ((2 * sigmax * sigmay) + C2)/((sigmax*sigmax) + (sigmay*sigmay) + C2); + /*Structure comparison*/ + C3 = C2 / 2; + scomp = (sigmaxy + C3) / (sigmax * sigmay + C3); + /*Similarity measure*/ + + sum = lcomp * ccomp * scomp; + return sum; +} + +void decode_help_display() +{ + fprintf(stdout,"HELP\n----\n\n"); + fprintf(stdout,"- the -h option displays this help information on screen\n\n"); + + fprintf(stdout,"List of parameters for the JPEG 2000 encoder:\n"); + fprintf(stdout,"\n"); + fprintf(stdout," Required arguments \n"); + fprintf(stdout," ---------------------------- \n"); + fprintf(stdout," -i <compressed file> ( *.jp3d, *.j3d )\n"); + fprintf(stdout," Currently accepts J3D-files. The file type is identified based on its suffix.\n"); + fprintf(stdout," -o <decompressed file> ( *.pgx, *.bin )\n"); + fprintf(stdout," Currently accepts PGX-files and BIN-files. Binary data is written to the file (not ascii). \n"); + fprintf(stdout," If a PGX filename is given, there will be as many output files as slices; \n"); + fprintf(stdout," an indice starting from 0 will then be appended to the output filename,\n"); + fprintf(stdout," just before the \"pgx\" extension.\n"); + fprintf(stdout," -m <characteristics file> ( *.img ) \n"); + fprintf(stdout," Required only for BIN-files. Ascii data of volume characteristics is written. \n"); + fprintf(stdout,"\n"); + fprintf(stdout," Optional \n"); + fprintf(stdout," ---------------------------- \n"); + fprintf(stdout," -h \n "); + fprintf(stdout," Display the help information\n"); + fprintf(stdout," -r <RFx,RFy,RFz>\n"); + fprintf(stdout," Set the number of highest resolution levels to be discarded on each dimension. \n"); + fprintf(stdout," The volume resolution is effectively divided by 2 to the power of the\n"); + fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); + fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); + fprintf(stdout," -l <number of quality layers to decode>\n"); + fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); + fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); + fprintf(stdout," are decoded. \n"); + fprintf(stdout," -O original-file \n"); + fprintf(stdout," This option offers the possibility to compute some quality results \n"); + fprintf(stdout," for the decompressed volume, like the PSNR value achieved or the global SSIM value. \n"); + fprintf(stdout," Needs the original file in order to compare with the new one.\n"); + fprintf(stdout," NOTE: Only valid when -r option is 0,0,0 (both original and decompressed volumes have same resolutions) \n"); + fprintf(stdout," NOTE: If original file is .BIN file, the volume characteristics file shall be defined with the -m option. \n"); + fprintf(stdout," (i.e. -O original-BIN-file -m original-IMG-file) \n"); + fprintf(stdout," -BE \n"); + fprintf(stdout," Define that the recovered volume data will be saved with big endian byte order.\n"); + fprintf(stdout," By default, little endian byte order is used.\n"); + fprintf(stdout,"\n"); +} + +/* -------------------------------------------------------------------------- */ + +int get_file_format(char *filename) +{ + int i; + static const char *extension[] = {"pgx", "bin", "j3d", "jp3d", "j2k", "img"}; + static const int format[] = { PGX_DFMT, BIN_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT, IMG_DFMT}; + char * ext = strrchr(filename, '.'); + if(ext) { + ext++; + for(i = 0; i < sizeof(format) / sizeof(format[0]); i++) { + if(strnicmp(ext, extension[i], 3) == 0) { + return format[i]; + } + } + } + + return -1; +} + +/* -------------------------------------------------------------------------- */ + +int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) +{ + /* parse the command line */ + + while (1) { + int c = opj_getopt(argc, argv, "i:o:O:r:l:B:m:h"); + if (c == -1) + break; + switch (c) { + case 'i': { /* input file */ + char *infile = opj_optarg; + parameters->decod_format = get_file_format(infile); + switch(parameters->decod_format) { + case J3D_CFMT: + case J2K_CFMT: + break; + default: + fprintf(stdout, "[ERROR] Unknown format for infile %s [only *.j3d]!! \n", infile); + return 1; + break; + } + strncpy(parameters->infile, infile, MAX_PATH); + fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile); + + } + break; + + case 'm': { /* img file */ + char *imgfile = opj_optarg; + int imgformat = get_file_format(imgfile); + switch(imgformat) { + case IMG_DFMT: + break; + default: + fprintf(stdout, "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", imgfile); + return 1; + break; + } + strncpy(parameters->imgfile, imgfile, MAX_PATH); + fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, imgformat); + } + break; + + /* ----------------------------------------------------- */ + + case 'o': { /* output file */ + char *outfile = opj_optarg; + parameters->cod_format = get_file_format(outfile); + switch(parameters->cod_format) { + case PGX_DFMT: + case BIN_DFMT: + break; + default: + fprintf(stdout, "[ERROR] Unrecognized format for outfile : %s [accept only *.pgx or *.bin] !!\n\n", outfile); + return 1; + break; + } + strncpy(parameters->outfile, outfile, MAX_PATH); + fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile); + + } + break; + + /* ----------------------------------------------------- */ + + case 'O': { /* Original image for PSNR computing */ + char *original = opj_optarg; + parameters->orig_format = get_file_format(original); + switch(parameters->orig_format) { + case PGX_DFMT: + case BIN_DFMT: + break; + default: + fprintf(stdout, "[ERROR] Unrecognized format for original file : %s [accept only *.pgx or *.bin] !!\n\n", original); + return 1; + break; + } + strncpy(parameters->original, original, MAX_PATH); + fprintf(stdout, "[INFO] Original file: %s \n", parameters->original); + } + break; + + /* ----------------------------------------------------- */ + + case 'r': { /* reduce option */ + /*sscanf(opj_optarg, "%d, %d, %d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]);*/ + int aux; + aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]); + if (aux == 2) + parameters->cp_reduce[2] = 0; + else if (aux == 1) { + parameters->cp_reduce[1] = parameters->cp_reduce[0]; + parameters->cp_reduce[2] = 0; + } else if (aux == 0) { + parameters->cp_reduce[0] = 0; + parameters->cp_reduce[1] = 0; + parameters->cp_reduce[2] = 0; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'l': { /* layering option */ + sscanf(opj_optarg, "%d", ¶meters->cp_layer); + } + break; + + /* ----------------------------------------------------- */ + + case 'B': { /* BIGENDIAN vs. LITTLEENDIAN */ + parameters->bigendian = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'L': { /* BIGENDIAN vs. LITTLEENDIAN */ + parameters->decod_format = LSE_CFMT; + } + break; + + /* ----------------------------------------------------- */ + + case 'h': { /* display an help description */ + decode_help_display(); + return 1; + } + break; + + /* ----------------------------------------------------- */ + + default: + fprintf(stdout,"[WARNING] This option is not valid \"-%c %s\"\n",c, opj_optarg); + break; + } + } + + /* check for possible errors */ + + if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { + fprintf(stdout,"[ERROR] At least one required argument is missing\n Check jp3d_to_volume -help for usage information\n"); + return 1; + } + + return 0; +} + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting no client object +*/ +void info_callback(const char *msg, void *client_data) +{ + fprintf(stdout, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + +int main(int argc, char **argv) +{ + + opj_dparameters_t parameters; /* decompression parameters */ + opj_event_mgr_t event_mgr; /* event manager */ + opj_volume_t *volume = NULL; + + opj_volume_t *original = NULL; + opj_cparameters_t cparameters; /* original parameters */ + + FILE *fsrc = NULL; + unsigned char *src = NULL; + int file_length; + int decodeok; + double psnr, ssim; + + opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ + opj_cio_t *cio = NULL; + + /* configure the event callbacks (not required) */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* set decoding parameters to default values */ + opj_set_default_decoder_parameters(¶meters); + + /* parse input and get user decoding parameters */ + strcpy(parameters.original,"NULL"); + strcpy(parameters.imgfile,"NULL"); + if(parse_cmdline_decoder(argc, argv, ¶meters) == 1) { + return 0; + } + + /* read the input file and put it in memory */ + /* ---------------------------------------- */ + fprintf(stdout, "[INFO] Loading %s file \n",parameters.decod_format==J3D_CFMT ? ".jp3d" : ".j2k"); + fsrc = fopen(parameters.infile, "rb"); + if (!fsrc) { + fprintf(stdout, "[ERROR] Failed to open %s for reading\n", parameters.infile); + return 1; + } + fseek(fsrc, 0, SEEK_END); + file_length = ftell(fsrc); + fseek(fsrc, 0, SEEK_SET); + src = (unsigned char *) malloc(file_length); + fread(src, 1, file_length, fsrc); + fclose(fsrc); + + /* decode the code-stream */ + /* ---------------------- */ + if (parameters.decod_format == J3D_CFMT || parameters.decod_format == J2K_CFMT) { + /* get a JP3D or J2K decoder handle */ + if (parameters.decod_format == J3D_CFMT) + dinfo = opj_create_decompress(CODEC_J3D); + else if (parameters.decod_format == J2K_CFMT) + dinfo = opj_create_decompress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + opj_setup_decoder(dinfo, ¶meters); + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); + + /* decode the stream and fill the volume structure */ + volume = opj_decode(dinfo, cio); + if(!volume) { + fprintf(stdout, "[ERROR] jp3d_to_volume: failed to decode volume!\n"); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + return 1; + } + + /* close the byte stream */ + opj_cio_close(cio); + } + + /* free the memory containing the code-stream */ + free(src); + src = NULL; + + /* create output volume */ + /* ------------------- */ + + switch (parameters.cod_format) { + case PGX_DFMT: /* PGX */ + decodeok = volumetopgx(volume, parameters.outfile); + if (decodeok) + fprintf(stdout,"[ERROR] Unable to write decoded volume into pgx files\n"); + break; + + case BIN_DFMT: /* BMP */ + decodeok = volumetobin(volume, parameters.outfile); + if (decodeok) + fprintf(stdout,"[ERROR] Unable to write decoded volume into pgx files\n"); + break; + } + switch (parameters.orig_format) { + case PGX_DFMT: /* PGX */ + if (strcmp("NULL",parameters.original) != 0) { + fprintf(stdout,"Loading original file %s \n",parameters.original); + cparameters.subsampling_dx = 1; + cparameters.subsampling_dy = 1; + cparameters.subsampling_dz = 1; + cparameters.volume_offset_x0 = 0; + cparameters.volume_offset_y0 = 0; + cparameters.volume_offset_z0 = 0; + original = pgxtovolume(parameters.original,&cparameters); + } + break; + + case BIN_DFMT: /* BMP */ + if (strcmp("NULL",parameters.original) != 0 && strcmp("NULL",parameters.imgfile) != 0) { + fprintf(stdout,"Loading original file %s %s\n",parameters.original,parameters.imgfile); + cparameters.subsampling_dx = 1; + cparameters.subsampling_dy = 1; + cparameters.subsampling_dz = 1; + cparameters.volume_offset_x0 = 0; + cparameters.volume_offset_y0 = 0; + cparameters.volume_offset_z0 = 0; + original = bintovolume(parameters.original,parameters.imgfile,&cparameters); + } + break; + } + + fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n ", + (volume->comps[0].w >> volume->comps[0].factor[0]), + (volume->comps[0].h >> volume->comps[0].factor[1]), + (volume->comps[0].l >> volume->comps[0].factor[2]), + volume->comps[0].prec); + + if(original) { + psnr = calc_PSNR(original,volume); + ssim = calc_SSIM(original,volume); + if (psnr < 0.0) + fprintf(stdout, " PSNR: Inf , SSMI %f -- Perfect reconstruction!\n",ssim); + else + fprintf(stdout, " PSNR: %f , SSIM %f \n",psnr,ssim); + } + /* free remaining structures */ + if(dinfo) { + opj_destroy_decompress(dinfo); + } + + /* free volume data structure */ + opj_volume_destroy(volume); + + return 0; +} + diff --git a/src/bin/jp3d/windirent.h b/src/bin/jp3d/windirent.h index 2494cd4e..e941bb5c 100644 --- a/src/bin/jp3d/windirent.h +++ b/src/bin/jp3d/windirent.h @@ -1,8 +1,8 @@ /* * uce-dirent.h - operating system independent dirent implementation - * + * * Copyright (C) 1998-2002 Toni Ronkko - * + * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * ``Software''), to deal in the Software without restriction, including @@ -10,10 +10,10 @@ * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -21,8 +21,8 @@ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. - * - * + * + * * May 28 1998, Toni Ronkko <tronkko@messi.uku.fi> * * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ @@ -58,7 +58,7 @@ * Revision 1.1 1998/07/04 16:27:51 tr * Initial revision * - * + * * MSVC 1.0 scans automatic dependencies incorrectly when your project * contains this very header. The problem is that MSVC cannot handle * include directives inside #if..#endif block those are never entered. @@ -105,14 +105,14 @@ */ #if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) # if defined(_MSC_VER) /* Microsoft C/C++ */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__MINGW32__) /* MinGW */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__BORLANDC__) /* Borland C/C++ */ # define HAVE_DIRENT_H # define VOID_CLOSEDIR # elif defined(__TURBOC__) /* Borland Turbo C */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__WATCOMC__) /* Watcom C/C++ */ # define HAVE_DIRECT_H # elif defined(__apollo) /* Apollo */ @@ -171,7 +171,7 @@ #elif defined(MSDOS) || defined(WIN32) - /* figure out type of underlaying directory interface to be used */ +/* figure out type of underlaying directory interface to be used */ # if defined(WIN32) # define DIRENT_WIN32_INTERFACE # elif defined(MSDOS) @@ -180,7 +180,7 @@ # error "missing native dirent interface" # endif - /*** WIN32 specifics ***/ +/*** WIN32 specifics ***/ # if defined(DIRENT_WIN32_INTERFACE) # include <windows.h> # if !defined(DIRENT_MAXNAMLEN) @@ -188,11 +188,11 @@ # endif - /*** MS-DOS specifics ***/ +/*** MS-DOS specifics ***/ # elif defined(DIRENT_MSDOS_INTERFACE) # include <dos.h> - /* Borland defines file length macros in dir.h */ +/* Borland defines file length macros in dir.h */ # if defined(__BORLANDC__) # include <dir.h> # if !defined(DIRENT_MAXNAMLEN) @@ -202,7 +202,7 @@ # define _find_t find_t # endif - /* Turbo C defines ffblk structure in dir.h */ +/* Turbo C defines ffblk structure in dir.h */ # elif defined(__TURBOC__) # include <dir.h> # if !defined(DIRENT_MAXNAMLEN) @@ -210,13 +210,13 @@ # endif # define DIRENT_USE_FFBLK - /* MSVC */ +/* MSVC */ # elif defined(_MSC_VER) # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (12) # endif - /* Watcom */ +/* Watcom */ # elif defined(__WATCOMC__) # if !defined(DIRENT_MAXNAMLEN) # if defined(__OS2__) || defined(__NT__) @@ -229,7 +229,7 @@ # endif # endif - /*** generic MS-DOS and MS-Windows stuff ***/ +/*** generic MS-DOS and MS-Windows stuff ***/ # if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) # define NAME_MAX DIRENT_MAXNAMLEN # endif @@ -238,16 +238,16 @@ # endif - /* - * Substitute for real dirent structure. Note that `d_name' field is a - * true character array although we have it copied in the implementation - * dependent data. We could save some memory if we had declared `d_name' - * as a pointer referring the name within implementation dependent data. - * We have not done that since some code may rely on sizeof(d_name) to be - * something other than four. Besides, directory entries are typically so - * small that it takes virtually no time to copy them from place to place. - */ - typedef struct dirent { +/* + * Substitute for real dirent structure. Note that `d_name' field is a + * true character array although we have it copied in the implementation + * dependent data. We could save some memory if we had declared `d_name' + * as a pointer referring the name within implementation dependent data. + * We have not done that since some code may rely on sizeof(d_name) to be + * something other than four. Besides, directory entries are typically so + * small that it takes virtually no time to copy them from place to place. + */ +typedef struct dirent { char d_name[NAME_MAX + 1]; /*** Operating system specific part ***/ @@ -260,21 +260,21 @@ struct _find_t data; # endif # endif - } dirent; +} dirent; - /* DIR substitute structure containing directory name. The name is - * essential for the operation of ``rewinndir'' function. */ - typedef struct DIR { +/* DIR substitute structure containing directory name. The name is + * essential for the operation of ``rewinndir'' function. */ +typedef struct DIR { char *dirname; /* directory being scanned */ dirent current; /* current entry */ int dirent_filled; /* is current un-processed? */ - /*** Operating system specific part ***/ + /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) HANDLE search_handle; # elif defined(DIRENT_MSDOS_INTERFACE) # endif - } DIR; +} DIR; # ifdef __cplusplus extern "C" { @@ -324,7 +324,7 @@ static void _setdirname (struct DIR *dirp); * internal working area that is used for retrieving individual directory * entries. The internal working area has no fields of your interest. * - * <ret>Returns a pointer to the internal working area or NULL in case the + * <ret>Returns a pointer to the internal working area or NULL in case the * directory stream could not be opened. Global `errno' variable will set * in case of error as follows: * @@ -343,46 +343,45 @@ static void _setdirname (struct DIR *dirp); */ static DIR *opendir(const char *dirname) { - DIR *dirp; - assert (dirname != NULL); - - dirp = (DIR*)malloc (sizeof (struct DIR)); - if (dirp != NULL) { - char *p; - - /* allocate room for directory name */ - dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); - if (dirp->dirname == NULL) { - /* failed to duplicate directory name. errno set by malloc() */ - free (dirp); - return NULL; - } - /* Copy directory name while appending directory separator and "*.*". - * Directory separator is not appended if the name already ends with - * drive or directory separator. Directory separator is assumed to be - * '/' or '\' and drive separator is assumed to be ':'. */ - strcpy (dirp->dirname, dirname); - p = strchr (dirp->dirname, '\0'); - if (dirp->dirname < p && - *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') - { - strcpy (p++, "\\"); - } + DIR *dirp; + assert (dirname != NULL); + + dirp = (DIR*)malloc (sizeof (struct DIR)); + if (dirp != NULL) { + char *p; + + /* allocate room for directory name */ + dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); + if (dirp->dirname == NULL) { + /* failed to duplicate directory name. errno set by malloc() */ + free (dirp); + return NULL; + } + /* Copy directory name while appending directory separator and "*.*". + * Directory separator is not appended if the name already ends with + * drive or directory separator. Directory separator is assumed to be + * '/' or '\' and drive separator is assumed to be ':'. */ + strcpy (dirp->dirname, dirname); + p = strchr (dirp->dirname, '\0'); + if (dirp->dirname < p && + *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { + strcpy (p++, "\\"); + } # ifdef DIRENT_WIN32_INTERFACE - strcpy (p, "*"); /*scan files with and without extension in win32*/ + strcpy (p, "*"); /*scan files with and without extension in win32*/ # else - strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ + strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ # endif - /* open stream */ - if (_initdir (dirp) == 0) { - /* initialization failed */ - free (dirp->dirname); - free (dirp); - return NULL; + /* open stream */ + if (_initdir (dirp) == 0) { + /* initialization failed */ + free (dirp->dirname); + free (dirp); + return NULL; + } } - } - return dirp; + return dirp; } @@ -435,55 +434,55 @@ static DIR *opendir(const char *dirname) static struct dirent * readdir (DIR *dirp) { - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return NULL; - } + assert(dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return NULL; + } #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* directory stream was opened/rewound incorrectly or it ended normally */ - errno = EBADF; - return NULL; - } + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* directory stream was opened/rewound incorrectly or it ended normally */ + errno = EBADF; + return NULL; + } #endif - if (dirp->dirent_filled != 0) { - /* - * Directory entry has already been retrieved and there is no need to - * retrieve a new one. Directory entry will be retrieved in advance - * when the user calls readdir function for the first time. This is so - * because real dirent has separate functions for opening and reading - * the stream whereas Win32 and DOS dirents open the stream - * automatically when we retrieve the first file. Therefore, we have to - * save the first file when opening the stream and later we have to - * return the saved entry when the user tries to read the first entry. - */ - dirp->dirent_filled = 0; - } else { - /* fill in entry and return that */ + if (dirp->dirent_filled != 0) { + /* + * Directory entry has already been retrieved and there is no need to + * retrieve a new one. Directory entry will be retrieved in advance + * when the user calls readdir function for the first time. This is so + * because real dirent has separate functions for opening and reading + * the stream whereas Win32 and DOS dirents open the stream + * automatically when we retrieve the first file. Therefore, we have to + * save the first file when opening the stream and later we have to + * return the saved entry when the user tries to read the first entry. + */ + dirp->dirent_filled = 0; + } else { + /* fill in entry and return that */ #if defined(DIRENT_WIN32_INTERFACE) - if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { - /* Last file has been processed or an error occurred */ - FindClose (dirp->search_handle); - dirp->search_handle = INVALID_HANDLE_VALUE; - errno = ENOENT; - return NULL; - } + if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { + /* Last file has been processed or an error occurred */ + FindClose (dirp->search_handle); + dirp->search_handle = INVALID_HANDLE_VALUE; + errno = ENOENT; + return NULL; + } # elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findnext (&dirp->current.data) != 0) { - /* _dos_findnext and findnext will set errno to ENOENT when no - * more entries could be retrieved. */ - return NULL; - } + if (_dos_findnext (&dirp->current.data) != 0) { + /* _dos_findnext and findnext will set errno to ENOENT when no + * more entries could be retrieved. */ + return NULL; + } # endif - _setdirname (dirp); - assert (dirp->dirent_filled == 0); - } - return &dirp->current; + _setdirname (dirp); + assert (dirp->dirent_filled == 0); + } + return &dirp->current; } @@ -508,37 +507,37 @@ readdir (DIR *dirp) */ static int closedir (DIR *dirp) -{ - int retcode = 0; - - /* make sure that dirp points to legal structure */ - assert (dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return -1; - } - - /* free directory name and search handles */ - if (dirp->dirname != NULL) free (dirp->dirname); +{ + int retcode = 0; + + /* make sure that dirp points to legal structure */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return -1; + } + + /* free directory name and search handles */ + if (dirp->dirname != NULL) free (dirp->dirname); #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose (dirp->search_handle) == FALSE) { - /* Unknown error */ - retcode = -1; - errno = EBADF; + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + retcode = -1; + errno = EBADF; + } } - } -#endif +#endif - /* clear dirp structure to make sure that it cannot be used anymore*/ - memset (dirp, 0, sizeof (*dirp)); + /* clear dirp structure to make sure that it cannot be used anymore*/ + memset (dirp, 0, sizeof (*dirp)); # if defined(DIRENT_WIN32_INTERFACE) - dirp->search_handle = INVALID_HANDLE_VALUE; + dirp->search_handle = INVALID_HANDLE_VALUE; # endif - free (dirp); - return retcode; + free (dirp); + return retcode; } @@ -565,31 +564,31 @@ closedir (DIR *dirp) */ static void rewinddir (DIR *dirp) -{ - /* make sure that dirp is legal */ - assert (dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return; - } - assert (dirp->dirname != NULL); - - /* close previous stream */ +{ + /* make sure that dirp is legal */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return; + } + assert (dirp->dirname != NULL); + + /* close previous stream */ #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose (dirp->search_handle) == FALSE) { - /* Unknown error */ - errno = EBADF; + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + errno = EBADF; + } } - } #endif - /* re-open previous stream */ - if (_initdir (dirp) == 0) { - /* initialization failed but we cannot deal with error. User will notice - * error later when she tries to retrieve first directory enty. */ - /*EMPTY*/; - } + /* re-open previous stream */ + if (_initdir (dirp) == 0) { + /* initialization failed but we cannot deal with error. User will notice + * error later when she tries to retrieve first directory enty. */ + /*EMPTY*/; + } } @@ -599,37 +598,36 @@ rewinddir (DIR *dirp) */ static int _initdir (DIR *dirp) -{ - assert (dirp != NULL); - assert (dirp->dirname != NULL); - dirp->dirent_filled = 0; +{ + assert (dirp != NULL); + assert (dirp->dirname != NULL); + dirp->dirent_filled = 0; # if defined(DIRENT_WIN32_INTERFACE) - /* Open stream and retrieve first file */ - dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* something went wrong but we don't know what. GetLastError() could - * give us more information about the error, but then we should map - * the error code into errno. */ - errno = ENOENT; - return 0; - } + /* Open stream and retrieve first file */ + dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* something went wrong but we don't know what. GetLastError() could + * give us more information about the error, but then we should map + * the error code into errno. */ + errno = ENOENT; + return 0; + } # elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findfirst (dirp->dirname, - _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, - &dirp->current.data) != 0) - { - /* _dos_findfirst and findfirst will set errno to ENOENT when no - * more entries could be retrieved. */ - return 0; - } + if (_dos_findfirst (dirp->dirname, + _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, + &dirp->current.data) != 0) { + /* _dos_findfirst and findfirst will set errno to ENOENT when no + * more entries could be retrieved. */ + return 0; + } # endif - /* initialize DIR and it's first entry */ - _setdirname (dirp); - dirp->dirent_filled = 1; - return 1; + /* initialize DIR and it's first entry */ + _setdirname (dirp); + dirp->dirent_filled = 1; + return 1; } @@ -640,14 +638,14 @@ static const char * _getdirname (const struct dirent *dp) { #if defined(DIRENT_WIN32_INTERFACE) - return dp->data.cFileName; - + return dp->data.cFileName; + #elif defined(DIRENT_USE_FFBLK) - return dp->data.ff_name; - + return dp->data.ff_name; + #else - return dp->data.name; -#endif + return dp->data.name; +#endif } @@ -655,16 +653,17 @@ _getdirname (const struct dirent *dp) * Copy name of implementation dependent directory entry to the d_name field. */ static void -_setdirname (struct DIR *dirp) { - /* make sure that d_name is long enough */ - assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); - - strncpy (dirp->current.d_name, - _getdirname (&dirp->current), - NAME_MAX); - dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ +_setdirname (struct DIR *dirp) +{ + /* make sure that d_name is long enough */ + assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); + + strncpy (dirp->current.d_name, + _getdirname (&dirp->current), + NAME_MAX); + dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ } - + # ifdef __cplusplus } # endif diff --git a/src/bin/jpip/opj_dec_server.c b/src/bin/jpip/opj_dec_server.c index f0b7fc13..cf656211 100644 --- a/src/bin/jpip/opj_dec_server.c +++ b/src/bin/jpip/opj_dec_server.c @@ -42,7 +42,7 @@ * quit\n * Be sure all image viewers are closed.\n * Cache file in JPT format is stored in the working directly before it quites. - * + * */ #include <stdio.h> @@ -54,40 +54,41 @@ WSADATA initialisation_win32; #endif -int main(int argc, char *argv[]){ - - dec_server_record_t *server_record; - client_t client; - int port = 50000; - int erreur; - (void)erreur; +int main(int argc, char *argv[]) +{ + + dec_server_record_t *server_record; + client_t client; + int port = 50000; + int erreur; + (void)erreur; - if( argc > 1) - port = atoi( argv[1]); + if( argc > 1) + port = atoi( argv[1]); #ifdef _WIN32 - erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); - if( erreur!=0) - fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); - else - printf( "Initialisation Winsock\n"); + erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); + if( erreur!=0) + fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); + else + printf( "Initialisation Winsock\n"); #endif /*_WIN32*/ - - server_record = init_dec_server( port); - - while(( client = accept_connection( server_record)) != -1 ) - if(!handle_clientreq( client, server_record)) - break; - - terminate_dec_server( &server_record); + + server_record = init_dec_server( port); + + while(( client = accept_connection( server_record)) != -1 ) + if(!handle_clientreq( client, server_record)) + break; + + terminate_dec_server( &server_record); #ifdef _WIN32 - if( WSACleanup() != 0){ - printf("\nError in WSACleanup : %d %d",erreur,WSAGetLastError()); - }else{ - printf("\nWSACleanup OK\n"); - } + if( WSACleanup() != 0) { + printf("\nError in WSACleanup : %d %d",erreur,WSAGetLastError()); + } else { + printf("\nWSACleanup OK\n"); + } #endif - return 0; + return 0; } diff --git a/src/bin/jpip/opj_jpip_addxml.c b/src/bin/jpip/opj_jpip_addxml.c index 626fc5d1..9c3a2563 100644 --- a/src/bin/jpip/opj_jpip_addxml.c +++ b/src/bin/jpip/opj_jpip_addxml.c @@ -36,7 +36,7 @@ * -# Input/output image file in JP2 format, this JP2 file is being modified * -# Input XML file with metadata contents\n * % ./addXMLinJP2 image.jp2 metadata.xml\n - * + * * Currently, this program does not parse XML file, and the XML file contents is directly embedded as a XML Box.\n * The following is an example of XML file contents specifying Region Of Interests with target names.\n * <xmlbox>\n @@ -74,111 +74,111 @@ char * read_xmlfile( const char filename[], long *fsize); int main(int argc, char *argv[]) { - FILE *fp; - char *xmldata, type[]="xml "; - long fsize, boxsize; - - if( argc<3){ - fprintf( stderr, "USAGE: %s modifing.jp2 adding.xml\n", argv[0] ); - return -1; - } - - fp = open_jp2file( argv[1]); - if( !fp) - return -1; - - xmldata = read_xmlfile( argv[2], &fsize); - if( fsize < 0 ) return -1; - boxsize = fsize + 8; - - fputc( (boxsize>>24)&0xff, fp); - fputc( (boxsize>>16)&0xff, fp); - fputc( (boxsize>>8)&0xff, fp); - fputc( boxsize&0xff, fp); - fwrite( type, 4, 1, fp); - fwrite( xmldata, (size_t)fsize, 1, fp); - - free( xmldata); - fclose(fp); - - return 0; + FILE *fp; + char *xmldata, type[]="xml "; + long fsize, boxsize; + + if( argc<3) { + fprintf( stderr, "USAGE: %s modifing.jp2 adding.xml\n", argv[0] ); + return -1; + } + + fp = open_jp2file( argv[1]); + if( !fp) + return -1; + + xmldata = read_xmlfile( argv[2], &fsize); + if( fsize < 0 ) return -1; + boxsize = fsize + 8; + + fputc( (boxsize>>24)&0xff, fp); + fputc( (boxsize>>16)&0xff, fp); + fputc( (boxsize>>8)&0xff, fp); + fputc( boxsize&0xff, fp); + fwrite( type, 4, 1, fp); + fwrite( xmldata, (size_t)fsize, 1, fp); + + free( xmldata); + fclose(fp); + + return 0; } FILE * open_jp2file( const char filename[]) { - FILE *fp; - char *data; - - if( !(fp = fopen( filename, "a+b"))){ - fprintf( stderr, "Original JP2 %s not found\n", filename); - return NULL; - } - /* Check resource is a JP family file. */ - if( fseek( fp, 0, SEEK_SET)==-1){ - fclose(fp); - fprintf( stderr, "Original JP2 %s broken (fseek error)\n", filename); - return NULL; - } - - data = (char *)malloc( 12); /* size of header */ - if( fread( data, 12, 1, fp) != 1){ + FILE *fp; + char *data; + + if( !(fp = fopen( filename, "a+b"))) { + fprintf( stderr, "Original JP2 %s not found\n", filename); + return NULL; + } + /* Check resource is a JP family file. */ + if( fseek( fp, 0, SEEK_SET)==-1) { + fclose(fp); + fprintf( stderr, "Original JP2 %s broken (fseek error)\n", filename); + return NULL; + } + + data = (char *)malloc( 12); /* size of header */ + if( fread( data, 12, 1, fp) != 1) { + free( data); + fclose(fp); + fprintf( stderr, "Original JP2 %s broken (read error)\n", filename); + return NULL; + } + + if( *data || *(data + 1) || *(data + 2) || + *(data + 3) != 12 || strncmp (data + 4, "jP \r\n\x87\n", 8)) { + free( data); + fclose(fp); + fprintf( stderr, "No JPEG 2000 Signature box in target %s\n", filename); + return NULL; + } free( data); - fclose(fp); - fprintf( stderr, "Original JP2 %s broken (read error)\n", filename); - return NULL; - } - - if( *data || *(data + 1) || *(data + 2) || - *(data + 3) != 12 || strncmp (data + 4, "jP \r\n\x87\n", 8)){ - free( data); - fclose(fp); - fprintf( stderr, "No JPEG 2000 Signature box in target %s\n", filename); - return NULL; - } - free( data); - return fp; + return fp; } char * read_xmlfile( const char filename[], long *fsize) { - FILE *fp; - char *data; - - /* fprintf( stderr, "open %s\n", filename);*/ - if(!(fp = fopen( filename, "r"))){ - fprintf( stderr, "XML file %s not found\n", filename); - return NULL; - } - - if( fseek( fp, 0, SEEK_END) == -1){ - fprintf( stderr, "XML file %s broken (seek error)\n", filename); - fclose( fp); - return NULL; - } - - if( (*fsize = ftell( fp)) == -1){ - fprintf( stderr, "XML file %s broken (seek error)\n", filename); - fclose( fp); - return NULL; - } - assert( *fsize >= 0 ); + FILE *fp; + char *data; + + /* fprintf( stderr, "open %s\n", filename);*/ + if(!(fp = fopen( filename, "r"))) { + fprintf( stderr, "XML file %s not found\n", filename); + return NULL; + } + + if( fseek( fp, 0, SEEK_END) == -1) { + fprintf( stderr, "XML file %s broken (seek error)\n", filename); + fclose( fp); + return NULL; + } + + if( (*fsize = ftell( fp)) == -1) { + fprintf( stderr, "XML file %s broken (seek error)\n", filename); + fclose( fp); + return NULL; + } + assert( *fsize >= 0 ); + + if( fseek( fp, 0, SEEK_SET) == -1) { + fprintf( stderr, "XML file %s broken (seek error)\n", filename); + fclose( fp); + return NULL; + } + + data = (char *)malloc( (size_t)*fsize); + + if( fread( data, (size_t)*fsize, 1, fp) != 1) { + fprintf( stderr, "XML file %s broken (read error)\n", filename); + free( data); + fclose(fp); + return NULL; + } - if( fseek( fp, 0, SEEK_SET) == -1){ - fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); - return NULL; - } - - data = (char *)malloc( (size_t)*fsize); - - if( fread( data, (size_t)*fsize, 1, fp) != 1){ - fprintf( stderr, "XML file %s broken (read error)\n", filename); - free( data); - fclose(fp); - return NULL; - } - - fclose( fp); - return data; + return data; } diff --git a/src/bin/jpip/opj_jpip_test.c b/src/bin/jpip/opj_jpip_test.c index 1b4fc1c6..5a902ec3 100644 --- a/src/bin/jpip/opj_jpip_test.c +++ b/src/bin/jpip/opj_jpip_test.c @@ -51,23 +51,23 @@ int main(int argc, char *argv[]) { - int fd; - index_t *jp2idx; - if( argc < 2 ) return 1; - - if( (fd = open( argv[1], O_RDONLY)) == -1){ - fprintf( stderr, "Error: Target %s not found\n", argv[1]); - return -1; - } + int fd; + index_t *jp2idx; + if( argc < 2 ) return 1; - if( !(jp2idx = get_index_from_JP2file( fd))){ - fprintf( stderr, "JP2 file broken\n"); - return -1; - } - - output_index( jp2idx); - destroy_index( &jp2idx); - close(fd); + if( (fd = open( argv[1], O_RDONLY)) == -1) { + fprintf( stderr, "Error: Target %s not found\n", argv[1]); + return -1; + } - return 0; + if( !(jp2idx = get_index_from_JP2file( fd))) { + fprintf( stderr, "JP2 file broken\n"); + return -1; + } + + output_index( jp2idx); + destroy_index( &jp2idx); + close(fd); + + return 0; } /* main */ diff --git a/src/bin/jpip/opj_jpip_transcode.c b/src/bin/jpip/opj_jpip_transcode.c index 19570af5..993baed7 100644 --- a/src/bin/jpip/opj_jpip_transcode.c +++ b/src/bin/jpip/opj_jpip_transcode.c @@ -44,23 +44,23 @@ */ static int jpip_to_jp2(char *argv[]) { - jpip_dec_param_t *dec; - - dec = init_jpipdecoder( OPJ_TRUE); - - if(!( fread_jpip( argv[1], dec))) - return 1; - - decode_jpip( dec); - - if(!(fwrite_jp2k( argv[2], dec))) - return 1; + jpip_dec_param_t *dec; + + dec = init_jpipdecoder( OPJ_TRUE); + + if(!( fread_jpip( argv[1], dec))) + return 1; + + decode_jpip( dec); - /* output_log( OPJ_TRUE, OPJ_FALSE, OPJ_TRUE, dec); */ + if(!(fwrite_jp2k( argv[2], dec))) + return 1; - destroy_jpipdecoder( &dec); + /* output_log( OPJ_TRUE, OPJ_FALSE, OPJ_TRUE, dec); */ - return 0; + destroy_jpipdecoder( &dec); + + return 0; } /*! \file @@ -76,49 +76,46 @@ static int jpip_to_jp2(char *argv[]) */ static int jpip_to_j2k(char *argv[]) { - jpip_dec_param_t *dec; - - dec = init_jpipdecoder( OPJ_FALSE); - - if(!( fread_jpip( argv[1], dec))) - return 1; - - decode_jpip( dec); - - if(!(fwrite_jp2k( argv[2], dec))) - return 1; - - /* output_log( OPJ_TRUE, OPJ_FALSE, OPJ_FALSE, dec); */ - - destroy_jpipdecoder( &dec); + jpip_dec_param_t *dec; + + dec = init_jpipdecoder( OPJ_FALSE); - return 0; + if(!( fread_jpip( argv[1], dec))) + return 1; + + decode_jpip( dec); + + if(!(fwrite_jp2k( argv[2], dec))) + return 1; + + /* output_log( OPJ_TRUE, OPJ_FALSE, OPJ_FALSE, dec); */ + + destroy_jpipdecoder( &dec); + + return 0; } int main(int argc,char *argv[]) { - char *ext; - if( argc < 3){ - fprintf( stderr, "Too few arguments:\n"); - fprintf( stderr, " - input jpt or jpp file\n"); - fprintf( stderr, " - output j2k file\n"); - return 1; - } - - ext = strrchr( argv[2], '.' ); - if( ext ) - { - /* strcasecmp ? */ - if( strcmp(ext, ".jp2" ) == 0 ) - { - return jpip_to_jp2(argv); - } - if( strcmp(ext, ".j2k" ) == 0 ) - { - return jpip_to_j2k(argv); - } + char *ext; + if( argc < 3) { + fprintf( stderr, "Too few arguments:\n"); + fprintf( stderr, " - input jpt or jpp file\n"); + fprintf( stderr, " - output j2k file\n"); + return 1; + } + + ext = strrchr( argv[2], '.' ); + if( ext ) { + /* strcasecmp ? */ + if( strcmp(ext, ".jp2" ) == 0 ) { + return jpip_to_jp2(argv); + } + if( strcmp(ext, ".j2k" ) == 0 ) { + return jpip_to_j2k(argv); + } } - fprintf( stderr, "Invalid file extension for output file: %s\n", argv[2]); - return 1; + fprintf( stderr, "Invalid file extension for output file: %s\n", argv[2]); + return 1; } diff --git a/src/bin/jpip/opj_server.c b/src/bin/jpip/opj_server.c index ec91e9c2..b6758330 100644 --- a/src/bin/jpip/opj_server.c +++ b/src/bin/jpip/opj_server.c @@ -3,7 +3,7 @@ * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2010-2011, Kaori Hagihara + * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * All rights reserved. * @@ -41,7 +41,7 @@ * * Note: JP2 files are stored in the working directory of opj_server\n * Check README for the JP2 Encoding\n - * + * * We tested this software with a virtual server running on the same Linux machine as the clients. */ @@ -60,69 +60,69 @@ WSADATA initialisation_win32; #endif /*_WIN32*/ int main(void) -{ - server_record_t *server_record; +{ + server_record_t *server_record; #ifdef SERVER - char *query_string; + char *query_string; #endif #ifdef _WIN32 - int erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); - if( erreur!=0) - fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); - else - fprintf( stderr, "Initialisation Winsock\n"); + int erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); + if( erreur!=0) + fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); + else + fprintf( stderr, "Initialisation Winsock\n"); #endif /*_WIN32*/ - server_record = init_JPIPserver( 60000, 0); + server_record = init_JPIPserver( 60000, 0); #ifdef SERVER - while(FCGI_Accept() >= 0) + while(FCGI_Accept() >= 0) #else - char query_string[128]; - while( fgets( query_string, 128, stdin) && query_string[0]!='\n') + char query_string[128]; + while( fgets( query_string, 128, stdin) && query_string[0]!='\n') #endif { - QR_t *qr; - OPJ_BOOL parse_status; + QR_t *qr; + OPJ_BOOL parse_status; -#ifdef SERVER - query_string = getenv("QUERY_STRING"); +#ifdef SERVER + query_string = getenv("QUERY_STRING"); #endif /*SERVER*/ - if( strcmp( query_string, QUIT_SIGNAL) == 0) - break; - - qr = parse_querystring( query_string); - - parse_status = process_JPIPrequest( server_record, qr); - + if( strcmp( query_string, QUIT_SIGNAL) == 0) + break; + + qr = parse_querystring( query_string); + + parse_status = process_JPIPrequest( server_record, qr); + #ifndef SERVER - local_log( OPJ_TRUE, OPJ_TRUE, parse_status, OPJ_FALSE, qr, server_record); + local_log( OPJ_TRUE, OPJ_TRUE, parse_status, OPJ_FALSE, qr, server_record); #endif - - if( parse_status) - send_responsedata( server_record, qr); - else{ - fprintf( FCGI_stderr, "Error: JPIP request failed\n"); - fprintf( FCGI_stdout, "\r\n"); - } - - end_QRprocess( server_record, &qr); + + if( parse_status) + send_responsedata( server_record, qr); + else { + fprintf( FCGI_stderr, "Error: JPIP request failed\n"); + fprintf( FCGI_stdout, "\r\n"); + } + + end_QRprocess( server_record, &qr); } - - fprintf( FCGI_stderr, "JPIP server terminated by a client request\n"); - terminate_JPIPserver( &server_record); + fprintf( FCGI_stderr, "JPIP server terminated by a client request\n"); + + terminate_JPIPserver( &server_record); #ifdef _WIN32 - if( WSACleanup() != 0){ - fprintf( stderr, "\nError in WSACleanup : %d %d",erreur,WSAGetLastError()); - }else{ - fprintf( stderr, "\nWSACleanup OK\n"); - } + if( WSACleanup() != 0) { + fprintf( stderr, "\nError in WSACleanup : %d %d",erreur,WSAGetLastError()); + } else { + fprintf( stderr, "\nWSACleanup OK\n"); + } #endif - return 0; + return 0; } diff --git a/src/bin/jpwl/convert.c b/src/bin/jpwl/convert.c index bf7b5641..7de18631 100644 --- a/src/bin/jpwl/convert.c +++ b/src/bin/jpwl/convert.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan @@ -59,12 +59,13 @@ * * log2(a) */ -static int int_floorlog2(int a) { - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; +static int int_floorlog2(int a) +{ + int l; + for (l = 0; a > 1; l++) { + a >>= 1; + } + return l; } /* -->> -->> -->> -->> @@ -75,8 +76,7 @@ static int int_floorlog2(int a) { #ifdef INFORMATION_ONLY /* TGA header definition. */ -struct tga_header -{ +struct tga_header { unsigned char id_length; /* Image id field length */ unsigned char colour_map_type; /* Colour map type */ unsigned char image_type; /* Image type */ @@ -98,10 +98,11 @@ struct tga_header }; #endif /* INFORMATION_ONLY */ -static unsigned short get_ushort(unsigned short val) { +static unsigned short get_ushort(unsigned short val) +{ #ifdef OPJ_BIG_ENDIAN - return( ((val & 0xff) << 8) + (val >> 8) ); + return( ((val & 0xff) << 8) + (val >> 8) ); #else return( val ); #endif @@ -110,400 +111,381 @@ static unsigned short get_ushort(unsigned short val) { #define TGA_HEADER_SIZE 18 -static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, - unsigned int *width, unsigned int *height, int *flip_image) +static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, + unsigned int *width, unsigned int *height, int *flip_image) { - int palette_size; - unsigned char *tga ; - unsigned char id_len, cmap_type, image_type; - unsigned char pixel_depth, image_desc; - unsigned short cmap_index, cmap_len, cmap_entry_size; - unsigned short x_origin, y_origin, image_w, image_h; - - if (!bits_per_pixel || !width || !height || !flip_image) - return 0; - tga = (unsigned char*)malloc(18); - - if ( fread(tga, TGA_HEADER_SIZE, 1, fp) != 1 ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0 ; - } - id_len = (unsigned char)tga[0]; - cmap_type = (unsigned char)tga[1]; - image_type = (unsigned char)tga[2]; - cmap_index = get_ushort(*(unsigned short*)(&tga[3])); - cmap_len = get_ushort(*(unsigned short*)(&tga[5])); - cmap_entry_size = (unsigned char)tga[7]; - - - x_origin = get_ushort(*(unsigned short*)(&tga[8])); - y_origin = get_ushort(*(unsigned short*)(&tga[10])); - image_w = get_ushort(*(unsigned short*)(&tga[12])); - image_h = get_ushort(*(unsigned short*)(&tga[14])); - pixel_depth = (unsigned char)tga[16]; - image_desc = (unsigned char)tga[17]; - - free(tga); - - *bits_per_pixel = (unsigned int)pixel_depth; - *width = (unsigned int)image_w; - *height = (unsigned int)image_h; - - /* Ignore tga identifier, if present ... */ - if (id_len) - { - unsigned char *id = (unsigned char *) malloc(id_len); - if ( !fread(id, id_len, 1, fp) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - free(id); - return 0 ; - } - free(id); - } - - /* Test for compressed formats ... not yet supported ... - // Note :- 9 - RLE encoded palettized. - // 10 - RLE encoded RGB. */ - if (image_type > 8) - { - fprintf(stderr, "Sorry, compressed tga files are not currently supported.\n"); - return 0 ; - } - - *flip_image = !(image_desc & 32); - - /* Palettized formats are not yet supported, skip over the palette, if present ... */ - palette_size = cmap_len * (cmap_entry_size/8); - - if (palette_size>0) - { - fprintf(stderr, "File contains a palette - not yet supported."); - fseek(fp, palette_size, SEEK_CUR); - } - return 1; + int palette_size; + unsigned char *tga ; + unsigned char id_len, cmap_type, image_type; + unsigned char pixel_depth, image_desc; + unsigned short cmap_index, cmap_len, cmap_entry_size; + unsigned short x_origin, y_origin, image_w, image_h; + + if (!bits_per_pixel || !width || !height || !flip_image) + return 0; + tga = (unsigned char*)malloc(18); + + if ( fread(tga, TGA_HEADER_SIZE, 1, fp) != 1 ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0 ; + } + id_len = (unsigned char)tga[0]; + cmap_type = (unsigned char)tga[1]; + image_type = (unsigned char)tga[2]; + cmap_index = get_ushort(*(unsigned short*)(&tga[3])); + cmap_len = get_ushort(*(unsigned short*)(&tga[5])); + cmap_entry_size = (unsigned char)tga[7]; + + + x_origin = get_ushort(*(unsigned short*)(&tga[8])); + y_origin = get_ushort(*(unsigned short*)(&tga[10])); + image_w = get_ushort(*(unsigned short*)(&tga[12])); + image_h = get_ushort(*(unsigned short*)(&tga[14])); + pixel_depth = (unsigned char)tga[16]; + image_desc = (unsigned char)tga[17]; + + free(tga); + + *bits_per_pixel = (unsigned int)pixel_depth; + *width = (unsigned int)image_w; + *height = (unsigned int)image_h; + + /* Ignore tga identifier, if present ... */ + if (id_len) { + unsigned char *id = (unsigned char *) malloc(id_len); + if ( !fread(id, id_len, 1, fp) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + free(id); + return 0 ; + } + free(id); + } + + /* Test for compressed formats ... not yet supported ... + // Note :- 9 - RLE encoded palettized. + // 10 - RLE encoded RGB. */ + if (image_type > 8) { + fprintf(stderr, "Sorry, compressed tga files are not currently supported.\n"); + return 0 ; + } + + *flip_image = !(image_desc & 32); + + /* Palettized formats are not yet supported, skip over the palette, if present ... */ + palette_size = cmap_len * (cmap_entry_size/8); + + if (palette_size>0) { + fprintf(stderr, "File contains a palette - not yet supported."); + fseek(fp, palette_size, SEEK_CUR); + } + return 1; } #ifdef OPJ_BIG_ENDIAN static inline int16_t swap16(int16_t x) { - return((((u_int16_t)x & 0x00ffU) << 8) | - (((u_int16_t)x & 0xff00U) >> 8)); + return((((u_int16_t)x & 0x00ffU) << 8) | + (((u_int16_t)x & 0xff00U) >> 8)); } #endif -static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, - opj_bool flip_image) +static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, + opj_bool flip_image) { - unsigned short image_w, image_h, us0; - unsigned char uc0, image_type; - unsigned char pixel_depth, image_desc; + unsigned short image_w, image_h, us0; + unsigned char uc0, image_type; + unsigned char pixel_depth, image_desc; - if (!bits_per_pixel || !width || !height) - return 0; + if (!bits_per_pixel || !width || !height) + return 0; - pixel_depth = 0; + pixel_depth = 0; - if ( bits_per_pixel < 256 ) - pixel_depth = (unsigned char)bits_per_pixel; - else{ - fprintf(stderr,"ERROR: Wrong bits per pixel inside tga_header"); - return 0; - } - uc0 = 0; + if ( bits_per_pixel < 256 ) + pixel_depth = (unsigned char)bits_per_pixel; + else { + fprintf(stderr,"ERROR: Wrong bits per pixel inside tga_header"); + return 0; + } + uc0 = 0; - if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* id_length */ - if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_type */ + if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* id_length */ + if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_type */ - image_type = 2; /* Uncompressed. */ - if(fwrite(&image_type, 1, 1, fp) != 1) goto fails; + image_type = 2; /* Uncompressed. */ + if(fwrite(&image_type, 1, 1, fp) != 1) goto fails; - us0 = 0; - if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_index */ - if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_length */ - if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_entry_size */ + us0 = 0; + if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_index */ + if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_length */ + if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_entry_size */ - if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* x_origin */ - if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* y_origin */ + if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* x_origin */ + if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* y_origin */ - image_w = (unsigned short)width; - image_h = (unsigned short) height; + image_w = (unsigned short)width; + image_h = (unsigned short) height; #ifndef OPJ_BIG_ENDIAN - if(fwrite(&image_w, 2, 1, fp) != 1) goto fails; - if(fwrite(&image_h, 2, 1, fp) != 1) goto fails; + if(fwrite(&image_w, 2, 1, fp) != 1) goto fails; + if(fwrite(&image_h, 2, 1, fp) != 1) goto fails; #else - image_w = swap16(image_w); - image_h = swap16(image_h); - if(fwrite(&image_w, 2, 1, fp) != 1) goto fails; - if(fwrite(&image_h, 2, 1, fp) != 1) goto fails; + image_w = swap16(image_w); + image_h = swap16(image_h); + if(fwrite(&image_w, 2, 1, fp) != 1) goto fails; + if(fwrite(&image_h, 2, 1, fp) != 1) goto fails; #endif - if(fwrite(&pixel_depth, 1, 1, fp) != 1) goto fails; + if(fwrite(&pixel_depth, 1, 1, fp) != 1) goto fails; - image_desc = 8; /* 8 bits per component. */ + image_desc = 8; /* 8 bits per component. */ - if (flip_image) - image_desc |= 32; - if(fwrite(&image_desc, 1, 1, fp) != 1) goto fails; + if (flip_image) + image_desc |= 32; + if(fwrite(&image_desc, 1, 1, fp) != 1) goto fails; - return 1; + return 1; fails: - fputs("\nwrite_tgaheader: write ERROR\n", stderr); - return 0; + fputs("\nwrite_tgaheader: write ERROR\n", stderr); + return 0; } -opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { - FILE *f; - opj_image_t *image; - unsigned int image_width, image_height, pixel_bit_depth; - unsigned int x, y; - int flip_image=0; - opj_image_cmptparm_t cmptparm[4]; /* maximum 4 components */ - int numcomps; - OPJ_COLOR_SPACE color_space; - opj_bool mono ; - opj_bool save_alpha; - int subsampling_dx, subsampling_dy; - int i; - - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - return 0; - } - - if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, &flip_image)) - return NULL; - - /* We currently only support 24 & 32 bit tga's ... */ - if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32))) - return NULL; - - /* initialize image components */ - memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); - - mono = (pixel_bit_depth == 8) || (pixel_bit_depth == 16); /* Mono with & without alpha. */ - save_alpha = (pixel_bit_depth == 16) || (pixel_bit_depth == 32); /* Mono with alpha, or RGB with alpha */ - - if (mono) { - color_space = CLRSPC_GRAY; - numcomps = save_alpha ? 2 : 1; - } - else { - numcomps = save_alpha ? 4 : 3; - color_space = CLRSPC_SRGB; - } - - subsampling_dx = parameters->subsampling_dx; - subsampling_dy = parameters->subsampling_dy; - - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = image_width; - cmptparm[i].h = image_height; - } - - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if (!image) - return NULL; - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (image_width - 1) * subsampling_dx + 1 : image->x0 + (image_width - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (image_height - 1) * subsampling_dy + 1 : image->y0 + (image_height - 1) * subsampling_dy + 1; - - /* set image data */ - for (y=0; y < image_height; y++) - { - int index; - - if (flip_image) - index = (image_height-y-1)*image_width; - else - index = y*image_width; - - if (numcomps==3) - { - for (x=0;x<image_width;x++) - { - unsigned char r,g,b; - - if( !fread(&b, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if ( !fread(&g, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if ( !fread(&r, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - - image->comps[0].data[index]=r; - image->comps[1].data[index]=g; - image->comps[2].data[index]=b; - index++; - } - } - else if (numcomps==4) - { - for (x=0;x<image_width;x++) - { - unsigned char r,g,b,a; - if ( !fread(&b, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if ( !fread(&g, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if ( !fread(&r, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if ( !fread(&a, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - - image->comps[0].data[index]=r; - image->comps[1].data[index]=g; - image->comps[2].data[index]=b; - image->comps[3].data[index]=a; - index++; - } - } - else { - fprintf(stderr, "Currently unsupported bit depth : %s\n", filename); - } - } - return image; +opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) +{ + FILE *f; + opj_image_t *image; + unsigned int image_width, image_height, pixel_bit_depth; + unsigned int x, y; + int flip_image=0; + opj_image_cmptparm_t cmptparm[4]; /* maximum 4 components */ + int numcomps; + OPJ_COLOR_SPACE color_space; + opj_bool mono ; + opj_bool save_alpha; + int subsampling_dx, subsampling_dy; + int i; + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "Failed to open %s for reading !!\n", filename); + return 0; + } + + if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, &flip_image)) + return NULL; + + /* We currently only support 24 & 32 bit tga's ... */ + if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32))) + return NULL; + + /* initialize image components */ + memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); + + mono = (pixel_bit_depth == 8) || (pixel_bit_depth == 16); /* Mono with & without alpha. */ + save_alpha = (pixel_bit_depth == 16) || (pixel_bit_depth == 32); /* Mono with alpha, or RGB with alpha */ + + if (mono) { + color_space = CLRSPC_GRAY; + numcomps = save_alpha ? 2 : 1; + } else { + numcomps = save_alpha ? 4 : 3; + color_space = CLRSPC_SRGB; + } + + subsampling_dx = parameters->subsampling_dx; + subsampling_dy = parameters->subsampling_dy; + + for (i = 0; i < numcomps; i++) { + cmptparm[i].prec = 8; + cmptparm[i].bpp = 8; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = subsampling_dx; + cmptparm[i].dy = subsampling_dy; + cmptparm[i].w = image_width; + cmptparm[i].h = image_height; + } + + /* create the image */ + image = opj_image_create(numcomps, &cmptparm[0], color_space); + + if (!image) + return NULL; + + /* set image offset and reference grid */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = !image->x0 ? (image_width - 1) * subsampling_dx + 1 : image->x0 + (image_width - 1) * subsampling_dx + 1; + image->y1 = !image->y0 ? (image_height - 1) * subsampling_dy + 1 : image->y0 + (image_height - 1) * subsampling_dy + 1; + + /* set image data */ + for (y=0; y < image_height; y++) { + int index; + + if (flip_image) + index = (image_height-y-1)*image_width; + else + index = y*image_width; + + if (numcomps==3) { + for (x=0; x<image_width; x++) { + unsigned char r,g,b; + + if( !fread(&b, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + if ( !fread(&g, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + if ( !fread(&r, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + + image->comps[0].data[index]=r; + image->comps[1].data[index]=g; + image->comps[2].data[index]=b; + index++; + } + } else if (numcomps==4) { + for (x=0; x<image_width; x++) { + unsigned char r,g,b,a; + if ( !fread(&b, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + if ( !fread(&g, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + if ( !fread(&r, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + if ( !fread(&a, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + opj_image_destroy(image); + return NULL; + } + + image->comps[0].data[index]=r; + image->comps[1].data[index]=g; + image->comps[2].data[index]=b; + image->comps[3].data[index]=a; + index++; + } + } else { + fprintf(stderr, "Currently unsupported bit depth : %s\n", filename); + } + } + return image; } -int imagetotga(opj_image_t * image, const char *outfile) { - int width, height, bpp, x, y; - opj_bool write_alpha; - int i, adjustR, adjustG, adjustB; - unsigned int alpha_channel; - float r,g,b,a; - unsigned char value; - float scale; - FILE *fdest; - size_t res; - - fdest = fopen(outfile, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); - return 1; - } - - for (i = 0; i < image->numcomps-1; i++) { - if ((image->comps[0].dx != image->comps[i+1].dx) - ||(image->comps[0].dy != image->comps[i+1].dy) - ||(image->comps[0].prec != image->comps[i+1].prec)) { - fprintf(stderr, "Unable to create a tga file with such J2K image charateristics."); - return 1; - } - } - - width = image->comps[0].w; - height = image->comps[0].h; - - /* Mono with alpha, or RGB with alpha. */ - write_alpha = (image->numcomps==2) || (image->numcomps==4); - - /* Write TGA header */ - bpp = write_alpha ? 32 : 24; - if (!tga_writeheader(fdest, bpp, width , height, OPJ_TRUE)) - return 1; - - alpha_channel = image->numcomps-1; - - scale = 255.0f / (float)((1<<image->comps[0].prec)-1); - - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - - for (y=0; y < height; y++) { - unsigned int index=y*width; - - for (x=0; x < width; x++, index++) { - r = (float)(image->comps[0].data[index] + adjustR); - - if (image->numcomps>2) { - g = (float)(image->comps[1].data[index] + adjustG); - b = (float)(image->comps[2].data[index] + adjustB); - } - else {/* Greyscale ... */ - g = r; - b = r; - } - - /* TGA format writes BGR ... */ - value = (unsigned char)(b*scale); - res = fwrite(&value,1,1,fdest); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } +int imagetotga(opj_image_t * image, const char *outfile) +{ + int width, height, bpp, x, y; + opj_bool write_alpha; + int i, adjustR, adjustG, adjustB; + unsigned int alpha_channel; + float r,g,b,a; + unsigned char value; + float scale; + FILE *fdest; + size_t res; - value = (unsigned char)(g*scale); - res = fwrite(&value,1,1,fdest); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + fdest = fopen(outfile, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); return 1; - } + } - value = (unsigned char)(r*scale); - res = fwrite(&value,1,1,fdest); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + for (i = 0; i < image->numcomps-1; i++) { + if ((image->comps[0].dx != image->comps[i+1].dx) + ||(image->comps[0].dy != image->comps[i+1].dy) + ||(image->comps[0].prec != image->comps[i+1].prec)) { + fprintf(stderr, "Unable to create a tga file with such J2K image charateristics."); + return 1; + } + } + + width = image->comps[0].w; + height = image->comps[0].h; + + /* Mono with alpha, or RGB with alpha. */ + write_alpha = (image->numcomps==2) || (image->numcomps==4); + + /* Write TGA header */ + bpp = write_alpha ? 32 : 24; + if (!tga_writeheader(fdest, bpp, width , height, OPJ_TRUE)) return 1; - } - - if (write_alpha) { - a = (float)(image->comps[alpha_channel].data[index]); - value = (unsigned char)(a*scale); - res = fwrite(&value,1,1,fdest); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; + + alpha_channel = image->numcomps-1; + + scale = 255.0f / (float)((1<<image->comps[0].prec)-1); + + adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); + adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); + + for (y=0; y < height; y++) { + unsigned int index=y*width; + + for (x=0; x < width; x++, index++) { + r = (float)(image->comps[0].data[index] + adjustR); + + if (image->numcomps>2) { + g = (float)(image->comps[1].data[index] + adjustG); + b = (float)(image->comps[2].data[index] + adjustB); + } else { /* Greyscale ... */ + g = r; + b = r; + } + + /* TGA format writes BGR ... */ + value = (unsigned char)(b*scale); + res = fwrite(&value,1,1,fdest); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + + value = (unsigned char)(g*scale); + res = fwrite(&value,1,1,fdest); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + + value = (unsigned char)(r*scale); + res = fwrite(&value,1,1,fdest); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + + if (write_alpha) { + a = (float)(image->comps[alpha_channel].data[index]); + value = (unsigned char)(a*scale); + res = fwrite(&value,1,1,fdest); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + } } - } - } - } + } - return 0; + return 0; } /* -->> -->> -->> -->> @@ -519,686 +501,646 @@ typedef unsigned short int WORD; typedef unsigned int DWORD; typedef struct { - WORD bfType; /* 'BM' for Bitmap (19776) */ - DWORD bfSize; /* Size of the file */ - WORD bfReserved1; /* Reserved : 0 */ - WORD bfReserved2; /* Reserved : 0 */ - DWORD bfOffBits; /* Offset */ + WORD bfType; /* 'BM' for Bitmap (19776) */ + DWORD bfSize; /* Size of the file */ + WORD bfReserved1; /* Reserved : 0 */ + WORD bfReserved2; /* Reserved : 0 */ + DWORD bfOffBits; /* Offset */ } BITMAPFILEHEADER_t; typedef struct { - DWORD biSize; /* Size of the structure in bytes */ - DWORD biWidth; /* Width of the image in pixels */ - DWORD biHeight; /* Heigth of the image in pixels */ - WORD biPlanes; /* 1 */ - WORD biBitCount; /* Number of color bits by pixels */ - DWORD biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */ - DWORD biSizeImage; /* Size of the image in bytes */ - DWORD biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */ - DWORD biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */ - DWORD biClrUsed; /* Number of color used in the image (0: ALL) */ - DWORD biClrImportant; /* Number of important color (0: ALL) */ + DWORD biSize; /* Size of the structure in bytes */ + DWORD biWidth; /* Width of the image in pixels */ + DWORD biHeight; /* Heigth of the image in pixels */ + WORD biPlanes; /* 1 */ + WORD biBitCount; /* Number of color bits by pixels */ + DWORD biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */ + DWORD biSizeImage; /* Size of the image in bytes */ + DWORD biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */ + DWORD biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */ + DWORD biClrUsed; /* Number of color used in the image (0: ALL) */ + DWORD biClrImportant; /* Number of important color (0: ALL) */ } BITMAPINFOHEADER_t; -opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters) +opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - int i, numcomps, w, h; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm[3]; /* maximum of 3 components */ - opj_image_t * image = NULL; - - FILE *IN; - BITMAPFILEHEADER_t File_h; - BITMAPINFOHEADER_t Info_h; - unsigned char *RGB; - unsigned char *table_R, *table_G, *table_B; - unsigned int j, PAD = 0; - - int x, y, index; - int gray_scale = 1; - int has_color; - DWORD W, H; - - IN = fopen(filename, "rb"); - if (!IN) - { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - return NULL; - } - - File_h.bfType = getc(IN); - File_h.bfType = (getc(IN) << 8) + File_h.bfType; - - if (File_h.bfType != 19778) - { - fprintf(stderr,"Error, not a BMP file!\n"); - fclose(IN); - return NULL; - } - /* FILE HEADER */ - /* ------------- */ - File_h.bfSize = getc(IN); - File_h.bfSize = (getc(IN) << 8) + File_h.bfSize; - File_h.bfSize = (getc(IN) << 16) + File_h.bfSize; - File_h.bfSize = (getc(IN) << 24) + File_h.bfSize; - - File_h.bfReserved1 = getc(IN); - File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1; - - File_h.bfReserved2 = getc(IN); - File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2; - - File_h.bfOffBits = getc(IN); - File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits; - File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits; - File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits; - - /* INFO HEADER */ - /* ------------- */ - - Info_h.biSize = getc(IN); - Info_h.biSize = (getc(IN) << 8) + Info_h.biSize; - Info_h.biSize = (getc(IN) << 16) + Info_h.biSize; - Info_h.biSize = (getc(IN) << 24) + Info_h.biSize; - - if(Info_h.biSize != 40) - { - fprintf(stderr,"Error, unknown BMP header size %d\n", Info_h.biSize); - fclose(IN); - return NULL; - } - Info_h.biWidth = getc(IN); - Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth; - Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth; - Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth; - w = Info_h.biWidth; - - Info_h.biHeight = getc(IN); - Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight; - Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight; - Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight; - h = Info_h.biHeight; - - Info_h.biPlanes = getc(IN); - Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes; - - Info_h.biBitCount = getc(IN); - Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount; - - Info_h.biCompression = getc(IN); - Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression; - Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression; - Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression; - - Info_h.biSizeImage = getc(IN); - Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage; - Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage; - Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage; - - Info_h.biXpelsPerMeter = getc(IN); - Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter; - Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter; - Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter; - - Info_h.biYpelsPerMeter = getc(IN); - Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter; - Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter; - Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter; - - Info_h.biClrUsed = getc(IN); - Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed; - Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed; - Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed; - - Info_h.biClrImportant = getc(IN); - Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant; - Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant; - Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant; - - /* Read the data and store them in the OUT file */ - - if (Info_h.biBitCount == 24) - { - numcomps = 3; - color_space = CLRSPC_SRGB; - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for(i = 0; i < numcomps; i++) - { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if(!image) - { - fclose(IN); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; - - /* set image data */ - - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, File_h.bfOffBits, SEEK_SET); - - W = Info_h.biWidth; - H = Info_h.biHeight; - - /* PAD = 4 - (3 * W) % 4; */ - /* PAD = (PAD == 4) ? 0 : PAD; */ - PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0; - - RGB = (unsigned char *) - malloc((3 * W + PAD) * H * sizeof(unsigned char)); - - if ( fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN) != (3 * W + PAD) * H ) - { - free(RGB); - opj_image_destroy(image); - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return NULL; - } - - index = 0; - - for(y = 0; y < (int)H; y++) - { - unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y); - for(x = 0; x < (int)W; x++) - { - unsigned char *pixel = &scanline[3 * x]; - image->comps[0].data[index] = pixel[2]; /* R */ - image->comps[1].data[index] = pixel[1]; /* G */ - image->comps[2].data[index] = pixel[0]; /* B */ - index++; - } - } - free(RGB); - }/* if (Info_h.biBitCount == 24) */ - else - if (Info_h.biBitCount == 8 && Info_h.biCompression == 0)/*RGB */ - { - if(Info_h.biClrUsed == 0) Info_h.biClrUsed = 256; - else - if(Info_h.biClrUsed > 256) Info_h.biClrUsed = 256; - - table_R = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_G = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_B = (unsigned char *) malloc(256 * sizeof(unsigned char)); - - has_color = 0; - for (j = 0; j < Info_h.biClrUsed; j++) - { - table_B[j] = (unsigned char)getc(IN); - table_G[j] = (unsigned char)getc(IN); - table_R[j] = (unsigned char)getc(IN); - getc(IN); - has_color += - !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); - } - if(has_color) gray_scale = 0; - - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, File_h.bfOffBits, SEEK_SET); - - W = Info_h.biWidth; - H = Info_h.biHeight; - if (Info_h.biWidth % 2) - W++; - - numcomps = gray_scale ? 1 : 3; - color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for(i = 0; i < numcomps; i++) - { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if(!image) - { - fclose(IN); - free(table_R); free(table_G); free(table_B); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; - - /* set image data */ - - RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char)); - - if ( fread(RGB, sizeof(unsigned char), W * H, IN) != W * H ) - { - free(table_R); - free(table_G); - free(table_B); - free(RGB); - opj_image_destroy(image); - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return NULL; - } - if (gray_scale) - { - index = 0; - for (j = 0; j < W * H; j++) - { - if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) - { - image->comps[0].data[index] = - table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]; - index++; - } - } - - } - else - { - index = 0; - for (j = 0; j < W * H; j++) - { - if ((j % W < W - 1 && Info_h.biWidth % 2) - || !(Info_h.biWidth % 2)) - { - unsigned char pixel_index = - RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]; - image->comps[0].data[index] = table_R[pixel_index]; - image->comps[1].data[index] = table_G[pixel_index]; - image->comps[2].data[index] = table_B[pixel_index]; - index++; - } - } - } - free(RGB); - free(table_R); - free(table_G); - free(table_B); - }/* RGB8 */ - else - if (Info_h.biBitCount == 8 && Info_h.biCompression == 1)/*RLE8*/ - { - unsigned char *pix, *beyond; - int *gray, *red, *green, *blue; - unsigned int x, y, max; - int i, c, c1; - unsigned char uc; - - if (Info_h.biClrUsed == 0) - Info_h.biClrUsed = 256; - else if (Info_h.biClrUsed > 256) - Info_h.biClrUsed = 256; - - table_R = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_G = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_B = (unsigned char *) malloc(256 * sizeof(unsigned char)); - - has_color = 0; - for (j = 0; j < Info_h.biClrUsed; j++) - { - table_B[j] = (unsigned char)getc(IN); - table_G[j] = (unsigned char)getc(IN); - table_R[j] = (unsigned char)getc(IN); - getc(IN); - has_color += !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); - } - - if (has_color) - gray_scale = 0; - - numcomps = gray_scale ? 1 : 3; - color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for (i = 0; i < numcomps; i++) - { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if (!image) - { - fclose(IN); - free(table_R); - free(table_G); - free(table_B); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - - 1) * subsampling_dy + 1; - - /* set image data */ - - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, File_h.bfOffBits, SEEK_SET); - - W = Info_h.biWidth; - H = Info_h.biHeight; - RGB = (unsigned char *) calloc(1, W * H * sizeof(unsigned char)); - beyond = RGB + W * H; - pix = beyond - W; - x = y = 0; - - while (y < H) - { - c = getc(IN); - - if (c) - { - c1 = getc(IN); - - for (i = 0; i < c && x < W && pix < beyond; i++, x++, pix++) - *pix = (unsigned char)c1; - } - else - { - c = getc(IN); - - if (c == 0x00) /* EOL */ - { - x = 0; - ++y; - pix = RGB + x + (H - y - 1) * W; - } - else if (c == 0x01) /* EOP */ - break; - else if (c == 0x02) /* MOVE by dxdy */ - { - c = getc(IN); - x += c; - c = getc(IN); - y += c; - pix = RGB + (H - y - 1) * W + x; - } - else /* 03 .. 255 */ - { - i = 0; - for (; i < c && x < W && pix < beyond; i++, x++, pix++) - { - c1 = getc(IN); - *pix = (unsigned char)c1; - } - if (c & 1) /* skip padding byte */ - getc(IN); - } - } - }/* while() */ - - if (gray_scale) - { - gray = image->comps[0].data; - pix = RGB; - max = W * H; - - while (max--) - { - uc = *pix++; - - *gray++ = table_R[uc]; - } - } - else - { - /*int *red, *green, *blue;*/ - - red = image->comps[0].data; - green = image->comps[1].data; - blue = image->comps[2].data; - pix = RGB; - max = W * H; - - while (max--) - { - uc = *pix++; - - *red++ = table_R[uc]; - *green++ = table_G[uc]; - *blue++ = table_B[uc]; - } - } - free(RGB); - free(table_R); - free(table_G); - free(table_B); - }/* RLE8 */ - else - { - fprintf(stderr, - "Other system than 24 bits/pixels or 8 bits (no RLE coding) " - "is not yet implemented [%d]\n", Info_h.biBitCount); - } - fclose(IN); - return image; + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + + int i, numcomps, w, h; + OPJ_COLOR_SPACE color_space; + opj_image_cmptparm_t cmptparm[3]; /* maximum of 3 components */ + opj_image_t * image = NULL; + + FILE *IN; + BITMAPFILEHEADER_t File_h; + BITMAPINFOHEADER_t Info_h; + unsigned char *RGB; + unsigned char *table_R, *table_G, *table_B; + unsigned int j, PAD = 0; + + int x, y, index; + int gray_scale = 1; + int has_color; + DWORD W, H; + + IN = fopen(filename, "rb"); + if (!IN) { + fprintf(stderr, "Failed to open %s for reading !!\n", filename); + return NULL; + } + + File_h.bfType = getc(IN); + File_h.bfType = (getc(IN) << 8) + File_h.bfType; + + if (File_h.bfType != 19778) { + fprintf(stderr,"Error, not a BMP file!\n"); + fclose(IN); + return NULL; + } + /* FILE HEADER */ + /* ------------- */ + File_h.bfSize = getc(IN); + File_h.bfSize = (getc(IN) << 8) + File_h.bfSize; + File_h.bfSize = (getc(IN) << 16) + File_h.bfSize; + File_h.bfSize = (getc(IN) << 24) + File_h.bfSize; + + File_h.bfReserved1 = getc(IN); + File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1; + + File_h.bfReserved2 = getc(IN); + File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2; + + File_h.bfOffBits = getc(IN); + File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits; + File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits; + File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits; + + /* INFO HEADER */ + /* ------------- */ + + Info_h.biSize = getc(IN); + Info_h.biSize = (getc(IN) << 8) + Info_h.biSize; + Info_h.biSize = (getc(IN) << 16) + Info_h.biSize; + Info_h.biSize = (getc(IN) << 24) + Info_h.biSize; + + if(Info_h.biSize != 40) { + fprintf(stderr,"Error, unknown BMP header size %d\n", Info_h.biSize); + fclose(IN); + return NULL; + } + Info_h.biWidth = getc(IN); + Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth; + Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth; + Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth; + w = Info_h.biWidth; + + Info_h.biHeight = getc(IN); + Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight; + Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight; + Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight; + h = Info_h.biHeight; + + Info_h.biPlanes = getc(IN); + Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes; + + Info_h.biBitCount = getc(IN); + Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount; + + Info_h.biCompression = getc(IN); + Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression; + Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression; + Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression; + + Info_h.biSizeImage = getc(IN); + Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage; + Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage; + Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage; + + Info_h.biXpelsPerMeter = getc(IN); + Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter; + Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter; + Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter; + + Info_h.biYpelsPerMeter = getc(IN); + Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter; + Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter; + Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter; + + Info_h.biClrUsed = getc(IN); + Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed; + Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed; + Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed; + + Info_h.biClrImportant = getc(IN); + Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant; + Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant; + Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant; + + /* Read the data and store them in the OUT file */ + + if (Info_h.biBitCount == 24) { + numcomps = 3; + color_space = CLRSPC_SRGB; + /* initialize image components */ + memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); + for(i = 0; i < numcomps; i++) { + cmptparm[i].prec = 8; + cmptparm[i].bpp = 8; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = subsampling_dx; + cmptparm[i].dy = subsampling_dy; + cmptparm[i].w = w; + cmptparm[i].h = h; + } + /* create the image */ + image = opj_image_create(numcomps, &cmptparm[0], color_space); + if(!image) { + fclose(IN); + return NULL; + } + + /* set image offset and reference grid */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; + image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; + + /* set image data */ + + /* Place the cursor at the beginning of the image information */ + fseek(IN, 0, SEEK_SET); + fseek(IN, File_h.bfOffBits, SEEK_SET); + + W = Info_h.biWidth; + H = Info_h.biHeight; + + /* PAD = 4 - (3 * W) % 4; */ + /* PAD = (PAD == 4) ? 0 : PAD; */ + PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0; + + RGB = (unsigned char *) + malloc((3 * W + PAD) * H * sizeof(unsigned char)); + + if ( fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN) != (3 * W + PAD) * H ) { + free(RGB); + opj_image_destroy(image); + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return NULL; + } + + index = 0; + + for(y = 0; y < (int)H; y++) { + unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y); + for(x = 0; x < (int)W; x++) { + unsigned char *pixel = &scanline[3 * x]; + image->comps[0].data[index] = pixel[2]; /* R */ + image->comps[1].data[index] = pixel[1]; /* G */ + image->comps[2].data[index] = pixel[0]; /* B */ + index++; + } + } + free(RGB); + }/* if (Info_h.biBitCount == 24) */ + else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) { /*RGB */ + if(Info_h.biClrUsed == 0) Info_h.biClrUsed = 256; + else if(Info_h.biClrUsed > 256) Info_h.biClrUsed = 256; + + table_R = (unsigned char *) malloc(256 * sizeof(unsigned char)); + table_G = (unsigned char *) malloc(256 * sizeof(unsigned char)); + table_B = (unsigned char *) malloc(256 * sizeof(unsigned char)); + + has_color = 0; + for (j = 0; j < Info_h.biClrUsed; j++) { + table_B[j] = (unsigned char)getc(IN); + table_G[j] = (unsigned char)getc(IN); + table_R[j] = (unsigned char)getc(IN); + getc(IN); + has_color += + !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); + } + if(has_color) gray_scale = 0; + + /* Place the cursor at the beginning of the image information */ + fseek(IN, 0, SEEK_SET); + fseek(IN, File_h.bfOffBits, SEEK_SET); + + W = Info_h.biWidth; + H = Info_h.biHeight; + if (Info_h.biWidth % 2) + W++; + + numcomps = gray_scale ? 1 : 3; + color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; + /* initialize image components */ + memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); + for(i = 0; i < numcomps; i++) { + cmptparm[i].prec = 8; + cmptparm[i].bpp = 8; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = subsampling_dx; + cmptparm[i].dy = subsampling_dy; + cmptparm[i].w = w; + cmptparm[i].h = h; + } + /* create the image */ + image = opj_image_create(numcomps, &cmptparm[0], color_space); + if(!image) { + fclose(IN); + free(table_R); + free(table_G); + free(table_B); + return NULL; + } + + /* set image offset and reference grid */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; + image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; + + /* set image data */ + + RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char)); + + if ( fread(RGB, sizeof(unsigned char), W * H, IN) != W * H ) { + free(table_R); + free(table_G); + free(table_B); + free(RGB); + opj_image_destroy(image); + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return NULL; + } + if (gray_scale) { + index = 0; + for (j = 0; j < W * H; j++) { + if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) { + image->comps[0].data[index] = + table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]; + index++; + } + } + + } else { + index = 0; + for (j = 0; j < W * H; j++) { + if ((j % W < W - 1 && Info_h.biWidth % 2) + || !(Info_h.biWidth % 2)) { + unsigned char pixel_index = + RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]; + image->comps[0].data[index] = table_R[pixel_index]; + image->comps[1].data[index] = table_G[pixel_index]; + image->comps[2].data[index] = table_B[pixel_index]; + index++; + } + } + } + free(RGB); + free(table_R); + free(table_G); + free(table_B); + }/* RGB8 */ + else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) { /*RLE8*/ + unsigned char *pix, *beyond; + int *gray, *red, *green, *blue; + unsigned int x, y, max; + int i, c, c1; + unsigned char uc; + + if (Info_h.biClrUsed == 0) + Info_h.biClrUsed = 256; + else if (Info_h.biClrUsed > 256) + Info_h.biClrUsed = 256; + + table_R = (unsigned char *) malloc(256 * sizeof(unsigned char)); + table_G = (unsigned char *) malloc(256 * sizeof(unsigned char)); + table_B = (unsigned char *) malloc(256 * sizeof(unsigned char)); + + has_color = 0; + for (j = 0; j < Info_h.biClrUsed; j++) { + table_B[j] = (unsigned char)getc(IN); + table_G[j] = (unsigned char)getc(IN); + table_R[j] = (unsigned char)getc(IN); + getc(IN); + has_color += !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); + } + + if (has_color) + gray_scale = 0; + + numcomps = gray_scale ? 1 : 3; + color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; + /* initialize image components */ + memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); + for (i = 0; i < numcomps; i++) { + cmptparm[i].prec = 8; + cmptparm[i].bpp = 8; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = subsampling_dx; + cmptparm[i].dy = subsampling_dy; + cmptparm[i].w = w; + cmptparm[i].h = h; + } + /* create the image */ + image = opj_image_create(numcomps, &cmptparm[0], color_space); + if (!image) { + fclose(IN); + free(table_R); + free(table_G); + free(table_B); + return NULL; + } + + /* set image offset and reference grid */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w + - 1) * subsampling_dx + 1; + image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h + - 1) * subsampling_dy + 1; + + /* set image data */ + + /* Place the cursor at the beginning of the image information */ + fseek(IN, 0, SEEK_SET); + fseek(IN, File_h.bfOffBits, SEEK_SET); + + W = Info_h.biWidth; + H = Info_h.biHeight; + RGB = (unsigned char *) calloc(1, W * H * sizeof(unsigned char)); + beyond = RGB + W * H; + pix = beyond - W; + x = y = 0; + + while (y < H) { + c = getc(IN); + + if (c) { + c1 = getc(IN); + + for (i = 0; i < c && x < W && pix < beyond; i++, x++, pix++) + *pix = (unsigned char)c1; + } else { + c = getc(IN); + + if (c == 0x00) { /* EOL */ + x = 0; + ++y; + pix = RGB + x + (H - y - 1) * W; + } else if (c == 0x01) /* EOP */ + break; + else if (c == 0x02) { /* MOVE by dxdy */ + c = getc(IN); + x += c; + c = getc(IN); + y += c; + pix = RGB + (H - y - 1) * W + x; + } else { /* 03 .. 255 */ + i = 0; + for (; i < c && x < W && pix < beyond; i++, x++, pix++) { + c1 = getc(IN); + *pix = (unsigned char)c1; + } + if (c & 1) /* skip padding byte */ + getc(IN); + } + } + }/* while() */ + + if (gray_scale) { + gray = image->comps[0].data; + pix = RGB; + max = W * H; + + while (max--) { + uc = *pix++; + + *gray++ = table_R[uc]; + } + } else { + /*int *red, *green, *blue;*/ + + red = image->comps[0].data; + green = image->comps[1].data; + blue = image->comps[2].data; + pix = RGB; + max = W * H; + + while (max--) { + uc = *pix++; + + *red++ = table_R[uc]; + *green++ = table_G[uc]; + *blue++ = table_B[uc]; + } + } + free(RGB); + free(table_R); + free(table_G); + free(table_B); + }/* RLE8 */ + else { + fprintf(stderr, + "Other system than 24 bits/pixels or 8 bits (no RLE coding) " + "is not yet implemented [%d]\n", Info_h.biBitCount); + } + fclose(IN); + return image; } -int imagetobmp(opj_image_t * image, const char *outfile) { - int w, h; - int i, pad; - FILE *fdest = NULL; - int adjustR, adjustG, adjustB; +int imagetobmp(opj_image_t * image, const char *outfile) +{ + int w, h; + int i, pad; + FILE *fdest = NULL; + int adjustR, adjustG, adjustB; - if (image->comps[0].prec < 8) { - fprintf(stderr, "Unsupported precision: %d\n", image->comps[0].prec); - return 1; - } - if (image->numcomps >= 3 && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec) { - - /* -->> -->> -->> -->> - 24 bits color - <<-- <<-- <<-- <<-- */ - - fdest = fopen(outfile, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); - return 1; - } - - w = image->comps[0].w; - h = image->comps[0].h; - - fprintf(fdest, "BM"); - - /* FILE HEADER */ - /* ------------- */ - fprintf(fdest, "%c%c%c%c", - (unsigned char) (h * w * 3 + 3 * h * (w % 2) + 54) & 0xff, - (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 8) & 0xff, - (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 16) & 0xff, - (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,((54) >> 16) & 0xff, ((54) >> 24) & 0xff); - - /* INFO HEADER */ - /* ------------- */ - fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char) ((w) & 0xff), - (unsigned char) ((w) >> 8) & 0xff, - (unsigned char) ((w) >> 16) & 0xff, - (unsigned char) ((w) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff), - (unsigned char) ((h) >> 8) & 0xff, - (unsigned char) ((h) >> 16) & 0xff, - (unsigned char) ((h) >> 24) & 0xff); - fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); - fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff); - fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char) (3 * h * w + 3 * h * (w % 2)) & 0xff, - (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff, - (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff, - (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - - if (image->comps[0].prec > 8) { - adjustR = image->comps[0].prec - 8; - printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); - } - else - adjustR = 0; - if (image->comps[1].prec > 8) { - adjustG = image->comps[1].prec - 8; - printf("BMP CONVERSION: Truncating component 1 from %d bits to 8 bits\n", image->comps[1].prec); - } - else - adjustG = 0; - if (image->comps[2].prec > 8) { - adjustB = image->comps[2].prec - 8; - printf("BMP CONVERSION: Truncating component 2 from %d bits to 8 bits\n", image->comps[2].prec); - } - else - adjustB = 0; - - for (i = 0; i < w * h; i++) { - unsigned char rc, gc, bc; - int r, g, b; - - r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - r = ((r >> adjustR)+((r >> (adjustR-1))%2)); - if(r > 255) r = 255; else if(r < 0) r = 0; - rc = (unsigned char)r; - - g = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - g = ((g >> adjustG)+((g >> (adjustG-1))%2)); - if(g > 255) g = 255; else if(g < 0) g = 0; - gc = (unsigned char)g; - - b = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - b = ((b >> adjustB)+((b >> (adjustB-1))%2)); - if(b > 255) b = 255; else if(b < 0) b = 0; - bc = (unsigned char)b; - - fprintf(fdest, "%c%c%c", bc, gc, rc); - - if ((i + 1) % w == 0) { - for (pad = (3 * w) % 4 ? 4 - (3 * w) % 4 : 0; pad > 0; pad--) /* ADD */ - fprintf(fdest, "%c", 0); - } - } - fclose(fdest); - } else { /* Gray-scale */ - - /* -->> -->> -->> -->> - 8 bits non code (Gray scale) - <<-- <<-- <<-- <<-- */ - - fdest = fopen(outfile, "wb"); - w = image->comps[0].w; - h = image->comps[0].h; - - fprintf(fdest, "BM"); - - /* FILE HEADER */ - /* ------------- */ - fprintf(fdest, "%c%c%c%c", (unsigned char) (h * w + 54 + 1024 + h * (w % 2)) & 0xff, - (unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 8) & 0xff, - (unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 16) & 0xff, - (unsigned char) ((h * w + 54 + 1024 + w * (w % 2)) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff, ((54 + 1024) >> 8) & 0xff, - ((54 + 1024) >> 16) & 0xff, - ((54 + 1024) >> 24) & 0xff); - - /* INFO HEADER */ - /* ------------- */ - fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char) ((w) & 0xff), - (unsigned char) ((w) >> 8) & 0xff, - (unsigned char) ((w) >> 16) & 0xff, - (unsigned char) ((w) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff), - (unsigned char) ((h) >> 8) & 0xff, - (unsigned char) ((h) >> 16) & 0xff, - (unsigned char) ((h) >> 24) & 0xff); - fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); - fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff); - fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char) (h * w + h * (w % 2)) & 0xff, - (unsigned char) ((h * w + h * (w % 2)) >> 8) & 0xff, - (unsigned char) ((h * w + h * (w % 2)) >> 16) & 0xff, - (unsigned char) ((h * w + h * (w % 2)) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); - - if (image->comps[0].prec > 8) { - adjustR = image->comps[0].prec - 8; - printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); - }else - adjustR = 0; - - for (i = 0; i < 256; i++) { - fprintf(fdest, "%c%c%c%c", i, i, i, 0); - } - - for (i = 0; i < w * h; i++) { - int r; - - r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - r = ((r >> adjustR)+((r >> (adjustR-1))%2)); - if(r > 255) r = 255; else if(r < 0) r = 0; - - fprintf(fdest, "%c", (unsigned char)r); - - if ((i + 1) % w == 0) { - for (pad = w % 4 ? 4 - w % 4 : 0; pad > 0; pad--) /* ADD */ - fprintf(fdest, "%c", 0); - } - } - fclose(fdest); - } - - return 0; + if (image->comps[0].prec < 8) { + fprintf(stderr, "Unsupported precision: %d\n", image->comps[0].prec); + return 1; + } + if (image->numcomps >= 3 && image->comps[0].dx == image->comps[1].dx + && image->comps[1].dx == image->comps[2].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[1].dy == image->comps[2].dy + && image->comps[0].prec == image->comps[1].prec + && image->comps[1].prec == image->comps[2].prec) { + + /* -->> -->> -->> -->> + 24 bits color + <<-- <<-- <<-- <<-- */ + + fdest = fopen(outfile, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); + return 1; + } + + w = image->comps[0].w; + h = image->comps[0].h; + + fprintf(fdest, "BM"); + + /* FILE HEADER */ + /* ------------- */ + fprintf(fdest, "%c%c%c%c", + (unsigned char) (h * w * 3 + 3 * h * (w % 2) + 54) & 0xff, + (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 8) & 0xff, + (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 16) & 0xff, + (unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,((54) >> 16) & 0xff, ((54) >> 24) & 0xff); + + /* INFO HEADER */ + /* ------------- */ + fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((w) & 0xff), + (unsigned char) ((w) >> 8) & 0xff, + (unsigned char) ((w) >> 16) & 0xff, + (unsigned char) ((w) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff), + (unsigned char) ((h) >> 8) & 0xff, + (unsigned char) ((h) >> 16) & 0xff, + (unsigned char) ((h) >> 24) & 0xff); + fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); + fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) (3 * h * w + 3 * h * (w % 2)) & 0xff, + (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff, + (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff, + (unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + + if (image->comps[0].prec > 8) { + adjustR = image->comps[0].prec - 8; + printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); + } else + adjustR = 0; + if (image->comps[1].prec > 8) { + adjustG = image->comps[1].prec - 8; + printf("BMP CONVERSION: Truncating component 1 from %d bits to 8 bits\n", image->comps[1].prec); + } else + adjustG = 0; + if (image->comps[2].prec > 8) { + adjustB = image->comps[2].prec - 8; + printf("BMP CONVERSION: Truncating component 2 from %d bits to 8 bits\n", image->comps[2].prec); + } else + adjustB = 0; + + for (i = 0; i < w * h; i++) { + unsigned char rc, gc, bc; + int r, g, b; + + r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; + r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + r = ((r >> adjustR)+((r >> (adjustR-1))%2)); + if(r > 255) r = 255; + else if(r < 0) r = 0; + rc = (unsigned char)r; + + g = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; + g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); + g = ((g >> adjustG)+((g >> (adjustG-1))%2)); + if(g > 255) g = 255; + else if(g < 0) g = 0; + gc = (unsigned char)g; + + b = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; + b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); + b = ((b >> adjustB)+((b >> (adjustB-1))%2)); + if(b > 255) b = 255; + else if(b < 0) b = 0; + bc = (unsigned char)b; + + fprintf(fdest, "%c%c%c", bc, gc, rc); + + if ((i + 1) % w == 0) { + for (pad = (3 * w) % 4 ? 4 - (3 * w) % 4 : 0; pad > 0; pad--) /* ADD */ + fprintf(fdest, "%c", 0); + } + } + fclose(fdest); + } else { /* Gray-scale */ + + /* -->> -->> -->> -->> + 8 bits non code (Gray scale) + <<-- <<-- <<-- <<-- */ + + fdest = fopen(outfile, "wb"); + w = image->comps[0].w; + h = image->comps[0].h; + + fprintf(fdest, "BM"); + + /* FILE HEADER */ + /* ------------- */ + fprintf(fdest, "%c%c%c%c", (unsigned char) (h * w + 54 + 1024 + h * (w % 2)) & 0xff, + (unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 8) & 0xff, + (unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 16) & 0xff, + (unsigned char) ((h * w + 54 + 1024 + w * (w % 2)) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff, ((54 + 1024) >> 8) & 0xff, + ((54 + 1024) >> 16) & 0xff, + ((54 + 1024) >> 24) & 0xff); + + /* INFO HEADER */ + /* ------------- */ + fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((w) & 0xff), + (unsigned char) ((w) >> 8) & 0xff, + (unsigned char) ((w) >> 16) & 0xff, + (unsigned char) ((w) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff), + (unsigned char) ((h) >> 8) & 0xff, + (unsigned char) ((h) >> 16) & 0xff, + (unsigned char) ((h) >> 24) & 0xff); + fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); + fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) (h * w + h * (w % 2)) & 0xff, + (unsigned char) ((h * w + h * (w % 2)) >> 8) & 0xff, + (unsigned char) ((h * w + h * (w % 2)) >> 16) & 0xff, + (unsigned char) ((h * w + h * (w % 2)) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); + + if (image->comps[0].prec > 8) { + adjustR = image->comps[0].prec - 8; + printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); + } else + adjustR = 0; + + for (i = 0; i < 256; i++) { + fprintf(fdest, "%c%c%c%c", i, i, i, 0); + } + + for (i = 0; i < w * h; i++) { + int r; + + r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; + r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + r = ((r >> adjustR)+((r >> (adjustR-1))%2)); + if(r > 255) r = 255; + else if(r < 0) r = 0; + + fprintf(fdest, "%c", (unsigned char)r); + + if ((i + 1) % w == 0) { + for (pad = w % 4 ? 4 - w % 4 : 0; pad > 0; pad--) /* ADD */ + fprintf(fdest, "%c", 0); + } + } + fclose(fdest); + } + + return 0; } /* -->> -->> -->> -->> @@ -1210,263 +1152,257 @@ PGX IMAGE FORMAT static unsigned char readuchar(FILE * f) { - unsigned char c1; - if ( !fread(&c1, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - return c1; + unsigned char c1; + if ( !fread(&c1, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + return c1; } static unsigned short readushort(FILE * f, int bigendian) { - unsigned char c1, c2; - if ( !fread(&c1, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if ( !fread(&c2, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (bigendian) - return (c1 << 8) + c2; - else - return (c2 << 8) + c1; + unsigned char c1, c2; + if ( !fread(&c1, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + if ( !fread(&c2, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + if (bigendian) + return (c1 << 8) + c2; + else + return (c2 << 8) + c1; } static unsigned int readuint(FILE * f, int bigendian) { - unsigned char c1, c2, c3, c4; - if ( !fread(&c1, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if ( !fread(&c2, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if ( !fread(&c3, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if ( !fread(&c4, 1, 1, f) ) - { - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (bigendian) - return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; - else - return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; + unsigned char c1, c2, c3, c4; + if ( !fread(&c1, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + if ( !fread(&c2, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + if ( !fread(&c3, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + if ( !fread(&c4, 1, 1, f) ) { + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + return 0; + } + if (bigendian) + return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; + else + return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; } -opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { - FILE *f = NULL; - int w, h, prec; - int i, numcomps, max; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_image_t * image = NULL; - int adjustS, ushift, dshift, force8; - - char endian1,endian2,sign; - char signtmp[32]; - - char temp[32]; - int bigendian; - opj_image_comp_t *comp = NULL; - - numcomps = 1; - color_space = CLRSPC_GRAY; - - memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t)); - - max = 0; - - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "Failed to open %s for reading !\n", filename); - return NULL; - } - - fseek(f, 0, SEEK_SET); - if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9){ - fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n"); - return NULL; - } - - i=0; - sign='+'; - while (signtmp[i]!='\0') { - if (signtmp[i]=='-') sign='-'; - i++; - } - - fgetc(f); - if (endian1=='M' && endian2=='L') { - bigendian = 1; - } else if (endian2=='M' && endian1=='L') { - bigendian = 0; - } else { - fprintf(stderr, "Bad pgx header, please check input file\n"); - return NULL; - } - - /* initialize image component */ - - cmptparm.x0 = parameters->image_offset_x0; - cmptparm.y0 = parameters->image_offset_y0; - cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; - cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; - - if (sign == '-') { - cmptparm.sgnd = 1; - } else { - cmptparm.sgnd = 0; - } - if(prec < 8) - { - force8 = 1; - ushift = 8 - prec; dshift = prec - ushift; - if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); else adjustS = 0; - cmptparm.sgnd = 0; - prec = 8; - } - else ushift = dshift = force8 = adjustS = 0; - - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.dx = parameters->subsampling_dx; - cmptparm.dy = parameters->subsampling_dy; - - /* create the image */ - image = opj_image_create(numcomps, &cmptparm, color_space); - if(!image) { - fclose(f); - return NULL; - } - /* set image offset and reference grid */ - image->x0 = cmptparm.x0; - image->y0 = cmptparm.x0; - image->x1 = cmptparm.w; - image->y1 = cmptparm.h; - - /* set image data */ - - comp = &image->comps[0]; - - for (i = 0; i < w * h; i++) { - int v; - if(force8) - { - v = readuchar(f) + adjustS; - v = (v<<ushift) + (v>>dshift); - comp->data[i] = (unsigned char)v; - - if(v > max) max = v; - - continue; - } - if (comp->prec == 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, bigendian); - } else { - v = (short) readushort(f, bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, bigendian); - } else { - v = (int) readuint(f, bigendian); - } - } - if (v > max) - max = v; - comp->data[i] = v; - } - fclose(f); - comp->bpp = int_floorlog2(max) + 1; - - return image; +opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) +{ + FILE *f = NULL; + int w, h, prec; + int i, numcomps, max; + OPJ_COLOR_SPACE color_space; + opj_image_cmptparm_t cmptparm; /* maximum of 1 component */ + opj_image_t * image = NULL; + int adjustS, ushift, dshift, force8; + + char endian1,endian2,sign; + char signtmp[32]; + + char temp[32]; + int bigendian; + opj_image_comp_t *comp = NULL; + + numcomps = 1; + color_space = CLRSPC_GRAY; + + memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t)); + + max = 0; + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "Failed to open %s for reading !\n", filename); + return NULL; + } + + fseek(f, 0, SEEK_SET); + if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9) { + fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n"); + return NULL; + } + + i=0; + sign='+'; + while (signtmp[i]!='\0') { + if (signtmp[i]=='-') sign='-'; + i++; + } + + fgetc(f); + if (endian1=='M' && endian2=='L') { + bigendian = 1; + } else if (endian2=='M' && endian1=='L') { + bigendian = 0; + } else { + fprintf(stderr, "Bad pgx header, please check input file\n"); + return NULL; + } + + /* initialize image component */ + + cmptparm.x0 = parameters->image_offset_x0; + cmptparm.y0 = parameters->image_offset_y0; + cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; + cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; + + if (sign == '-') { + cmptparm.sgnd = 1; + } else { + cmptparm.sgnd = 0; + } + if(prec < 8) { + force8 = 1; + ushift = 8 - prec; + dshift = prec - ushift; + if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); + else adjustS = 0; + cmptparm.sgnd = 0; + prec = 8; + } else ushift = dshift = force8 = adjustS = 0; + + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.dx = parameters->subsampling_dx; + cmptparm.dy = parameters->subsampling_dy; + + /* create the image */ + image = opj_image_create(numcomps, &cmptparm, color_space); + if(!image) { + fclose(f); + return NULL; + } + /* set image offset and reference grid */ + image->x0 = cmptparm.x0; + image->y0 = cmptparm.x0; + image->x1 = cmptparm.w; + image->y1 = cmptparm.h; + + /* set image data */ + + comp = &image->comps[0]; + + for (i = 0; i < w * h; i++) { + int v; + if(force8) { + v = readuchar(f) + adjustS; + v = (v<<ushift) + (v>>dshift); + comp->data[i] = (unsigned char)v; + + if(v > max) max = v; + + continue; + } + if (comp->prec == 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, bigendian); + } else { + v = (short) readushort(f, bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, bigendian); + } else { + v = (int) readuint(f, bigendian); + } + } + if (v > max) + max = v; + comp->data[i] = v; + } + fclose(f); + comp->bpp = int_floorlog2(max) + 1; + + return image; } -int imagetopgx(opj_image_t * image, const char *outfile) { - int w, h; - int i, j, compno; - FILE *fdest = NULL; +int imagetopgx(opj_image_t * image, const char *outfile) +{ + int w, h; + int i, j, compno; + FILE *fdest = NULL; + + for (compno = 0; compno < image->numcomps; compno++) { + opj_image_comp_t *comp = &image->comps[compno]; + char bname[256]; /* buffer for name */ + char *name = bname; /* pointer */ + int nbytes = 0; + size_t res; + const size_t olen = strlen(outfile); + const size_t dotpos = olen - 4; + const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ + if( outfile[dotpos] != '.' ) { + /* `pgx` was recognized but there is no dot at expected position */ + fprintf(stderr, "ERROR -> Impossible happen." ); + return 1; + } + if( total > 256 ) { + name = (char*)malloc(total+1); + } + strncpy(name, outfile, dotpos); + /*if (image->numcomps > 1) {*/ + sprintf(name+dotpos, "_%d.pgx", compno); + /*} else { + strcpy(name+dotpos, ".pgx"); + }*/ + fdest = fopen(name, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); + return 1; + } + /* don't need name anymore */ + if( total > 256 ) { + free(name); + } - for (compno = 0; compno < image->numcomps; compno++) { - opj_image_comp_t *comp = &image->comps[compno]; - char bname[256]; /* buffer for name */ - char *name = bname; /* pointer */ - int nbytes = 0; - size_t res; - const size_t olen = strlen(outfile); - const size_t dotpos = olen - 4; - const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ - if( outfile[dotpos] != '.' ) { - /* `pgx` was recognized but there is no dot at expected position */ - fprintf(stderr, "ERROR -> Impossible happen." ); - return 1; - } - if( total > 256 ) { - name = (char*)malloc(total+1); - } - strncpy(name, outfile, dotpos); - /*if (image->numcomps > 1) {*/ - sprintf(name+dotpos, "_%d.pgx", compno); - /*} else { - strcpy(name+dotpos, ".pgx"); - }*/ - fdest = fopen(name, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); - return 1; - } - /* don't need name anymore */ - if( total > 256 ) { - free(name); - } - - w = image->comps[compno].w; - h = image->comps[compno].h; - - fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, w, h); - if (comp->prec <= 8) { - nbytes = 1; - } else if (comp->prec <= 16) { - nbytes = 2; - } else { - nbytes = 4; - } - for (i = 0; i < w * h; i++) { - int v = image->comps[compno].data[i]; - for (j = nbytes - 1; j >= 0; j--) { - char byte = (char) (v >> (j * 8)); - res = fwrite(&byte, 1, 1, fdest); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", name); - return 1; + w = image->comps[compno].w; + h = image->comps[compno].h; + + fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, w, h); + if (comp->prec <= 8) { + nbytes = 1; + } else if (comp->prec <= 16) { + nbytes = 2; + } else { + nbytes = 4; + } + for (i = 0; i < w * h; i++) { + int v = image->comps[compno].data[i]; + for (j = nbytes - 1; j >= 0; j--) { + char byte = (char) (v >> (j * 8)); + res = fwrite(&byte, 1, 1, fdest); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", name); + return 1; + } + } } - } - } - fclose(fdest); - } + fclose(fdest); + } - return 0; + return 0; } /* -->> -->> -->> -->> @@ -1475,8 +1411,7 @@ PNM IMAGE FORMAT <<-- <<-- <<-- <<-- */ -struct pnm_header -{ +struct pnm_header { int width, height, maxval, depth, format; char rgb, rgba, gray, graya, bw; char ok; @@ -1484,12 +1419,14 @@ struct pnm_header static char *skip_white(char *s) { - while(*s) - { - if(*s == '\n' || *s == '\r') return NULL; - if(isspace(*s)) { ++s; continue; } - return s; - } + while(*s) { + if(*s == '\n' || *s == '\r') return NULL; + if(isspace(*s)) { + ++s; + continue; + } + return s; + } return NULL; } @@ -1498,18 +1435,21 @@ static char *skip_int(char *start, int *out_n) char *s; char c; - *out_n = 0; s = start; + *out_n = 0; + s = start; s = skip_white(start); if(s == NULL) return NULL; start = s; - while(*s) - { - if( !isdigit(*s)) break; - ++s; - } - c = *s; *s = 0; *out_n = atoi(start); *s = c; + while(*s) { + if( !isdigit(*s)) break; + ++s; + } + c = *s; + *s = 0; + *out_n = atoi(start); + *s = c; return s; } @@ -1522,12 +1462,17 @@ static char *skip_idf(char *start, char out_idf[256]) if(s == NULL) return NULL; start = s; - while(*s) - { - if(isalpha(*s) || *s == '_') { ++s; continue; } - break; - } - c = *s; *s = 0; strncpy(out_idf, start, 255); *s = c; + while(*s) { + if(isalpha(*s) || *s == '_') { + ++s; + continue; + } + break; + } + c = *s; + *s = 0; + strncpy(out_idf, start, 255); + *s = c; return s; } @@ -1538,151 +1483,138 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph) char idf[256], type[256]; char line[256]; - if (fgets(line, 250, reader) == NULL) - { - fprintf(stderr,"\nWARNING: fgets return a NULL value"); - return; + if (fgets(line, 250, reader) == NULL) { + fprintf(stderr,"\nWARNING: fgets return a NULL value"); + return; } - if(line[0] != 'P') - { - fprintf(stderr,"read_pnm_header:PNM:magic P missing\n"); return; - } + if(line[0] != 'P') { + fprintf(stderr,"read_pnm_header:PNM:magic P missing\n"); + return; + } format = atoi(line + 1); - if(format < 1 || format > 7) - { - fprintf(stderr,"read_pnm_header:magic format %d invalid\n", format); - return; - } + if(format < 1 || format > 7) { + fprintf(stderr,"read_pnm_header:magic format %d invalid\n", format); + return; + } ph->format = format; ttype = end = have_wh = 0; - while(fgets(line, 250, reader)) - { - if(*line == '#') continue; - - s = line; - - if(format == 7) - { - s = skip_idf(s, idf); - - if(s == NULL || *s == 0) return; - - if(strcmp(idf, "ENDHDR") == 0) - { - end = 1; break; - } - if(strcmp(idf, "WIDTH") == 0) - { - s = skip_int(s, &ph->width); - if(s == NULL || *s == 0) return; - - continue; - } - if(strcmp(idf, "HEIGHT") == 0) - { - s = skip_int(s, &ph->height); - if(s == NULL || *s == 0) return; - - continue; - } - if(strcmp(idf, "DEPTH") == 0) - { - s = skip_int(s, &ph->depth); - if(s == NULL || *s == 0) return; - - continue; - } - if(strcmp(idf, "MAXVAL") == 0) - { - s = skip_int(s, &ph->maxval); - if(s == NULL || *s == 0) return; - - continue; - } - if(strcmp(idf, "TUPLTYPE") == 0) - { - s = skip_idf(s, type); - if(s == NULL || *s == 0) return; - - if(strcmp(type, "BLACKANDWHITE") == 0) - { - ph->bw = 1; ttype = 1; continue; - } - if(strcmp(type, "GRAYSCALE") == 0) - { - ph->gray = 1; ttype = 1; continue; - } - if(strcmp(type, "GRAYSCALE_ALPHA") == 0) - { - ph->graya = 1; ttype = 1; continue; - } - if(strcmp(type, "RGB") == 0) - { - ph->rgb = 1; ttype = 1; continue; - } - if(strcmp(type, "RGB_ALPHA") == 0) - { - ph->rgba = 1; ttype = 1; continue; - } - fprintf(stderr,"read_pnm_header:unknown P7 TUPLTYPE %s\n",type); - return; - } - fprintf(stderr,"read_pnm_header:unknown P7 idf %s\n",idf); - return; - } /* if(format == 7) */ - - if( !have_wh) - { - s = skip_int(s, &ph->width); - - s = skip_int(s, &ph->height); - - have_wh = 1; - - if(format == 1 || format == 4) break; - - continue; - } - if(format == 2 || format == 3 || format == 5 || format == 6) - { -/* P2, P3, P5, P6: */ - s = skip_int(s, &ph->maxval); - - if(ph->maxval > 65535) return; - } - break; - }/* while(fgets( ) */ - if(format == 2 || format == 3 || format > 4) - { - if(ph->maxval < 1 || ph->maxval > 65535) return; - } + while(fgets(line, 250, reader)) { + if(*line == '#') continue; + + s = line; + + if(format == 7) { + s = skip_idf(s, idf); + + if(s == NULL || *s == 0) return; + + if(strcmp(idf, "ENDHDR") == 0) { + end = 1; + break; + } + if(strcmp(idf, "WIDTH") == 0) { + s = skip_int(s, &ph->width); + if(s == NULL || *s == 0) return; + + continue; + } + if(strcmp(idf, "HEIGHT") == 0) { + s = skip_int(s, &ph->height); + if(s == NULL || *s == 0) return; + + continue; + } + if(strcmp(idf, "DEPTH") == 0) { + s = skip_int(s, &ph->depth); + if(s == NULL || *s == 0) return; + + continue; + } + if(strcmp(idf, "MAXVAL") == 0) { + s = skip_int(s, &ph->maxval); + if(s == NULL || *s == 0) return; + + continue; + } + if(strcmp(idf, "TUPLTYPE") == 0) { + s = skip_idf(s, type); + if(s == NULL || *s == 0) return; + + if(strcmp(type, "BLACKANDWHITE") == 0) { + ph->bw = 1; + ttype = 1; + continue; + } + if(strcmp(type, "GRAYSCALE") == 0) { + ph->gray = 1; + ttype = 1; + continue; + } + if(strcmp(type, "GRAYSCALE_ALPHA") == 0) { + ph->graya = 1; + ttype = 1; + continue; + } + if(strcmp(type, "RGB") == 0) { + ph->rgb = 1; + ttype = 1; + continue; + } + if(strcmp(type, "RGB_ALPHA") == 0) { + ph->rgba = 1; + ttype = 1; + continue; + } + fprintf(stderr,"read_pnm_header:unknown P7 TUPLTYPE %s\n",type); + return; + } + fprintf(stderr,"read_pnm_header:unknown P7 idf %s\n",idf); + return; + } /* if(format == 7) */ + + if( !have_wh) { + s = skip_int(s, &ph->width); + + s = skip_int(s, &ph->height); + + have_wh = 1; + + if(format == 1 || format == 4) break; + + continue; + } + if(format == 2 || format == 3 || format == 5 || format == 6) { + /* P2, P3, P5, P6: */ + s = skip_int(s, &ph->maxval); + + if(ph->maxval > 65535) return; + } + break; + }/* while(fgets( ) */ + if(format == 2 || format == 3 || format > 4) { + if(ph->maxval < 1 || ph->maxval > 65535) return; + } if(ph->width < 1 || ph->height < 1) return; - if(format == 7) - { - if(!end) - { - fprintf(stderr,"read_pnm_header:P7 without ENDHDR\n"); return; - } - if(ph->depth < 1 || ph->depth > 4) return; - - if(ph->width && ph->height && ph->depth & ph->maxval && ttype) - ph->ok = 1; - } - else - { - if(format != 1 && format != 4) - { - if(ph->width && ph->height && ph->maxval) ph->ok = 1; - } - else - { - if(ph->width && ph->height) ph->ok = 1; - ph->maxval = 255; - } - } + if(format == 7) { + if(!end) { + fprintf(stderr,"read_pnm_header:P7 without ENDHDR\n"); + return; + } + if(ph->depth < 1 || ph->depth > 4) return; + + if(ph->width && ph->height && ph->depth & ph->maxval && ttype) + ph->ok = 1; + } else { + if(format != 1 && format != 4) { + if(ph->width && ph->height && ph->maxval) ph->ok = 1; + } else { + if(ph->width && ph->height) ph->ok = 1; + ph->maxval = 255; + } + } } static int has_prec(int val) @@ -1705,32 +1637,34 @@ static int has_prec(int val) return 16; } -opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - FILE *fp = NULL; - int i, compno, numcomps, w, h, prec, format; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm[4]; /* RGBA: max. 4 components */ - opj_image_t * image = NULL; - struct pnm_header header_info; - - if((fp = fopen(filename, "rb")) == NULL) - { - fprintf(stderr, "pnmtoimage:Failed to open %s for reading!\n",filename); - return NULL; - } - memset(&header_info, 0, sizeof(struct pnm_header)); +opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) +{ + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + + FILE *fp = NULL; + int i, compno, numcomps, w, h, prec, format; + OPJ_COLOR_SPACE color_space; + opj_image_cmptparm_t cmptparm[4]; /* RGBA: max. 4 components */ + opj_image_t * image = NULL; + struct pnm_header header_info; + + if((fp = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "pnmtoimage:Failed to open %s for reading!\n",filename); + return NULL; + } + memset(&header_info, 0, sizeof(struct pnm_header)); - read_pnm_header(fp, &header_info); + read_pnm_header(fp, &header_info); - if(!header_info.ok) { fclose(fp); return NULL; } + if(!header_info.ok) { + fclose(fp); + return NULL; + } - format = header_info.format; + format = header_info.format; - switch(format) - { + switch(format) { case 1: /* ascii bitmap */ case 4: /* raw bitmap */ numcomps = 1; @@ -1748,18 +1682,20 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { case 7: /* arbitrary map */ numcomps = header_info.depth; - break; + break; - default: fclose(fp); return NULL; - } + default: + fclose(fp); + return NULL; + } if(numcomps < 3) - color_space = CLRSPC_GRAY;/* GRAY, GRAYA */ + color_space = CLRSPC_GRAY;/* GRAY, GRAYA */ else - color_space = CLRSPC_SRGB;/* RGB, RGBA */ + color_space = CLRSPC_SRGB;/* RGB, RGBA */ prec = has_prec(header_info.maxval); - if(prec < 8) prec = 8; + if(prec < 8) prec = 8; w = header_info.width; h = header_info.height; @@ -1768,316 +1704,284 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); - for(i = 0; i < numcomps; i++) - { - cmptparm[i].prec = prec; - cmptparm[i].bpp = prec; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } + for(i = 0; i < numcomps; i++) { + cmptparm[i].prec = prec; + cmptparm[i].bpp = prec; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = subsampling_dx; + cmptparm[i].dy = subsampling_dy; + cmptparm[i].w = w; + cmptparm[i].h = h; + } image = opj_image_create(numcomps, &cmptparm[0], color_space); - if(!image) { fclose(fp); return NULL; } - -/* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; - image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; - - if((format == 2) || (format == 3)) /* ascii pixmap */ - { - unsigned int index; - - for (i = 0; i < w * h; i++) - { - for(compno = 0; compno < numcomps; compno++) - { - index = 0; - if (fscanf(fp, "%u", &index) != 1) - fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); - - image->comps[compno].data[i] = (index * 255)/header_info.maxval; - } - } - } - else - if((format == 5) - || (format == 6) - ||((format == 7) - && ( header_info.gray || header_info.graya - || header_info.rgb || header_info.rgba)))/* binary pixmap */ - { - unsigned char c0, c1, one; - - one = (prec < 9); - - for (i = 0; i < w * h; i++) - { - for(compno = 0; compno < numcomps; compno++) - { - if ( !fread(&c0, 1, 1, fp) ) - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - if(one) - { - image->comps[compno].data[i] = c0; - } - else - { - if ( !fread(&c1, 1, 1, fp) ) - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); -/* netpbm: */ - image->comps[compno].data[i] = ((c0<<8) | c1); - } - } - } - } - else - if(format == 1) /* ascii bitmap */ - { - for (i = 0; i < w * h; i++) - { - unsigned int index; - - if ( fscanf(fp, "%u", &index) != 1) - fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); - - image->comps[0].data[i] = (index?0:255); - } - } - else - if(format == 4) - { - int x, y, bit; - unsigned char uc; - - i = 0; - for(y = 0; y < h; ++y) - { - bit = -1; uc = 0; - - for(x = 0; x < w; ++x) - { - if(bit == -1) - { - bit = 7; - uc = (unsigned char)getc(fp); - } - image->comps[0].data[i] = (((uc>>bit) & 1)?0:255); - --bit; ++i; - } - } - } - else - if((format == 7 && header_info.bw)) /*MONO*/ - { - unsigned char uc; - - for(i = 0; i < w * h; ++i) - { - if ( !fread(&uc, 1, 1, fp) ) - fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); - image->comps[0].data[i] = (uc & 1)?0:255; - } - } + if(!image) { + fclose(fp); + return NULL; + } + + /* set image offset and reference grid */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; + image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; + + if((format == 2) || (format == 3)) { /* ascii pixmap */ + unsigned int index; + + for (i = 0; i < w * h; i++) { + for(compno = 0; compno < numcomps; compno++) { + index = 0; + if (fscanf(fp, "%u", &index) != 1) + fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); + + image->comps[compno].data[i] = (index * 255)/header_info.maxval; + } + } + } else if((format == 5) + || (format == 6) + ||((format == 7) + && ( header_info.gray || header_info.graya + || header_info.rgb || header_info.rgba))) { /* binary pixmap */ + unsigned char c0, c1, one; + + one = (prec < 9); + + for (i = 0; i < w * h; i++) { + for(compno = 0; compno < numcomps; compno++) { + if ( !fread(&c0, 1, 1, fp) ) + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + if(one) { + image->comps[compno].data[i] = c0; + } else { + if ( !fread(&c1, 1, 1, fp) ) + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + /* netpbm: */ + image->comps[compno].data[i] = ((c0<<8) | c1); + } + } + } + } else if(format == 1) { /* ascii bitmap */ + for (i = 0; i < w * h; i++) { + unsigned int index; + + if ( fscanf(fp, "%u", &index) != 1) + fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); + + image->comps[0].data[i] = (index?0:255); + } + } else if(format == 4) { + int x, y, bit; + unsigned char uc; + + i = 0; + for(y = 0; y < h; ++y) { + bit = -1; + uc = 0; + + for(x = 0; x < w; ++x) { + if(bit == -1) { + bit = 7; + uc = (unsigned char)getc(fp); + } + image->comps[0].data[i] = (((uc>>bit) & 1)?0:255); + --bit; + ++i; + } + } + } else if((format == 7 && header_info.bw)) { /*MONO*/ + unsigned char uc; + + for(i = 0; i < w * h; ++i) { + if ( !fread(&uc, 1, 1, fp) ) + fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); + image->comps[0].data[i] = (uc & 1)?0:255; + } + } fclose(fp); return image; }/* pnmtoimage() */ -int imagetopnm(opj_image_t * image, const char *outfile) +int imagetopnm(opj_image_t * image, const char *outfile) { - int *red, *green, *blue, *alpha; - int wr, hr, max; - int i, compno, ncomp; - int adjustR, adjustG, adjustB, adjustA; - int fails, two, want_gray, has_alpha, triple; - int prec, v; - FILE *fdest = NULL; - const char *tmp = outfile; - char *destname; - alpha = NULL; - if((prec = image->comps[0].prec) > 16) - { - fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16" - "\n\t: refused.\n",__FILE__,__LINE__,prec); - return 1; - } - two = has_alpha = 0; fails = 1; - ncomp = image->numcomps; - - while (*tmp) ++tmp; tmp -= 2; - want_gray = (*tmp == 'g' || *tmp == 'G'); - ncomp = image->numcomps; - - if(want_gray) ncomp = 1; - - if (ncomp == 2 /* GRAYA */ - || (ncomp > 2 /* RGB, RGBA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec - )) - { - fdest = fopen(outfile, "wb"); - - if (!fdest) - { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); - return fails; - } - two = (prec > 8); - triple = (ncomp > 2); - wr = image->comps[0].w; hr = image->comps[0].h; - max = (1<<prec) - 1; has_alpha = (ncomp == 4 || ncomp == 2); - - red = image->comps[0].data; - - if(triple) - { - green = image->comps[1].data; - blue = image->comps[2].data; - } - else green = blue = NULL; - - if(has_alpha) - { - const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA"); - - fprintf(fdest, "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n" - "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n", opj_version(), - wr, hr, ncomp, max, tt); - alpha = image->comps[ncomp - 1].data; - adjustA = (image->comps[ncomp - 1].sgnd ? - 1 << (image->comps[ncomp - 1].prec - 1) : 0); - } - else - { - fprintf(fdest, "P6\n# OpenJPEG-%s\n%d %d\n%d\n", - opj_version(), wr, hr, max); - adjustA = 0; - } - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + int *red, *green, *blue, *alpha; + int wr, hr, max; + int i, compno, ncomp; + int adjustR, adjustG, adjustB, adjustA; + int fails, two, want_gray, has_alpha, triple; + int prec, v; + FILE *fdest = NULL; + const char *tmp = outfile; + char *destname; + alpha = NULL; + if((prec = image->comps[0].prec) > 16) { + fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16" + "\n\t: refused.\n",__FILE__,__LINE__,prec); + return 1; + } + two = has_alpha = 0; + fails = 1; + ncomp = image->numcomps; + + while (*tmp) ++tmp; + tmp -= 2; + want_gray = (*tmp == 'g' || *tmp == 'G'); + ncomp = image->numcomps; + + if(want_gray) ncomp = 1; + + if (ncomp == 2 /* GRAYA */ + || (ncomp > 2 /* RGB, RGBA */ + && image->comps[0].dx == image->comps[1].dx + && image->comps[1].dx == image->comps[2].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[1].dy == image->comps[2].dy + && image->comps[0].prec == image->comps[1].prec + && image->comps[1].prec == image->comps[2].prec + )) { + fdest = fopen(outfile, "wb"); + + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); + return fails; + } + two = (prec > 8); + triple = (ncomp > 2); + wr = image->comps[0].w; + hr = image->comps[0].h; + max = (1<<prec) - 1; + has_alpha = (ncomp == 4 || ncomp == 2); + + red = image->comps[0].data; + + if(triple) { + green = image->comps[1].data; + blue = image->comps[2].data; + } else green = blue = NULL; + + if(has_alpha) { + const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA"); + + fprintf(fdest, "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n" + "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n", opj_version(), + wr, hr, ncomp, max, tt); + alpha = image->comps[ncomp - 1].data; + adjustA = (image->comps[ncomp - 1].sgnd ? + 1 << (image->comps[ncomp - 1].prec - 1) : 0); + } else { + fprintf(fdest, "P6\n# OpenJPEG-%s\n%d %d\n%d\n", + opj_version(), wr, hr, max); + adjustA = 0; + } + adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - if(triple) - { - adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - } - else adjustG = adjustB = 0; - - for(i = 0; i < wr * hr; ++i) - { - if(two) - { - v = *red + adjustR; ++red; -/* netpbm: */ - fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - - if(triple) - { - v = *green + adjustG; ++green; -/* netpbm: */ - fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - - v = *blue + adjustB; ++blue; -/* netpbm: */ - fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - - }/* if(triple) */ - - if(has_alpha) - { - v = *alpha + adjustA; ++alpha; -/* netpbm: */ - fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - } - continue; - - } /* if(two) */ - -/* prec <= 8: */ - - fprintf(fdest, "%c", (unsigned char)*red++); - if(triple) - fprintf(fdest, "%c%c",(unsigned char)*green++, (unsigned char)*blue++); - - if(has_alpha) - fprintf(fdest, "%c", (unsigned char)*alpha++); - - } /* for(i */ - - fclose(fdest); return 0; - } - -/* YUV or MONO: */ - - if (image->numcomps > ncomp) - { - fprintf(stderr,"WARNING -> [PGM file] Only the first component\n"); - fprintf(stderr," is written to the file\n"); - } - destname = (char*)malloc(strlen(outfile) + 8); - - for (compno = 0; compno < ncomp; compno++) - { - if (ncomp > 1) - sprintf(destname, "%d.%s", compno, outfile); - else - sprintf(destname, "%s", outfile); - - fdest = fopen(destname, "wb"); - if (!fdest) - { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", destname); - free(destname); - return 1; - } - wr = image->comps[compno].w; hr = image->comps[compno].h; - prec = image->comps[compno].prec; - max = (1<<prec) - 1; - - fprintf(fdest, "P5\n#OpenJPEG-%s\n%d %d\n%d\n", - opj_version(), wr, hr, max); - - red = image->comps[compno].data; - adjustR = - (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0); - - if(prec > 8) - { - for (i = 0; i < wr * hr; i++) - { - v = *red + adjustR; ++red; -/* netpbm: */ - fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - - if(has_alpha) - { - v = *alpha++; -/* netpbm: */ - fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); - } - }/* for(i */ - } - else /* prec <= 8 */ - { - for(i = 0; i < wr * hr; ++i) - { - fprintf(fdest, "%c", (unsigned char)(*red + adjustR)); ++red; - } - } - fclose(fdest); - } /* for (compno */ - free(destname); - - return 0; + if(triple) { + adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); + adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); + } else adjustG = adjustB = 0; + + for(i = 0; i < wr * hr; ++i) { + if(two) { + v = *red + adjustR; + ++red; + /* netpbm: */ + fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); + + if(triple) { + v = *green + adjustG; + ++green; + /* netpbm: */ + fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); + + v = *blue + adjustB; + ++blue; + /* netpbm: */ + fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); + + }/* if(triple) */ + + if(has_alpha) { + v = *alpha + adjustA; + ++alpha; + /* netpbm: */ + fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); + } + continue; + + } /* if(two) */ + + /* prec <= 8: */ + + fprintf(fdest, "%c", (unsigned char)*red++); + if(triple) + fprintf(fdest, "%c%c",(unsigned char)*green++, (unsigned char)*blue++); + + if(has_alpha) + fprintf(fdest, "%c", (unsigned char)*alpha++); + + } /* for(i */ + + fclose(fdest); + return 0; + } + + /* YUV or MONO: */ + + if (image->numcomps > ncomp) { + fprintf(stderr,"WARNING -> [PGM file] Only the first component\n"); + fprintf(stderr," is written to the file\n"); + } + destname = (char*)malloc(strlen(outfile) + 8); + + for (compno = 0; compno < ncomp; compno++) { + if (ncomp > 1) + sprintf(destname, "%d.%s", compno, outfile); + else + sprintf(destname, "%s", outfile); + + fdest = fopen(destname, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", destname); + free(destname); + return 1; + } + wr = image->comps[compno].w; + hr = image->comps[compno].h; + prec = image->comps[compno].prec; + max = (1<<prec) - 1; + + fprintf(fdest, "P5\n#OpenJPEG-%s\n%d %d\n%d\n", + opj_version(), wr, hr, max); + + red = image->comps[compno].data; + adjustR = + (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0); + + if(prec > 8) { + for (i = 0; i < wr * hr; i++) { + v = *red + adjustR; + ++red; + /* netpbm: */ + fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); + + if(has_alpha) { + v = *alpha++; + /* netpbm: */ + fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); + } + }/* for(i */ + } else { /* prec <= 8 */ + for(i = 0; i < wr * hr; ++i) { + fprintf(fdest, "%c", (unsigned char)(*red + adjustR)); + ++red; + } + } + fclose(fdest); + } /* for (compno */ + free(destname); + + return 0; }/* imagetopnm() */ #ifdef OPJ_HAVE_LIBTIFF @@ -2087,366 +1991,333 @@ int imagetopnm(opj_image_t * image, const char *outfile) <<-- <<-- <<-- <<-- */ -int imagetotif(opj_image_t * image, const char *outfile) +int imagetotif(opj_image_t * image, const char *outfile) { - int width, height, imgsize; - int bps,index,adjust, sgnd; - int ushift, dshift, has_alpha, force16; - TIFF *tif; - tdata_t buf; - tstrip_t strip; - tsize_t strip_size; - - ushift = dshift = force16 = has_alpha = 0; - bps = image->comps[0].prec; - - if(bps > 8 && bps < 16) - { - ushift = 16 - bps; dshift = bps - ushift; - bps = 16; force16 = 1; - } - - if(bps != 8 && bps != 16) - { - fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits implemented\n", - bps); - fprintf(stderr,"\tAborting\n"); - return 1; - } - tif = TIFFOpen(outfile, "wb"); - - if (!tif) - { - fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile); - return 1; - } - sgnd = image->comps[0].sgnd; - adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; - - if(image->numcomps >= 3 - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec) - { - has_alpha = (image->numcomps == 4); - - width = image->comps[0].w; - height = image->comps[0].h; - imgsize = width * height ; - - TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3 + has_alpha); - TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); - strip_size = TIFFStripSize(tif); - buf = _TIFFmalloc(strip_size); - index=0; - - for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) - { - unsigned char *dat8; - tsize_t i, ssize, last_i = 0; - int step, restx; - ssize = TIFFStripSize(tif); - dat8 = (unsigned char*)buf; - - if(bps == 8) - { - step = 3 + has_alpha; - restx = step - 1; - - for(i=0; i < ssize - restx; i += step) - { - int r, g, b, a = 0; - - if(index < imgsize) - { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if(has_alpha) a = image->comps[3].data[index]; - - if(sgnd) - { - r += adjust; - g += adjust; - b += adjust; - if(has_alpha) a += adjust; - } - dat8[i+0] = r ; - dat8[i+1] = g ; - dat8[i+2] = b ; - if(has_alpha) dat8[i+3] = a; - - index++; - last_i = i + step; - } - else - break; - }/*for(i = 0;)*/ - - if(last_i < ssize) - { - for(i = last_i; i < ssize; i += step) - { - int r, g, b, a = 0; - - if(index < imgsize) - { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if(has_alpha) a = image->comps[3].data[index]; - - if(sgnd) - { - r += adjust; - g += adjust; - b += adjust; - if(has_alpha) a += adjust; - } - dat8[i+0] = r ; - if(i+1 < ssize) dat8[i+1] = g ; else break; - if(i+2 < ssize) dat8[i+2] = b ; else break; - if(has_alpha) - { - if(i+3 < ssize) dat8[i+3] = a ; else break; - } - index++; - } - else - break; - }/*for(i)*/ - }/*if(last_i < ssize)*/ - - } /*if(bps == 8)*/ - else - if(bps == 16) - { - step = 6 + has_alpha + has_alpha; - restx = step - 1; - - for(i = 0; i < ssize - restx ; i += step) - { - int r, g, b, a = 0; - - if(index < imgsize) - { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if(has_alpha) a = image->comps[3].data[index]; - - if(sgnd) - { - r += adjust; - g += adjust; - b += adjust; - if(has_alpha) a += adjust; - } - if(force16) - { - r = (r<<ushift) + (r>>dshift); - g = (g<<ushift) + (g>>dshift); - b = (b<<ushift) + (b>>dshift); - if(has_alpha) a = (a<<ushift) + (a>>dshift); - } - dat8[i+0] = r;/*LSB*/ - dat8[i+1] = (r >> 8);/*MSB*/ - dat8[i+2] = g; - dat8[i+3] = (g >> 8); - dat8[i+4] = b; - dat8[i+5] = (b >> 8); - if(has_alpha) - { - dat8[i+6] = a; - dat8[i+7] = (a >> 8); - } - index++; - last_i = i + step; - } - else - break; - }/*for(i = 0;)*/ - - if(last_i < ssize) - { - for(i = last_i ; i < ssize ; i += step) - { - int r, g, b, a = 0; - - if(index < imgsize) - { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if(has_alpha) a = image->comps[3].data[index]; - - if(sgnd) - { - r += adjust; - g += adjust; - b += adjust; - if(has_alpha) a += adjust; - } - if(force16) - { - r = (r<<ushift) + (r>>dshift); - g = (g<<ushift) + (g>>dshift); - b = (b<<ushift) + (b>>dshift); - if(has_alpha) a = (a<<ushift) + (a>>dshift); - } - dat8[i+0] = r;/*LSB*/ - if(i+1 < ssize) dat8[i+1] = (r >> 8);else break;/*MSB*/ - if(i+2 < ssize) dat8[i+2] = g; else break; - if(i+3 < ssize) dat8[i+3] = (g >> 8);else break; - if(i+4 < ssize) dat8[i+4] = b; else break; - if(i+5 < ssize) dat8[i+5] = (b >> 8);else break; - - if(has_alpha) - { - if(i+6 < ssize) dat8[i+6] = a; else break; - if(i+7 < ssize) dat8[i+7] = (a >> 8); else break; - } - index++; - } - else - break; - }/*for(i)*/ - }/*if(last_i < ssize)*/ - - }/*if(bps == 16)*/ - (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); - }/*for(strip = 0; )*/ - - _TIFFfree((void*)buf); - TIFFClose(tif); - - return 0; - }/*RGB(A)*/ - - if(image->numcomps == 1 /* GRAY */ - || ( image->numcomps == 2 /* GRAY_ALPHA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[0].prec == image->comps[1].prec)) - { - int step; - - has_alpha = (image->numcomps == 2); - - width = image->comps[0].w; - height = image->comps[0].h; - imgsize = width * height; - -/* Set tags */ - TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1 + has_alpha); - TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); - TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); - -/* Get a buffer for the data */ - strip_size = TIFFStripSize(tif); - buf = _TIFFmalloc(strip_size); - index = 0; - - for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) - { - unsigned char *dat8; - tsize_t i, ssize = TIFFStripSize(tif); - dat8 = (unsigned char*)buf; - - if(bps == 8) - { - step = 1 + has_alpha; - - for(i=0; i < ssize; i += step) - { - if(index < imgsize) - { - int r, a = 0; - - r = image->comps[0].data[index]; - if(has_alpha) a = image->comps[1].data[index]; - - if(sgnd) - { - r += adjust; - if(has_alpha) a += adjust; - } - dat8[i+0] = r; - if(has_alpha) dat8[i+1] = a; - index++; - } - else - break; - }/*for(i )*/ - }/*if(bps == 8*/ - else - if(bps == 16) - { - step = 2 + has_alpha + has_alpha; - - for(i=0; i < ssize; i += step) - { - if(index < imgsize) - { - int r, a = 0; - - r = image->comps[0].data[index]; - if(has_alpha) a = image->comps[1].data[index]; - - if(sgnd) - { - r += adjust; - if(has_alpha) a += adjust; - } - if(force16) - { - r = (r<<ushift) + (r>>dshift); - if(has_alpha) a = (a<<ushift) + (a>>dshift); - } - dat8[i+0] = r;/*LSB*/ - dat8[i+1] = r >> 8;/*MSB*/ - if(has_alpha) - { - dat8[i+2] = a; - dat8[i+3] = a >> 8; - } - index++; - }/*if(index < imgsize)*/ - else - break; - }/*for(i )*/ - } - (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); - }/*for(strip*/ - - _TIFFfree(buf); - TIFFClose(tif); - - return 0; - } - - TIFFClose(tif); - - fprintf(stderr,"imagetotif: Bad color format.\n" - "\tOnly RGB(A) and GRAY(A) has been implemented\n"); - fprintf(stderr,"\tFOUND: numcomps(%d)\n\tAborting\n", - image->numcomps); - - return 1; + int width, height, imgsize; + int bps,index,adjust, sgnd; + int ushift, dshift, has_alpha, force16; + TIFF *tif; + tdata_t buf; + tstrip_t strip; + tsize_t strip_size; + + ushift = dshift = force16 = has_alpha = 0; + bps = image->comps[0].prec; + + if(bps > 8 && bps < 16) { + ushift = 16 - bps; + dshift = bps - ushift; + bps = 16; + force16 = 1; + } + + if(bps != 8 && bps != 16) { + fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits implemented\n", + bps); + fprintf(stderr,"\tAborting\n"); + return 1; + } + tif = TIFFOpen(outfile, "wb"); + + if (!tif) { + fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile); + return 1; + } + sgnd = image->comps[0].sgnd; + adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; + + if(image->numcomps >= 3 + && image->comps[0].dx == image->comps[1].dx + && image->comps[1].dx == image->comps[2].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[1].dy == image->comps[2].dy + && image->comps[0].prec == image->comps[1].prec + && image->comps[1].prec == image->comps[2].prec) { + has_alpha = (image->numcomps == 4); + + width = image->comps[0].w; + height = image->comps[0].h; + imgsize = width * height ; + + TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3 + has_alpha); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); + strip_size = TIFFStripSize(tif); + buf = _TIFFmalloc(strip_size); + index=0; + + for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { + unsigned char *dat8; + tsize_t i, ssize, last_i = 0; + int step, restx; + ssize = TIFFStripSize(tif); + dat8 = (unsigned char*)buf; + + if(bps == 8) { + step = 3 + has_alpha; + restx = step - 1; + + for(i=0; i < ssize - restx; i += step) { + int r, g, b, a = 0; + + if(index < imgsize) { + r = image->comps[0].data[index]; + g = image->comps[1].data[index]; + b = image->comps[2].data[index]; + if(has_alpha) a = image->comps[3].data[index]; + + if(sgnd) { + r += adjust; + g += adjust; + b += adjust; + if(has_alpha) a += adjust; + } + dat8[i+0] = r ; + dat8[i+1] = g ; + dat8[i+2] = b ; + if(has_alpha) dat8[i+3] = a; + + index++; + last_i = i + step; + } else + break; + }/*for(i = 0;)*/ + + if(last_i < ssize) { + for(i = last_i; i < ssize; i += step) { + int r, g, b, a = 0; + + if(index < imgsize) { + r = image->comps[0].data[index]; + g = image->comps[1].data[index]; + b = image->comps[2].data[index]; + if(has_alpha) a = image->comps[3].data[index]; + + if(sgnd) { + r += adjust; + g += adjust; + b += adjust; + if(has_alpha) a += adjust; + } + dat8[i+0] = r ; + if(i+1 < ssize) dat8[i+1] = g ; + else break; + if(i+2 < ssize) dat8[i+2] = b ; + else break; + if(has_alpha) { + if(i+3 < ssize) dat8[i+3] = a ; + else break; + } + index++; + } else + break; + }/*for(i)*/ + }/*if(last_i < ssize)*/ + + } /*if(bps == 8)*/ + else if(bps == 16) { + step = 6 + has_alpha + has_alpha; + restx = step - 1; + + for(i = 0; i < ssize - restx ; i += step) { + int r, g, b, a = 0; + + if(index < imgsize) { + r = image->comps[0].data[index]; + g = image->comps[1].data[index]; + b = image->comps[2].data[index]; + if(has_alpha) a = image->comps[3].data[index]; + + if(sgnd) { + r += adjust; + g += adjust; + b += adjust; + if(has_alpha) a += adjust; + } + if(force16) { + r = (r<<ushift) + (r>>dshift); + g = (g<<ushift) + (g>>dshift); + b = (b<<ushift) + (b>>dshift); + if(has_alpha) a = (a<<ushift) + (a>>dshift); + } + dat8[i+0] = r;/*LSB*/ + dat8[i+1] = (r >> 8);/*MSB*/ + dat8[i+2] = g; + dat8[i+3] = (g >> 8); + dat8[i+4] = b; + dat8[i+5] = (b >> 8); + if(has_alpha) { + dat8[i+6] = a; + dat8[i+7] = (a >> 8); + } + index++; + last_i = i + step; + } else + break; + }/*for(i = 0;)*/ + + if(last_i < ssize) { + for(i = last_i ; i < ssize ; i += step) { + int r, g, b, a = 0; + + if(index < imgsize) { + r = image->comps[0].data[index]; + g = image->comps[1].data[index]; + b = image->comps[2].data[index]; + if(has_alpha) a = image->comps[3].data[index]; + + if(sgnd) { + r += adjust; + g += adjust; + b += adjust; + if(has_alpha) a += adjust; + } + if(force16) { + r = (r<<ushift) + (r>>dshift); + g = (g<<ushift) + (g>>dshift); + b = (b<<ushift) + (b>>dshift); + if(has_alpha) a = (a<<ushift) + (a>>dshift); + } + dat8[i+0] = r;/*LSB*/ + if(i+1 < ssize) dat8[i+1] = (r >> 8); + else break;/*MSB*/ + if(i+2 < ssize) dat8[i+2] = g; + else break; + if(i+3 < ssize) dat8[i+3] = (g >> 8); + else break; + if(i+4 < ssize) dat8[i+4] = b; + else break; + if(i+5 < ssize) dat8[i+5] = (b >> 8); + else break; + + if(has_alpha) { + if(i+6 < ssize) dat8[i+6] = a; + else break; + if(i+7 < ssize) dat8[i+7] = (a >> 8); + else break; + } + index++; + } else + break; + }/*for(i)*/ + }/*if(last_i < ssize)*/ + + }/*if(bps == 16)*/ + (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); + }/*for(strip = 0; )*/ + + _TIFFfree((void*)buf); + TIFFClose(tif); + + return 0; + }/*RGB(A)*/ + + if(image->numcomps == 1 /* GRAY */ + || ( image->numcomps == 2 /* GRAY_ALPHA */ + && image->comps[0].dx == image->comps[1].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[0].prec == image->comps[1].prec)) { + int step; + + has_alpha = (image->numcomps == 2); + + width = image->comps[0].w; + height = image->comps[0].h; + imgsize = width * height; + + /* Set tags */ + TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1 + has_alpha); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); + + /* Get a buffer for the data */ + strip_size = TIFFStripSize(tif); + buf = _TIFFmalloc(strip_size); + index = 0; + + for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { + unsigned char *dat8; + tsize_t i, ssize = TIFFStripSize(tif); + dat8 = (unsigned char*)buf; + + if(bps == 8) { + step = 1 + has_alpha; + + for(i=0; i < ssize; i += step) { + if(index < imgsize) { + int r, a = 0; + + r = image->comps[0].data[index]; + if(has_alpha) a = image->comps[1].data[index]; + + if(sgnd) { + r += adjust; + if(has_alpha) a += adjust; + } + dat8[i+0] = r; + if(has_alpha) dat8[i+1] = a; + index++; + } else + break; + }/*for(i )*/ + }/*if(bps == 8*/ + else if(bps == 16) { + step = 2 + has_alpha + has_alpha; + + for(i=0; i < ssize; i += step) { + if(index < imgsize) { + int r, a = 0; + + r = image->comps[0].data[index]; + if(has_alpha) a = image->comps[1].data[index]; + + if(sgnd) { + r += adjust; + if(has_alpha) a += adjust; + } + if(force16) { + r = (r<<ushift) + (r>>dshift); + if(has_alpha) a = (a<<ushift) + (a>>dshift); + } + dat8[i+0] = r;/*LSB*/ + dat8[i+1] = r >> 8;/*MSB*/ + if(has_alpha) { + dat8[i+2] = a; + dat8[i+3] = a >> 8; + } + index++; + }/*if(index < imgsize)*/ + else + break; + }/*for(i )*/ + } + (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); + }/*for(strip*/ + + _TIFFfree(buf); + TIFFClose(tif); + + return 0; + } + + TIFFClose(tif); + + fprintf(stderr,"imagetotif: Bad color format.\n" + "\tOnly RGB(A) and GRAY(A) has been implemented\n"); + fprintf(stderr,"\tFOUND: numcomps(%d)\n\tAborting\n", + image->numcomps); + + return 1; }/* imagetotif() */ /* @@ -2455,335 +2326,293 @@ int imagetotif(opj_image_t * image, const char *outfile) */ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - TIFF *tif; - tdata_t buf; - tstrip_t strip; - tsize_t strip_size; - int j, numcomps, w, h,index; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm[4]; /* RGBA */ - opj_image_t *image = NULL; - int imgsize = 0; - int has_alpha = 0; - unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; - unsigned int tiWidth, tiHeight; - - tif = TIFFOpen(filename, "r"); - - if(!tif) - { - fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename); - return 0; - } - tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0; - tiWidth = tiHeight = 0; - - TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth); - TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight); - TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps); - TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf); - TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); - TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); - TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); - w= tiWidth; - h= tiHeight; - - { - unsigned short b = tiBps, p = tiPhoto; - - if(tiBps != 8 && tiBps != 16 && tiBps != 12) b = 0; - if(tiPhoto != 1 && tiPhoto != 2) p = 0; - - if( !b || !p) - { - if( !b) - fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits" - " implemented\n",tiBps); - else - if( !p) - fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A)" - " and GRAY(A) has been implemented\n",(int) tiPhoto); - - fprintf(stderr,"\tAborting\n"); - TIFFClose(tif); + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + TIFF *tif; + tdata_t buf; + tstrip_t strip; + tsize_t strip_size; + int j, numcomps, w, h,index; + OPJ_COLOR_SPACE color_space; + opj_image_cmptparm_t cmptparm[4]; /* RGBA */ + opj_image_t *image = NULL; + int imgsize = 0; + int has_alpha = 0; + unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; + unsigned int tiWidth, tiHeight; + + tif = TIFFOpen(filename, "r"); + + if(!tif) { + fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename); + return 0; + } + tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0; + tiWidth = tiHeight = 0; + + TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth); + TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight); + TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps); + TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf); + TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); + TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); + TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); + w= tiWidth; + h= tiHeight; - return NULL; - } - } - {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */ - uint16* sampleinfo; - uint16 extrasamples; - - TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, - &extrasamples, &sampleinfo); - - if(extrasamples >= 1) - { - switch(sampleinfo[0]) - { - case EXTRASAMPLE_UNSPECIFIED: -/* Workaround for some images without correct info about alpha channel -*/ - if(tiSpp > 3) - has_alpha = 1; - break; - - case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */ - case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */ - has_alpha = 1; - break; - } - } - else /* extrasamples == 0 */ - if(tiSpp == 4 || tiSpp == 2) has_alpha = 1; - } - -/* initialize image components -*/ - memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); - - if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */ - { - numcomps = 3 + has_alpha; - color_space = CLRSPC_SRGB; - - for(j = 0; j < numcomps; j++) - { - if(parameters->cp_cinema) - { - cmptparm[j].prec = 12; - cmptparm[j].bpp = 12; - } - else - { - cmptparm[j].prec = tiBps; - cmptparm[j].bpp = tiBps; - } - cmptparm[j].dx = subsampling_dx; - cmptparm[j].dy = subsampling_dy; - cmptparm[j].w = w; - cmptparm[j].h = h; - } - - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if(!image) - { - TIFFClose(tif); - return NULL; - } -/* set image offset and reference grid -*/ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : - image->x0 + (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : - image->y0 + (h - 1) * subsampling_dy + 1; - - buf = _TIFFmalloc(TIFFStripSize(tif)); - - strip_size=TIFFStripSize(tif); - index = 0; - imgsize = image->comps[0].w * image->comps[0].h ; -/* Read the Image components -*/ - for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) - { - unsigned char *dat8; - int step; - tsize_t i, ssize; - ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); - dat8 = (unsigned char*)buf; - - if(tiBps == 16) - { - step = 6 + has_alpha + has_alpha; - - for(i = 0; i < ssize; i += step) - { - if(index < imgsize) - { - image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; /* R */ - image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; /* G */ - image->comps[2].data[index] = ( dat8[i+5] << 8 ) | dat8[i+4]; /* B */ - if(has_alpha) - image->comps[3].data[index] = ( dat8[i+7] << 8 ) | dat8[i+6]; - - if(parameters->cp_cinema) - { -/* Rounding 16 to 12 bits -*/ - image->comps[0].data[index] = - (image->comps[0].data[index] + 0x08) >> 4 ; - image->comps[1].data[index] = - (image->comps[1].data[index] + 0x08) >> 4 ; - image->comps[2].data[index] = - (image->comps[2].data[index] + 0x08) >> 4 ; - if(has_alpha) - image->comps[3].data[index] = - (image->comps[3].data[index] + 0x08) >> 4 ; - } - index++; - } - else - break; - }/*for(i = 0)*/ - }/*if(tiBps == 16)*/ - else - if(tiBps == 8) - { - step = 3 + has_alpha; - - for(i = 0; i < ssize; i += step) - { - if(index < imgsize) - { - image->comps[0].data[index] = dat8[i+0];/* R */ - image->comps[1].data[index] = dat8[i+1];/* G */ - image->comps[2].data[index] = dat8[i+2];/* B */ - if(has_alpha) - image->comps[3].data[index] = dat8[i+3]; - - if(parameters->cp_cinema) - { -/* Rounding 8 to 12 bits -*/ - image->comps[0].data[index] = image->comps[0].data[index] << 4 ; - image->comps[1].data[index] = image->comps[1].data[index] << 4 ; - image->comps[2].data[index] = image->comps[2].data[index] << 4 ; - if(has_alpha) - image->comps[3].data[index] = image->comps[3].data[index] << 4 ; - } - index++; - }/*if(index*/ - else - break; - }/*for(i )*/ - }/*if( tiBps == 8)*/ - else - if(tiBps == 12)/* CINEMA file */ - { - step = 9; - - for(i = 0; i < ssize; i += step) - { - if((index < imgsize)&(index+1 < imgsize)) - { - image->comps[0].data[index] = ( dat8[i+0]<<4 ) |(dat8[i+1]>>4); - image->comps[1].data[index] = ((dat8[i+1]& 0x0f)<< 8) | dat8[i+2]; - - image->comps[2].data[index] = ( dat8[i+3]<<4) |(dat8[i+4]>>4); - image->comps[0].data[index+1] = ((dat8[i+4]& 0x0f)<< 8) | dat8[i+5]; - - image->comps[1].data[index+1] = ( dat8[i+6] <<4) |(dat8[i+7]>>4); - image->comps[2].data[index+1] = ((dat8[i+7]& 0x0f)<< 8) | dat8[i+8]; - - index += 2; - } - else - break; - }/*for(i )*/ - } - }/*for(strip = 0; )*/ - - _TIFFfree(buf); - TIFFClose(tif); - - return image; - }/*RGB(A)*/ - - if(tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */ - { - numcomps = 1 + has_alpha; - color_space = CLRSPC_GRAY; - - for(j = 0; j < numcomps; ++j) - { - cmptparm[j].prec = tiBps; - cmptparm[j].bpp = tiBps; - cmptparm[j].dx = subsampling_dx; - cmptparm[j].dy = subsampling_dy; - cmptparm[j].w = w; - cmptparm[j].h = h; - } - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if(!image) - { - TIFFClose(tif); - return NULL; - } -/* set image offset and reference grid -*/ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : - image->x0 + (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : - image->y0 + (h - 1) * subsampling_dy + 1; - - buf = _TIFFmalloc(TIFFStripSize(tif)); - - strip_size = TIFFStripSize(tif); - index = 0; - imgsize = image->comps[0].w * image->comps[0].h ; -/* Read the Image components -*/ - for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) - { - unsigned char *dat8; - tsize_t i, ssize; - int step; - - ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); - dat8 = (unsigned char*)buf; - - if(tiBps == 16) - { - step = 2 + has_alpha + has_alpha; - - for(i = 0; i < ssize; i += step) - { - if(index < imgsize) - { - image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; - if(has_alpha) - image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; - index++; - } - else - break; - }/*for(i )*/ - } - else - if(tiBps == 8) - { - step = 1 + has_alpha; - - for(i = 0; i < ssize; i += step) - { - if(index < imgsize) - { - image->comps[0].data[index] = dat8[i+0]; - if(has_alpha) - image->comps[1].data[index] = dat8[i+1]; - index++; - } - else - break; - }/*for(i )*/ - } - }/*for(strip = 0;*/ - - _TIFFfree(buf); - TIFFClose(tif); - - }/*GRAY(A)*/ - - return image; + { + unsigned short b = tiBps, p = tiPhoto; + + if(tiBps != 8 && tiBps != 16 && tiBps != 12) b = 0; + if(tiPhoto != 1 && tiPhoto != 2) p = 0; + + if( !b || !p) { + if( !b) + fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits" + " implemented\n",tiBps); + else if( !p) + fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A)" + " and GRAY(A) has been implemented\n",(int) tiPhoto); + + fprintf(stderr,"\tAborting\n"); + TIFFClose(tif); + + return NULL; + } + } + {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */ + uint16* sampleinfo; + uint16 extrasamples; + + TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, + &extrasamples, &sampleinfo); + + if(extrasamples >= 1) { + switch(sampleinfo[0]) { + case EXTRASAMPLE_UNSPECIFIED: + /* Workaround for some images without correct info about alpha channel + */ + if(tiSpp > 3) + has_alpha = 1; + break; + + case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */ + case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */ + has_alpha = 1; + break; + } + } else /* extrasamples == 0 */ + if(tiSpp == 4 || tiSpp == 2) has_alpha = 1; + } + + /* initialize image components + */ + memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); + + if(tiPhoto == PHOTOMETRIC_RGB) { /* RGB(A) */ + numcomps = 3 + has_alpha; + color_space = CLRSPC_SRGB; + + for(j = 0; j < numcomps; j++) { + if(parameters->cp_cinema) { + cmptparm[j].prec = 12; + cmptparm[j].bpp = 12; + } else { + cmptparm[j].prec = tiBps; + cmptparm[j].bpp = tiBps; + } + cmptparm[j].dx = subsampling_dx; + cmptparm[j].dy = subsampling_dy; + cmptparm[j].w = w; + cmptparm[j].h = h; + } + + image = opj_image_create(numcomps, &cmptparm[0], color_space); + + if(!image) { + TIFFClose(tif); + return NULL; + } + /* set image offset and reference grid + */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : + image->x0 + (w - 1) * subsampling_dx + 1; + image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : + image->y0 + (h - 1) * subsampling_dy + 1; + + buf = _TIFFmalloc(TIFFStripSize(tif)); + + strip_size=TIFFStripSize(tif); + index = 0; + imgsize = image->comps[0].w * image->comps[0].h ; + /* Read the Image components + */ + for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { + unsigned char *dat8; + int step; + tsize_t i, ssize; + ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); + dat8 = (unsigned char*)buf; + + if(tiBps == 16) { + step = 6 + has_alpha + has_alpha; + + for(i = 0; i < ssize; i += step) { + if(index < imgsize) { + image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; /* R */ + image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; /* G */ + image->comps[2].data[index] = ( dat8[i+5] << 8 ) | dat8[i+4]; /* B */ + if(has_alpha) + image->comps[3].data[index] = ( dat8[i+7] << 8 ) | dat8[i+6]; + + if(parameters->cp_cinema) { + /* Rounding 16 to 12 bits + */ + image->comps[0].data[index] = + (image->comps[0].data[index] + 0x08) >> 4 ; + image->comps[1].data[index] = + (image->comps[1].data[index] + 0x08) >> 4 ; + image->comps[2].data[index] = + (image->comps[2].data[index] + 0x08) >> 4 ; + if(has_alpha) + image->comps[3].data[index] = + (image->comps[3].data[index] + 0x08) >> 4 ; + } + index++; + } else + break; + }/*for(i = 0)*/ + }/*if(tiBps == 16)*/ + else if(tiBps == 8) { + step = 3 + has_alpha; + + for(i = 0; i < ssize; i += step) { + if(index < imgsize) { + image->comps[0].data[index] = dat8[i+0];/* R */ + image->comps[1].data[index] = dat8[i+1];/* G */ + image->comps[2].data[index] = dat8[i+2];/* B */ + if(has_alpha) + image->comps[3].data[index] = dat8[i+3]; + + if(parameters->cp_cinema) { + /* Rounding 8 to 12 bits + */ + image->comps[0].data[index] = image->comps[0].data[index] << 4 ; + image->comps[1].data[index] = image->comps[1].data[index] << 4 ; + image->comps[2].data[index] = image->comps[2].data[index] << 4 ; + if(has_alpha) + image->comps[3].data[index] = image->comps[3].data[index] << 4 ; + } + index++; + }/*if(index*/ + else + break; + }/*for(i )*/ + }/*if( tiBps == 8)*/ + else if(tiBps == 12) { /* CINEMA file */ + step = 9; + + for(i = 0; i < ssize; i += step) { + if((index < imgsize)&(index+1 < imgsize)) { + image->comps[0].data[index] = ( dat8[i+0]<<4 ) |(dat8[i+1]>>4); + image->comps[1].data[index] = ((dat8[i+1]& 0x0f)<< 8) | dat8[i+2]; + + image->comps[2].data[index] = ( dat8[i+3]<<4) |(dat8[i+4]>>4); + image->comps[0].data[index+1] = ((dat8[i+4]& 0x0f)<< 8) | dat8[i+5]; + + image->comps[1].data[index+1] = ( dat8[i+6] <<4) |(dat8[i+7]>>4); + image->comps[2].data[index+1] = ((dat8[i+7]& 0x0f)<< 8) | dat8[i+8]; + + index += 2; + } else + break; + }/*for(i )*/ + } + }/*for(strip = 0; )*/ + + _TIFFfree(buf); + TIFFClose(tif); + + return image; + }/*RGB(A)*/ + + if(tiPhoto == PHOTOMETRIC_MINISBLACK) { /* GRAY(A) */ + numcomps = 1 + has_alpha; + color_space = CLRSPC_GRAY; + + for(j = 0; j < numcomps; ++j) { + cmptparm[j].prec = tiBps; + cmptparm[j].bpp = tiBps; + cmptparm[j].dx = subsampling_dx; + cmptparm[j].dy = subsampling_dy; + cmptparm[j].w = w; + cmptparm[j].h = h; + } + image = opj_image_create(numcomps, &cmptparm[0], color_space); + + if(!image) { + TIFFClose(tif); + return NULL; + } + /* set image offset and reference grid + */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : + image->x0 + (w - 1) * subsampling_dx + 1; + image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : + image->y0 + (h - 1) * subsampling_dy + 1; + + buf = _TIFFmalloc(TIFFStripSize(tif)); + + strip_size = TIFFStripSize(tif); + index = 0; + imgsize = image->comps[0].w * image->comps[0].h ; + /* Read the Image components + */ + for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { + unsigned char *dat8; + tsize_t i, ssize; + int step; + + ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); + dat8 = (unsigned char*)buf; + + if(tiBps == 16) { + step = 2 + has_alpha + has_alpha; + + for(i = 0; i < ssize; i += step) { + if(index < imgsize) { + image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; + if(has_alpha) + image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; + index++; + } else + break; + }/*for(i )*/ + } else if(tiBps == 8) { + step = 1 + has_alpha; + + for(i = 0; i < ssize; i += step) { + if(index < imgsize) { + image->comps[0].data[index] = dat8[i+0]; + if(has_alpha) + image->comps[1].data[index] = dat8[i+1]; + index++; + } else + break; + }/*for(i )*/ + } + }/*for(strip = 0;*/ + + _TIFFfree(buf); + TIFFClose(tif); + + }/*GRAY(A)*/ + + return image; }/* tiftoimage() */ @@ -2795,246 +2624,227 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) <<-- <<-- <<-- <<-- */ -opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) { - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - FILE *f = NULL; - int i, compno, numcomps, w, h; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t *cmptparm; - opj_image_t * image = NULL; - unsigned short ch; - - if((! (raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & raw_cp->rawBitDepth)) == 0) - { - fprintf(stderr,"\nError: invalid raw image parameters\n"); - fprintf(stderr,"Please use the Format option -F:\n"); - fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); - fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); - fprintf(stderr,"Aborting\n"); - return NULL; - } - - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - fprintf(stderr,"Aborting\n"); - return NULL; - } - numcomps = raw_cp->rawComp; - color_space = CLRSPC_SRGB; - w = raw_cp->rawWidth; - h = raw_cp->rawHeight; - cmptparm = (opj_image_cmptparm_t*) malloc(numcomps * sizeof(opj_image_cmptparm_t)); - - /* initialize image components */ - memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); - for(i = 0; i < numcomps; i++) { - cmptparm[i].prec = raw_cp->rawBitDepth; - cmptparm[i].bpp = raw_cp->rawBitDepth; - cmptparm[i].sgnd = raw_cp->rawSigned; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if(!image) { - fclose(f); - return NULL; - } - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; - image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; - - if(raw_cp->rawBitDepth <= 8) - { - unsigned char value = 0; - for(compno = 0; compno < numcomps; compno++) { - for (i = 0; i < w * h; i++) { - if (!fread(&value, 1, 1, f)) { - fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); - fclose(f); - return NULL; - } - image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value; - } - } - } - else if(raw_cp->rawBitDepth <= 16) - { - unsigned short value; - for(compno = 0; compno < numcomps; compno++) { - for (i = 0; i < w * h; i++) { - unsigned char temp; - if (!fread(&temp, 1, 1, f)) { - fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); - fclose(f); - return NULL; - } - value = temp << 8; - if (!fread(&temp, 1, 1, f)) { - fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); - fclose(f); - return NULL; - } - value += temp; - image->comps[compno].data[i] = raw_cp->rawSigned?(short)value:value; - } - } - } - else { - fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n"); - fclose(f); - return NULL; - } - - if (fread(&ch, 1, 1, f)) { - fprintf(stderr,"Warning. End of raw file not reached... processing anyway\n"); - } - fclose(f); - - return image; +opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) +{ + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + + FILE *f = NULL; + int i, compno, numcomps, w, h; + OPJ_COLOR_SPACE color_space; + opj_image_cmptparm_t *cmptparm; + opj_image_t * image = NULL; + unsigned short ch; + + if((! (raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & raw_cp->rawBitDepth)) == 0) { + fprintf(stderr,"\nError: invalid raw image parameters\n"); + fprintf(stderr,"Please use the Format option -F:\n"); + fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); + fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); + fprintf(stderr,"Aborting\n"); + return NULL; + } + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "Failed to open %s for reading !!\n", filename); + fprintf(stderr,"Aborting\n"); + return NULL; + } + numcomps = raw_cp->rawComp; + color_space = CLRSPC_SRGB; + w = raw_cp->rawWidth; + h = raw_cp->rawHeight; + cmptparm = (opj_image_cmptparm_t*) malloc(numcomps * sizeof(opj_image_cmptparm_t)); + + /* initialize image components */ + memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); + for(i = 0; i < numcomps; i++) { + cmptparm[i].prec = raw_cp->rawBitDepth; + cmptparm[i].bpp = raw_cp->rawBitDepth; + cmptparm[i].sgnd = raw_cp->rawSigned; + cmptparm[i].dx = subsampling_dx; + cmptparm[i].dy = subsampling_dy; + cmptparm[i].w = w; + cmptparm[i].h = h; + } + /* create the image */ + image = opj_image_create(numcomps, &cmptparm[0], color_space); + if(!image) { + fclose(f); + return NULL; + } + /* set image offset and reference grid */ + image->x0 = parameters->image_offset_x0; + image->y0 = parameters->image_offset_y0; + image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; + image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; + + if(raw_cp->rawBitDepth <= 8) { + unsigned char value = 0; + for(compno = 0; compno < numcomps; compno++) { + for (i = 0; i < w * h; i++) { + if (!fread(&value, 1, 1, f)) { + fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); + fclose(f); + return NULL; + } + image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value; + } + } + } else if(raw_cp->rawBitDepth <= 16) { + unsigned short value; + for(compno = 0; compno < numcomps; compno++) { + for (i = 0; i < w * h; i++) { + unsigned char temp; + if (!fread(&temp, 1, 1, f)) { + fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); + fclose(f); + return NULL; + } + value = temp << 8; + if (!fread(&temp, 1, 1, f)) { + fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); + fclose(f); + return NULL; + } + value += temp; + image->comps[compno].data[i] = raw_cp->rawSigned?(short)value:value; + } + } + } else { + fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n"); + fclose(f); + return NULL; + } + + if (fread(&ch, 1, 1, f)) { + fprintf(stderr,"Warning. End of raw file not reached... processing anyway\n"); + } + fclose(f); + + return image; } int imagetoraw(opj_image_t * image, const char *outfile) { - FILE *rawFile = NULL; - size_t res; - int compno; - int w, h; - int line, row; - int *ptr; - - if((image->numcomps * image->x1 * image->y1) == 0) - { - fprintf(stderr,"\nError: invalid raw image parameters\n"); - return 1; - } - - rawFile = fopen(outfile, "wb"); - if (!rawFile) { - fprintf(stderr, "Failed to open %s for writing !!\n", outfile); - return 1; - } - - fprintf(stdout,"Raw image characteristics: %d components\n", image->numcomps); - - for(compno = 0; compno < image->numcomps; compno++) - { - fprintf(stdout,"Component %d characteristics: %dx%dx%d %s\n", compno, image->comps[compno].w, - image->comps[compno].h, image->comps[compno].prec, image->comps[compno].sgnd==1 ? "signed": "unsigned"); - - w = image->comps[compno].w; - h = image->comps[compno].h; - - if(image->comps[compno].prec <= 8) - { - if(image->comps[compno].sgnd == 1) - { - signed char curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for(row = 0; row < w; row++) { - curr = (signed char) (*ptr & mask); - res = fwrite(&curr, sizeof(signed char), 1, rawFile); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } - else if(image->comps[compno].sgnd == 0) - { - unsigned char curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for(row = 0; row < w; row++) { - curr = (unsigned char) (*ptr & mask); - res = fwrite(&curr, sizeof(unsigned char), 1, rawFile); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } - } - else if(image->comps[compno].prec <= 16) - { - if(image->comps[compno].sgnd == 1) - { - signed short int curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for(row = 0; row < w; row++) { - unsigned char temp; - curr = (signed short int) (*ptr & mask); - temp = (unsigned char) (curr >> 8); - res = fwrite(&temp, 1, 1, rawFile); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - temp = (unsigned char) curr; - res = fwrite(&temp, 1, 1, rawFile); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } - else if(image->comps[compno].sgnd == 0) - { - unsigned short int curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for(row = 0; row < w; row++) { - unsigned char temp; - curr = (unsigned short int) (*ptr & mask); - temp = (unsigned char) (curr >> 8); - res = fwrite(&temp, 1, 1, rawFile); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; + FILE *rawFile = NULL; + size_t res; + int compno; + int w, h; + int line, row; + int *ptr; + + if((image->numcomps * image->x1 * image->y1) == 0) { + fprintf(stderr,"\nError: invalid raw image parameters\n"); + return 1; + } + + rawFile = fopen(outfile, "wb"); + if (!rawFile) { + fprintf(stderr, "Failed to open %s for writing !!\n", outfile); + return 1; + } + + fprintf(stdout,"Raw image characteristics: %d components\n", image->numcomps); + + for(compno = 0; compno < image->numcomps; compno++) { + fprintf(stdout,"Component %d characteristics: %dx%dx%d %s\n", compno, image->comps[compno].w, + image->comps[compno].h, image->comps[compno].prec, image->comps[compno].sgnd==1 ? "signed": "unsigned"); + + w = image->comps[compno].w; + h = image->comps[compno].h; + + if(image->comps[compno].prec <= 8) { + if(image->comps[compno].sgnd == 1) { + signed char curr; + int mask = (1 << image->comps[compno].prec) - 1; + ptr = image->comps[compno].data; + for (line = 0; line < h; line++) { + for(row = 0; row < w; row++) { + curr = (signed char) (*ptr & mask); + res = fwrite(&curr, sizeof(signed char), 1, rawFile); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + ptr++; + } + } + } else if(image->comps[compno].sgnd == 0) { + unsigned char curr; + int mask = (1 << image->comps[compno].prec) - 1; + ptr = image->comps[compno].data; + for (line = 0; line < h; line++) { + for(row = 0; row < w; row++) { + curr = (unsigned char) (*ptr & mask); + res = fwrite(&curr, sizeof(unsigned char), 1, rawFile); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + ptr++; + } + } } - temp = (unsigned char) curr; - res = fwrite(&temp, 1, 1, rawFile); - if( res < 1 ) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; + } else if(image->comps[compno].prec <= 16) { + if(image->comps[compno].sgnd == 1) { + signed short int curr; + int mask = (1 << image->comps[compno].prec) - 1; + ptr = image->comps[compno].data; + for (line = 0; line < h; line++) { + for(row = 0; row < w; row++) { + unsigned char temp; + curr = (signed short int) (*ptr & mask); + temp = (unsigned char) (curr >> 8); + res = fwrite(&temp, 1, 1, rawFile); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + temp = (unsigned char) curr; + res = fwrite(&temp, 1, 1, rawFile); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + ptr++; + } + } + } else if(image->comps[compno].sgnd == 0) { + unsigned short int curr; + int mask = (1 << image->comps[compno].prec) - 1; + ptr = image->comps[compno].data; + for (line = 0; line < h; line++) { + for(row = 0; row < w; row++) { + unsigned char temp; + curr = (unsigned short int) (*ptr & mask); + temp = (unsigned char) (curr >> 8); + res = fwrite(&temp, 1, 1, rawFile); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + temp = (unsigned char) curr; + res = fwrite(&temp, 1, 1, rawFile); + if( res < 1 ) { + fprintf(stderr, "failed to write 1 byte for %s\n", outfile); + return 1; + } + ptr++; + } + } } - ptr++; - } - } - } - } - else if (image->comps[compno].prec <= 32) - { - fprintf(stderr,"More than 16 bits per component no handled yet\n"); - return 1; - } - else - { - fprintf(stderr,"Error: invalid precision: %d\n", image->comps[compno].prec); - return 1; - } - } - fclose(rawFile); - return 0; + } else if (image->comps[compno].prec <= 32) { + fprintf(stderr,"More than 16 bits per component no handled yet\n"); + return 1; + } else { + fprintf(stderr,"Error: invalid precision: %d\n", image->comps[compno].prec); + return 1; + } + } + fclose(rawFile); + return 0; } #ifdef OPJ_HAVE_LIBPNG @@ -3045,529 +2855,546 @@ int imagetoraw(opj_image_t * image, const char *outfile) opj_image_t *pngtoimage(const char *read_idf, opj_cparameters_t * params) { - png_structp png; - png_infop info; - double gamma, display_exponent; - int bit_depth, interlace_type,compression_type, filter_type; - int unit; - png_uint_32 resx, resy; - unsigned int i, j; - png_uint_32 width, height; - int color_type, has_alpha, is16; - unsigned char *s; - FILE *reader; - unsigned char **rows; -/* j2k: */ - opj_image_t *image; - opj_image_cmptparm_t cmptparm[4]; - int sub_dx, sub_dy; - unsigned int nr_comp; - int *r, *g, *b, *a; - unsigned char sigbuf[8]; - - if((reader = fopen(read_idf, "rb")) == NULL) - { - fprintf(stderr,"pngtoimage: can not open %s\n",read_idf); - return NULL; - } - image = NULL; png = NULL; rows = NULL; - - if(fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE - || memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0) - { - fprintf(stderr,"pngtoimage: %s is no valid PNG file\n",read_idf); - goto fin; - } -/* libpng-VERSION/example.c: - * PC : screen_gamma = 2.2; - * Mac: screen_gamma = 1.7 or 1.0; -*/ - display_exponent = 2.2; + png_structp png; + png_infop info; + double gamma, display_exponent; + int bit_depth, interlace_type,compression_type, filter_type; + int unit; + png_uint_32 resx, resy; + unsigned int i, j; + png_uint_32 width, height; + int color_type, has_alpha, is16; + unsigned char *s; + FILE *reader; + unsigned char **rows; + /* j2k: */ + opj_image_t *image; + opj_image_cmptparm_t cmptparm[4]; + int sub_dx, sub_dy; + unsigned int nr_comp; + int *r, *g, *b, *a; + unsigned char sigbuf[8]; + + if((reader = fopen(read_idf, "rb")) == NULL) { + fprintf(stderr,"pngtoimage: can not open %s\n",read_idf); + return NULL; + } + image = NULL; + png = NULL; + rows = NULL; + + if(fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE + || memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0) { + fprintf(stderr,"pngtoimage: %s is no valid PNG file\n",read_idf); + goto fin; + } + /* libpng-VERSION/example.c: + * PC : screen_gamma = 2.2; + * Mac: screen_gamma = 1.7 or 1.0; + */ + display_exponent = 2.2; - if((png = png_create_read_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL)) == NULL) - goto fin; - if((info = png_create_info_struct(png)) == NULL) - goto fin; + if((png = png_create_read_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL)) == NULL) + goto fin; + if((info = png_create_info_struct(png)) == NULL) + goto fin; - if(setjmp(png_jmpbuf(png))) - goto fin; + if(setjmp(png_jmpbuf(png))) + goto fin; - png_init_io(png, reader); - png_set_sig_bytes(png, MAGIC_SIZE); + png_init_io(png, reader); + png_set_sig_bytes(png, MAGIC_SIZE); - png_read_info(png, info); + png_read_info(png, info); - if(png_get_IHDR(png, info, &width, &height, - &bit_depth, &color_type, &interlace_type, - &compression_type, &filter_type) == 0) - goto fin; + if(png_get_IHDR(png, info, &width, &height, + &bit_depth, &color_type, &interlace_type, + &compression_type, &filter_type) == 0) + goto fin; -/* png_set_expand(): - * expand paletted images to RGB, expand grayscale images of - * less than 8-bit depth to 8-bit depth, and expand tRNS chunks - * to alpha channels. -*/ - if(color_type == PNG_COLOR_TYPE_PALETTE) - png_set_expand(png); - else - if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) - png_set_expand(png); + /* png_set_expand(): + * expand paletted images to RGB, expand grayscale images of + * less than 8-bit depth to 8-bit depth, and expand tRNS chunks + * to alpha channels. + */ + if(color_type == PNG_COLOR_TYPE_PALETTE) + png_set_expand(png); + else if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand(png); - if(png_get_valid(png, info, PNG_INFO_tRNS)) - png_set_expand(png); + if(png_get_valid(png, info, PNG_INFO_tRNS)) + png_set_expand(png); - is16 = (bit_depth == 16); + is16 = (bit_depth == 16); -/* GRAY => RGB; GRAY_ALPHA => RGBA -*/ - if(color_type == PNG_COLOR_TYPE_GRAY - || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - png_set_gray_to_rgb(png); - color_type = - (color_type == PNG_COLOR_TYPE_GRAY? PNG_COLOR_TYPE_RGB: - PNG_COLOR_TYPE_RGB_ALPHA); - } - if( !png_get_gAMA(png, info, &gamma)) - gamma = 0.45455; + /* GRAY => RGB; GRAY_ALPHA => RGBA + */ + if(color_type == PNG_COLOR_TYPE_GRAY + || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { + png_set_gray_to_rgb(png); + color_type = + (color_type == PNG_COLOR_TYPE_GRAY? PNG_COLOR_TYPE_RGB: + PNG_COLOR_TYPE_RGB_ALPHA); + } + if( !png_get_gAMA(png, info, &gamma)) + gamma = 0.45455; - png_set_gamma(png, display_exponent, gamma); + png_set_gamma(png, display_exponent, gamma); - png_read_update_info(png, info); + png_read_update_info(png, info); - png_get_pHYs(png, info, &resx, &resy, &unit); + png_get_pHYs(png, info, &resx, &resy, &unit); - color_type = png_get_color_type(png, info); + color_type = png_get_color_type(png, info); - has_alpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA); + has_alpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA); - nr_comp = 3 + has_alpha; + nr_comp = 3 + has_alpha; - bit_depth = png_get_bit_depth(png, info); + bit_depth = png_get_bit_depth(png, info); - rows = (unsigned char**)calloc(height+1, sizeof(unsigned char*)); - for(i = 0; i < height; ++i) - rows[i] = (unsigned char*)malloc(png_get_rowbytes(png,info)); + rows = (unsigned char**)calloc(height+1, sizeof(unsigned char*)); + for(i = 0; i < height; ++i) + rows[i] = (unsigned char*)malloc(png_get_rowbytes(png,info)); - png_read_image(png, rows); + png_read_image(png, rows); - memset(&cmptparm, 0, 4 * sizeof(opj_image_cmptparm_t)); + memset(&cmptparm, 0, 4 * sizeof(opj_image_cmptparm_t)); - sub_dx = params->subsampling_dx; sub_dy = params->subsampling_dy; + sub_dx = params->subsampling_dx; + sub_dy = params->subsampling_dy; - for(i = 0; i < nr_comp; ++i) - { - cmptparm[i].prec = bit_depth; -/* bits_per_pixel: 8 or 16 */ - cmptparm[i].bpp = bit_depth; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = sub_dx; - cmptparm[i].dy = sub_dy; - cmptparm[i].w = width; - cmptparm[i].h = height; - } + for(i = 0; i < nr_comp; ++i) { + cmptparm[i].prec = bit_depth; + /* bits_per_pixel: 8 or 16 */ + cmptparm[i].bpp = bit_depth; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = sub_dx; + cmptparm[i].dy = sub_dy; + cmptparm[i].w = width; + cmptparm[i].h = height; + } - image = opj_image_create(nr_comp, &cmptparm[0], CLRSPC_SRGB); + image = opj_image_create(nr_comp, &cmptparm[0], CLRSPC_SRGB); - if(image == NULL) goto fin; + if(image == NULL) goto fin; image->x0 = params->image_offset_x0; image->y0 = params->image_offset_y0; image->x1 = image->x0 + (width - 1) * sub_dx + 1 + image->x0; image->y1 = image->y0 + (height - 1) * sub_dy + 1 + image->y0; - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - a = image->comps[3].data; - - for(i = 0; i < height; ++i) - { - s = rows[i]; - - for(j = 0; j < width; ++j) - { - if(is16) - { - *r++ = s[0]<<8|s[1]; s += 2; - - *g++ = s[0]<<8|s[1]; s += 2; - - *b++ = s[0]<<8|s[1]; s += 2; - - if(has_alpha) { *a++ = s[0]<<8|s[1]; s += 2; } - - continue; - } - *r++ = *s++; *g++ = *s++; *b++ = *s++; - - if(has_alpha) *a++ = *s++; - } - } + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + a = image->comps[3].data; + + for(i = 0; i < height; ++i) { + s = rows[i]; + + for(j = 0; j < width; ++j) { + if(is16) { + *r++ = s[0]<<8|s[1]; + s += 2; + + *g++ = s[0]<<8|s[1]; + s += 2; + + *b++ = s[0]<<8|s[1]; + s += 2; + + if(has_alpha) { + *a++ = s[0]<<8|s[1]; + s += 2; + } + + continue; + } + *r++ = *s++; + *g++ = *s++; + *b++ = *s++; + + if(has_alpha) *a++ = *s++; + } + } fin: - if(rows) - { - for(i = 0; i < height; ++i) - free(rows[i]); - free(rows); - } - if(png) - png_destroy_read_struct(&png, &info, NULL); + if(rows) { + for(i = 0; i < height; ++i) + free(rows[i]); + free(rows); + } + if(png) + png_destroy_read_struct(&png, &info, NULL); - fclose(reader); + fclose(reader); - return image; + return image; }/* pngtoimage() */ int imagetopng(opj_image_t * image, const char *write_idf) { - FILE *writer; - png_structp png; - png_infop info; - int *red, *green, *blue, *alpha; - unsigned char *row_buf, *d; - int has_alpha, width, height, nr_comp, color_type; - int adjustR, adjustG, adjustB, adjustA, x, y, fails; - int prec, ushift, dshift, is16, force16, force8; - unsigned short mask = 0xffff; - png_color_8 sig_bit; - - is16 = force16 = force8 = ushift = dshift = 0; fails = 1; - prec = image->comps[0].prec; - nr_comp = image->numcomps; - - if(prec > 8 && prec < 16) - { - ushift = 16 - prec; dshift = prec - ushift; - prec = 16; force16 = 1; - } - else - if(prec < 8 && nr_comp > 1)/* GRAY_ALPHA, RGB, RGB_ALPHA */ - { - ushift = 8 - prec; dshift = 8 - ushift; - prec = 8; force8 = 1; - } - - if(prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16) - { - fprintf(stderr,"imagetopng: can not create %s" - "\n\twrong bit_depth %d\n", write_idf, prec); - return fails; - } - writer = fopen(write_idf, "wb"); - - if(writer == NULL) return fails; - - info = NULL; has_alpha = 0; - -/* Create and initialize the png_struct with the desired error handler - * functions. If you want to use the default stderr and longjump method, - * you can supply NULL for the last three parameters. We also check that - * the library version is compatible with the one used at compile time, - * in case we are using dynamically linked libraries. REQUIRED. -*/ - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); -/*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */ + FILE *writer; + png_structp png; + png_infop info; + int *red, *green, *blue, *alpha; + unsigned char *row_buf, *d; + int has_alpha, width, height, nr_comp, color_type; + int adjustR, adjustG, adjustB, adjustA, x, y, fails; + int prec, ushift, dshift, is16, force16, force8; + unsigned short mask = 0xffff; + png_color_8 sig_bit; + + is16 = force16 = force8 = ushift = dshift = 0; + fails = 1; + prec = image->comps[0].prec; + nr_comp = image->numcomps; + + if(prec > 8 && prec < 16) { + ushift = 16 - prec; + dshift = prec - ushift; + prec = 16; + force16 = 1; + } else if(prec < 8 && nr_comp > 1) { /* GRAY_ALPHA, RGB, RGB_ALPHA */ + ushift = 8 - prec; + dshift = 8 - ushift; + prec = 8; + force8 = 1; + } - if(png == NULL) goto fin; + if(prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16) { + fprintf(stderr,"imagetopng: can not create %s" + "\n\twrong bit_depth %d\n", write_idf, prec); + return fails; + } + writer = fopen(write_idf, "wb"); -/* Allocate/initialize the image information data. REQUIRED -*/ - info = png_create_info_struct(png); + if(writer == NULL) return fails; - if(info == NULL) goto fin; + info = NULL; + has_alpha = 0; -/* Set error handling. REQUIRED if you are not supplying your own - * error handling functions in the png_create_write_struct() call. -*/ - if(setjmp(png_jmpbuf(png))) goto fin; + /* Create and initialize the png_struct with the desired error handler + * functions. If you want to use the default stderr and longjump method, + * you can supply NULL for the last three parameters. We also check that + * the library version is compatible with the one used at compile time, + * in case we are using dynamically linked libraries. REQUIRED. + */ + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + /*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */ -/* I/O initialization functions is REQUIRED -*/ - png_init_io(png, writer); - -/* Set the image information here. Width and height are up to 2^31, - * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on - * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, - * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, - * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or - * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST - * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. - * REQUIRED - * - * ERRORS: - * - * color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8 - * color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8 - * color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8 - * color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8 - * -*/ - png_set_compression_level(png, Z_BEST_COMPRESSION); - - if(prec == 16) mask = 0xffff; - else - if(prec == 8) mask = 0x00ff; - else - if(prec == 4) mask = 0x000f; - else - if(prec == 2) mask = 0x0003; - else - if(prec == 1) mask = 0x0001; - - if(nr_comp >= 3 - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec) - { - int v; - - has_alpha = (nr_comp > 3); - - is16 = (prec == 16); - - width = image->comps[0].w; - height = image->comps[0].h; + if(png == NULL) goto fin; - red = image->comps[0].data; - green = image->comps[1].data; - blue = image->comps[2].data; - - sig_bit.red = sig_bit.green = sig_bit.blue = prec; - - if(has_alpha) - { - sig_bit.alpha = prec; - alpha = image->comps[3].data; - color_type = PNG_COLOR_TYPE_RGB_ALPHA; - adjustA = (image->comps[3].sgnd ? 1 << (image->comps[3].prec - 1) : 0); - } - else - { - sig_bit.alpha = 0; alpha = NULL; - color_type = PNG_COLOR_TYPE_RGB; - adjustA = 0; - } - png_set_sBIT(png, info, &sig_bit); - - png_set_IHDR(png, info, width, height, prec, - color_type, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); -/*=============================*/ - png_write_info(png, info); -/*=============================*/ - if(prec < 8) - { - png_set_packing(png); - } - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); + /* Allocate/initialize the image information data. REQUIRED + */ + info = png_create_info_struct(png); - row_buf = (unsigned char*)malloc(width * nr_comp * 2); + if(info == NULL) goto fin; - for(y = 0; y < height; ++y) - { - d = row_buf; + /* Set error handling. REQUIRED if you are not supplying your own + * error handling functions in the png_create_write_struct() call. + */ + if(setjmp(png_jmpbuf(png))) goto fin; - for(x = 0; x < width; ++x) - { - if(is16) - { - v = *red + adjustR; ++red; - - if(force16) { v = (v<<ushift) + (v>>dshift); } + /* I/O initialization functions is REQUIRED + */ + png_init_io(png, writer); + + /* Set the image information here. Width and height are up to 2^31, + * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on + * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, + * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, + * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or + * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST + * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. + * REQUIRED + * + * ERRORS: + * + * color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8 + * color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8 + * color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8 + * color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8 + * + */ + png_set_compression_level(png, Z_BEST_COMPRESSION); + + if(prec == 16) mask = 0xffff; + else if(prec == 8) mask = 0x00ff; + else if(prec == 4) mask = 0x000f; + else if(prec == 2) mask = 0x0003; + else if(prec == 1) mask = 0x0001; + + if(nr_comp >= 3 + && image->comps[0].dx == image->comps[1].dx + && image->comps[1].dx == image->comps[2].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[1].dy == image->comps[2].dy + && image->comps[0].prec == image->comps[1].prec + && image->comps[1].prec == image->comps[2].prec) { + int v; + + has_alpha = (nr_comp > 3); + + is16 = (prec == 16); + + width = image->comps[0].w; + height = image->comps[0].h; + + red = image->comps[0].data; + green = image->comps[1].data; + blue = image->comps[2].data; + + sig_bit.red = sig_bit.green = sig_bit.blue = prec; + + if(has_alpha) { + sig_bit.alpha = prec; + alpha = image->comps[3].data; + color_type = PNG_COLOR_TYPE_RGB_ALPHA; + adjustA = (image->comps[3].sgnd ? 1 << (image->comps[3].prec - 1) : 0); + } else { + sig_bit.alpha = 0; + alpha = NULL; + color_type = PNG_COLOR_TYPE_RGB; + adjustA = 0; + } + png_set_sBIT(png, info, &sig_bit); + + png_set_IHDR(png, info, width, height, prec, + color_type, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + /*=============================*/ + png_write_info(png, info); + /*=============================*/ + if(prec < 8) { + png_set_packing(png); + } + adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); + adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; + row_buf = (unsigned char*)malloc(width * nr_comp * 2); - v = *green + adjustG; ++green; - - if(force16) { v = (v<<ushift) + (v>>dshift); } + for(y = 0; y < height; ++y) { + d = row_buf; - *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; + for(x = 0; x < width; ++x) { + if(is16) { + v = *red + adjustR; + ++red; - v = *blue + adjustB; ++blue; - - if(force16) { v = (v<<ushift) + (v>>dshift); } + if(force16) { + v = (v<<ushift) + (v>>dshift); + } - *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; + *d++ = (unsigned char)(v>>8); + *d++ = (unsigned char)v; - if(has_alpha) - { - v = *alpha + adjustA; ++alpha; - - if(force16) { v = (v<<ushift) + (v>>dshift); } + v = *green + adjustG; + ++green; - *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; - } - continue; - }/* if(is16) */ + if(force16) { + v = (v<<ushift) + (v>>dshift); + } - v = *red + adjustR; ++red; + *d++ = (unsigned char)(v>>8); + *d++ = (unsigned char)v; - if(force8) { v = (v<<ushift) + (v>>dshift); } + v = *blue + adjustB; + ++blue; - *d++ = (unsigned char)(v & mask); + if(force16) { + v = (v<<ushift) + (v>>dshift); + } - v = *green + adjustG; ++green; + *d++ = (unsigned char)(v>>8); + *d++ = (unsigned char)v; - if(force8) { v = (v<<ushift) + (v>>dshift); } + if(has_alpha) { + v = *alpha + adjustA; + ++alpha; - *d++ = (unsigned char)(v & mask); + if(force16) { + v = (v<<ushift) + (v>>dshift); + } - v = *blue + adjustB; ++blue; + *d++ = (unsigned char)(v>>8); + *d++ = (unsigned char)v; + } + continue; + }/* if(is16) */ - if(force8) { v = (v<<ushift) + (v>>dshift); } + v = *red + adjustR; + ++red; - *d++ = (unsigned char)(v & mask); + if(force8) { + v = (v<<ushift) + (v>>dshift); + } - if(has_alpha) - { - v = *alpha + adjustA; ++alpha; + *d++ = (unsigned char)(v & mask); - if(force8) { v = (v<<ushift) + (v>>dshift); } + v = *green + adjustG; + ++green; - *d++ = (unsigned char)(v & mask); - } - } /* for(x) */ + if(force8) { + v = (v<<ushift) + (v>>dshift); + } - png_write_row(png, row_buf); + *d++ = (unsigned char)(v & mask); - } /* for(y) */ - free(row_buf); + v = *blue + adjustB; + ++blue; - }/* nr_comp >= 3 */ - else - if(nr_comp == 1 /* GRAY */ - || ( nr_comp == 2 /* GRAY_ALPHA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[0].prec == image->comps[1].prec)) - { - int v; + if(force8) { + v = (v<<ushift) + (v>>dshift); + } - red = image->comps[0].data; + *d++ = (unsigned char)(v & mask); - sig_bit.gray = prec; - sig_bit.red = sig_bit.green = sig_bit.blue = sig_bit.alpha = 0; - alpha = NULL; adjustA = 0; - color_type = PNG_COLOR_TYPE_GRAY; + if(has_alpha) { + v = *alpha + adjustA; + ++alpha; - if(nr_comp == 2) - { - has_alpha = 1; sig_bit.alpha = prec; - alpha = image->comps[1].data; - color_type = PNG_COLOR_TYPE_GRAY_ALPHA; - adjustA = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - } - width = image->comps[0].w; - height = image->comps[0].h; + if(force8) { + v = (v<<ushift) + (v>>dshift); + } - png_set_IHDR(png, info, width, height, sig_bit.gray, - color_type, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + *d++ = (unsigned char)(v & mask); + } + } /* for(x) */ - png_set_sBIT(png, info, &sig_bit); -/*=============================*/ - png_write_info(png, info); -/*=============================*/ - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + png_write_row(png, row_buf); - if(prec < 8) - { - png_set_packing(png); - } + } /* for(y) */ + free(row_buf); - if(prec > 8) - { - row_buf = (unsigned char*) - malloc(width * nr_comp * sizeof(unsigned short)); + }/* nr_comp >= 3 */ + else if(nr_comp == 1 /* GRAY */ + || ( nr_comp == 2 /* GRAY_ALPHA */ + && image->comps[0].dx == image->comps[1].dx + && image->comps[0].dy == image->comps[1].dy + && image->comps[0].prec == image->comps[1].prec)) { + int v; - for(y = 0; y < height; ++y) - { - d = row_buf; + red = image->comps[0].data; - for(x = 0; x < width; ++x) - { - v = *red + adjustR; ++red; + sig_bit.gray = prec; + sig_bit.red = sig_bit.green = sig_bit.blue = sig_bit.alpha = 0; + alpha = NULL; + adjustA = 0; + color_type = PNG_COLOR_TYPE_GRAY; + + if(nr_comp == 2) { + has_alpha = 1; + sig_bit.alpha = prec; + alpha = image->comps[1].data; + color_type = PNG_COLOR_TYPE_GRAY_ALPHA; + adjustA = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); + } + width = image->comps[0].w; + height = image->comps[0].h; + + png_set_IHDR(png, info, width, height, sig_bit.gray, + color_type, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_set_sBIT(png, info, &sig_bit); + /*=============================*/ + png_write_info(png, info); + /*=============================*/ + adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); + + if(prec < 8) { + png_set_packing(png); + } - if(force16) { v = (v<<ushift) + (v>>dshift); } + if(prec > 8) { + row_buf = (unsigned char*) + malloc(width * nr_comp * sizeof(unsigned short)); - *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; + for(y = 0; y < height; ++y) { + d = row_buf; - if(has_alpha) - { - v = *alpha++; + for(x = 0; x < width; ++x) { + v = *red + adjustR; + ++red; - if(force16) { v = (v<<ushift) + (v>>dshift); } + if(force16) { + v = (v<<ushift) + (v>>dshift); + } - *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; - } - }/* for(x) */ - png_write_row(png, row_buf); + *d++ = (unsigned char)(v>>8); + *d++ = (unsigned char)v; - } /* for(y) */ - free(row_buf); - } - else /* prec <= 8 */ - { - row_buf = (unsigned char*)calloc(width, nr_comp * 2); + if(has_alpha) { + v = *alpha++; - for(y = 0; y < height; ++y) - { - d = row_buf; + if(force16) { + v = (v<<ushift) + (v>>dshift); + } - for(x = 0; x < width; ++x) - { - v = *red + adjustR; ++red; + *d++ = (unsigned char)(v>>8); + *d++ = (unsigned char)v; + } + }/* for(x) */ + png_write_row(png, row_buf); - if(force8) { v = (v<<ushift) + (v>>dshift); } + } /* for(y) */ + free(row_buf); + } else { /* prec <= 8 */ + row_buf = (unsigned char*)calloc(width, nr_comp * 2); - *d++ = (unsigned char)(v & mask); + for(y = 0; y < height; ++y) { + d = row_buf; - if(has_alpha) - { - v = *alpha + adjustA; ++alpha; + for(x = 0; x < width; ++x) { + v = *red + adjustR; + ++red; - if(force8) { v = (v<<ushift) + (v>>dshift); } + if(force8) { + v = (v<<ushift) + (v>>dshift); + } - *d++ = (unsigned char)(v & mask); - } - }/* for(x) */ + *d++ = (unsigned char)(v & mask); - png_write_row(png, row_buf); + if(has_alpha) { + v = *alpha + adjustA; + ++alpha; - } /* for(y) */ - free(row_buf); - } - } - else - { - fprintf(stderr,"imagetopng: can not create %s\n",write_idf); - goto fin; - } - png_write_end(png, info); + if(force8) { + v = (v<<ushift) + (v>>dshift); + } - fails = 0; + *d++ = (unsigned char)(v & mask); + } + }/* for(x) */ + + png_write_row(png, row_buf); + + } /* for(y) */ + free(row_buf); + } + } else { + fprintf(stderr,"imagetopng: can not create %s\n",write_idf); + goto fin; + } + png_write_end(png, info); + + fails = 0; fin: - if(png) - { - png_destroy_write_struct(&png, &info); - } - fclose(writer); + if(png) { + png_destroy_write_struct(&png, &info); + } + fclose(writer); - if(fails) remove(write_idf); + if(fails) remove(write_idf); - return fails; + return fails; }/* imagetopng() */ #endif /* OPJ_HAVE_LIBPNG */ diff --git a/src/bin/jpwl/convert.h b/src/bin/jpwl/convert.h index 591bde61..24366d78 100644 --- a/src/bin/jpwl/convert.h +++ b/src/bin/jpwl/convert.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. @@ -40,17 +40,17 @@ /**@name RAW image encoding parameters */ /*@{*/ typedef struct raw_cparameters { - /** width of the raw image */ - int rawWidth; - /** height of the raw image */ - int rawHeight; - /** components of the raw image */ - int rawComp; - /** bit depth of the raw image */ - int rawBitDepth; - /** signed/unsigned raw image */ - opj_bool rawSigned; - /*@}*/ + /** width of the raw image */ + int rawWidth; + /** height of the raw image */ + int rawHeight; + /** components of the raw image */ + int rawComp; + /** bit depth of the raw image */ + int rawBitDepth; + /** signed/unsigned raw image */ + opj_bool rawSigned; + /*@}*/ } raw_cparameters_t; /* TGA conversion */ diff --git a/src/bin/jpwl/index.c b/src/bin/jpwl/index.c index 173e1633..b8da6ba7 100644 --- a/src/bin/jpwl/index.c +++ b/src/bin/jpwl/index.c @@ -1,12 +1,12 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,356 +41,357 @@ /** Write a structured index to a file -@param cstr_info Codestream information +@param cstr_info Codestream information @param index Index filename @return Returns 0 if successful, returns 1 otherwise */ -int write_index_file(opj_codestream_info_t *cstr_info, char *index) { - int tileno, compno, layno, resno, precno, pack_nb, x, y; - FILE *stream = NULL; - double total_disto = 0; -/* UniPG>> */ - int tilepartno; - char disto_on, numpix_on; +int write_index_file(opj_codestream_info_t *cstr_info, char *index) +{ + int tileno, compno, layno, resno, precno, pack_nb, x, y; + FILE *stream = NULL; + double total_disto = 0; + /* UniPG>> */ + int tilepartno; + char disto_on, numpix_on; #ifdef USE_JPWL - if (!strcmp(index, JPWL_PRIVATEINDEX_NAME)) - return 0; + if (!strcmp(index, JPWL_PRIVATEINDEX_NAME)) + return 0; #endif /* USE_JPWL */ -/* <<UniPG */ - - if (!cstr_info) - return 1; - - stream = fopen(index, "w"); - if (!stream) { - fprintf(stderr, "failed to open index file [%s] for writing\n", index); - return 1; - } - - if (cstr_info->tile[0].distotile) - disto_on = 1; - else - disto_on = 0; - - if (cstr_info->tile[0].numpix) - numpix_on = 1; - else - numpix_on = 0; - - fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h); - fprintf(stream, "%d\n", cstr_info->prog); - fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y); - fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th); - fprintf(stream, "%d\n", cstr_info->numcomps); - fprintf(stream, "%d\n", cstr_info->numlayers); - fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */ - - for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { - fprintf(stream, "[%d,%d] ", - (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */ - } - - fprintf(stream, "\n"); -/* UniPG>> */ - fprintf(stream, "%d\n", cstr_info->main_head_start); -/* <<UniPG */ - fprintf(stream, "%d\n", cstr_info->main_head_end); - fprintf(stream, "%d\n", cstr_info->codestream_size); - - fprintf(stream, "\nINFO ON TILES\n"); - fprintf(stream, "tileno start_pos end_hd end_tile nbparts"); - if (disto_on) - fprintf(stream," disto"); - if (numpix_on) - fprintf(stream," nbpix"); - if (disto_on && numpix_on) - fprintf(stream," disto/nbpix"); - fprintf(stream, "\n"); - - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - fprintf(stream, "%4d %9d %9d %9d %9d", - cstr_info->tile[tileno].tileno, - cstr_info->tile[tileno].start_pos, - cstr_info->tile[tileno].end_header, - cstr_info->tile[tileno].end_pos, - cstr_info->tile[tileno].num_tps); - if (disto_on) - fprintf(stream," %9e", cstr_info->tile[tileno].distotile); - if (numpix_on) - fprintf(stream," %9d", cstr_info->tile[tileno].numpix); - if (disto_on && numpix_on) - fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix); - fprintf(stream, "\n"); - } - - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - int start_pos, end_ph_pos, end_pos; - double disto = 0; - int max_numdecompos = 0; - pack_nb = 0; - - for (compno = 0; compno < cstr_info->numcomps; compno++) { - if (max_numdecompos < cstr_info->numdecompos[compno]) - max_numdecompos = cstr_info->numdecompos[compno]; - } - - fprintf(stream, "\nTILE %d DETAILS\n", tileno); - fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n"); - for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++) - fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n", - tilepartno, tileno, - cstr_info->tile[tileno].tp[tilepartno].tp_start_pack, - cstr_info->tile[tileno].tp[tilepartno].tp_numpacks, - cstr_info->tile[tileno].tp[tilepartno].tp_start_pos, - cstr_info->tile[tileno].tp[tilepartno].tp_end_header, - cstr_info->tile[tileno].tp[tilepartno].tp_end_pos - ); - - if (cstr_info->prog == LRCP) { /* LRCP */ - fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (layno = 0; layno < cstr_info->numlayers; layno++) { - for (resno = 0; resno < max_numdecompos + 1; resno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int prec_max; - if (resno > cstr_info->numdecompos[compno]) - break; - prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %7d %5d %6d %6d %6d %6d %7d", - pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* LRCP */ - - else if (cstr_info->prog == RLCP) { /* RLCP */ - fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (resno = 0; resno < max_numdecompos + 1; resno++) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int prec_max; - if (resno > cstr_info->numdecompos[compno]) - break; - prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %7d", - pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* RLCP */ - - else if (cstr_info->prog == RPCL) { /* RPCL */ - - fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < numprec; precno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); - int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); - int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; - int precno_y = (int) floor( (float)precno/(float)pcnx ); - if (resno > cstr_info->numdecompos[compno]) - break; - for(y = y0; y < y1; y++) { - if (precno_y*pcy == y ) { - for (x = x0; x < x1; x++) { - if (precno_x*pcx == x ) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %7d", - pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* precno */ - } /* compno */ - } /* resno */ - } /* RPCL */ - - else if (cstr_info->prog == PCRL) { /* PCRL */ - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - - /* Count the maximum number of precincts */ - int max_numprec = 0; - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - if (numprec > max_numprec) - max_numprec = numprec; - } - - fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (precno = 0; precno < max_numprec; precno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); - int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); - int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; - int precno_y = (int) floor( (float)precno/(float)pcnx ); - if (precno >= numprec) - continue; - for(y = y0; y < y1; y++) { - if (precno_y*pcy == y ) { - for (x = x0; x < x1; x++) { - if (precno_x*pcx == x ) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d", - pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* resno */ - } /* compno */ - } /* precno */ - } /* PCRL */ - - else { /* CPRL */ - /* Count the maximum number of precincts */ - int max_numprec = 0; - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - if (numprec > max_numprec) - max_numprec = numprec; - } - - fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); - if (disto_on) - fprintf(stream, " disto"); - fprintf(stream,"\n"); - - for (compno = 0; compno < cstr_info->numcomps; compno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - - for (precno = 0; precno < max_numprec; precno++) { - for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); - int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); - int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; - int precno_y = (int) floor( (float)precno/(float)pcnx ); - if (precno >= numprec) - continue; - - for(y = y0; y < y1; y++) { - if (precno_y*pcy == y ) { - for (x = x0; x < x1; x++) { - if (precno_x*pcx == x ) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d", - pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) - fprintf(stream, " %8e", disto); - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* resno */ - } /* precno */ - } /* compno */ - } /* CPRL */ - } /* tileno */ - - if (disto_on) { - fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */ - fprintf(stream, "%.8e\n", total_disto); /* SE totale */ - } -/* UniPG>> */ - /* print the markers' list */ - if (cstr_info->marknum) { - fprintf(stream, "\nMARKER LIST\n"); - fprintf(stream, "%d\n", cstr_info->marknum); - fprintf(stream, "type\tstart_pos length\n"); - for (x = 0; x < cstr_info->marknum; x++) - fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len); - } -/* <<UniPG */ - fclose(stream); - - fprintf(stderr,"Generated index file %s\n", index); - - return 0; + /* <<UniPG */ + + if (!cstr_info) + return 1; + + stream = fopen(index, "w"); + if (!stream) { + fprintf(stderr, "failed to open index file [%s] for writing\n", index); + return 1; + } + + if (cstr_info->tile[0].distotile) + disto_on = 1; + else + disto_on = 0; + + if (cstr_info->tile[0].numpix) + numpix_on = 1; + else + numpix_on = 0; + + fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h); + fprintf(stream, "%d\n", cstr_info->prog); + fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y); + fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th); + fprintf(stream, "%d\n", cstr_info->numcomps); + fprintf(stream, "%d\n", cstr_info->numlayers); + fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */ + + for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { + fprintf(stream, "[%d,%d] ", + (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */ + } + + fprintf(stream, "\n"); + /* UniPG>> */ + fprintf(stream, "%d\n", cstr_info->main_head_start); + /* <<UniPG */ + fprintf(stream, "%d\n", cstr_info->main_head_end); + fprintf(stream, "%d\n", cstr_info->codestream_size); + + fprintf(stream, "\nINFO ON TILES\n"); + fprintf(stream, "tileno start_pos end_hd end_tile nbparts"); + if (disto_on) + fprintf(stream," disto"); + if (numpix_on) + fprintf(stream," nbpix"); + if (disto_on && numpix_on) + fprintf(stream," disto/nbpix"); + fprintf(stream, "\n"); + + for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { + fprintf(stream, "%4d %9d %9d %9d %9d", + cstr_info->tile[tileno].tileno, + cstr_info->tile[tileno].start_pos, + cstr_info->tile[tileno].end_header, + cstr_info->tile[tileno].end_pos, + cstr_info->tile[tileno].num_tps); + if (disto_on) + fprintf(stream," %9e", cstr_info->tile[tileno].distotile); + if (numpix_on) + fprintf(stream," %9d", cstr_info->tile[tileno].numpix); + if (disto_on && numpix_on) + fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix); + fprintf(stream, "\n"); + } + + for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { + int start_pos, end_ph_pos, end_pos; + double disto = 0; + int max_numdecompos = 0; + pack_nb = 0; + + for (compno = 0; compno < cstr_info->numcomps; compno++) { + if (max_numdecompos < cstr_info->numdecompos[compno]) + max_numdecompos = cstr_info->numdecompos[compno]; + } + + fprintf(stream, "\nTILE %d DETAILS\n", tileno); + fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n"); + for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++) + fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n", + tilepartno, tileno, + cstr_info->tile[tileno].tp[tilepartno].tp_start_pack, + cstr_info->tile[tileno].tp[tilepartno].tp_numpacks, + cstr_info->tile[tileno].tp[tilepartno].tp_start_pos, + cstr_info->tile[tileno].tp[tilepartno].tp_end_header, + cstr_info->tile[tileno].tp[tilepartno].tp_end_pos + ); + + if (cstr_info->prog == LRCP) { /* LRCP */ + fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (layno = 0; layno < cstr_info->numlayers; layno++) { + for (resno = 0; resno < max_numdecompos + 1; resno++) { + for (compno = 0; compno < cstr_info->numcomps; compno++) { + int prec_max; + if (resno > cstr_info->numdecompos[compno]) + break; + prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + for (precno = 0; precno < prec_max; precno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %7d %5d %6d %6d %6d %6d %7d", + pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + } + } + } /* LRCP */ + + else if (cstr_info->prog == RLCP) { /* RLCP */ + fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (resno = 0; resno < max_numdecompos + 1; resno++) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + for (compno = 0; compno < cstr_info->numcomps; compno++) { + int prec_max; + if (resno > cstr_info->numdecompos[compno]) + break; + prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + for (precno = 0; precno < prec_max; precno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %7d", + pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + } + } + } /* RLCP */ + + else if (cstr_info->prog == RPCL) { /* RPCL */ + + fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (resno = 0; resno < max_numdecompos + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + for (precno = 0; precno < numprec; precno++) { + /* I suppose components have same XRsiz, YRsiz */ + int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; + int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; + int x1 = x0 + cstr_info->tile_x; + int y1 = y0 + cstr_info->tile_y; + for (compno = 0; compno < cstr_info->numcomps; compno++) { + int pcnx = cstr_info->tile[tileno].pw[resno]; + int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); + int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); + int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; + int precno_y = (int) floor( (float)precno/(float)pcnx ); + if (resno > cstr_info->numdecompos[compno]) + break; + for(y = y0; y < y1; y++) { + if (precno_y*pcy == y ) { + for (x = x0; x < x1; x++) { + if (precno_x*pcx == x ) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %7d", + pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + }/* x = x0..x1 */ + } + } /* y = y0..y1 */ + } /* precno */ + } /* compno */ + } /* resno */ + } /* RPCL */ + + else if (cstr_info->prog == PCRL) { /* PCRL */ + /* I suppose components have same XRsiz, YRsiz */ + int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; + int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; + int x1 = x0 + cstr_info->tile_x; + int y1 = y0 + cstr_info->tile_y; + + /* Count the maximum number of precincts */ + int max_numprec = 0; + for (resno = 0; resno < max_numdecompos + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + if (numprec > max_numprec) + max_numprec = numprec; + } + + fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (precno = 0; precno < max_numprec; precno++) { + for (compno = 0; compno < cstr_info->numcomps; compno++) { + for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + int pcnx = cstr_info->tile[tileno].pw[resno]; + int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); + int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); + int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; + int precno_y = (int) floor( (float)precno/(float)pcnx ); + if (precno >= numprec) + continue; + for(y = y0; y < y1; y++) { + if (precno_y*pcy == y ) { + for (x = x0; x < x1; x++) { + if (precno_x*pcx == x ) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d", + pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + }/* x = x0..x1 */ + } + } /* y = y0..y1 */ + } /* resno */ + } /* compno */ + } /* precno */ + } /* PCRL */ + + else { /* CPRL */ + /* Count the maximum number of precincts */ + int max_numprec = 0; + for (resno = 0; resno < max_numdecompos + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + if (numprec > max_numprec) + max_numprec = numprec; + } + + fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); + if (disto_on) + fprintf(stream, " disto"); + fprintf(stream,"\n"); + + for (compno = 0; compno < cstr_info->numcomps; compno++) { + /* I suppose components have same XRsiz, YRsiz */ + int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; + int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; + int x1 = x0 + cstr_info->tile_x; + int y1 = y0 + cstr_info->tile_y; + + for (precno = 0; precno < max_numprec; precno++) { + for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { + int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; + int pcnx = cstr_info->tile[tileno].pw[resno]; + int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); + int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); + int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; + int precno_y = (int) floor( (float)precno/(float)pcnx ); + if (precno >= numprec) + continue; + + for(y = y0; y < y1; y++) { + if (precno_y*pcy == y ) { + for (x = x0; x < x1; x++) { + if (precno_x*pcx == x ) { + for (layno = 0; layno < cstr_info->numlayers; layno++) { + start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; + end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; + end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; + disto = cstr_info->tile[tileno].packet[pack_nb].disto; + fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d", + pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); + if (disto_on) + fprintf(stream, " %8e", disto); + fprintf(stream, "\n"); + total_disto += disto; + pack_nb++; + } + } + }/* x = x0..x1 */ + } + } /* y = y0..y1 */ + } /* resno */ + } /* precno */ + } /* compno */ + } /* CPRL */ + } /* tileno */ + + if (disto_on) { + fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */ + fprintf(stream, "%.8e\n", total_disto); /* SE totale */ + } + /* UniPG>> */ + /* print the markers' list */ + if (cstr_info->marknum) { + fprintf(stream, "\nMARKER LIST\n"); + fprintf(stream, "%d\n", cstr_info->marknum); + fprintf(stream, "type\tstart_pos length\n"); + for (x = 0; x < cstr_info->marknum; x++) + fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len); + } + /* <<UniPG */ + fclose(stream); + + fprintf(stderr,"Generated index file %s\n", index); + + return 0; } diff --git a/src/bin/jpwl/index.h b/src/bin/jpwl/index.h index d8b448d0..b461e91b 100644 --- a/src/bin/jpwl/index.h +++ b/src/bin/jpwl/index.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -40,7 +40,7 @@ extern "C" { /** Write a structured index to a file -@param cstr_info Codestream information +@param cstr_info Codestream information @param index Index filename @return Returns 0 if successful, returns 1 otherwise */ diff --git a/src/bin/jpwl/opj_jpwl_compress.c b/src/bin/jpwl/opj_jpwl_compress.c index 7410486e..63cd70c9 100644 --- a/src/bin/jpwl/opj_jpwl_compress.c +++ b/src/bin/jpwl/opj_jpwl_compress.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan @@ -68,1403 +68,1382 @@ #define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/ #define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/ -typedef struct dircnt{ - /** Buffer for holding images read from Directory*/ - char *filename_buf; - /** Pointer to the buffer*/ - char **filename; -}dircnt_t; - -typedef struct img_folder{ - /** The directory path of the folder containing input images*/ - char *imgdirpath; - /** Output format*/ - char *out_format; - /** Enable option*/ - char set_imgdir; - /** Enable Cod Format for output*/ - char set_out_format; - /** User specified rate stored in case of cinema option*/ - float *rates; -}img_fol_t; - -static void encode_help_display(void) { - fprintf(stdout,"HELP for opj_jpwl_compress\n----\n\n"); - fprintf(stdout,"- the -h option displays this help information on screen\n\n"); - -/* UniPG>> */ - fprintf(stdout,"List of parameters for the JPEG 2000 " +typedef struct dircnt { + /** Buffer for holding images read from Directory*/ + char *filename_buf; + /** Pointer to the buffer*/ + char **filename; +} dircnt_t; + +typedef struct img_folder { + /** The directory path of the folder containing input images*/ + char *imgdirpath; + /** Output format*/ + char *out_format; + /** Enable option*/ + char set_imgdir; + /** Enable Cod Format for output*/ + char set_out_format; + /** User specified rate stored in case of cinema option*/ + float *rates; +} img_fol_t; + +static void encode_help_display(void) +{ + fprintf(stdout,"HELP for opj_jpwl_compress\n----\n\n"); + fprintf(stdout,"- the -h option displays this help information on screen\n\n"); + + /* UniPG>> */ + fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL - "+ JPWL " + "+ JPWL " #endif /* USE_JPWL */ - "encoder:\n"); -/* <<UniPG */ - fprintf(stdout,"\n"); - fprintf(stdout,"REMARKS:\n"); - fprintf(stdout,"---------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); - fprintf(stdout,"COD and QCD never appear in the tile_header.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"By default:\n"); - fprintf(stdout,"------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout," * Lossless\n"); - fprintf(stdout," * 1 tile\n"); - fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); - fprintf(stdout," * Size of code-block : 64 x 64\n"); - fprintf(stdout," * Number of resolutions: 6\n"); - fprintf(stdout," * No SOP marker in the codestream\n"); - fprintf(stdout," * No EPH marker in the codestream\n"); - fprintf(stdout," * No sub-sampling in x or y direction\n"); - fprintf(stdout," * No mode switch activated\n"); - fprintf(stdout," * Progression order: LRCP\n"); - fprintf(stdout," * No index file\n"); - fprintf(stdout," * No ROI upshifted\n"); - fprintf(stdout," * No offset of the origin of the image\n"); - fprintf(stdout," * No offset of the origin of the tiles\n"); - fprintf(stdout," * Reversible DWT 5-3\n"); -/* UniPG>> */ + "encoder:\n"); + /* <<UniPG */ + fprintf(stdout,"\n"); + fprintf(stdout,"REMARKS:\n"); + fprintf(stdout,"---------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); + fprintf(stdout,"COD and QCD never appear in the tile_header.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"By default:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout," * Lossless\n"); + fprintf(stdout," * 1 tile\n"); + fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); + fprintf(stdout," * Size of code-block : 64 x 64\n"); + fprintf(stdout," * Number of resolutions: 6\n"); + fprintf(stdout," * No SOP marker in the codestream\n"); + fprintf(stdout," * No EPH marker in the codestream\n"); + fprintf(stdout," * No sub-sampling in x or y direction\n"); + fprintf(stdout," * No mode switch activated\n"); + fprintf(stdout," * Progression order: LRCP\n"); + fprintf(stdout," * No index file\n"); + fprintf(stdout," * No ROI upshifted\n"); + fprintf(stdout," * No offset of the origin of the image\n"); + fprintf(stdout," * No offset of the origin of the tiles\n"); + fprintf(stdout," * Reversible DWT 5-3\n"); + /* UniPG>> */ #ifdef USE_JPWL - fprintf(stdout," * No JPWL protection\n"); + fprintf(stdout," * No JPWL protection\n"); #endif /* USE_JPWL */ -/* <<UniPG */ - fprintf(stdout,"\n"); - fprintf(stdout,"Parameters:\n"); - fprintf(stdout,"------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Required Parameters (except with -h):\n"); - fprintf(stdout,"One of the two options -ImgDir or -i must be used\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-ImgDir : Image file Directory path (example ../Images) \n"); - fprintf(stdout," When using this option -OutFor must be used\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-OutFor \n"); - fprintf(stdout," REQUIRED only if -ImgDir is used\n"); - fprintf(stdout," Need to specify only format without filename <BMP> \n"); - fprintf(stdout," Currently accepts PBM, PGM, PPM, PNM, PAM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-i : source file (-i source.pnm also *pbm, *.pgm, *.ppm, *.pam, *.pgx, *png, *.bmp, *.tif, *.raw, *.tga) \n"); - fprintf(stdout," When using this option -o must be used\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Optional Parameters:\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-h : display the help information \n "); - fprintf(stdout,"\n"); - fprintf(stdout,"-cinema2K : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n"); - fprintf(stdout," Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-cinema4K : Digital Cinema 4K profile compliant codestream for 4K resolution \n"); - fprintf(stdout," Frames per second not required. Default value is 24fps\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); - fprintf(stdout," - The rate specified for each quality level is the desired \n"); - fprintf(stdout," compression factor.\n"); - fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); - fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); - fprintf(stdout,"\n"); - fprintf(stdout," (options -r and -q cannot be used together)\n "); - fprintf(stdout,"\n"); - - fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); - - fprintf(stdout," (options -r and -q cannot be used together)\n "); - - fprintf(stdout,"\n"); - fprintf(stdout,"-n : number of resolutions (-n 3) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-b : size of code block (-b 32,32) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-t : size of tile (-t 512,512) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); - fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-POC : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n"); - fprintf(stdout," Example: T1=0,0,1,5,3,CPRL \n"); - fprintf(stdout," : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-SOP : write SOP marker before each packet \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); - fprintf(stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); - fprintf(stdout," Indicate multiple modes by adding their values. \n"); - fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-TP : divide packets of every tile into tile-parts (-TP R) [R, L, C]\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); - fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n"); - fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI c=0,U=25) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-d : offset of the origin of the image (-d 150,300) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-F : characteristics of the raw input image\n"); - fprintf(stdout," -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); - fprintf(stdout," Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-jpip : write jpip codestream index box in JP2 output file\n"); - fprintf(stdout," NOTICE: currently supports only RPCL order\n"); - fprintf(stdout,"\n"); -/* UniPG>> */ + /* <<UniPG */ + fprintf(stdout,"\n"); + fprintf(stdout,"Parameters:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Required Parameters (except with -h):\n"); + fprintf(stdout,"One of the two options -ImgDir or -i must be used\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-ImgDir : Image file Directory path (example ../Images) \n"); + fprintf(stdout," When using this option -OutFor must be used\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-OutFor \n"); + fprintf(stdout," REQUIRED only if -ImgDir is used\n"); + fprintf(stdout," Need to specify only format without filename <BMP> \n"); + fprintf(stdout," Currently accepts PBM, PGM, PPM, PNM, PAM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-i : source file (-i source.pnm also *pbm, *.pgm, *.ppm, *.pam, *.pgx, *png, *.bmp, *.tif, *.raw, *.tga) \n"); + fprintf(stdout," When using this option -o must be used\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Optional Parameters:\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-h : display the help information \n "); + fprintf(stdout,"\n"); + fprintf(stdout,"-cinema2K : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n"); + fprintf(stdout," Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-cinema4K : Digital Cinema 4K profile compliant codestream for 4K resolution \n"); + fprintf(stdout," Frames per second not required. Default value is 24fps\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); + fprintf(stdout," - The rate specified for each quality level is the desired \n"); + fprintf(stdout," compression factor.\n"); + fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); + fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); + fprintf(stdout,"\n"); + fprintf(stdout," (options -r and -q cannot be used together)\n "); + fprintf(stdout,"\n"); + + fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); + + fprintf(stdout," (options -r and -q cannot be used together)\n "); + + fprintf(stdout,"\n"); + fprintf(stdout,"-n : number of resolutions (-n 3) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-b : size of code block (-b 32,32) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-t : size of tile (-t 512,512) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); + fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-POC : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n"); + fprintf(stdout," Example: T1=0,0,1,5,3,CPRL \n"); + fprintf(stdout," : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-SOP : write SOP marker before each packet \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); + fprintf(stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); + fprintf(stdout," Indicate multiple modes by adding their values. \n"); + fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-TP : divide packets of every tile into tile-parts (-TP R) [R, L, C]\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); + fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n"); + fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI c=0,U=25) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-d : offset of the origin of the image (-d 150,300) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-F : characteristics of the raw input image\n"); + fprintf(stdout," -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); + fprintf(stdout," Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"-jpip : write jpip codestream index box in JP2 output file\n"); + fprintf(stdout," NOTICE: currently supports only RPCL order\n"); + fprintf(stdout,"\n"); + /* UniPG>> */ #ifdef USE_JPWL - fprintf(stdout,"-W : adoption of JPWL (Part 11) capabilities (-W params)\n"); - fprintf(stdout," The parameters can be written and repeated in any order:\n"); - fprintf(stdout," [h<tilepart><=type>,s<tilepart><=method>,a=<addr>,...\n"); - fprintf(stdout," ...,z=<size>,g=<range>,p<tilepart:pack><=type>]\n"); - fprintf(stdout,"\n"); - fprintf(stdout," h selects the header error protection (EPB): 'type' can be\n"); - fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); - fprintf(stdout," if 'tilepart' is absent, it is for main and tile headers\n"); - fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); - fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\n"); - fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); - fprintf(stdout,"\n"); - fprintf(stdout," p selects the packet error protection (EEP/UEP with EPBs)\n"); - fprintf(stdout," to be applied to raw data: 'type' can be\n"); - fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); - fprintf(stdout," if 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); - fprintf(stdout," if 'tilepart:pack' is present, it applies from that tile\n"); - fprintf(stdout," and that packet onwards, up to the next packet spec\n"); - fprintf(stdout," or to the last packet in the last tilepart in the stream\n"); - fprintf(stdout," (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS); - fprintf(stdout,"\n"); - fprintf(stdout," s enables sensitivity data insertion (ESD): 'method' can be\n"); - fprintf(stdout," [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR\n"); - fprintf(stdout," 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]\n"); - fprintf(stdout," if 'tilepart' is absent, it is for main header only\n"); - fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); - fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); - fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); - fprintf(stdout,"\n"); - fprintf(stdout," g determines the addressing mode: <range> can be\n"); - fprintf(stdout," [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n"); - fprintf(stdout,"\n"); - fprintf(stdout," a determines the size of data addressing: <addr> can be\n"); - fprintf(stdout," 2/4 bytes (small/large codestreams). If not set, auto-mode\n"); - fprintf(stdout,"\n"); - fprintf(stdout," z determines the size of sensitivity values: <size> can be\n"); - fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); - fprintf(stdout,"\n"); - fprintf(stdout," ex.:\n"); - fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); - fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); - fprintf(stdout," means\n"); - fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); - fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); - fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); - fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); - fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); - fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); - fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\n"); - fprintf(stdout," relative sensitivity ESD for MH,\n"); - fprintf(stdout," TSE ESD from TPH 0 to TPH 2, byte range with automatic\n"); - fprintf(stdout," size of addresses and 1 byte for each sensitivity value\n"); - fprintf(stdout,"\n"); - fprintf(stdout," ex.:\n"); - fprintf(stdout," h,s,p\n"); - fprintf(stdout," means\n"); - fprintf(stdout," default protection to headers (MH and TPHs) as well as\n"); - fprintf(stdout," data packets, one ESD in MH\n"); - fprintf(stdout,"\n"); - fprintf(stdout," N.B.: use the following recommendations when specifying\n"); - fprintf(stdout," the JPWL parameters list\n"); - fprintf(stdout," - when you use UEP, always pair the 'p' option with 'h'\n"); - fprintf(stdout," \n"); + fprintf(stdout,"-W : adoption of JPWL (Part 11) capabilities (-W params)\n"); + fprintf(stdout," The parameters can be written and repeated in any order:\n"); + fprintf(stdout," [h<tilepart><=type>,s<tilepart><=method>,a=<addr>,...\n"); + fprintf(stdout," ...,z=<size>,g=<range>,p<tilepart:pack><=type>]\n"); + fprintf(stdout,"\n"); + fprintf(stdout," h selects the header error protection (EPB): 'type' can be\n"); + fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); + fprintf(stdout," if 'tilepart' is absent, it is for main and tile headers\n"); + fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); + fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\n"); + fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); + fprintf(stdout,"\n"); + fprintf(stdout," p selects the packet error protection (EEP/UEP with EPBs)\n"); + fprintf(stdout," to be applied to raw data: 'type' can be\n"); + fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); + fprintf(stdout," if 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); + fprintf(stdout," if 'tilepart:pack' is present, it applies from that tile\n"); + fprintf(stdout," and that packet onwards, up to the next packet spec\n"); + fprintf(stdout," or to the last packet in the last tilepart in the stream\n"); + fprintf(stdout," (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS); + fprintf(stdout,"\n"); + fprintf(stdout," s enables sensitivity data insertion (ESD): 'method' can be\n"); + fprintf(stdout," [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR\n"); + fprintf(stdout," 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]\n"); + fprintf(stdout," if 'tilepart' is absent, it is for main header only\n"); + fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); + fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); + fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); + fprintf(stdout,"\n"); + fprintf(stdout," g determines the addressing mode: <range> can be\n"); + fprintf(stdout," [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n"); + fprintf(stdout,"\n"); + fprintf(stdout," a determines the size of data addressing: <addr> can be\n"); + fprintf(stdout," 2/4 bytes (small/large codestreams). If not set, auto-mode\n"); + fprintf(stdout,"\n"); + fprintf(stdout," z determines the size of sensitivity values: <size> can be\n"); + fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); + fprintf(stdout,"\n"); + fprintf(stdout," ex.:\n"); + fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); + fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); + fprintf(stdout," means\n"); + fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); + fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); + fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); + fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); + fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); + fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); + fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\n"); + fprintf(stdout," relative sensitivity ESD for MH,\n"); + fprintf(stdout," TSE ESD from TPH 0 to TPH 2, byte range with automatic\n"); + fprintf(stdout," size of addresses and 1 byte for each sensitivity value\n"); + fprintf(stdout,"\n"); + fprintf(stdout," ex.:\n"); + fprintf(stdout," h,s,p\n"); + fprintf(stdout," means\n"); + fprintf(stdout," default protection to headers (MH and TPHs) as well as\n"); + fprintf(stdout," data packets, one ESD in MH\n"); + fprintf(stdout,"\n"); + fprintf(stdout," N.B.: use the following recommendations when specifying\n"); + fprintf(stdout," the JPWL parameters list\n"); + fprintf(stdout," - when you use UEP, always pair the 'p' option with 'h'\n"); + fprintf(stdout," \n"); #endif /* USE_JPWL */ -/* <<UniPG */ - fprintf(stdout,"IMPORTANT:\n"); - fprintf(stdout,"-----------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"The index file has the structure below:\n"); - fprintf(stdout,"---------------------------------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Image_height Image_width\n"); - fprintf(stdout,"progression order\n"); - fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); - fprintf(stdout,"Tiles_nb_X Tiles_nb_Y\n"); - fprintf(stdout,"Components_nb\n"); - fprintf(stdout,"Layers_nb\n"); - fprintf(stdout,"decomposition_levels\n"); - fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); - fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); - fprintf(stdout,"Main_header_start_position\n"); - fprintf(stdout,"Main_header_end_position\n"); - fprintf(stdout,"Codestream_size\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"INFO ON TILES\n"); - fprintf(stdout,"tileno start_pos end_hd end_tile nbparts disto nbpix disto/nbpix\n"); - fprintf(stdout,"Tile_0 start_pos end_Theader end_pos NumParts TotalDisto NumPix MaxMSE\n"); - fprintf(stdout,"Tile_1 '' '' '' '' '' '' ''\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Tile_Nt '' '' '' '' '' '' ''\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"TILE 0 DETAILS\n"); - fprintf(stdout,"part_nb tileno num_packs start_pos end_tph_pos end_pos\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Progression_string\n"); - fprintf(stdout,"pack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n"); - fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); - - fprintf(stdout,"MaxDisto\n"); - - fprintf(stdout,"TotalDisto\n\n"); + /* <<UniPG */ + fprintf(stdout,"IMPORTANT:\n"); + fprintf(stdout,"-----------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"The index file has the structure below:\n"); + fprintf(stdout,"---------------------------------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Image_height Image_width\n"); + fprintf(stdout,"progression order\n"); + fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); + fprintf(stdout,"Tiles_nb_X Tiles_nb_Y\n"); + fprintf(stdout,"Components_nb\n"); + fprintf(stdout,"Layers_nb\n"); + fprintf(stdout,"decomposition_levels\n"); + fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); + fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); + fprintf(stdout,"Main_header_start_position\n"); + fprintf(stdout,"Main_header_end_position\n"); + fprintf(stdout,"Codestream_size\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"INFO ON TILES\n"); + fprintf(stdout,"tileno start_pos end_hd end_tile nbparts disto nbpix disto/nbpix\n"); + fprintf(stdout,"Tile_0 start_pos end_Theader end_pos NumParts TotalDisto NumPix MaxMSE\n"); + fprintf(stdout,"Tile_1 '' '' '' '' '' '' ''\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Tile_Nt '' '' '' '' '' '' ''\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"TILE 0 DETAILS\n"); + fprintf(stdout,"part_nb tileno num_packs start_pos end_tph_pos end_pos\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Progression_string\n"); + fprintf(stdout,"pack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n"); + fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); + + fprintf(stdout,"MaxDisto\n"); + + fprintf(stdout,"TotalDisto\n\n"); } -static OPJ_PROG_ORDER give_progression(const char progression[4]) { - if(strncmp(progression, "LRCP", 4) == 0) { - return LRCP; - } - if(strncmp(progression, "RLCP", 4) == 0) { - return RLCP; - } - if(strncmp(progression, "RPCL", 4) == 0) { - return RPCL; - } - if(strncmp(progression, "PCRL", 4) == 0) { - return PCRL; - } - if(strncmp(progression, "CPRL", 4) == 0) { - return CPRL; - } - - return PROG_UNKNOWN; +static OPJ_PROG_ORDER give_progression(const char progression[4]) +{ + if(strncmp(progression, "LRCP", 4) == 0) { + return LRCP; + } + if(strncmp(progression, "RLCP", 4) == 0) { + return RLCP; + } + if(strncmp(progression, "RPCL", 4) == 0) { + return RPCL; + } + if(strncmp(progression, "PCRL", 4) == 0) { + return PCRL; + } + if(strncmp(progression, "CPRL", 4) == 0) { + return CPRL; + } + + return PROG_UNKNOWN; } -static unsigned int get_num_images(char *imgdirpath){ - DIR *dir; - struct dirent* content; - unsigned int num_images = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 0; - } - - num_images=0; - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - num_images++; - } - return num_images; +static unsigned int get_num_images(char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + unsigned int num_images = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 0; + } + + num_images=0; + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + num_images++; + } + return num_images; } -static int load_images(dircnt_t *dirptr, char *imgdirpath){ - DIR *dir; - struct dirent* content; - int i = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 1; - }else { - fprintf(stderr,"Folder opened successfully\n"); - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - - strcpy(dirptr->filename[i],content->d_name); - i++; - } - return 0; +static int load_images(dircnt_t *dirptr, char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int i = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 1; + } else { + fprintf(stderr,"Folder opened successfully\n"); + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + + strcpy(dirptr->filename[i],content->d_name); + i++; + } + return 0; } -static int get_file_format(char *filename) { - unsigned int i; - static const char *extension[] = { - "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc" +static int get_file_format(char *filename) +{ + unsigned int i; + static const char *extension[] = { + "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc" }; - static const int format[] = { - PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT, J2K_CFMT + static const int format[] = { + PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT, J2K_CFMT }; - char * ext = strrchr(filename, '.'); - if (ext == NULL) - return -1; - ext++; - for(i = 0; i < sizeof(format)/sizeof(*format); i++) { - if(strcasecmp(ext, extension[i]) == 0) { - return format[i]; - } - } - return -1; + char * ext = strrchr(filename, '.'); + if (ext == NULL) + return -1; + ext++; + for(i = 0; i < sizeof(format)/sizeof(*format); i++) { + if(strcasecmp(ext, extension[i]) == 0) { + return format[i]; + } + } + return -1; } -static char * get_file_name(char *name){ - char *fname; - fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char)); - fname= strtok(name,"."); - return fname; +static char * get_file_name(char *name) +{ + char *fname; + fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char)); + fname= strtok(name,"."); + return fname; } -static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){ - char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; - char *temp_p, temp1[OPJ_PATH_LEN]=""; - - strcpy(image_filename,dirptr->filename[imageno]); - fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); - parameters->decod_format = get_file_format(image_filename); - if (parameters->decod_format == -1) - return 1; - sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); - strncpy(parameters->infile, infilename, sizeof(infilename)); - - /*Set output file*/ - strcpy(temp_ofname,get_file_name(image_filename)); - while((temp_p = strtok(NULL,".")) != NULL){ - strcat(temp_ofname,temp1); - sprintf(temp1,".%s",temp_p); - } - if(img_fol->set_out_format==1){ - sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); - strncpy(parameters->outfile, outfilename, sizeof(outfilename)); - } - return 0; +static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters) +{ + char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; + char *temp_p, temp1[OPJ_PATH_LEN]=""; + + strcpy(image_filename,dirptr->filename[imageno]); + fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); + parameters->decod_format = get_file_format(image_filename); + if (parameters->decod_format == -1) + return 1; + sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); + strncpy(parameters->infile, infilename, sizeof(infilename)); + + /*Set output file*/ + strcpy(temp_ofname,get_file_name(image_filename)); + while((temp_p = strtok(NULL,".")) != NULL) { + strcat(temp_ofname,temp1); + sprintf(temp1,".%s",temp_p); + } + if(img_fol->set_out_format==1) { + sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); + strncpy(parameters->outfile, outfilename, sizeof(outfilename)); + } + return 0; } -static int initialise_4K_poc(opj_poc_t *POC, int numres){ - POC[0].tile = 1; - POC[0].resno0 = 0; - POC[0].compno0 = 0; - POC[0].layno1 = 1; - POC[0].resno1 = numres-1; - POC[0].compno1 = 3; - POC[0].prg1 = CPRL; - POC[1].tile = 1; - POC[1].resno0 = numres-1; - POC[1].compno0 = 0; - POC[1].layno1 = 1; - POC[1].resno1 = numres; - POC[1].compno1 = 3; - POC[1].prg1 = CPRL; - return 2; +static int initialise_4K_poc(opj_poc_t *POC, int numres) +{ + POC[0].tile = 1; + POC[0].resno0 = 0; + POC[0].compno0 = 0; + POC[0].layno1 = 1; + POC[0].resno1 = numres-1; + POC[0].compno1 = 3; + POC[0].prg1 = CPRL; + POC[1].tile = 1; + POC[1].resno0 = numres-1; + POC[1].compno0 = 0; + POC[1].layno1 = 1; + POC[1].resno1 = numres; + POC[1].compno1 = 3; + POC[1].prg1 = CPRL; + return 2; } -static void cinema_parameters(opj_cparameters_t *parameters){ - parameters->tile_size_on = OPJ_FALSE; - parameters->cp_tdx=1; - parameters->cp_tdy=1; +static void cinema_parameters(opj_cparameters_t *parameters) +{ + parameters->tile_size_on = OPJ_FALSE; + parameters->cp_tdx=1; + parameters->cp_tdy=1; - /*Tile part*/ - parameters->tp_flag = 'C'; - parameters->tp_on = 1; + /*Tile part*/ + parameters->tp_flag = 'C'; + parameters->tp_on = 1; - /*Tile and Image shall be at (0,0)*/ - parameters->cp_tx0 = 0; - parameters->cp_ty0 = 0; - parameters->image_offset_x0 = 0; - parameters->image_offset_y0 = 0; + /*Tile and Image shall be at (0,0)*/ + parameters->cp_tx0 = 0; + parameters->cp_ty0 = 0; + parameters->image_offset_x0 = 0; + parameters->image_offset_y0 = 0; - /*Codeblock size= 32*32*/ - parameters->cblockw_init = 32; - parameters->cblockh_init = 32; - parameters->csty |= 0x01; + /*Codeblock size= 32*32*/ + parameters->cblockw_init = 32; + parameters->cblockh_init = 32; + parameters->csty |= 0x01; - /*The progression order shall be CPRL*/ - parameters->prog_order = CPRL; + /*The progression order shall be CPRL*/ + parameters->prog_order = CPRL; - /* No ROI */ - parameters->roi_compno = -1; + /* No ROI */ + parameters->roi_compno = -1; - parameters->subsampling_dx = 1; parameters->subsampling_dy = 1; + parameters->subsampling_dx = 1; + parameters->subsampling_dy = 1; - /* 9-7 transform */ - parameters->irreversible = 1; + /* 9-7 transform */ + parameters->irreversible = 1; } -static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){ - int i; - float temp_rate; - - switch (parameters->cp_cinema){ - case CINEMA2K_24: - case CINEMA2K_48: - if(parameters->numresolution > 6){ - parameters->numresolution = 6; - } - if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){ - fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 " - "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n", - image->comps[0].w,image->comps[0].h); - parameters->cp_rsiz = STD_RSIZ; - } - break; - - case CINEMA4K_24: - if(parameters->numresolution < 1){ - parameters->numresolution = 1; - }else if(parameters->numresolution > 7){ - parameters->numresolution = 7; - } - if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){ - fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" - "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n", - image->comps[0].w,image->comps[0].h); - parameters->cp_rsiz = STD_RSIZ; - } - parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution); - break; - default : - break; - } - - switch (parameters->cp_cinema){ - case CINEMA2K_24: - case CINEMA4K_24: - for(i=0 ; i<parameters->tcp_numlayers ; i++){ - temp_rate = 0 ; - if (img_fol->rates[i]== 0){ - parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ - (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); - }else{ - temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ - (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); - if (temp_rate > CINEMA_24_CS ){ - parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ - (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); - }else{ - parameters->tcp_rates[i]= img_fol->rates[i]; - } - } - } - parameters->max_comp_size = COMP_24_CS; - break; - - case CINEMA2K_48: - for(i=0 ; i<parameters->tcp_numlayers ; i++){ - temp_rate = 0 ; - if (img_fol->rates[i]== 0){ - parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ - (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); - }else{ - temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ - (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); - if (temp_rate > CINEMA_48_CS ){ - parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ - (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); - }else{ - parameters->tcp_rates[i]= img_fol->rates[i]; - } - } - } - parameters->max_comp_size = COMP_48_CS; - break; - default: - break; - } - parameters->cp_disto_alloc = 1; +static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol) +{ + int i; + float temp_rate; + + switch (parameters->cp_cinema) { + case CINEMA2K_24: + case CINEMA2K_48: + if(parameters->numresolution > 6) { + parameters->numresolution = 6; + } + if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))) { + fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 " + "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n", + image->comps[0].w,image->comps[0].h); + parameters->cp_rsiz = STD_RSIZ; + } + break; + + case CINEMA4K_24: + if(parameters->numresolution < 1) { + parameters->numresolution = 1; + } else if(parameters->numresolution > 7) { + parameters->numresolution = 7; + } + if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))) { + fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" + "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n", + image->comps[0].w,image->comps[0].h); + parameters->cp_rsiz = STD_RSIZ; + } + parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution); + break; + default : + break; + } + + switch (parameters->cp_cinema) { + case CINEMA2K_24: + case CINEMA4K_24: + for(i=0 ; i<parameters->tcp_numlayers ; i++) { + temp_rate = 0 ; + if (img_fol->rates[i]== 0) { + parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ + (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); + } else { + temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ + (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); + if (temp_rate > CINEMA_24_CS ) { + parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ + (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); + } else { + parameters->tcp_rates[i]= img_fol->rates[i]; + } + } + } + parameters->max_comp_size = COMP_24_CS; + break; + + case CINEMA2K_48: + for(i=0 ; i<parameters->tcp_numlayers ; i++) { + temp_rate = 0 ; + if (img_fol->rates[i]== 0) { + parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ + (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); + } else { + temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ + (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); + if (temp_rate > CINEMA_48_CS ) { + parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ + (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); + } else { + parameters->tcp_rates[i]= img_fol->rates[i]; + } + } + } + parameters->max_comp_size = COMP_48_CS; + break; + default: + break; + } + parameters->cp_disto_alloc = 1; } /* ------------------------------------------------------------------------------------ */ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, - img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) { - int i, j, totlen, c; - opj_option_t long_option[]={ - {"cinema2K",REQ_ARG, NULL ,'w'}, - {"cinema4K",NO_ARG, NULL ,'y'}, - {"ImgDir",REQ_ARG, NULL ,'z'}, - {"TP",REQ_ARG, NULL ,'u'}, - {"SOP",NO_ARG, NULL ,'S'}, - {"EPH",NO_ARG, NULL ,'E'}, - {"OutFor",REQ_ARG, NULL ,'O'}, - {"POC",REQ_ARG, NULL ,'P'}, - {"ROI",REQ_ARG, NULL ,'R'}, - {"jpip",NO_ARG, NULL, 'J'} - }; - - /* parse the command line */ - const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J" + img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) +{ + int i, j, totlen, c; + opj_option_t long_option[]= { + {"cinema2K",REQ_ARG, NULL ,'w'}, + {"cinema4K",NO_ARG, NULL ,'y'}, + {"ImgDir",REQ_ARG, NULL ,'z'}, + {"TP",REQ_ARG, NULL ,'u'}, + {"SOP",NO_ARG, NULL ,'S'}, + {"EPH",NO_ARG, NULL ,'E'}, + {"OutFor",REQ_ARG, NULL ,'O'}, + {"POC",REQ_ARG, NULL ,'P'}, + {"ROI",REQ_ARG, NULL ,'R'}, + {"jpip",NO_ARG, NULL, 'J'} + }; + + /* parse the command line */ + const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J" #ifdef USE_JPWL - "W:" + "W:" #endif /* USE_JPWL */ - "h"; - - totlen=sizeof(long_option); - img_fol->set_out_format=0; - raw_cp->rawWidth = 0; - - do{ - c = opj_getopt_long(argc, argv, optlist,long_option,totlen); - if (c == -1) - break; - switch (c) { - case 'i': /* input file */ - { - char *infile = opj_optarg; - parameters->decod_format = get_file_format(infile); - switch(parameters->decod_format) { - case PGX_DFMT: - case PXM_DFMT: - case BMP_DFMT: - case TIF_DFMT: - case RAW_DFMT: - case TGA_DFMT: - case PNG_DFMT: - break; - default: - fprintf(stderr, - "!! Unrecognized format for infile : %s " - "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *png, *.bmp, *.tif, *.raw or *.tga] !!\n\n", - infile); - return 1; - } - strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); - } - break; - - /* ----------------------------------------------------- */ - - case 'o': /* output file */ - { - char *outfile = opj_optarg; - parameters->cod_format = get_file_format(outfile); - switch(parameters->cod_format) { - case J2K_CFMT: - case JP2_CFMT: - break; - default: - fprintf(stderr, "Unknown output format image %s [only *.j2k, *.j2c or *.jp2]!! \n", outfile); - return 1; - } - strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); - } - break; - - /* ----------------------------------------------------- */ - case 'O': /* output format */ - { - char outformat[50]; - char *of = opj_optarg; - sprintf(outformat,".%s",of); - img_fol->set_out_format = 1; - parameters->cod_format = get_file_format(outformat); - switch(parameters->cod_format) { - case J2K_CFMT: - case JP2_CFMT: - img_fol->out_format = opj_optarg; - break; - default: - fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n"); - return 1; - } - } - break; - - - /* ----------------------------------------------------- */ - - - case 'r': /* rates rates/distorsion */ - { - char *s = opj_optarg; - parameters->tcp_numlayers = 0; - while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { - parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) - break; - s++; - } - parameters->cp_disto_alloc = 1; - } - break; - - /* ----------------------------------------------------- */ - - - case 'F': /* Raw image format parameters */ - { - char signo; - char *s = opj_optarg; - if (sscanf(s, "%d,%d,%d,%d,%c", &raw_cp->rawWidth, &raw_cp->rawHeight, &raw_cp->rawComp, &raw_cp->rawBitDepth, &signo) == 5) { - if (signo == 's') { - raw_cp->rawSigned = OPJ_TRUE; - fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Signed\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); - } - else if (signo == 'u') { - raw_cp->rawSigned = OPJ_FALSE; - fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Unsigned\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); - } - else { - fprintf(stderr,"\nError: invalid raw image parameters: Unknown sign of raw file\n"); - fprintf(stderr,"Please use the Format option -F:\n"); - fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); - fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); - fprintf(stderr,"Aborting\n"); - } - } - else { - fprintf(stderr,"\nError: invalid raw image parameters\n"); - fprintf(stderr,"Please use the Format option -F:\n"); - fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); - fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); - fprintf(stderr,"Aborting\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'q': /* add fixed_quality */ - { - char *s = opj_optarg; - while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { - parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) - break; - s++; - } - parameters->cp_fixed_quality = 1; - } - break; - - /* dda */ - /* ----------------------------------------------------- */ - - case 'f': /* mod fixed_quality (before : -q) */ - { - int *row = NULL, *col = NULL; - int numlayers = 0, numresolution = 0, matrix_width = 0; - - char *s = opj_optarg; - sscanf(s, "%d", &numlayers); - s++; - if (numlayers > 9) - s++; - - parameters->tcp_numlayers = numlayers; - numresolution = parameters->numresolution; - matrix_width = numresolution * 3; - parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); - s = s + 2; - - for (i = 0; i < numlayers; i++) { - row = ¶meters->cp_matrice[i * matrix_width]; - col = row; - parameters->tcp_rates[i] = 1; - sscanf(s, "%d,", &col[0]); - s += 2; - if (col[0] > 9) - s++; - col[1] = 0; - col[2] = 0; - for (j = 1; j < numresolution; j++) { - col += 3; - sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); - s += 6; - if (col[0] > 9) - s++; - if (col[1] > 9) - s++; - if (col[2] > 9) - s++; - } - if (i < numlayers - 1) - s++; - } - parameters->cp_fixed_alloc = 1; - } - break; - - /* ----------------------------------------------------- */ - - case 't': /* tiles */ - { - sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); - parameters->tile_size_on = OPJ_TRUE; - } - break; - - /* ----------------------------------------------------- */ - - case 'n': /* resolution */ - { - sscanf(opj_optarg, "%d", ¶meters->numresolution); - } - break; - - /* ----------------------------------------------------- */ - case 'c': /* precinct dimension */ - { - char sep; - int res_spec = 0; - - char *s = opj_optarg; - do { - sep = 0; - sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], - ¶meters->prch_init[res_spec], &sep); - parameters->csty |= 0x01; - res_spec++; - s = strpbrk(s, "]") + 2; - } - while (sep == ','); - parameters->res_spec = res_spec; - } - break; - - /* ----------------------------------------------------- */ - - case 'b': /* code-block dimension */ - { - int cblockw_init = 0, cblockh_init = 0; - sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init); - if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 - || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { - fprintf(stderr, - "!! Size of code_block error (option -b) !!\n\nRestriction :\n" - " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); - return 1; - } - parameters->cblockw_init = cblockw_init; - parameters->cblockh_init = cblockh_init; - } - break; - - /* ----------------------------------------------------- */ - - case 'x': /* creation of index file */ - { - char *index = opj_optarg; - strncpy(indexfilename, index, OPJ_PATH_LEN); - } - break; - - /* ----------------------------------------------------- */ - - case 'p': /* progression order */ - { - char progression[4]; - - strncpy(progression, opj_optarg, 4); - parameters->prog_order = give_progression(progression); - if (parameters->prog_order == -1) { - fprintf(stderr, "Unrecognized progression order " - "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 's': /* subsampling factor */ - { - if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, - ¶meters->subsampling_dy) != 2) { - fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'd': /* coordonnate of the reference grid */ - { - if (sscanf(opj_optarg, "%d,%d", ¶meters->image_offset_x0, - ¶meters->image_offset_y0) != 2) { - fprintf(stderr, "-d 'coordonnate of the reference grid' argument " - "error !! [-d x0,y0]\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'h': /* display an help description */ - encode_help_display(); - return 1; - - /* ----------------------------------------------------- */ - - case 'P': /* POC */ - { - int numpocs = 0; /* number of progression order change (POC) default 0 */ - opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ - - char *s = opj_optarg; - POC = parameters->POC; - - while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, - &POC[numpocs].resno0, &POC[numpocs].compno0, - &POC[numpocs].layno1, &POC[numpocs].resno1, - &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { - POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); - numpocs++; - while (*s && *s != '/') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->numpocs = numpocs; - } - break; - - /* ------------------------------------------------------ */ - - case 'S': /* SOP marker */ - { - parameters->csty |= 0x02; - } - break; - - /* ------------------------------------------------------ */ - - case 'E': /* EPH marker */ - { - parameters->csty |= 0x04; - } - break; - - /* ------------------------------------------------------ */ - - case 'M': /* Mode switch pas tous au point !! */ - { - int value = 0; - if (sscanf(opj_optarg, "%d", &value) == 1) { - for (i = 0; i <= 5; i++) { - int cache = value & (1 << i); - if (cache) - parameters->mode |= (1 << i); - } - } - } - break; - - /* ------------------------------------------------------ */ - - case 'R': /* ROI */ - { - if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, - ¶meters->roi_shift) != 2) { - fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'T': /* Tile offset */ - { - if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0) != 2) { - fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'C': /* add a comment */ - { - parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); - if(parameters->cp_comment) { - strcpy(parameters->cp_comment, opj_optarg); - } - } - break; - - - /* ------------------------------------------------------ */ - - case 'I': /* reversible or not */ - { - parameters->irreversible = 1; - } - break; - - /* ------------------------------------------------------ */ - - case 'u': /* Tile part generation*/ - { - parameters->tp_flag = opj_optarg[0]; - parameters->tp_on = 1; - } - break; - - /* ------------------------------------------------------ */ - - case 'z': /* Image Directory path */ - { - img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); - strcpy(img_fol->imgdirpath,opj_optarg); - img_fol->set_imgdir=1; - } - break; - - /* ------------------------------------------------------ */ - - case 'w': /* Digital Cinema 2K profile compliance*/ - { - int fps=0; - sscanf(opj_optarg,"%d",&fps); - if(fps == 24){ - parameters->cp_cinema = CINEMA2K_24; - }else if(fps == 48 ){ - parameters->cp_cinema = CINEMA2K_48; - }else { - fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); - return 1; - } - fprintf(stdout,"CINEMA 2K compliant codestream\n"); - parameters->cp_rsiz = CINEMA2K; - - } - break; - - /* ------------------------------------------------------ */ - - case 'y': /* Digital Cinema 4K profile compliance*/ - { - parameters->cp_cinema = CINEMA4K_24; - fprintf(stdout,"CINEMA 4K compliant codestream\n"); - parameters->cp_rsiz = CINEMA4K; - } - break; - - /* ------------------------------------------------------ */ - -/* UniPG>> */ + "h"; + + totlen=sizeof(long_option); + img_fol->set_out_format=0; + raw_cp->rawWidth = 0; + + do { + c = opj_getopt_long(argc, argv, optlist,long_option,totlen); + if (c == -1) + break; + switch (c) { + case 'i': { /* input file */ + char *infile = opj_optarg; + parameters->decod_format = get_file_format(infile); + switch(parameters->decod_format) { + case PGX_DFMT: + case PXM_DFMT: + case BMP_DFMT: + case TIF_DFMT: + case RAW_DFMT: + case TGA_DFMT: + case PNG_DFMT: + break; + default: + fprintf(stderr, + "!! Unrecognized format for infile : %s " + "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *png, *.bmp, *.tif, *.raw or *.tga] !!\n\n", + infile); + return 1; + } + strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); + } + break; + + /* ----------------------------------------------------- */ + + case 'o': { /* output file */ + char *outfile = opj_optarg; + parameters->cod_format = get_file_format(outfile); + switch(parameters->cod_format) { + case J2K_CFMT: + case JP2_CFMT: + break; + default: + fprintf(stderr, "Unknown output format image %s [only *.j2k, *.j2c or *.jp2]!! \n", outfile); + return 1; + } + strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); + } + break; + + /* ----------------------------------------------------- */ + case 'O': { /* output format */ + char outformat[50]; + char *of = opj_optarg; + sprintf(outformat,".%s",of); + img_fol->set_out_format = 1; + parameters->cod_format = get_file_format(outformat); + switch(parameters->cod_format) { + case J2K_CFMT: + case JP2_CFMT: + img_fol->out_format = opj_optarg; + break; + default: + fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n"); + return 1; + } + } + break; + + + /* ----------------------------------------------------- */ + + + case 'r': { /* rates rates/distorsion */ + char *s = opj_optarg; + parameters->tcp_numlayers = 0; + while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { + parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + parameters->cp_disto_alloc = 1; + } + break; + + /* ----------------------------------------------------- */ + + + case 'F': { /* Raw image format parameters */ + char signo; + char *s = opj_optarg; + if (sscanf(s, "%d,%d,%d,%d,%c", &raw_cp->rawWidth, &raw_cp->rawHeight, &raw_cp->rawComp, &raw_cp->rawBitDepth, &signo) == 5) { + if (signo == 's') { + raw_cp->rawSigned = OPJ_TRUE; + fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Signed\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); + } else if (signo == 'u') { + raw_cp->rawSigned = OPJ_FALSE; + fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Unsigned\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); + } else { + fprintf(stderr,"\nError: invalid raw image parameters: Unknown sign of raw file\n"); + fprintf(stderr,"Please use the Format option -F:\n"); + fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); + fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); + fprintf(stderr,"Aborting\n"); + } + } else { + fprintf(stderr,"\nError: invalid raw image parameters\n"); + fprintf(stderr,"Please use the Format option -F:\n"); + fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); + fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); + fprintf(stderr,"Aborting\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'q': { /* add fixed_quality */ + char *s = opj_optarg; + while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { + parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + parameters->cp_fixed_quality = 1; + } + break; + + /* dda */ + /* ----------------------------------------------------- */ + + case 'f': { /* mod fixed_quality (before : -q) */ + int *row = NULL, *col = NULL; + int numlayers = 0, numresolution = 0, matrix_width = 0; + + char *s = opj_optarg; + sscanf(s, "%d", &numlayers); + s++; + if (numlayers > 9) + s++; + + parameters->tcp_numlayers = numlayers; + numresolution = parameters->numresolution; + matrix_width = numresolution * 3; + parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); + s = s + 2; + + for (i = 0; i < numlayers; i++) { + row = ¶meters->cp_matrice[i * matrix_width]; + col = row; + parameters->tcp_rates[i] = 1; + sscanf(s, "%d,", &col[0]); + s += 2; + if (col[0] > 9) + s++; + col[1] = 0; + col[2] = 0; + for (j = 1; j < numresolution; j++) { + col += 3; + sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); + s += 6; + if (col[0] > 9) + s++; + if (col[1] > 9) + s++; + if (col[2] > 9) + s++; + } + if (i < numlayers - 1) + s++; + } + parameters->cp_fixed_alloc = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 't': { /* tiles */ + sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); + parameters->tile_size_on = OPJ_TRUE; + } + break; + + /* ----------------------------------------------------- */ + + case 'n': { /* resolution */ + sscanf(opj_optarg, "%d", ¶meters->numresolution); + } + break; + + /* ----------------------------------------------------- */ + case 'c': { /* precinct dimension */ + char sep; + int res_spec = 0; + + char *s = opj_optarg; + do { + sep = 0; + sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], + ¶meters->prch_init[res_spec], &sep); + parameters->csty |= 0x01; + res_spec++; + s = strpbrk(s, "]") + 2; + } while (sep == ','); + parameters->res_spec = res_spec; + } + break; + + /* ----------------------------------------------------- */ + + case 'b': { /* code-block dimension */ + int cblockw_init = 0, cblockh_init = 0; + sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init); + if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 + || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { + fprintf(stderr, + "!! Size of code_block error (option -b) !!\n\nRestriction :\n" + " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); + return 1; + } + parameters->cblockw_init = cblockw_init; + parameters->cblockh_init = cblockh_init; + } + break; + + /* ----------------------------------------------------- */ + + case 'x': { /* creation of index file */ + char *index = opj_optarg; + strncpy(indexfilename, index, OPJ_PATH_LEN); + } + break; + + /* ----------------------------------------------------- */ + + case 'p': { /* progression order */ + char progression[4]; + + strncpy(progression, opj_optarg, 4); + parameters->prog_order = give_progression(progression); + if (parameters->prog_order == -1) { + fprintf(stderr, "Unrecognized progression order " + "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 's': { /* subsampling factor */ + if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, + ¶meters->subsampling_dy) != 2) { + fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'd': { /* coordonnate of the reference grid */ + if (sscanf(opj_optarg, "%d,%d", ¶meters->image_offset_x0, + ¶meters->image_offset_y0) != 2) { + fprintf(stderr, "-d 'coordonnate of the reference grid' argument " + "error !! [-d x0,y0]\n"); + return 1; + } + } + break; + + /* ----------------------------------------------------- */ + + case 'h': /* display an help description */ + encode_help_display(); + return 1; + + /* ----------------------------------------------------- */ + + case 'P': { /* POC */ + int numpocs = 0; /* number of progression order change (POC) default 0 */ + opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ + + char *s = opj_optarg; + POC = parameters->POC; + + while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, + &POC[numpocs].resno0, &POC[numpocs].compno0, + &POC[numpocs].layno1, &POC[numpocs].resno1, + &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { + POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); + numpocs++; + while (*s && *s != '/') { + s++; + } + if (!*s) { + break; + } + s++; + } + parameters->numpocs = numpocs; + } + break; + + /* ------------------------------------------------------ */ + + case 'S': { /* SOP marker */ + parameters->csty |= 0x02; + } + break; + + /* ------------------------------------------------------ */ + + case 'E': { /* EPH marker */ + parameters->csty |= 0x04; + } + break; + + /* ------------------------------------------------------ */ + + case 'M': { /* Mode switch pas tous au point !! */ + int value = 0; + if (sscanf(opj_optarg, "%d", &value) == 1) { + for (i = 0; i <= 5; i++) { + int cache = value & (1 << i); + if (cache) + parameters->mode |= (1 << i); + } + } + } + break; + + /* ------------------------------------------------------ */ + + case 'R': { /* ROI */ + if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, + ¶meters->roi_shift) != 2) { + fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'T': { /* Tile offset */ + if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0) != 2) { + fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'C': { /* add a comment */ + parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); + if(parameters->cp_comment) { + strcpy(parameters->cp_comment, opj_optarg); + } + } + break; + + + /* ------------------------------------------------------ */ + + case 'I': { /* reversible or not */ + parameters->irreversible = 1; + } + break; + + /* ------------------------------------------------------ */ + + case 'u': { /* Tile part generation*/ + parameters->tp_flag = opj_optarg[0]; + parameters->tp_on = 1; + } + break; + + /* ------------------------------------------------------ */ + + case 'z': { /* Image Directory path */ + img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); + strcpy(img_fol->imgdirpath,opj_optarg); + img_fol->set_imgdir=1; + } + break; + + /* ------------------------------------------------------ */ + + case 'w': { /* Digital Cinema 2K profile compliance*/ + int fps=0; + sscanf(opj_optarg,"%d",&fps); + if(fps == 24) { + parameters->cp_cinema = CINEMA2K_24; + } else if(fps == 48 ) { + parameters->cp_cinema = CINEMA2K_48; + } else { + fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); + return 1; + } + fprintf(stdout,"CINEMA 2K compliant codestream\n"); + parameters->cp_rsiz = CINEMA2K; + + } + break; + + /* ------------------------------------------------------ */ + + case 'y': { /* Digital Cinema 4K profile compliance*/ + parameters->cp_cinema = CINEMA4K_24; + fprintf(stdout,"CINEMA 4K compliant codestream\n"); + parameters->cp_rsiz = CINEMA4K; + } + break; + + /* ------------------------------------------------------ */ + + /* UniPG>> */ #ifdef USE_JPWL - /* ------------------------------------------------------ */ - - case 'W': /* JPWL capabilities switched on */ - { - char *token = NULL; - int hprot, pprot, sens, addr, size, range; - - /* we need to enable indexing */ - if (!indexfilename || !*indexfilename) { - strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN); - } - - /* search for different protection methods */ - - /* break the option in comma points and parse the result */ - token = strtok(opj_optarg, ","); - while(token != NULL) { - - /* search header error protection method */ - if (*token == 'h') { - - static int tile = 0, tilespec = 0, lasttileno = 0; - - hprot = 1; /* predefined method */ - - if(sscanf(token, "h=%d", &hprot) == 1) { - /* Main header, specified */ - if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || - ((hprot >= 37) && (hprot <= 128)))) { - fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot); - return 1; - } - parameters->jpwl_hprot_MH = hprot; - - } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) { - /* Tile part header, specified */ - if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || - ((hprot >= 37) && (hprot <= 128)))) { - fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot); - return 1; - } - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); - return 1; - } - if (tilespec < JPWL_MAX_NO_TILESPECS) { - parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; - parameters->jpwl_hprot_TPH[tilespec++] = hprot; - } - - } else if(sscanf(token, "h%d", &tile) == 1) { - /* Tile part header, unspecified */ - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); - return 1; - } - if (tilespec < JPWL_MAX_NO_TILESPECS) { - parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; - parameters->jpwl_hprot_TPH[tilespec++] = hprot; - } - - - } else if (!strcmp(token, "h")) { - /* Main header, unspecified */ - parameters->jpwl_hprot_MH = hprot; - - } else { - fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); - return 1; - }; - - } - - /* search packet error protection method */ - if (*token == 'p') { - - static int pack = 0, tile = 0, packspec = 0; - - pprot = 1; /* predefined method */ - - if (sscanf(token, "p=%d", &pprot) == 1) { - /* Method for all tiles and all packets */ - if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { - fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot); - return 1; - } - parameters->jpwl_pprot_tileno[0] = 0; - parameters->jpwl_pprot_packno[0] = 0; - parameters->jpwl_pprot[0] = pprot; - - } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) { - /* method specified from that tile on */ - if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { - fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); - return 1; - } - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); - return 1; - } - if (packspec < JPWL_MAX_NO_PACKSPECS) { - parameters->jpwl_pprot_tileno[packspec] = tile; - parameters->jpwl_pprot_packno[packspec] = 0; - parameters->jpwl_pprot[packspec++] = pprot; - } - - } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) { - /* method fully specified from that tile and that packet on */ - if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { - fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); - return 1; - } - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); - return 1; - } - if (pack < 0) { - fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); - return 1; - } - if (packspec < JPWL_MAX_NO_PACKSPECS) { - parameters->jpwl_pprot_tileno[packspec] = tile; - parameters->jpwl_pprot_packno[packspec] = pack; - parameters->jpwl_pprot[packspec++] = pprot; - } - - } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) { - /* default method from that tile and that packet on */ - if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || - ((pprot >= 37) && (pprot <= 128)))) { - fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); - return 1; - } - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); - return 1; - } - if (pack < 0) { - fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); - return 1; - } - if (packspec < JPWL_MAX_NO_PACKSPECS) { - parameters->jpwl_pprot_tileno[packspec] = tile; - parameters->jpwl_pprot_packno[packspec] = pack; - parameters->jpwl_pprot[packspec++] = pprot; - } - - } else if (sscanf(token, "p%d", &tile) == 1) { - /* default from a tile on */ - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); - return 1; - } - if (packspec < JPWL_MAX_NO_PACKSPECS) { - parameters->jpwl_pprot_tileno[packspec] = tile; - parameters->jpwl_pprot_packno[packspec] = 0; - parameters->jpwl_pprot[packspec++] = pprot; - } - - - } else if (!strcmp(token, "p")) { - /* all default */ - parameters->jpwl_pprot_tileno[0] = 0; - parameters->jpwl_pprot_packno[0] = 0; - parameters->jpwl_pprot[0] = pprot; - - } else { - fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); - return 1; - }; - - } - - /* search sensitivity method */ - if (*token == 's') { - - static int tile = 0, tilespec = 0, lasttileno = 0; - - sens = 0; /* predefined: relative error */ - - if(sscanf(token, "s=%d", &sens) == 1) { - /* Main header, specified */ - if ((sens < -1) || (sens > 7)) { - fprintf(stderr, "ERROR -> invalid main header sensitivity method s = %d\n", sens); - return 1; - } - parameters->jpwl_sens_MH = sens; - - } else if(sscanf(token, "s%d=%d", &tile, &sens) == 2) { - /* Tile part header, specified */ - if ((sens < -1) || (sens > 7)) { - fprintf(stderr, "ERROR -> invalid tile part header sensitivity method s = %d\n", sens); - return 1; - } - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); - return 1; - } - if (tilespec < JPWL_MAX_NO_TILESPECS) { - parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; - parameters->jpwl_sens_TPH[tilespec++] = sens; - } - - } else if(sscanf(token, "s%d", &tile) == 1) { - /* Tile part header, unspecified */ - if (tile < 0) { - fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); - return 1; - } - if (tilespec < JPWL_MAX_NO_TILESPECS) { - parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; - parameters->jpwl_sens_TPH[tilespec++] = hprot; - } - - } else if (!strcmp(token, "s")) { - /* Main header, unspecified */ - parameters->jpwl_sens_MH = sens; - - } else { - fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token); - return 1; - }; - - parameters->jpwl_sens_size = 2; /* 2 bytes for default size */ - } - - /* search addressing size */ - if (*token == 'a') { - - - addr = 0; /* predefined: auto */ - - if(sscanf(token, "a=%d", &addr) == 1) { - /* Specified */ - if ((addr != 0) && (addr != 2) && (addr != 4)) { - fprintf(stderr, "ERROR -> invalid addressing size a = %d\n", addr); - return 1; - } - parameters->jpwl_sens_addr = addr; - - } else if (!strcmp(token, "a")) { - /* default */ - parameters->jpwl_sens_addr = addr; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token); - return 1; - }; - - } - - /* search sensitivity size */ - if (*token == 'z') { - - - size = 1; /* predefined: 1 byte */ - - if(sscanf(token, "z=%d", &size) == 1) { - /* Specified */ - if ((size != 0) && (size != 1) && (size != 2)) { - fprintf(stderr, "ERROR -> invalid sensitivity size z = %d\n", size); - return 1; - } - parameters->jpwl_sens_size = size; - - } else if (!strcmp(token, "a")) { - /* default */ - parameters->jpwl_sens_size = size; /* 1 for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid size selection = %s\n", token); - return 1; - }; - - } - - /* search range method */ - if (*token == 'g') { - - - range = 0; /* predefined: 0 (packet) */ - - if(sscanf(token, "g=%d", &range) == 1) { - /* Specified */ - if ((range < 0) || (range > 3)) { - fprintf(stderr, "ERROR -> invalid sensitivity range method g = %d\n", range); - return 1; - } - parameters->jpwl_sens_range = range; - - } else if (!strcmp(token, "g")) { - /* default */ - parameters->jpwl_sens_range = range; + /* ------------------------------------------------------ */ + + case 'W': { /* JPWL capabilities switched on */ + char *token = NULL; + int hprot, pprot, sens, addr, size, range; + + /* we need to enable indexing */ + if (!indexfilename || !*indexfilename) { + strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN); + } + + /* search for different protection methods */ + + /* break the option in comma points and parse the result */ + token = strtok(opj_optarg, ","); + while(token != NULL) { + + /* search header error protection method */ + if (*token == 'h') { + + static int tile = 0, tilespec = 0, lasttileno = 0; + + hprot = 1; /* predefined method */ + + if(sscanf(token, "h=%d", &hprot) == 1) { + /* Main header, specified */ + if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || + ((hprot >= 37) && (hprot <= 128)))) { + fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot); + return 1; + } + parameters->jpwl_hprot_MH = hprot; + + } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) { + /* Tile part header, specified */ + if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || + ((hprot >= 37) && (hprot <= 128)))) { + fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot); + return 1; + } + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); + return 1; + } + if (tilespec < JPWL_MAX_NO_TILESPECS) { + parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; + parameters->jpwl_hprot_TPH[tilespec++] = hprot; + } + + } else if(sscanf(token, "h%d", &tile) == 1) { + /* Tile part header, unspecified */ + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); + return 1; + } + if (tilespec < JPWL_MAX_NO_TILESPECS) { + parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; + parameters->jpwl_hprot_TPH[tilespec++] = hprot; + } + + + } else if (!strcmp(token, "h")) { + /* Main header, unspecified */ + parameters->jpwl_hprot_MH = hprot; + + } else { + fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); + return 1; + }; + + } + + /* search packet error protection method */ + if (*token == 'p') { + + static int pack = 0, tile = 0, packspec = 0; + + pprot = 1; /* predefined method */ + + if (sscanf(token, "p=%d", &pprot) == 1) { + /* Method for all tiles and all packets */ + if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || + ((pprot >= 37) && (pprot <= 128)))) { + fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot); + return 1; + } + parameters->jpwl_pprot_tileno[0] = 0; + parameters->jpwl_pprot_packno[0] = 0; + parameters->jpwl_pprot[0] = pprot; + + } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) { + /* method specified from that tile on */ + if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || + ((pprot >= 37) && (pprot <= 128)))) { + fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); + return 1; + } + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); + return 1; + } + if (packspec < JPWL_MAX_NO_PACKSPECS) { + parameters->jpwl_pprot_tileno[packspec] = tile; + parameters->jpwl_pprot_packno[packspec] = 0; + parameters->jpwl_pprot[packspec++] = pprot; + } + + } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) { + /* method fully specified from that tile and that packet on */ + if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || + ((pprot >= 37) && (pprot <= 128)))) { + fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); + return 1; + } + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); + return 1; + } + if (pack < 0) { + fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); + return 1; + } + if (packspec < JPWL_MAX_NO_PACKSPECS) { + parameters->jpwl_pprot_tileno[packspec] = tile; + parameters->jpwl_pprot_packno[packspec] = pack; + parameters->jpwl_pprot[packspec++] = pprot; + } + + } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) { + /* default method from that tile and that packet on */ + if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || + ((pprot >= 37) && (pprot <= 128)))) { + fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); + return 1; + } + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); + return 1; + } + if (pack < 0) { + fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); + return 1; + } + if (packspec < JPWL_MAX_NO_PACKSPECS) { + parameters->jpwl_pprot_tileno[packspec] = tile; + parameters->jpwl_pprot_packno[packspec] = pack; + parameters->jpwl_pprot[packspec++] = pprot; + } + + } else if (sscanf(token, "p%d", &tile) == 1) { + /* default from a tile on */ + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); + return 1; + } + if (packspec < JPWL_MAX_NO_PACKSPECS) { + parameters->jpwl_pprot_tileno[packspec] = tile; + parameters->jpwl_pprot_packno[packspec] = 0; + parameters->jpwl_pprot[packspec++] = pprot; + } + + + } else if (!strcmp(token, "p")) { + /* all default */ + parameters->jpwl_pprot_tileno[0] = 0; + parameters->jpwl_pprot_packno[0] = 0; + parameters->jpwl_pprot[0] = pprot; + + } else { + fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); + return 1; + }; + + } + + /* search sensitivity method */ + if (*token == 's') { + + static int tile = 0, tilespec = 0, lasttileno = 0; + + sens = 0; /* predefined: relative error */ + + if(sscanf(token, "s=%d", &sens) == 1) { + /* Main header, specified */ + if ((sens < -1) || (sens > 7)) { + fprintf(stderr, "ERROR -> invalid main header sensitivity method s = %d\n", sens); + return 1; + } + parameters->jpwl_sens_MH = sens; + + } else if(sscanf(token, "s%d=%d", &tile, &sens) == 2) { + /* Tile part header, specified */ + if ((sens < -1) || (sens > 7)) { + fprintf(stderr, "ERROR -> invalid tile part header sensitivity method s = %d\n", sens); + return 1; + } + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); + return 1; + } + if (tilespec < JPWL_MAX_NO_TILESPECS) { + parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; + parameters->jpwl_sens_TPH[tilespec++] = sens; + } + + } else if(sscanf(token, "s%d", &tile) == 1) { + /* Tile part header, unspecified */ + if (tile < 0) { + fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); + return 1; + } + if (tilespec < JPWL_MAX_NO_TILESPECS) { + parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; + parameters->jpwl_sens_TPH[tilespec++] = hprot; + } + + } else if (!strcmp(token, "s")) { + /* Main header, unspecified */ + parameters->jpwl_sens_MH = sens; + + } else { + fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token); + return 1; + }; + + parameters->jpwl_sens_size = 2; /* 2 bytes for default size */ + } + + /* search addressing size */ + if (*token == 'a') { + + + addr = 0; /* predefined: auto */ + + if(sscanf(token, "a=%d", &addr) == 1) { + /* Specified */ + if ((addr != 0) && (addr != 2) && (addr != 4)) { + fprintf(stderr, "ERROR -> invalid addressing size a = %d\n", addr); + return 1; + } + parameters->jpwl_sens_addr = addr; + + } else if (!strcmp(token, "a")) { + /* default */ + parameters->jpwl_sens_addr = addr; /* auto for default size */ + + } else { + fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token); + return 1; + }; + + } + + /* search sensitivity size */ + if (*token == 'z') { + + + size = 1; /* predefined: 1 byte */ + + if(sscanf(token, "z=%d", &size) == 1) { + /* Specified */ + if ((size != 0) && (size != 1) && (size != 2)) { + fprintf(stderr, "ERROR -> invalid sensitivity size z = %d\n", size); + return 1; + } + parameters->jpwl_sens_size = size; + + } else if (!strcmp(token, "a")) { + /* default */ + parameters->jpwl_sens_size = size; /* 1 for default size */ + + } else { + fprintf(stderr, "ERROR -> invalid size selection = %s\n", token); + return 1; + }; + + } + + /* search range method */ + if (*token == 'g') { + + + range = 0; /* predefined: 0 (packet) */ + + if(sscanf(token, "g=%d", &range) == 1) { + /* Specified */ + if ((range < 0) || (range > 3)) { + fprintf(stderr, "ERROR -> invalid sensitivity range method g = %d\n", range); + return 1; + } + parameters->jpwl_sens_range = range; + + } else if (!strcmp(token, "g")) { + /* default */ + parameters->jpwl_sens_range = range; - } else { - fprintf(stderr, "ERROR -> invalid range selection = %s\n", token); - return 1; - }; + } else { + fprintf(stderr, "ERROR -> invalid range selection = %s\n", token); + return 1; + }; - } + } - /* next token or bust */ - token = strtok(NULL, ","); - }; + /* next token or bust */ + token = strtok(NULL, ","); + }; - /* some info */ - fprintf(stdout, "Info: JPWL capabilities enabled\n"); - parameters->jpwl_epc_on = OPJ_TRUE; + /* some info */ + fprintf(stdout, "Info: JPWL capabilities enabled\n"); + parameters->jpwl_epc_on = OPJ_TRUE; - } - break; + } + break; #endif /* USE_JPWL */ -/* <<UniPG */ -/* ------------------------------------------------------ */ - - case 'J': /* jpip on */ - { - /*parameters->jpip_on = OPJ_TRUE;*/ - } - break; - /* ------------------------------------------------------ */ - - - default: - fprintf(stderr, "ERROR -> Command line not valid\n"); - return 1; - } - }while(c != -1); - - /* check for possible errors */ - if (parameters->cp_cinema){ - if(parameters->tcp_numlayers > 1){ - parameters->cp_rsiz = STD_RSIZ; - fprintf(stdout,"Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile\n"); - } - } - if(img_fol->set_imgdir == 1){ - if(!(parameters->infile[0] == 0)){ - fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); - return 1; - } - if(img_fol->set_out_format == 0){ - fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); - fprintf(stderr, "Only one format allowed! Valid formats are j2k and jp2!!\n"); - return 1; - } - if(!((parameters->outfile[0] == 0))){ - fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); - fprintf(stderr, "Specify OutputFormat using -OutFor<FORMAT> !!\n"); - return 1; - } - }else{ - if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { - fprintf(stderr, "Example: %s -i image.ppm -o image.j2k\n",argv[0]); - fprintf(stderr, " Try: %s -h\n",argv[0]); - return 1; - } - } - - if (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) { - fprintf(stderr,"\nError: invalid raw image parameters\n"); - fprintf(stderr,"Please use the Format option -F:\n"); - fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); - fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); - fprintf(stderr,"Aborting\n"); - return 1; - } - - if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) - && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->cp_fixed_quality))) { - fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); - return 1; - } /* mod fixed_quality */ - - /* if no rate entered, lossless by default */ - if (parameters->tcp_numlayers == 0) { - parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ - parameters->tcp_numlayers++; - parameters->cp_disto_alloc = 1; - } - - if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) { - fprintf(stderr, - "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", - parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0); - return 1; - } - - for (i = 0; i < parameters->numpocs; i++) { - if (parameters->POC[i].prg == -1) { - fprintf(stderr, - "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", - i + 1); - } - } - - return 0; + /* <<UniPG */ + /* ------------------------------------------------------ */ + + case 'J': { /* jpip on */ + /*parameters->jpip_on = OPJ_TRUE;*/ + } + break; + /* ------------------------------------------------------ */ + + + default: + fprintf(stderr, "ERROR -> Command line not valid\n"); + return 1; + } + } while(c != -1); + + /* check for possible errors */ + if (parameters->cp_cinema) { + if(parameters->tcp_numlayers > 1) { + parameters->cp_rsiz = STD_RSIZ; + fprintf(stdout,"Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile\n"); + } + } + if(img_fol->set_imgdir == 1) { + if(!(parameters->infile[0] == 0)) { + fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); + return 1; + } + if(img_fol->set_out_format == 0) { + fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); + fprintf(stderr, "Only one format allowed! Valid formats are j2k and jp2!!\n"); + return 1; + } + if(!((parameters->outfile[0] == 0))) { + fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); + fprintf(stderr, "Specify OutputFormat using -OutFor<FORMAT> !!\n"); + return 1; + } + } else { + if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { + fprintf(stderr, "Example: %s -i image.ppm -o image.j2k\n",argv[0]); + fprintf(stderr, " Try: %s -h\n",argv[0]); + return 1; + } + } + + if (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) { + fprintf(stderr,"\nError: invalid raw image parameters\n"); + fprintf(stderr,"Please use the Format option -F:\n"); + fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); + fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); + fprintf(stderr,"Aborting\n"); + return 1; + } + + if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) + && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->cp_fixed_quality))) { + fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); + return 1; + } /* mod fixed_quality */ + + /* if no rate entered, lossless by default */ + if (parameters->tcp_numlayers == 0) { + parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ + parameters->tcp_numlayers++; + parameters->cp_disto_alloc = 1; + } + + if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) { + fprintf(stderr, + "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", + parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0); + return 1; + } + + for (i = 0; i < parameters->numpocs; i++) { + if (parameters->POC[i].prg == -1) { + fprintf(stderr, + "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", + i + 1); + } + } + + return 0; } /* -------------------------------------------------------------------------- */ @@ -1472,348 +1451,351 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param /** sample error callback expecting a FILE* client object */ -static void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +static void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -static void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +static void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ -static void info_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); +static void info_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ -int main(int argc, char **argv) { - opj_bool bSuccess; - opj_cparameters_t parameters; /* compression parameters */ - img_fol_t img_fol; - opj_event_mgr_t event_mgr; /* event manager */ - opj_image_t *image = NULL; - int i,num_images; - int imageno; - dircnt_t *dirptr = NULL; - raw_cparameters_t raw_cp; - opj_codestream_info_t cstr_info; /* Codestream information structure */ - char indexfilename[OPJ_PATH_LEN]; /* index file name */ - - /* - configure the event callbacks (not required) - setting of each callback is optionnal - */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* set encoding parameters to default values */ - opj_set_default_encoder_parameters(¶meters); - - /* Initialize indexfilename and img_fol */ - *indexfilename = 0; - memset(&img_fol,0,sizeof(img_fol_t)); - - /* parse input and get user encoding parameters */ - if(parse_cmdline_encoder(argc, argv, ¶meters,&img_fol, &raw_cp, indexfilename) == 1) { - return 1; - } - - if (parameters.cp_cinema){ - img_fol.rates = (float*)malloc(parameters.tcp_numlayers * sizeof(float)); - for(i=0; i< parameters.tcp_numlayers; i++){ - img_fol.rates[i] = parameters.tcp_rates[i]; - } - cinema_parameters(¶meters); - } - - /* Create comment for codestream */ - if(parameters.cp_comment == NULL) { - const char comment[] = "Created by OpenJPEG version "; - const size_t clen = strlen(comment); - const char *version = opj_version(); -/* UniPG>> */ +int main(int argc, char **argv) +{ + opj_bool bSuccess; + opj_cparameters_t parameters; /* compression parameters */ + img_fol_t img_fol; + opj_event_mgr_t event_mgr; /* event manager */ + opj_image_t *image = NULL; + int i,num_images; + int imageno; + dircnt_t *dirptr = NULL; + raw_cparameters_t raw_cp; + opj_codestream_info_t cstr_info; /* Codestream information structure */ + char indexfilename[OPJ_PATH_LEN]; /* index file name */ + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* set encoding parameters to default values */ + opj_set_default_encoder_parameters(¶meters); + + /* Initialize indexfilename and img_fol */ + *indexfilename = 0; + memset(&img_fol,0,sizeof(img_fol_t)); + + /* parse input and get user encoding parameters */ + if(parse_cmdline_encoder(argc, argv, ¶meters,&img_fol, &raw_cp, indexfilename) == 1) { + return 1; + } + + if (parameters.cp_cinema) { + img_fol.rates = (float*)malloc(parameters.tcp_numlayers * sizeof(float)); + for(i=0; i< parameters.tcp_numlayers; i++) { + img_fol.rates[i] = parameters.tcp_rates[i]; + } + cinema_parameters(¶meters); + } + + /* Create comment for codestream */ + if(parameters.cp_comment == NULL) { + const char comment[] = "Created by OpenJPEG version "; + const size_t clen = strlen(comment); + const char *version = opj_version(); + /* UniPG>> */ #ifdef USE_JPWL - parameters.cp_comment = (char*)malloc(clen+strlen(version)+11); - sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); + parameters.cp_comment = (char*)malloc(clen+strlen(version)+11); + sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); #else - parameters.cp_comment = (char*)malloc(clen+strlen(version)+1); - sprintf(parameters.cp_comment,"%s%s", comment, version); + parameters.cp_comment = (char*)malloc(clen+strlen(version)+1); + sprintf(parameters.cp_comment,"%s%s", comment, version); #endif -/* <<UniPG */ - } - - /* Read directory if necessary */ - if(img_fol.set_imgdir==1){ - num_images=get_num_images(img_fol.imgdirpath); - dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); - if(dirptr){ - dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ - dirptr->filename = (char**) malloc(num_images*sizeof(char*)); - if(!dirptr->filename_buf){ - return 0; - } - for(i=0;i<num_images;i++){ - dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; - } - } - if(load_images(dirptr,img_fol.imgdirpath)==1){ - return 0; - } - if (num_images==0){ - fprintf(stdout,"Folder is empty\n"); - return 0; - } - }else{ - num_images=1; - } - /*Encoding image one by one*/ - for(imageno=0;imageno<num_images;imageno++) { - image = NULL; - fprintf(stderr,"\n"); - - if(img_fol.set_imgdir==1){ - if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { - fprintf(stderr,"skipping file...\n"); - continue; - } - } - switch(parameters.decod_format) { - case PGX_DFMT: - break; - case PXM_DFMT: - break; - case BMP_DFMT: - break; - case TIF_DFMT: - break; - case RAW_DFMT: - break; - case TGA_DFMT: - break; - case PNG_DFMT: - break; - default: - fprintf(stderr,"skipping file...\n"); - continue; - } - - /* decode the source image */ - /* ----------------------- */ - - switch (parameters.decod_format) { - case PGX_DFMT: - image = pgxtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load pgx file\n"); - return 1; - } - break; - - case PXM_DFMT: - image = pnmtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load pnm file\n"); - return 1; - } - break; - - case BMP_DFMT: - image = bmptoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load bmp file\n"); - return 1; - } - break; + /* <<UniPG */ + } + + /* Read directory if necessary */ + if(img_fol.set_imgdir==1) { + num_images=get_num_images(img_fol.imgdirpath); + dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); + if(dirptr) { + dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ + dirptr->filename = (char**) malloc(num_images*sizeof(char*)); + if(!dirptr->filename_buf) { + return 0; + } + for(i=0; i<num_images; i++) { + dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; + } + } + if(load_images(dirptr,img_fol.imgdirpath)==1) { + return 0; + } + if (num_images==0) { + fprintf(stdout,"Folder is empty\n"); + return 0; + } + } else { + num_images=1; + } + /*Encoding image one by one*/ + for(imageno=0; imageno<num_images; imageno++) { + image = NULL; + fprintf(stderr,"\n"); + + if(img_fol.set_imgdir==1) { + if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { + fprintf(stderr,"skipping file...\n"); + continue; + } + } + switch(parameters.decod_format) { + case PGX_DFMT: + break; + case PXM_DFMT: + break; + case BMP_DFMT: + break; + case TIF_DFMT: + break; + case RAW_DFMT: + break; + case TGA_DFMT: + break; + case PNG_DFMT: + break; + default: + fprintf(stderr,"skipping file...\n"); + continue; + } + + /* decode the source image */ + /* ----------------------- */ + + switch (parameters.decod_format) { + case PGX_DFMT: + image = pgxtoimage(parameters.infile, ¶meters); + if (!image) { + fprintf(stderr, "Unable to load pgx file\n"); + return 1; + } + break; + + case PXM_DFMT: + image = pnmtoimage(parameters.infile, ¶meters); + if (!image) { + fprintf(stderr, "Unable to load pnm file\n"); + return 1; + } + break; + + case BMP_DFMT: + image = bmptoimage(parameters.infile, ¶meters); + if (!image) { + fprintf(stderr, "Unable to load bmp file\n"); + return 1; + } + break; #ifdef OPJ_HAVE_LIBTIFF - case TIF_DFMT: - image = tiftoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load tiff file\n"); - return 1; - } - break; + case TIF_DFMT: + image = tiftoimage(parameters.infile, ¶meters); + if (!image) { + fprintf(stderr, "Unable to load tiff file\n"); + return 1; + } + break; #endif /* OPJ_HAVE_LIBTIFF */ - case RAW_DFMT: - image = rawtoimage(parameters.infile, ¶meters, &raw_cp); - if (!image) { - fprintf(stderr, "Unable to load raw file\n"); - return 1; - } - break; - - case TGA_DFMT: - image = tgatoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load tga file\n"); - return 1; - } - break; + case RAW_DFMT: + image = rawtoimage(parameters.infile, ¶meters, &raw_cp); + if (!image) { + fprintf(stderr, "Unable to load raw file\n"); + return 1; + } + break; + + case TGA_DFMT: + image = tgatoimage(parameters.infile, ¶meters); + if (!image) { + fprintf(stderr, "Unable to load tga file\n"); + return 1; + } + break; #ifdef OPJ_HAVE_LIBPNG - case PNG_DFMT: - image = pngtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load png file\n"); - return 1; - } - break; + case PNG_DFMT: + image = pngtoimage(parameters.infile, ¶meters); + if (!image) { + fprintf(stderr, "Unable to load png file\n"); + return 1; + } + break; #endif /* OPJ_HAVE_LIBPNG */ - } -/* Can happen if input file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined -*/ - if( !image) - { - fprintf(stderr, "Unable to load file: got no image\n"); - return 1; - } - /* Decide if MCT should be used */ - parameters.tcp_mct = image->numcomps == 3 ? 1 : 0; - - if(parameters.cp_cinema){ - cinema_setup_encoder(¶meters,image,&img_fol); - } - - /* encode the destination image */ - /* ---------------------------- */ - - if (parameters.cod_format == J2K_CFMT) { /* J2K format output */ - int codestream_length; - size_t res; - opj_cio_t *cio = NULL; - FILE *f = NULL; - - /* get a J2K compressor handle */ - opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup the encoder parameters using the current image and user parameters */ - opj_setup_encoder(cinfo, ¶meters, image); - - /* open a byte stream for writing */ - /* allocate memory for all tiles */ - cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); - - /* encode the image */ - if (*indexfilename) /* If need to extract codestream information*/ - bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); - else - bSuccess = opj_encode(cinfo, cio, image, NULL); - if (!bSuccess) { - opj_cio_close(cio); - fprintf(stderr, "failed to encode image\n"); - return 1; - } - codestream_length = cio_tell(cio); - - /* write the buffer to disk */ - f = fopen(parameters.outfile, "wb"); - if (!f) { - fprintf(stderr, "failed to open %s for writing\n", parameters.outfile); - return 1; - } - res = fwrite(cio->buffer, 1, codestream_length, f); - if( res < (size_t)codestream_length ) { /* FIXME */ - fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile); - return 1; - } - fclose(f); - - fprintf(stderr,"Generated outfile %s\n",parameters.outfile); - /* close and free the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename); - } - } - - /* free remaining compression structures */ - opj_destroy_compress(cinfo); - if (*indexfilename) - opj_destroy_cstr_info(&cstr_info); - } else { /* JP2 format output */ - int codestream_length; - size_t res; - opj_cio_t *cio = NULL; - FILE *f = NULL; - opj_cinfo_t *cinfo = NULL; - - /* get a JP2 compressor handle */ - cinfo = opj_create_compress(CODEC_JP2); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup the encoder parameters using the current image and using user parameters */ - opj_setup_encoder(cinfo, ¶meters, image); - - /* open a byte stream for writing */ - /* allocate memory for all tiles */ - cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); - - /* encode the image */ - if (*indexfilename /*|| parameters.jpip_on*/) /* If need to extract codestream information*/ - bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); - else - bSuccess = opj_encode(cinfo, cio, image, NULL); - if (!bSuccess) { - opj_cio_close(cio); - fprintf(stderr, "failed to encode image\n"); - return 1; - } - codestream_length = cio_tell(cio); - - /* write the buffer to disk */ - f = fopen(parameters.outfile, "wb"); - if (!f) { - fprintf(stderr, "failed to open %s for writing\n", parameters.outfile); - return 1; - } - res = fwrite(cio->buffer, 1, codestream_length, f); - if( res < (size_t)codestream_length ) { /* FIXME */ - fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile); - return 1; - } - fclose(f); - fprintf(stderr,"Generated outfile %s\n",parameters.outfile); - /* close and free the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - - /* free remaining compression structures */ - opj_destroy_compress(cinfo); - if (*indexfilename) - opj_destroy_cstr_info(&cstr_info); - } - - /* free image data */ - opj_image_destroy(image); - } - - /* free user parameters structure */ - if(parameters.cp_comment) free(parameters.cp_comment); - if(parameters.cp_matrice) free(parameters.cp_matrice); - - return 0; + } + /* Can happen if input file is TIFF or PNG + * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined + */ + if( !image) { + fprintf(stderr, "Unable to load file: got no image\n"); + return 1; + } + /* Decide if MCT should be used */ + parameters.tcp_mct = image->numcomps == 3 ? 1 : 0; + + if(parameters.cp_cinema) { + cinema_setup_encoder(¶meters,image,&img_fol); + } + + /* encode the destination image */ + /* ---------------------------- */ + + if (parameters.cod_format == J2K_CFMT) { /* J2K format output */ + int codestream_length; + size_t res; + opj_cio_t *cio = NULL; + FILE *f = NULL; + + /* get a J2K compressor handle */ + opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); + + /* setup the encoder parameters using the current image and user parameters */ + opj_setup_encoder(cinfo, ¶meters, image); + + /* open a byte stream for writing */ + /* allocate memory for all tiles */ + cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); + + /* encode the image */ + if (*indexfilename) /* If need to extract codestream information*/ + bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); + else + bSuccess = opj_encode(cinfo, cio, image, NULL); + if (!bSuccess) { + opj_cio_close(cio); + fprintf(stderr, "failed to encode image\n"); + return 1; + } + codestream_length = cio_tell(cio); + + /* write the buffer to disk */ + f = fopen(parameters.outfile, "wb"); + if (!f) { + fprintf(stderr, "failed to open %s for writing\n", parameters.outfile); + return 1; + } + res = fwrite(cio->buffer, 1, codestream_length, f); + if( res < (size_t)codestream_length ) { /* FIXME */ + fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile); + return 1; + } + fclose(f); + + fprintf(stderr,"Generated outfile %s\n",parameters.outfile); + /* close and free the byte stream */ + opj_cio_close(cio); + + /* Write the index to disk */ + if (*indexfilename) { + bSuccess = write_index_file(&cstr_info, indexfilename); + if (bSuccess) { + fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename); + } + } + + /* free remaining compression structures */ + opj_destroy_compress(cinfo); + if (*indexfilename) + opj_destroy_cstr_info(&cstr_info); + } else { /* JP2 format output */ + int codestream_length; + size_t res; + opj_cio_t *cio = NULL; + FILE *f = NULL; + opj_cinfo_t *cinfo = NULL; + + /* get a JP2 compressor handle */ + cinfo = opj_create_compress(CODEC_JP2); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); + + /* setup the encoder parameters using the current image and using user parameters */ + opj_setup_encoder(cinfo, ¶meters, image); + + /* open a byte stream for writing */ + /* allocate memory for all tiles */ + cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); + + /* encode the image */ + if (*indexfilename /*|| parameters.jpip_on*/) /* If need to extract codestream information*/ + bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); + else + bSuccess = opj_encode(cinfo, cio, image, NULL); + if (!bSuccess) { + opj_cio_close(cio); + fprintf(stderr, "failed to encode image\n"); + return 1; + } + codestream_length = cio_tell(cio); + + /* write the buffer to disk */ + f = fopen(parameters.outfile, "wb"); + if (!f) { + fprintf(stderr, "failed to open %s for writing\n", parameters.outfile); + return 1; + } + res = fwrite(cio->buffer, 1, codestream_length, f); + if( res < (size_t)codestream_length ) { /* FIXME */ + fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile); + return 1; + } + fclose(f); + fprintf(stderr,"Generated outfile %s\n",parameters.outfile); + /* close and free the byte stream */ + opj_cio_close(cio); + + /* Write the index to disk */ + if (*indexfilename) { + bSuccess = write_index_file(&cstr_info, indexfilename); + if (bSuccess) { + fprintf(stderr, "Failed to output index file\n"); + } + } + + /* free remaining compression structures */ + opj_destroy_compress(cinfo); + if (*indexfilename) + opj_destroy_cstr_info(&cstr_info); + } + + /* free image data */ + opj_image_destroy(image); + } + + /* free user parameters structure */ + if(parameters.cp_comment) free(parameters.cp_comment); + if(parameters.cp_matrice) free(parameters.cp_matrice); + + return 0; } diff --git a/src/bin/jpwl/opj_jpwl_decompress.c b/src/bin/jpwl/opj_jpwl_decompress.c index 3e4ca23d..848728b5 100644 --- a/src/bin/jpwl/opj_jpwl_decompress.c +++ b/src/bin/jpwl/opj_jpwl_decompress.c @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -8,7 +8,7 @@ * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan @@ -71,424 +71,422 @@ #include "format_defs.h" -typedef struct dircnt{ - /** Buffer for holding images read from Directory*/ - char *filename_buf; - /** Pointer to the buffer*/ - char **filename; -}dircnt_t; - - -typedef struct img_folder{ - /** The directory path of the folder containing input images*/ - char *imgdirpath; - /** Output format*/ - const char *out_format; - /** Enable option*/ - char set_imgdir; - /** Enable Cod Format for output*/ - char set_out_format; - -}img_fol_t; - -void decode_help_display(void) { - fprintf(stdout,"HELP for j2k_to_image\n----\n\n"); - fprintf(stdout,"- the -h option displays this help information on screen\n\n"); - -/* UniPG>> */ - fprintf(stdout,"List of parameters for the JPEG 2000 " +typedef struct dircnt { + /** Buffer for holding images read from Directory*/ + char *filename_buf; + /** Pointer to the buffer*/ + char **filename; +} dircnt_t; + + +typedef struct img_folder { + /** The directory path of the folder containing input images*/ + char *imgdirpath; + /** Output format*/ + const char *out_format; + /** Enable option*/ + char set_imgdir; + /** Enable Cod Format for output*/ + char set_out_format; + +} img_fol_t; + +void decode_help_display(void) +{ + fprintf(stdout,"HELP for j2k_to_image\n----\n\n"); + fprintf(stdout,"- the -h option displays this help information on screen\n\n"); + + /* UniPG>> */ + fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL - "+ JPWL " + "+ JPWL " #endif /* USE_JPWL */ - "decoder:\n"); -/* <<UniPG */ - fprintf(stdout,"\n"); - fprintf(stdout,"\n"); - fprintf(stdout," -ImgDir \n"); - fprintf(stdout," Image file Directory path \n"); - fprintf(stdout," -OutFor \n"); - fprintf(stdout," REQUIRED only if -ImgDir is used\n"); - fprintf(stdout," Need to specify only format without filename <BMP> \n"); - fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); - fprintf(stdout," -i <compressed file>\n"); - fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); - fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); - fprintf(stdout," is identified based on its suffix.\n"); - fprintf(stdout," -o <decompressed file>\n"); - fprintf(stdout," REQUIRED\n"); - fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n"); - fprintf(stdout," Binary data is written to the file (not ascii). If a PGX\n"); - fprintf(stdout," filename is given, there will be as many output files as there are\n"); - fprintf(stdout," components: an indice starting from 0 will then be appended to the\n"); - fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n"); - fprintf(stdout," is given and there are more than one component, only the first component\n"); - fprintf(stdout," will be written to the file.\n"); - fprintf(stdout," -r <reduce factor>\n"); - fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n"); - fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n"); - fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); - fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); - fprintf(stdout," -l <number of quality layers to decode>\n"); - fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); - fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); - fprintf(stdout," are decoded.\n"); - fprintf(stdout," -x \n"); - fprintf(stdout," Create an index file *.Idx (-x index_name.Idx) \n"); - fprintf(stdout,"\n"); -/* UniPG>> */ + "decoder:\n"); + /* <<UniPG */ + fprintf(stdout,"\n"); + fprintf(stdout,"\n"); + fprintf(stdout," -ImgDir \n"); + fprintf(stdout," Image file Directory path \n"); + fprintf(stdout," -OutFor \n"); + fprintf(stdout," REQUIRED only if -ImgDir is used\n"); + fprintf(stdout," Need to specify only format without filename <BMP> \n"); + fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); + fprintf(stdout," -i <compressed file>\n"); + fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); + fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); + fprintf(stdout," is identified based on its suffix.\n"); + fprintf(stdout," -o <decompressed file>\n"); + fprintf(stdout," REQUIRED\n"); + fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n"); + fprintf(stdout," Binary data is written to the file (not ascii). If a PGX\n"); + fprintf(stdout," filename is given, there will be as many output files as there are\n"); + fprintf(stdout," components: an indice starting from 0 will then be appended to the\n"); + fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n"); + fprintf(stdout," is given and there are more than one component, only the first component\n"); + fprintf(stdout," will be written to the file.\n"); + fprintf(stdout," -r <reduce factor>\n"); + fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n"); + fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n"); + fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); + fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); + fprintf(stdout," -l <number of quality layers to decode>\n"); + fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); + fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); + fprintf(stdout," are decoded.\n"); + fprintf(stdout," -x \n"); + fprintf(stdout," Create an index file *.Idx (-x index_name.Idx) \n"); + fprintf(stdout,"\n"); + /* UniPG>> */ #ifdef USE_JPWL - fprintf(stdout," -W <options>\n"); - fprintf(stdout," Activates the JPWL correction capability, if the codestream complies.\n"); - fprintf(stdout," Options can be a comma separated list of <param=val> tokens:\n"); - fprintf(stdout," c, c=numcomps\n"); - fprintf(stdout," numcomps is the number of expected components in the codestream\n"); - fprintf(stdout," (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); + fprintf(stdout," -W <options>\n"); + fprintf(stdout," Activates the JPWL correction capability, if the codestream complies.\n"); + fprintf(stdout," Options can be a comma separated list of <param=val> tokens:\n"); + fprintf(stdout," c, c=numcomps\n"); + fprintf(stdout," numcomps is the number of expected components in the codestream\n"); + fprintf(stdout," (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); #endif /* USE_JPWL */ -/* <<UniPG */ - fprintf(stdout,"\n"); + /* <<UniPG */ + fprintf(stdout,"\n"); } /* -------------------------------------------------------------------------- */ -int get_num_images(char *imgdirpath){ - DIR *dir; - struct dirent* content; - int num_images = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 0; - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - num_images++; - } - return num_images; +int get_num_images(char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int num_images = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 0; + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + num_images++; + } + return num_images; } -int load_images(dircnt_t *dirptr, char *imgdirpath){ - DIR *dir; - struct dirent* content; - int i = 0; - - /*Reading the input images from given input directory*/ - - dir= opendir(imgdirpath); - if(!dir){ - fprintf(stderr,"Could not open Folder %s\n",imgdirpath); - return 1; - }else { - fprintf(stderr,"Folder opened successfully\n"); - } - - while((content=readdir(dir))!=NULL){ - if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) - continue; - - strcpy(dirptr->filename[i],content->d_name); - i++; - } - return 0; +int load_images(dircnt_t *dirptr, char *imgdirpath) +{ + DIR *dir; + struct dirent* content; + int i = 0; + + /*Reading the input images from given input directory*/ + + dir= opendir(imgdirpath); + if(!dir) { + fprintf(stderr,"Could not open Folder %s\n",imgdirpath); + return 1; + } else { + fprintf(stderr,"Folder opened successfully\n"); + } + + while((content=readdir(dir))!=NULL) { + if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) + continue; + + strcpy(dirptr->filename[i],content->d_name); + i++; + } + return 0; } -int get_file_format(char *filename) { - unsigned int i; - static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; - static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; - char * ext = strrchr(filename, '.'); - if (ext == NULL) - return -1; - ext++; - if(ext) { - for(i = 0; i < sizeof(format)/sizeof(*format); i++) { - if(_strnicmp(ext, extension[i], 3) == 0) { - return format[i]; - } - } - } - - return -1; +int get_file_format(char *filename) +{ + unsigned int i; + static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; + static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; + char * ext = strrchr(filename, '.'); + if (ext == NULL) + return -1; + ext++; + if(ext) { + for(i = 0; i < sizeof(format)/sizeof(*format); i++) { + if(_strnicmp(ext, extension[i], 3) == 0) { + return format[i]; + } + } + } + + return -1; } -char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){ - char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; - char *temp_p, temp1[OPJ_PATH_LEN]=""; - - strcpy(image_filename,dirptr->filename[imageno]); - fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); - parameters->decod_format = get_file_format(image_filename); - if (parameters->decod_format == -1) - return 1; - sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); - strncpy(parameters->infile, infilename, sizeof(infilename)); - - /*Set output file*/ - strcpy(temp_ofname,strtok(image_filename,".")); - while((temp_p = strtok(NULL,".")) != NULL){ - strcat(temp_ofname,temp1); - sprintf(temp1,".%s",temp_p); - } - if(img_fol->set_out_format==1){ - sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); - strncpy(parameters->outfile, outfilename, sizeof(outfilename)); - } - return 0; +char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters) +{ + char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; + char *temp_p, temp1[OPJ_PATH_LEN]=""; + + strcpy(image_filename,dirptr->filename[imageno]); + fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); + parameters->decod_format = get_file_format(image_filename); + if (parameters->decod_format == -1) + return 1; + sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); + strncpy(parameters->infile, infilename, sizeof(infilename)); + + /*Set output file*/ + strcpy(temp_ofname,strtok(image_filename,".")); + while((temp_p = strtok(NULL,".")) != NULL) { + strcat(temp_ofname,temp1); + sprintf(temp1,".%s",temp_p); + } + if(img_fol->set_out_format==1) { + sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); + strncpy(parameters->outfile, outfilename, sizeof(outfilename)); + } + return 0; } /* -------------------------------------------------------------------------- */ -int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol, char *indexfilename) { - /* parse the command line */ - int totlen, c; - opj_option_t long_option[]={ - {"ImgDir",REQ_ARG, NULL ,'y'}, - {"OutFor",REQ_ARG, NULL ,'O'}, - }; - - const char optlist[] = "i:o:r:l:x:" - -/* UniPG>> */ +int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol, char *indexfilename) +{ + /* parse the command line */ + int totlen, c; + opj_option_t long_option[]= { + {"ImgDir",REQ_ARG, NULL ,'y'}, + {"OutFor",REQ_ARG, NULL ,'O'}, + }; + + const char optlist[] = "i:o:r:l:x:" + + /* UniPG>> */ #ifdef USE_JPWL - "W:" + "W:" #endif /* USE_JPWL */ -/* <<UniPG */ - "h" ; - totlen=sizeof(long_option); - img_fol->set_out_format = 0; - do { - c = opj_getopt_long(argc, argv,optlist,long_option,totlen); - if (c == -1) - break; - switch (c) { - case 'i': /* input file */ - { - char *infile = opj_optarg; - parameters->decod_format = get_file_format(infile); - switch(parameters->decod_format) { - case J2K_CFMT: - case JP2_CFMT: - case JPT_CFMT: - break; - default: - fprintf(stderr, - "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", - infile); - return 1; - } - strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); - } - break; - - /* ----------------------------------------------------- */ - - case 'o': /* output file */ - { - char *outfile = opj_optarg; - parameters->cod_format = get_file_format(outfile); - switch(parameters->cod_format) { - case PGX_DFMT: - case PXM_DFMT: - case BMP_DFMT: - case TIF_DFMT: - case RAW_DFMT: - case TGA_DFMT: - case PNG_DFMT: - break; - default: - fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile); - return 1; - } - strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); - } - break; - - /* ----------------------------------------------------- */ - - case 'O': /* output format */ - { - char outformat[50]; - char *of = opj_optarg; - sprintf(outformat,".%s",of); - img_fol->set_out_format = 1; - parameters->cod_format = get_file_format(outformat); - switch(parameters->cod_format) { - case PGX_DFMT: - img_fol->out_format = "pgx"; - break; - case PXM_DFMT: - img_fol->out_format = "ppm"; - break; - case BMP_DFMT: - img_fol->out_format = "bmp"; - break; - case TIF_DFMT: - img_fol->out_format = "tif"; - break; - case RAW_DFMT: - img_fol->out_format = "raw"; - break; - case TGA_DFMT: - img_fol->out_format = "raw"; - break; - case PNG_DFMT: - img_fol->out_format = "png"; - break; - default: - fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat); - return 1; - break; - } - } - break; - - /* ----------------------------------------------------- */ - - - case 'r': /* reduce option */ - { - sscanf(opj_optarg, "%d", ¶meters->cp_reduce); - } - break; - - /* ----------------------------------------------------- */ - - - case 'l': /* layering option */ - { - sscanf(opj_optarg, "%d", ¶meters->cp_layer); - } - break; - - /* ----------------------------------------------------- */ - - case 'h': /* display an help description */ - decode_help_display(); - return 1; - - /* ------------------------------------------------------ */ - - case 'y': /* Image Directory path */ - { - img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); - strcpy(img_fol->imgdirpath,opj_optarg); - img_fol->set_imgdir=1; - } - break; - /* ----------------------------------------------------- */ - case 'x': /* Creation of index file */ - { - char *index = opj_optarg; - strncpy(indexfilename, index, OPJ_PATH_LEN); - } - break; - /* ----------------------------------------------------- */ - /* UniPG>> */ + /* <<UniPG */ + "h" ; + totlen=sizeof(long_option); + img_fol->set_out_format = 0; + do { + c = opj_getopt_long(argc, argv,optlist,long_option,totlen); + if (c == -1) + break; + switch (c) { + case 'i': { /* input file */ + char *infile = opj_optarg; + parameters->decod_format = get_file_format(infile); + switch(parameters->decod_format) { + case J2K_CFMT: + case JP2_CFMT: + case JPT_CFMT: + break; + default: + fprintf(stderr, + "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", + infile); + return 1; + } + strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); + } + break; + + /* ----------------------------------------------------- */ + + case 'o': { /* output file */ + char *outfile = opj_optarg; + parameters->cod_format = get_file_format(outfile); + switch(parameters->cod_format) { + case PGX_DFMT: + case PXM_DFMT: + case BMP_DFMT: + case TIF_DFMT: + case RAW_DFMT: + case TGA_DFMT: + case PNG_DFMT: + break; + default: + fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile); + return 1; + } + strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); + } + break; + + /* ----------------------------------------------------- */ + + case 'O': { /* output format */ + char outformat[50]; + char *of = opj_optarg; + sprintf(outformat,".%s",of); + img_fol->set_out_format = 1; + parameters->cod_format = get_file_format(outformat); + switch(parameters->cod_format) { + case PGX_DFMT: + img_fol->out_format = "pgx"; + break; + case PXM_DFMT: + img_fol->out_format = "ppm"; + break; + case BMP_DFMT: + img_fol->out_format = "bmp"; + break; + case TIF_DFMT: + img_fol->out_format = "tif"; + break; + case RAW_DFMT: + img_fol->out_format = "raw"; + break; + case TGA_DFMT: + img_fol->out_format = "raw"; + break; + case PNG_DFMT: + img_fol->out_format = "png"; + break; + default: + fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat); + return 1; + break; + } + } + break; + + /* ----------------------------------------------------- */ + + + case 'r': { /* reduce option */ + sscanf(opj_optarg, "%d", ¶meters->cp_reduce); + } + break; + + /* ----------------------------------------------------- */ + + + case 'l': { /* layering option */ + sscanf(opj_optarg, "%d", ¶meters->cp_layer); + } + break; + + /* ----------------------------------------------------- */ + + case 'h': /* display an help description */ + decode_help_display(); + return 1; + + /* ------------------------------------------------------ */ + + case 'y': { /* Image Directory path */ + img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); + strcpy(img_fol->imgdirpath,opj_optarg); + img_fol->set_imgdir=1; + } + break; + /* ----------------------------------------------------- */ + case 'x': { /* Creation of index file */ + char *index = opj_optarg; + strncpy(indexfilename, index, OPJ_PATH_LEN); + } + break; + /* ----------------------------------------------------- */ + /* UniPG>> */ #ifdef USE_JPWL - - case 'W': /* activate JPWL correction */ - { - char *token = NULL; - - token = strtok(opj_optarg, ","); - while(token != NULL) { - - /* search expected number of components */ - if (*token == 'c') { - - static int compno; - - compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ - - if(sscanf(token, "c=%d", &compno) == 1) { - /* Specified */ - if ((compno < 1) || (compno > 256)) { - fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); - return 1; - } - parameters->jpwl_exp_comps = compno; - - } else if (!strcmp(token, "c")) { - /* default */ - parameters->jpwl_exp_comps = compno; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); - return 1; - }; - } - - /* search maximum number of tiles */ - if (*token == 't') { - - static int tileno; - - tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ - - if(sscanf(token, "t=%d", &tileno) == 1) { - /* Specified */ - if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { - fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); - return 1; - } - parameters->jpwl_max_tiles = tileno; - - } else if (!strcmp(token, "t")) { - /* default */ - parameters->jpwl_max_tiles = tileno; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); - return 1; - }; - } - - /* next token or bust */ - token = strtok(NULL, ","); - }; - parameters->jpwl_correct = OPJ_TRUE; - fprintf(stdout, "JPWL correction capability activated\n"); - fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); - } - break; + + case 'W': { /* activate JPWL correction */ + char *token = NULL; + + token = strtok(opj_optarg, ","); + while(token != NULL) { + + /* search expected number of components */ + if (*token == 'c') { + + static int compno; + + compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ + + if(sscanf(token, "c=%d", &compno) == 1) { + /* Specified */ + if ((compno < 1) || (compno > 256)) { + fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); + return 1; + } + parameters->jpwl_exp_comps = compno; + + } else if (!strcmp(token, "c")) { + /* default */ + parameters->jpwl_exp_comps = compno; /* auto for default size */ + + } else { + fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); + return 1; + }; + } + + /* search maximum number of tiles */ + if (*token == 't') { + + static int tileno; + + tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ + + if(sscanf(token, "t=%d", &tileno) == 1) { + /* Specified */ + if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { + fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); + return 1; + } + parameters->jpwl_max_tiles = tileno; + + } else if (!strcmp(token, "t")) { + /* default */ + parameters->jpwl_max_tiles = tileno; /* auto for default size */ + + } else { + fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); + return 1; + }; + } + + /* next token or bust */ + token = strtok(NULL, ","); + }; + parameters->jpwl_correct = OPJ_TRUE; + fprintf(stdout, "JPWL correction capability activated\n"); + fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); + } + break; #endif /* USE_JPWL */ -/* <<UniPG */ - - /* ----------------------------------------------------- */ - - default: - fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, opj_optarg); - break; - } - }while(c != -1); - - /* check for possible errors */ - if(img_fol->set_imgdir==1){ - if(!(parameters->infile[0]==0)){ - fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); - return 1; - } - if(img_fol->set_out_format == 0){ - fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); - fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n"); - return 1; - } - if(!((parameters->outfile[0] == 0))){ - fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); - return 1; - } - }else{ - if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { - fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\n",argv[0]); - fprintf(stderr, " Try: %s -h\n",argv[0]); - return 1; - } - } - - return 0; + /* <<UniPG */ + + /* ----------------------------------------------------- */ + + default: + fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, opj_optarg); + break; + } + } while(c != -1); + + /* check for possible errors */ + if(img_fol->set_imgdir==1) { + if(!(parameters->infile[0]==0)) { + fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); + return 1; + } + if(img_fol->set_out_format == 0) { + fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); + fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n"); + return 1; + } + if(!((parameters->outfile[0] == 0))) { + fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); + return 1; + } + } else { + if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { + fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\n",argv[0]); + fprintf(stderr, " Try: %s -h\n",argv[0]); + return 1; + } + } + + return 0; } /* -------------------------------------------------------------------------- */ @@ -496,362 +494,354 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i /** sample error callback expecting a FILE* client object */ -void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting no client object */ -void info_callback(const char *msg, void *client_data) { - (void)client_data; - fprintf(stdout, "[INFO] %s", msg); +void info_callback(const char *msg, void *client_data) +{ + (void)client_data; + fprintf(stdout, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ -int main(int argc, char **argv) { - opj_dparameters_t parameters; /* decompression parameters */ - img_fol_t img_fol; - opj_event_mgr_t event_mgr; /* event manager */ - opj_image_t *image = NULL; - FILE *fsrc = NULL; - unsigned char *src = NULL; - int file_length; - int num_images; - int i,imageno; - dircnt_t *dirptr = NULL; - opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ - opj_cio_t *cio = NULL; - opj_codestream_info_t cstr_info; /* Codestream information structure */ - char indexfilename[OPJ_PATH_LEN]; /* index file name */ - - /* configure the event callbacks (not required) */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* set decoding parameters to default values */ - opj_set_default_decoder_parameters(¶meters); - - /* Initialize indexfilename and img_fol */ - *indexfilename = 0; - memset(&img_fol,0,sizeof(img_fol_t)); - - /* parse input and get user encoding parameters */ - if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol, indexfilename) == 1) { - return 1; - } - - /* Initialize reading of directory */ - if(img_fol.set_imgdir==1){ - num_images=get_num_images(img_fol.imgdirpath); - - dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); - if(dirptr){ - dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ - dirptr->filename = (char**) malloc(num_images*sizeof(char*)); - - if(!dirptr->filename_buf){ - return 1; - } - for(i=0;i<num_images;i++){ - dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; - } - } - if(load_images(dirptr,img_fol.imgdirpath)==1){ - return 1; - } - if (num_images==0){ - fprintf(stdout,"Folder is empty\n"); - return 1; - } - }else{ - num_images=1; - } - - /*Encoding image one by one*/ - for(imageno = 0; imageno < num_images ; imageno++) { - image = NULL; - fprintf(stderr,"\n"); - - if(img_fol.set_imgdir==1){ - if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { - fprintf(stderr,"skipping file...\n"); - continue; - } - } - - /* read the input file and put it in memory */ - /* ---------------------------------------- */ - fsrc = fopen(parameters.infile, "rb"); - if (!fsrc) { - fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); - return 1; - } - fseek(fsrc, 0, SEEK_END); - file_length = ftell(fsrc); - fseek(fsrc, 0, SEEK_SET); - src = (unsigned char *) malloc(file_length); - if (fread(src, 1, file_length, fsrc) != (size_t)file_length) - { - free(src); - fclose(fsrc); - fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n"); - return 1; - } - fclose(fsrc); - - /* decode the code-stream */ - /* ---------------------- */ - - switch(parameters.decod_format) { - case J2K_CFMT: - { - /* JPEG-2000 codestream */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_J2K); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the image structure */ - if (*indexfilename) /* If need to extract codestream information*/ - image = opj_decode_with_info(dinfo, cio, &cstr_info); - else - image = opj_decode(dinfo, cio); - if(!image) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(src); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - opj_bool bSuccess; - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - } - break; - - case JP2_CFMT: - { - /* JPEG 2000 compressed image data */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_JP2); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using the current image and user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the image structure */ - if (*indexfilename) /* If need to extract codestream information*/ - image = opj_decode_with_info(dinfo, cio, &cstr_info); - else - image = opj_decode(dinfo, cio); - if(!image) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(src); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - opj_bool bSuccess; - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - } - break; - - case JPT_CFMT: - { - /* JPEG 2000, JPIP */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_JPT); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the image structure */ - if (*indexfilename) /* If need to extract codestream information*/ - image = opj_decode_with_info(dinfo, cio, &cstr_info); - else - image = opj_decode(dinfo, cio); - if(!image) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(src); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - opj_bool bSuccess; - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - } - break; - - default: - fprintf(stderr, "skipping file..\n"); - continue; - } - - /* free the memory containing the code-stream */ - free(src); - src = NULL; - - if(image->color_space == CLRSPC_SYCC) - { - color_sycc_to_rgb(image); - } - - if(image->icc_profile_buf) - { +int main(int argc, char **argv) +{ + opj_dparameters_t parameters; /* decompression parameters */ + img_fol_t img_fol; + opj_event_mgr_t event_mgr; /* event manager */ + opj_image_t *image = NULL; + FILE *fsrc = NULL; + unsigned char *src = NULL; + int file_length; + int num_images; + int i,imageno; + dircnt_t *dirptr = NULL; + opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ + opj_cio_t *cio = NULL; + opj_codestream_info_t cstr_info; /* Codestream information structure */ + char indexfilename[OPJ_PATH_LEN]; /* index file name */ + + /* configure the event callbacks (not required) */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* set decoding parameters to default values */ + opj_set_default_decoder_parameters(¶meters); + + /* Initialize indexfilename and img_fol */ + *indexfilename = 0; + memset(&img_fol,0,sizeof(img_fol_t)); + + /* parse input and get user encoding parameters */ + if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol, indexfilename) == 1) { + return 1; + } + + /* Initialize reading of directory */ + if(img_fol.set_imgdir==1) { + num_images=get_num_images(img_fol.imgdirpath); + + dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); + if(dirptr) { + dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ + dirptr->filename = (char**) malloc(num_images*sizeof(char*)); + + if(!dirptr->filename_buf) { + return 1; + } + for(i=0; i<num_images; i++) { + dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; + } + } + if(load_images(dirptr,img_fol.imgdirpath)==1) { + return 1; + } + if (num_images==0) { + fprintf(stdout,"Folder is empty\n"); + return 1; + } + } else { + num_images=1; + } + + /*Encoding image one by one*/ + for(imageno = 0; imageno < num_images ; imageno++) { + image = NULL; + fprintf(stderr,"\n"); + + if(img_fol.set_imgdir==1) { + if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { + fprintf(stderr,"skipping file...\n"); + continue; + } + } + + /* read the input file and put it in memory */ + /* ---------------------------------------- */ + fsrc = fopen(parameters.infile, "rb"); + if (!fsrc) { + fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); + return 1; + } + fseek(fsrc, 0, SEEK_END); + file_length = ftell(fsrc); + fseek(fsrc, 0, SEEK_SET); + src = (unsigned char *) malloc(file_length); + if (fread(src, 1, file_length, fsrc) != (size_t)file_length) { + free(src); + fclose(fsrc); + fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n"); + return 1; + } + fclose(fsrc); + + /* decode the code-stream */ + /* ---------------------- */ + + switch(parameters.decod_format) { + case J2K_CFMT: { + /* JPEG-2000 codestream */ + + /* get a decoder handle */ + dinfo = opj_create_decompress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + opj_setup_decoder(dinfo, ¶meters); + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); + + /* decode the stream and fill the image structure */ + if (*indexfilename) /* If need to extract codestream information*/ + image = opj_decode_with_info(dinfo, cio, &cstr_info); + else + image = opj_decode(dinfo, cio); + if(!image) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + free(src); + return 1; + } + + /* close the byte stream */ + opj_cio_close(cio); + + /* Write the index to disk */ + if (*indexfilename) { + opj_bool bSuccess; + bSuccess = write_index_file(&cstr_info, indexfilename); + if (bSuccess) { + fprintf(stderr, "Failed to output index file\n"); + } + } + } + break; + + case JP2_CFMT: { + /* JPEG 2000 compressed image data */ + + /* get a decoder handle */ + dinfo = opj_create_decompress(CODEC_JP2); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using the current image and user parameters */ + opj_setup_decoder(dinfo, ¶meters); + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); + + /* decode the stream and fill the image structure */ + if (*indexfilename) /* If need to extract codestream information*/ + image = opj_decode_with_info(dinfo, cio, &cstr_info); + else + image = opj_decode(dinfo, cio); + if(!image) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + free(src); + return 1; + } + + /* close the byte stream */ + opj_cio_close(cio); + + /* Write the index to disk */ + if (*indexfilename) { + opj_bool bSuccess; + bSuccess = write_index_file(&cstr_info, indexfilename); + if (bSuccess) { + fprintf(stderr, "Failed to output index file\n"); + } + } + } + break; + + case JPT_CFMT: { + /* JPEG 2000, JPIP */ + + /* get a decoder handle */ + dinfo = opj_create_decompress(CODEC_JPT); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + opj_setup_decoder(dinfo, ¶meters); + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); + + /* decode the stream and fill the image structure */ + if (*indexfilename) /* If need to extract codestream information*/ + image = opj_decode_with_info(dinfo, cio, &cstr_info); + else + image = opj_decode(dinfo, cio); + if(!image) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + free(src); + return 1; + } + + /* close the byte stream */ + opj_cio_close(cio); + + /* Write the index to disk */ + if (*indexfilename) { + opj_bool bSuccess; + bSuccess = write_index_file(&cstr_info, indexfilename); + if (bSuccess) { + fprintf(stderr, "Failed to output index file\n"); + } + } + } + break; + + default: + fprintf(stderr, "skipping file..\n"); + continue; + } + + /* free the memory containing the code-stream */ + free(src); + src = NULL; + + if(image->color_space == CLRSPC_SYCC) { + color_sycc_to_rgb(image); + } + + if(image->icc_profile_buf) { #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) - color_apply_icc_profile(image); + color_apply_icc_profile(image); #endif - free(image->icc_profile_buf); - image->icc_profile_buf = NULL; image->icc_profile_len = 0; - } - - /* create output image */ - /* ------------------- */ - switch (parameters.cod_format) { - case PXM_DFMT: /* PNM PGM PPM */ - if (imagetopnm(image, parameters.outfile)) { - fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); - } - break; - - case PGX_DFMT: /* PGX */ - if(imagetopgx(image, parameters.outfile)){ - fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); - } - break; - - case BMP_DFMT: /* BMP */ - if(imagetobmp(image, parameters.outfile)){ - fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); - } - break; + free(image->icc_profile_buf); + image->icc_profile_buf = NULL; + image->icc_profile_len = 0; + } + + /* create output image */ + /* ------------------- */ + switch (parameters.cod_format) { + case PXM_DFMT: /* PNM PGM PPM */ + if (imagetopnm(image, parameters.outfile)) { + fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); + } + break; + + case PGX_DFMT: /* PGX */ + if(imagetopgx(image, parameters.outfile)) { + fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); + } + break; + + case BMP_DFMT: /* BMP */ + if(imagetobmp(image, parameters.outfile)) { + fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); + } + break; #ifdef OPJ_HAVE_LIBTIFF - case TIF_DFMT: /* TIFF */ - if(imagetotif(image, parameters.outfile)){ - fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); - } - break; + case TIF_DFMT: /* TIFF */ + if(imagetotif(image, parameters.outfile)) { + fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); + } + break; #endif /* OPJ_HAVE_LIBTIFF */ - case RAW_DFMT: /* RAW */ - if(imagetoraw(image, parameters.outfile)){ - fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); - } - break; - - case TGA_DFMT: /* TGA */ - if(imagetotga(image, parameters.outfile)){ - fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); - } - break; + case RAW_DFMT: /* RAW */ + if(imagetoraw(image, parameters.outfile)) { + fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); + } + break; + + case TGA_DFMT: /* TGA */ + if(imagetotga(image, parameters.outfile)) { + fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); + } + break; #ifdef OPJ_HAVE_LIBPNG - case PNG_DFMT: /* PNG */ - if(imagetopng(image, parameters.outfile)){ - fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile); - } - else { - fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); - } - break; + case PNG_DFMT: /* PNG */ + if(imagetopng(image, parameters.outfile)) { + fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile); + } else { + fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); + } + break; #endif /* OPJ_HAVE_LIBPNG */ -/* Can happen if output file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined -*/ - default: - fprintf(stderr,"Outfile %s not generated\n",parameters.outfile); - } - - /* free remaining structures */ - if(dinfo) { - opj_destroy_decompress(dinfo); - } - /* free codestream information structure */ - if (*indexfilename) - opj_destroy_cstr_info(&cstr_info); - /* free image data structure */ - opj_image_destroy(image); - - } - return 0; + /* Can happen if output file is TIFF or PNG + * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined + */ + default: + fprintf(stderr,"Outfile %s not generated\n",parameters.outfile); + } + + /* free remaining structures */ + if(dinfo) { + opj_destroy_decompress(dinfo); + } + /* free codestream information structure */ + if (*indexfilename) + opj_destroy_cstr_info(&cstr_info); + /* free image data structure */ + opj_image_destroy(image); + + } + return 0; } /*end main*/ diff --git a/src/bin/jpwl/windirent.h b/src/bin/jpwl/windirent.h index bef28194..b6e9de49 100644 --- a/src/bin/jpwl/windirent.h +++ b/src/bin/jpwl/windirent.h @@ -1,9 +1,9 @@ /* * uce-dirent.h - operating system independent dirent implementation - * + * * Copyright (C) 1998-2002 Toni Ronkko - * + * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * ``Software''), to deal in the Software without restriction, including @@ -11,10 +11,10 @@ * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -22,8 +22,8 @@ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. - * - * + * + * * May 28 1998, Toni Ronkko <tronkko@messi.uku.fi> * * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ @@ -59,7 +59,7 @@ * Revision 1.1 1998/07/04 16:27:51 tr * Initial revision * - * + * * MSVC 1.0 scans automatic dependencies incorrectly when your project * contains this very header. The problem is that MSVC cannot handle * include directives inside #if..#endif block those are never entered. @@ -106,14 +106,14 @@ */ #if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) # if defined(_MSC_VER) /* Microsoft C/C++ */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__MINGW32__) /* MinGW */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__BORLANDC__) /* Borland C/C++ */ # define HAVE_DIRENT_H # define VOID_CLOSEDIR # elif defined(__TURBOC__) /* Borland Turbo C */ - /* no dirent.h */ +/* no dirent.h */ # elif defined(__WATCOMC__) /* Watcom C/C++ */ # define HAVE_DIRECT_H # elif defined(__apollo) /* Apollo */ @@ -172,7 +172,7 @@ #elif defined(MSDOS) || defined(WIN32) - /* figure out type of underlaying directory interface to be used */ +/* figure out type of underlaying directory interface to be used */ # if defined(WIN32) # define DIRENT_WIN32_INTERFACE # elif defined(MSDOS) @@ -181,7 +181,7 @@ # error "missing native dirent interface" # endif - /*** WIN32 specifics ***/ +/*** WIN32 specifics ***/ # if defined(DIRENT_WIN32_INTERFACE) # include <windows.h> # if !defined(DIRENT_MAXNAMLEN) @@ -189,11 +189,11 @@ # endif - /*** MS-DOS specifics ***/ +/*** MS-DOS specifics ***/ # elif defined(DIRENT_MSDOS_INTERFACE) # include <dos.h> - /* Borland defines file length macros in dir.h */ +/* Borland defines file length macros in dir.h */ # if defined(__BORLANDC__) # include <dir.h> # if !defined(DIRENT_MAXNAMLEN) @@ -203,7 +203,7 @@ # define _find_t find_t # endif - /* Turbo C defines ffblk structure in dir.h */ +/* Turbo C defines ffblk structure in dir.h */ # elif defined(__TURBOC__) # include <dir.h> # if !defined(DIRENT_MAXNAMLEN) @@ -211,13 +211,13 @@ # endif # define DIRENT_USE_FFBLK - /* MSVC */ +/* MSVC */ # elif defined(_MSC_VER) # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (12) # endif - /* Watcom */ +/* Watcom */ # elif defined(__WATCOMC__) # if !defined(DIRENT_MAXNAMLEN) # if defined(__OS2__) || defined(__NT__) @@ -230,7 +230,7 @@ # endif # endif - /*** generic MS-DOS and MS-Windows stuff ***/ +/*** generic MS-DOS and MS-Windows stuff ***/ # if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) # define NAME_MAX DIRENT_MAXNAMLEN # endif @@ -239,16 +239,16 @@ # endif - /* - * Substitute for real dirent structure. Note that `d_name' field is a - * true character array although we have it copied in the implementation - * dependent data. We could save some memory if we had declared `d_name' - * as a pointer referring the name within implementation dependent data. - * We have not done that since some code may rely on sizeof(d_name) to be - * something other than four. Besides, directory entries are typically so - * small that it takes virtually no time to copy them from place to place. - */ - typedef struct dirent { +/* + * Substitute for real dirent structure. Note that `d_name' field is a + * true character array although we have it copied in the implementation + * dependent data. We could save some memory if we had declared `d_name' + * as a pointer referring the name within implementation dependent data. + * We have not done that since some code may rely on sizeof(d_name) to be + * something other than four. Besides, directory entries are typically so + * small that it takes virtually no time to copy them from place to place. + */ +typedef struct dirent { char d_name[NAME_MAX + 1]; /*** Operating system specific part ***/ @@ -261,21 +261,21 @@ struct _find_t data; # endif # endif - } dirent; +} dirent; - /* DIR substitute structure containing directory name. The name is - * essential for the operation of ``rewinndir'' function. */ - typedef struct DIR { +/* DIR substitute structure containing directory name. The name is + * essential for the operation of ``rewinndir'' function. */ +typedef struct DIR { char *dirname; /* directory being scanned */ dirent current; /* current entry */ int dirent_filled; /* is current un-processed? */ - /*** Operating system specific part ***/ + /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) HANDLE search_handle; # elif defined(DIRENT_MSDOS_INTERFACE) # endif - } DIR; +} DIR; # ifdef __cplusplus extern "C" { @@ -325,7 +325,7 @@ static void _setdirname (struct DIR *dirp); * internal working area that is used for retrieving individual directory * entries. The internal working area has no fields of your interest. * - * <ret>Returns a pointer to the internal working area or NULL in case the + * <ret>Returns a pointer to the internal working area or NULL in case the * directory stream could not be opened. Global `errno' variable will set * in case of error as follows: * @@ -344,46 +344,45 @@ static void _setdirname (struct DIR *dirp); */ static DIR *opendir(const char *dirname) { - DIR *dirp; - assert (dirname != NULL); - - dirp = (DIR*)malloc (sizeof (struct DIR)); - if (dirp != NULL) { - char *p; - - /* allocate room for directory name */ - dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); - if (dirp->dirname == NULL) { - /* failed to duplicate directory name. errno set by malloc() */ - free (dirp); - return NULL; - } - /* Copy directory name while appending directory separator and "*.*". - * Directory separator is not appended if the name already ends with - * drive or directory separator. Directory separator is assumed to be - * '/' or '\' and drive separator is assumed to be ':'. */ - strcpy (dirp->dirname, dirname); - p = strchr (dirp->dirname, '\0'); - if (dirp->dirname < p && - *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') - { - strcpy (p++, "\\"); - } + DIR *dirp; + assert (dirname != NULL); + + dirp = (DIR*)malloc (sizeof (struct DIR)); + if (dirp != NULL) { + char *p; + + /* allocate room for directory name */ + dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); + if (dirp->dirname == NULL) { + /* failed to duplicate directory name. errno set by malloc() */ + free (dirp); + return NULL; + } + /* Copy directory name while appending directory separator and "*.*". + * Directory separator is not appended if the name already ends with + * drive or directory separator. Directory separator is assumed to be + * '/' or '\' and drive separator is assumed to be ':'. */ + strcpy (dirp->dirname, dirname); + p = strchr (dirp->dirname, '\0'); + if (dirp->dirname < p && + *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { + strcpy (p++, "\\"); + } # ifdef DIRENT_WIN32_INTERFACE - strcpy (p, "*"); /*scan files with and without extension in win32*/ + strcpy (p, "*"); /*scan files with and without extension in win32*/ # else - strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ + strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ # endif - /* open stream */ - if (_initdir (dirp) == 0) { - /* initialization failed */ - free (dirp->dirname); - free (dirp); - return NULL; + /* open stream */ + if (_initdir (dirp) == 0) { + /* initialization failed */ + free (dirp->dirname); + free (dirp); + return NULL; + } } - } - return dirp; + return dirp; } @@ -436,55 +435,55 @@ static DIR *opendir(const char *dirname) static struct dirent * readdir (DIR *dirp) { - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return NULL; - } + assert(dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return NULL; + } #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* directory stream was opened/rewound incorrectly or it ended normally */ - errno = EBADF; - return NULL; - } + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* directory stream was opened/rewound incorrectly or it ended normally */ + errno = EBADF; + return NULL; + } #endif - if (dirp->dirent_filled != 0) { - /* - * Directory entry has already been retrieved and there is no need to - * retrieve a new one. Directory entry will be retrieved in advance - * when the user calls readdir function for the first time. This is so - * because real dirent has separate functions for opening and reading - * the stream whereas Win32 and DOS dirents open the stream - * automatically when we retrieve the first file. Therefore, we have to - * save the first file when opening the stream and later we have to - * return the saved entry when the user tries to read the first entry. - */ - dirp->dirent_filled = 0; - } else { - /* fill in entry and return that */ + if (dirp->dirent_filled != 0) { + /* + * Directory entry has already been retrieved and there is no need to + * retrieve a new one. Directory entry will be retrieved in advance + * when the user calls readdir function for the first time. This is so + * because real dirent has separate functions for opening and reading + * the stream whereas Win32 and DOS dirents open the stream + * automatically when we retrieve the first file. Therefore, we have to + * save the first file when opening the stream and later we have to + * return the saved entry when the user tries to read the first entry. + */ + dirp->dirent_filled = 0; + } else { + /* fill in entry and return that */ #if defined(DIRENT_WIN32_INTERFACE) - if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { - /* Last file has been processed or an error occurred */ - FindClose (dirp->search_handle); - dirp->search_handle = INVALID_HANDLE_VALUE; - errno = ENOENT; - return NULL; - } + if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { + /* Last file has been processed or an error occurred */ + FindClose (dirp->search_handle); + dirp->search_handle = INVALID_HANDLE_VALUE; + errno = ENOENT; + return NULL; + } # elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findnext (&dirp->current.data) != 0) { - /* _dos_findnext and findnext will set errno to ENOENT when no - * more entries could be retrieved. */ - return NULL; - } + if (_dos_findnext (&dirp->current.data) != 0) { + /* _dos_findnext and findnext will set errno to ENOENT when no + * more entries could be retrieved. */ + return NULL; + } # endif - _setdirname (dirp); - assert (dirp->dirent_filled == 0); - } - return &dirp->current; + _setdirname (dirp); + assert (dirp->dirent_filled == 0); + } + return &dirp->current; } @@ -509,37 +508,37 @@ readdir (DIR *dirp) */ static int closedir (DIR *dirp) -{ - int retcode = 0; - - /* make sure that dirp points to legal structure */ - assert (dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return -1; - } - - /* free directory name and search handles */ - if (dirp->dirname != NULL) free (dirp->dirname); +{ + int retcode = 0; + + /* make sure that dirp points to legal structure */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return -1; + } + + /* free directory name and search handles */ + if (dirp->dirname != NULL) free (dirp->dirname); #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose (dirp->search_handle) == FALSE) { - /* Unknown error */ - retcode = -1; - errno = EBADF; + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + retcode = -1; + errno = EBADF; + } } - } -#endif +#endif - /* clear dirp structure to make sure that it cannot be used anymore*/ - memset (dirp, 0, sizeof (*dirp)); + /* clear dirp structure to make sure that it cannot be used anymore*/ + memset (dirp, 0, sizeof (*dirp)); # if defined(DIRENT_WIN32_INTERFACE) - dirp->search_handle = INVALID_HANDLE_VALUE; + dirp->search_handle = INVALID_HANDLE_VALUE; # endif - free (dirp); - return retcode; + free (dirp); + return retcode; } @@ -566,31 +565,31 @@ closedir (DIR *dirp) */ static void rewinddir (DIR *dirp) -{ - /* make sure that dirp is legal */ - assert (dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return; - } - assert (dirp->dirname != NULL); - - /* close previous stream */ +{ + /* make sure that dirp is legal */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return; + } + assert (dirp->dirname != NULL); + + /* close previous stream */ #if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose (dirp->search_handle) == FALSE) { - /* Unknown error */ - errno = EBADF; + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + errno = EBADF; + } } - } #endif - /* re-open previous stream */ - if (_initdir (dirp) == 0) { - /* initialization failed but we cannot deal with error. User will notice - * error later when she tries to retrieve first directory enty. */ - /*EMPTY*/; - } + /* re-open previous stream */ + if (_initdir (dirp) == 0) { + /* initialization failed but we cannot deal with error. User will notice + * error later when she tries to retrieve first directory enty. */ + /*EMPTY*/; + } } @@ -600,37 +599,36 @@ rewinddir (DIR *dirp) */ static int _initdir (DIR *dirp) -{ - assert (dirp != NULL); - assert (dirp->dirname != NULL); - dirp->dirent_filled = 0; +{ + assert (dirp != NULL); + assert (dirp->dirname != NULL); + dirp->dirent_filled = 0; # if defined(DIRENT_WIN32_INTERFACE) - /* Open stream and retrieve first file */ - dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* something went wrong but we don't know what. GetLastError() could - * give us more information about the error, but then we should map - * the error code into errno. */ - errno = ENOENT; - return 0; - } + /* Open stream and retrieve first file */ + dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* something went wrong but we don't know what. GetLastError() could + * give us more information about the error, but then we should map + * the error code into errno. */ + errno = ENOENT; + return 0; + } # elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findfirst (dirp->dirname, - _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, - &dirp->current.data) != 0) - { - /* _dos_findfirst and findfirst will set errno to ENOENT when no - * more entries could be retrieved. */ - return 0; - } + if (_dos_findfirst (dirp->dirname, + _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, + &dirp->current.data) != 0) { + /* _dos_findfirst and findfirst will set errno to ENOENT when no + * more entries could be retrieved. */ + return 0; + } # endif - /* initialize DIR and it's first entry */ - _setdirname (dirp); - dirp->dirent_filled = 1; - return 1; + /* initialize DIR and it's first entry */ + _setdirname (dirp); + dirp->dirent_filled = 1; + return 1; } @@ -641,14 +639,14 @@ static const char * _getdirname (const struct dirent *dp) { #if defined(DIRENT_WIN32_INTERFACE) - return dp->data.cFileName; - + return dp->data.cFileName; + #elif defined(DIRENT_USE_FFBLK) - return dp->data.ff_name; - + return dp->data.ff_name; + #else - return dp->data.name; -#endif + return dp->data.name; +#endif } @@ -656,16 +654,17 @@ _getdirname (const struct dirent *dp) * Copy name of implementation dependent directory entry to the d_name field. */ static void -_setdirname (struct DIR *dirp) { - /* make sure that d_name is long enough */ - assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); - - strncpy (dirp->current.d_name, - _getdirname (&dirp->current), - NAME_MAX); - dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ +_setdirname (struct DIR *dirp) +{ + /* make sure that d_name is long enough */ + assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); + + strncpy (dirp->current.d_name, + _getdirname (&dirp->current), + NAME_MAX); + dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ } - + # ifdef __cplusplus } # endif diff --git a/src/bin/mj2/meta_out.c b/src/bin/mj2/meta_out.c index f5ca0be8..44efdbb6 100644 --- a/src/bin/mj2/meta_out.c +++ b/src/bin/mj2/meta_out.c @@ -4,7 +4,7 @@ /* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. The base code in this file was developed by the author as part of a video archiving -project for the U.S. National Library of Medicine, Bethesda, MD. +project for the U.S. National Library of Medicine, Bethesda, MD. It is the policy of NLM (and U.S. government) to not assert copyright. A non-exclusive copy of this code has been contributed to the Open JPEG project. @@ -82,194 +82,192 @@ void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp); void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d) { - /* Init file globals */ - notes = n; - sampletables = t; - raw = r; - derived = d; + /* Init file globals */ + notes = n; + sampletables = t; + raw = r; + derived = d; } -int xml_write_struct(FILE* file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr) { - - if(stringDTD != NULL) - { - fprintf(xmlout,"<?xml version=\"1.0\" standalone=\"no\"?>\n"); - /* stringDTD is known to start with "SYSTEM " or "PUBLIC " */ - /* typical: SYSTEM mj2_to_metadata.dtd */ - stringDTD[6] = '\0'; /* Break into two strings at space, so quotes can be inserted. */ - fprintf(xmlout,"<!DOCTYPE MJ2_File %s \"%s\">\n", stringDTD, stringDTD+7); - stringDTD[6] = ' '; /* restore for sake of debugger or memory allocator */ - } else - fprintf(xmlout,"<?xml version=\"1.0\" standalone=\"yes\"?>\n"); - - fprintf(xmlout, "<MJ2_File>\n"); - xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr); - fprintf(xmlout, "</MJ2_File>"); - return 0; +int xml_write_struct(FILE* file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr) +{ + + if(stringDTD != NULL) { + fprintf(xmlout,"<?xml version=\"1.0\" standalone=\"no\"?>\n"); + /* stringDTD is known to start with "SYSTEM " or "PUBLIC " */ + /* typical: SYSTEM mj2_to_metadata.dtd */ + stringDTD[6] = '\0'; /* Break into two strings at space, so quotes can be inserted. */ + fprintf(xmlout,"<!DOCTYPE MJ2_File %s \"%s\">\n", stringDTD, stringDTD+7); + stringDTD[6] = ' '; /* restore for sake of debugger or memory allocator */ + } else + fprintf(xmlout,"<?xml version=\"1.0\" standalone=\"yes\"?>\n"); + + fprintf(xmlout, "<MJ2_File>\n"); + xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr); + fprintf(xmlout, "</MJ2_File>"); + return 0; } /* ------------- */ int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { - int i; - char buf[5]; - buf[4] = '\0'; - - fprintf(xmlout, " <JP2 BoxType=\"jP[space][space]\" Signature=\"0x0d0a870a\" />\n"); - // Called after structure initialized by mj2_read_ftyp - fprintf(xmlout, " <FileType BoxType=\"ftyp\">\n"); - uint_to_chars(movie->brand, buf); - fprintf(xmlout, " <Brand>%s</Brand>\n", buf); /* 4 character; BR */ - fprintf(xmlout, " <MinorVersion>%u</MinorVersion>\n", movie->minversion); /* 4 char; MinV */ - fprintf(xmlout, " <CompatibilityList Count=\"%d\">\n",movie->num_cl); - for (i = movie->num_cl - 1; i > -1; i--) /* read routine stored in reverse order, so let's undo damage */ - { - uint_to_chars(movie->cl[i], buf); - fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n", buf); /*4 characters, each CLi */ - } - fprintf(xmlout, " </CompatibilityList>\n"); - fprintf(xmlout, " </FileType>\n"); - xml_write_moov(file, xmlout, movie, sampleframe, event_mgr); - // To come? <mdat> // This is the container for media data that can also be accessed through track structures, - // so is redundant, and simply not of interest as metadata - // <moof> // Allows incremental build up of movie. Probably not in Simple Profile - xml_write_free_and_skip(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ - xml_write_uuid(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ - return 0; + int i; + char buf[5]; + buf[4] = '\0'; + + fprintf(xmlout, " <JP2 BoxType=\"jP[space][space]\" Signature=\"0x0d0a870a\" />\n"); + // Called after structure initialized by mj2_read_ftyp + fprintf(xmlout, " <FileType BoxType=\"ftyp\">\n"); + uint_to_chars(movie->brand, buf); + fprintf(xmlout, " <Brand>%s</Brand>\n", buf); /* 4 character; BR */ + fprintf(xmlout, " <MinorVersion>%u</MinorVersion>\n", movie->minversion); /* 4 char; MinV */ + fprintf(xmlout, " <CompatibilityList Count=\"%d\">\n",movie->num_cl); + for (i = movie->num_cl - 1; i > -1; i--) { /* read routine stored in reverse order, so let's undo damage */ + uint_to_chars(movie->cl[i], buf); + fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n", buf); /*4 characters, each CLi */ + } + fprintf(xmlout, " </CompatibilityList>\n"); + fprintf(xmlout, " </FileType>\n"); + xml_write_moov(file, xmlout, movie, sampleframe, event_mgr); + // To come? <mdat> // This is the container for media data that can also be accessed through track structures, + // so is redundant, and simply not of interest as metadata + // <moof> // Allows incremental build up of movie. Probably not in Simple Profile + xml_write_free_and_skip(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ + xml_write_uuid(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ + return 0; } /* ------------- */ int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { - unsigned int tnum; - mj2_tk_t *track; - - fprintf(xmlout, " <MovieBox BoxType=\"moov\">\n"); - fprintf(xmlout, " <MovieHeader BoxType=\"mvhd\">\n"); - fprintf(xmlout, " <CreationTime>\n"); - if(raw) - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", movie->creation_time); - if(notes) - fprintf(xmlout, " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n"); - /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ - /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time - should be local or UTC */ - if(derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, movie->creation_time - 2082844800); - fprintf(xmlout,"</AsLocalTime>\n"); - } - fprintf(xmlout, " </CreationTime>\n"); - fprintf(xmlout, " <ModificationTime>\n"); - if(raw) - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", movie->modification_time); - if(derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, movie->modification_time - 2082844800); - fprintf(xmlout,"</AsLocalTime>\n"); - } - fprintf(xmlout, " </ModificationTime>\n"); - fprintf(xmlout, " <Timescale>%d</Timescale>\n", movie->timescale); - if(notes) - fprintf(xmlout, " <!-- Timescale defines time units in one second -->\n"); - fprintf(xmlout, " <Rate>\n"); /* Rate to play presentation (default = 0x00010000) */ - if(notes) { - fprintf(xmlout, " <!-- Rate to play presentation is stored as fixed-point binary 16.16 value. Decimal value is approximation. -->\n"); - fprintf(xmlout, " <!-- Rate is expressed relative to normal (default) value of 0x00010000 (1.0) -->\n"); - } - if(raw) - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", movie->rate); - if(derived) - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)movie->rate/(double)0x00010000); - fprintf(xmlout, " </Rate>\n"); - fprintf(xmlout, " <Duration>\n"); - if(raw) - fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", movie->duration); - if(derived) - fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n", (double)movie->duration/(double)movie->timescale); // Make this double later to get fractional seconds - fprintf(xmlout, " </Duration>\n"); + unsigned int tnum; + mj2_tk_t *track; + + fprintf(xmlout, " <MovieBox BoxType=\"moov\">\n"); + fprintf(xmlout, " <MovieHeader BoxType=\"mvhd\">\n"); + fprintf(xmlout, " <CreationTime>\n"); + if(raw) + fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", movie->creation_time); + if(notes) + fprintf(xmlout, " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n"); + /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ + /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time + should be local or UTC */ + if(derived) { + fprintf(xmlout, " <AsLocalTime>"); + xml_time_out(xmlout, movie->creation_time - 2082844800); + fprintf(xmlout,"</AsLocalTime>\n"); + } + fprintf(xmlout, " </CreationTime>\n"); + fprintf(xmlout, " <ModificationTime>\n"); + if(raw) + fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", movie->modification_time); + if(derived) { + fprintf(xmlout, " <AsLocalTime>"); + xml_time_out(xmlout, movie->modification_time - 2082844800); + fprintf(xmlout,"</AsLocalTime>\n"); + } + fprintf(xmlout, " </ModificationTime>\n"); + fprintf(xmlout, " <Timescale>%d</Timescale>\n", movie->timescale); + if(notes) + fprintf(xmlout, " <!-- Timescale defines time units in one second -->\n"); + fprintf(xmlout, " <Rate>\n"); /* Rate to play presentation (default = 0x00010000) */ + if(notes) { + fprintf(xmlout, " <!-- Rate to play presentation is stored as fixed-point binary 16.16 value. Decimal value is approximation. -->\n"); + fprintf(xmlout, " <!-- Rate is expressed relative to normal (default) value of 0x00010000 (1.0) -->\n"); + } + if(raw) + fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", movie->rate); + if(derived) + fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)movie->rate/(double)0x00010000); + fprintf(xmlout, " </Rate>\n"); + fprintf(xmlout, " <Duration>\n"); + if(raw) + fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", movie->duration); + if(derived) + fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n", (double)movie->duration/(double)movie->timescale); // Make this double later to get fractional seconds + fprintf(xmlout, " </Duration>\n"); #ifdef CURRENTSTRUCT - movie->volume = movie->volume << 8; + movie->volume = movie->volume << 8; #endif - fprintf(xmlout, " <Volume>\n"); - if(notes) { - fprintf(xmlout, " <!-- Audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); - fprintf(xmlout, " <!-- Full, normal (default) value is 0x0100 (1.0) -->\n"); - } - if(raw) - fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", movie->volume); - if(derived) - fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n", (double)movie->volume/(double)0x0100); - fprintf(xmlout, " </Volume>\n"); + fprintf(xmlout, " <Volume>\n"); + if(notes) { + fprintf(xmlout, " <!-- Audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); + fprintf(xmlout, " <!-- Full, normal (default) value is 0x0100 (1.0) -->\n"); + } + if(raw) + fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", movie->volume); + if(derived) + fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n", (double)movie->volume/(double)0x0100); + fprintf(xmlout, " </Volume>\n"); #ifdef CURRENTSTRUCT - if(notes) - fprintf(xmlout, " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - movie->volume = movie->volume >> 8; + if(notes) + fprintf(xmlout, " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); + movie->volume = movie->volume >> 8; #endif - /* Transformation matrix for video */ - fprintf(xmlout, " <TransformationMatrix>\n"); - if(notes) { - fprintf(xmlout, " <!-- 3 x 3 Video Transformation Matrix {a,b,u,c,d,v,x,y,w}. Required: u=0, v=0, w=1 -->\n"); - fprintf(xmlout, " <!-- Maps decompressed point (p,q) to rendered point (ap + cq + x, bp + dq + y) -->\n"); - fprintf(xmlout, " <!-- Stored as Fixed Point Hex: all are binary 16.16, except u,v,w are 2.30 -->\n"); - fprintf(xmlout, " <!-- Unity = 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 -->\n"); - } - fprintf(xmlout, " <TMa>0x%08x</TMa>\n", movie->trans_matrix[0]); - fprintf(xmlout, " <TMb>0x%08x</TMb>\n", movie->trans_matrix[1]); - fprintf(xmlout, " <TMu>0x%08x</TMu>\n", movie->trans_matrix[2]); - fprintf(xmlout, " <TMc>0x%08x</TMc>\n", movie->trans_matrix[3]); - fprintf(xmlout, " <TMd>0x%08x</TMd>\n", movie->trans_matrix[4]); - fprintf(xmlout, " <TMv>0x%08x</TMv>\n", movie->trans_matrix[5]); - fprintf(xmlout, " <TMx>0x%08x</TMx>\n", movie->trans_matrix[6]); - fprintf(xmlout, " <TMy>0x%08x</TMy>\n", movie->trans_matrix[7]); - fprintf(xmlout, " <TMw>0x%08x</TMw>\n", movie->trans_matrix[8]); - fprintf(xmlout, " </TransformationMatrix>\n"); - fprintf(xmlout, " </MovieHeader>\n"); - - fprintf(xmlout, " <Statistics>\n"); - fprintf(xmlout, " <TracksFound>\n"); - fprintf(xmlout, " <Video>%d</Video>\n", movie->num_vtk); - fprintf(xmlout, " <Audio>%d</Audio>\n", movie->num_stk); - fprintf(xmlout, " <Hint>%d</Hint>\n", movie->num_htk); - if(notes) - fprintf(xmlout, " <!-- Hint tracks for streaming video are not part of MJ2, but are a defined extension. -->\n"); - /* See Part 3 Amend 2 Section 4.2 for relation of MJ2 to Part 12 Sections 7 and 10 hints */ - fprintf(xmlout, " </TracksFound>\n"); - fprintf(xmlout, " </Statistics>\n"); - /* Idea for the future: It would be possible to add code to verify that the file values: - 1) are legal and self-consistent - 2) comply with particular JP2 and/or MJ2 profiles. - This could be reported here as additional XML elements */ - - // Find first video track - tnum = 0; - while (movie->tk[tnum].track_type != 0) - tnum ++; - - track = &(movie->tk[tnum]); - // For now, output info on first video track - xml_write_trak(file, xmlout, track, tnum, sampleframe, event_mgr); - - // to come: <MovieExtends mvek> // possibly not in Simple Profile - xml_write_moov_udta(xmlout, movie); /* NO OP so far */ /* <UserDataBox udta> contains <CopyrightBox cprt> */ - fprintf(xmlout, " </MovieBox>\n"); - return 0; + /* Transformation matrix for video */ + fprintf(xmlout, " <TransformationMatrix>\n"); + if(notes) { + fprintf(xmlout, " <!-- 3 x 3 Video Transformation Matrix {a,b,u,c,d,v,x,y,w}. Required: u=0, v=0, w=1 -->\n"); + fprintf(xmlout, " <!-- Maps decompressed point (p,q) to rendered point (ap + cq + x, bp + dq + y) -->\n"); + fprintf(xmlout, " <!-- Stored as Fixed Point Hex: all are binary 16.16, except u,v,w are 2.30 -->\n"); + fprintf(xmlout, " <!-- Unity = 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 -->\n"); + } + fprintf(xmlout, " <TMa>0x%08x</TMa>\n", movie->trans_matrix[0]); + fprintf(xmlout, " <TMb>0x%08x</TMb>\n", movie->trans_matrix[1]); + fprintf(xmlout, " <TMu>0x%08x</TMu>\n", movie->trans_matrix[2]); + fprintf(xmlout, " <TMc>0x%08x</TMc>\n", movie->trans_matrix[3]); + fprintf(xmlout, " <TMd>0x%08x</TMd>\n", movie->trans_matrix[4]); + fprintf(xmlout, " <TMv>0x%08x</TMv>\n", movie->trans_matrix[5]); + fprintf(xmlout, " <TMx>0x%08x</TMx>\n", movie->trans_matrix[6]); + fprintf(xmlout, " <TMy>0x%08x</TMy>\n", movie->trans_matrix[7]); + fprintf(xmlout, " <TMw>0x%08x</TMw>\n", movie->trans_matrix[8]); + fprintf(xmlout, " </TransformationMatrix>\n"); + fprintf(xmlout, " </MovieHeader>\n"); + + fprintf(xmlout, " <Statistics>\n"); + fprintf(xmlout, " <TracksFound>\n"); + fprintf(xmlout, " <Video>%d</Video>\n", movie->num_vtk); + fprintf(xmlout, " <Audio>%d</Audio>\n", movie->num_stk); + fprintf(xmlout, " <Hint>%d</Hint>\n", movie->num_htk); + if(notes) + fprintf(xmlout, " <!-- Hint tracks for streaming video are not part of MJ2, but are a defined extension. -->\n"); + /* See Part 3 Amend 2 Section 4.2 for relation of MJ2 to Part 12 Sections 7 and 10 hints */ + fprintf(xmlout, " </TracksFound>\n"); + fprintf(xmlout, " </Statistics>\n"); + /* Idea for the future: It would be possible to add code to verify that the file values: + 1) are legal and self-consistent + 2) comply with particular JP2 and/or MJ2 profiles. + This could be reported here as additional XML elements */ + + // Find first video track + tnum = 0; + while (movie->tk[tnum].track_type != 0) + tnum ++; + + track = &(movie->tk[tnum]); + // For now, output info on first video track + xml_write_trak(file, xmlout, track, tnum, sampleframe, event_mgr); + + // to come: <MovieExtends mvek> // possibly not in Simple Profile + xml_write_moov_udta(xmlout, movie); /* NO OP so far */ /* <UserDataBox udta> contains <CopyrightBox cprt> */ + fprintf(xmlout, " </MovieBox>\n"); + return 0; } /* --------------- */ void uint_to_chars(unsigned int value, char* buf) { - /* buf is at least char[5] */ + /* buf is at least char[5] */ int i; - for (i = 3; i >= 0; i--) - { + for (i = 3; i >= 0; i--) { buf[i] = (value & 0x000000ff); value = (value >> 8); } - buf[4] = '\0'; /* Precautionary */ + buf[4] = '\0'; /* Precautionary */ } /* ------------- */ @@ -278,15 +276,15 @@ void uint_to_chars(unsigned int value, char* buf) void UnixTimeToFileTime(time_t t, LPFILETIME pft) { - /* Windows specific. From MS Q167296 */ - /* 'time_t' represents seconds since midnight January 1, 1970 UTC (coordinated universal time). */ - /* 64-bit FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 UTC (coordinate universal time). */ - LONGLONG ll; /* LONGLONG is a 64-bit value. */ - ll = Int32x32To64(t, 10000000) + 116444736000000000; - pft->dwLowDateTime = (DWORD)ll; - /* pft->dwLowDateTime = (DWORD)(0x00000000ffffffff & ll); */ - pft->dwHighDateTime = (DWORD)(ll >> 32); -} + /* Windows specific. From MS Q167296 */ + /* 'time_t' represents seconds since midnight January 1, 1970 UTC (coordinated universal time). */ + /* 64-bit FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 UTC (coordinate universal time). */ + LONGLONG ll; /* LONGLONG is a 64-bit value. */ + ll = Int32x32To64(t, 10000000) + 116444736000000000; + pft->dwLowDateTime = (DWORD)ll; + /* pft->dwLowDateTime = (DWORD)(0x00000000ffffffff & ll); */ + pft->dwHighDateTime = (DWORD)(ll >> 32); +} // Once the UNIX time is converted to a FILETIME structure, // other Win32 time formats can be easily obtained by using Win32 functions such // as FileTimeToSystemTime() and FileTimeToDosDateTime(). @@ -295,104 +293,107 @@ void UnixTimeToFileTime(time_t t, LPFILETIME pft) void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst) { - /* Windows specific */ - FILETIME ft; - UnixTimeToFileTime(t, &ft); - FileTimeToLocalFileTime( &ft, &ft ); /* Adjust from UTC to local time zone */ - FileTimeToSystemTime(&ft, pst); + /* Windows specific */ + FILETIME ft; + UnixTimeToFileTime(t, &ft); + FileTimeToLocalFileTime( &ft, &ft ); /* Adjust from UTC to local time zone */ + FileTimeToSystemTime(&ft, pst); } /* ------------- */ void xml_time_out(FILE* xmlout, time_t t) { - /* Windows specific */ - SYSTEMTIME st; - char szLocalDate[255], szLocalTime[255]; - UnixTimeToSystemTime( t, &st ); - GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255 ); - GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 ); - fprintf(xmlout, "%s %s", szLocalDate, szLocalTime ); + /* Windows specific */ + SYSTEMTIME st; + char szLocalDate[255], szLocalTime[255]; + UnixTimeToSystemTime( t, &st ); + GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255 ); + GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 ); + fprintf(xmlout, "%s %s", szLocalDate, szLocalTime ); } /* END WINDOWS SPECIFIC */ /* ------------- */ -void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie) { - /* Compare with xml_write_udta */ +void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie) +{ + /* Compare with xml_write_udta */ #ifdef NOTYET - /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) - can contain multiple Copyright 'cprt' with different language codes */ - /* There may be nested non-standard boxes within udta */ - IMAGINE movie->udta, movie->copyright_count, movie->copyright_language[i] (array of 16bit ints), movie->copyright_notice[i] (array of buffers) - PROBABLY ALSO NEED movie->udta_len or special handler for non-standard boxes - char buf[5]; - int i; - - if(movie->udta != 1) - return; /* Not present */ - - fprintf(xmlout, " <UserData BoxType=\"udta\">\n"); - for(i = 0; i < movie->copyright_count; i++) { - fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n", i+1); - int16_to_3packedchars((short int)movie->copyright_languages[i], buf); - fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ - fprintf(xmlout, " <Notice>%s</Notice>\n",movie->copyright_notices[i]); - fprintf(xmlout, " </Copyright>\n", i+1); - } - /* TO DO: Non-standard boxes */ - fprintf(xmlout, " </UserData>\n"); + /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) + can contain multiple Copyright 'cprt' with different language codes */ + /* There may be nested non-standard boxes within udta */ + IMAGINE movie->udta, movie->copyright_count, movie->copyright_language[i] (array of 16bit ints), movie->copyright_notice[i] (array of buffers) + PROBABLY ALSO NEED movie->udta_len or special handler for non-standard boxes + char buf[5]; + int i; + + if(movie->udta != 1) + return; /* Not present */ + + fprintf(xmlout, " <UserData BoxType=\"udta\">\n"); + for(i = 0; i < movie->copyright_count; i++) { + fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n", i+1); + int16_to_3packedchars((short int)movie->copyright_languages[i], buf); + fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ + fprintf(xmlout, " <Notice>%s</Notice>\n",movie->copyright_notices[i]); + fprintf(xmlout, " </Copyright>\n", i+1); + } + /* TO DO: Non-standard boxes */ + fprintf(xmlout, " </UserData>\n"); #endif } -void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie) { +void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie) +{ #ifdef NOTYET - /* NO-OP so far. There can be zero or more instances of free and/or skip - at the top level of the file. This may be a place where the user squirrel's metadata. - Let's assume unstructured, and do a dump */ - IMAGINE movie->free_and_skip, movie->free_and_skip_count, movie->free_and_skip_content[i] (array of buffers), - movie->free_and_skip_len[i] (array of ints), movie->is_skip[i] (array of BOOL) - int i; - - if(movie->free_and_skip != 1) - return; /* Not present */ - - for(i = 0; i < movie->free_and_skip_count; i++) { - if(movie->is_skip[i]) - fprintf(xmlout, " <Skip BoxType=\"skip\">\n"); - else - fprintf(xmlout, " <Free BoxType=\"free\">\n"); - - xml_out_dump_hex_and_ascii(xmlout, movie->free_and_skip_contents[i], movie->free_and_skip_len[i]); - - if(movie->is_skip[i]) - fprintf(xmlout, " </Skip>\n"); - else - fprintf(xmlout, " </Free>\n"); - } + /* NO-OP so far. There can be zero or more instances of free and/or skip + at the top level of the file. This may be a place where the user squirrel's metadata. + Let's assume unstructured, and do a dump */ + IMAGINE movie->free_and_skip, movie->free_and_skip_count, movie->free_and_skip_content[i] (array of buffers), + movie->free_and_skip_len[i] (array of ints), movie->is_skip[i] (array of BOOL) + int i; + + if(movie->free_and_skip != 1) + return; /* Not present */ + + for(i = 0; i < movie->free_and_skip_count; i++) { + if(movie->is_skip[i]) + fprintf(xmlout, " <Skip BoxType=\"skip\">\n"); + else + fprintf(xmlout, " <Free BoxType=\"free\">\n"); + + xml_out_dump_hex_and_ascii(xmlout, movie->free_and_skip_contents[i], movie->free_and_skip_len[i]); + + if(movie->is_skip[i]) + fprintf(xmlout, " </Skip>\n"); + else + fprintf(xmlout, " </Free>\n"); + } #endif } -void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie) { -/* Universal Unique IDs of 16 bytes. */ +void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie) +{ + /* Universal Unique IDs of 16 bytes. */ #ifdef NOTYET - /* NO-OP so far. There can be zero or more instances of private uuid boxes in a file. - This function supports the top level of the file, but uuid may be elsewhere [not yet supported]. - This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */ - IMAGINE movie->uuid, movie->uuid_count, movie->uuid_content[i] (array of buffers), - movie->uuid_len[i] (array of ints), movie->uuid_type[i] (array of 17-byte (16+null termination) buffers) - int i; - - if(movie->uuid != 1) - return; /* Not present */ - - for(i = 0; i < movie->uuid_count; i++) { - fprintf(xmlout, " <PrivateExtension BoxType=\"uuid\" UUID=\"%s\">\n", movie->uuid_type[i]); - // See Part III section 5.2.1, 6.1, 6.2 - xml_out_dump_hex_and_ascii(xmlout, movie->uuid_contents[i], movie->uuid_len[i]); - fprintf(xmlout, " </PrivateExtension>\n"); - } + /* NO-OP so far. There can be zero or more instances of private uuid boxes in a file. + This function supports the top level of the file, but uuid may be elsewhere [not yet supported]. + This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */ + IMAGINE movie->uuid, movie->uuid_count, movie->uuid_content[i] (array of buffers), + movie->uuid_len[i] (array of ints), movie->uuid_type[i] (array of 17-byte (16+null termination) buffers) + int i; + + if(movie->uuid != 1) + return; /* Not present */ + + for(i = 0; i < movie->uuid_count; i++) { + fprintf(xmlout, " <PrivateExtension BoxType=\"uuid\" UUID=\"%s\">\n", movie->uuid_type[i]); + // See Part III section 5.2.1, 6.1, 6.2 + xml_out_dump_hex_and_ascii(xmlout, movie->uuid_contents[i], movie->uuid_len[i]); + fprintf(xmlout, " </PrivateExtension>\n"); + } #endif } @@ -400,147 +401,144 @@ void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie) { void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { - fprintf(xmlout, " <Track BoxType=\"trak\" Instance=\"%d\">\n", tnum); - xml_write_tkhd(file, xmlout, track, tnum); - // TO DO: TrackReferenceContainer 'tref' just used in hint track - // TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate - xml_write_mdia(file, xmlout, track, tnum); - xml_write_udta(file, xmlout, track, tnum); // NO-OP so far. Optional UserData 'udta', can contain multiple Copyright 'cprt' - - if(track->track_type==0) { /* Only do for visual track */ - /* sampleframe is from user option -f. 1 = first frame */ - /* sampleframe of 0 is a user requests: no jp2 header */ - /* Treat out-of-bounds values in the same way */ - if(sampleframe > 0 && sampleframe <= track->num_samples) - { - mj2_sample_t *sample; - unsigned int snum; - - snum = sampleframe-1; - // Someday maybe do a smart range scan... for (snum=0; snum < track->num_samples; snum++){ - // fprintf(stdout,"Frame %d: ",snum+1); - sample = &track->sample[snum]; - if(xml_out_frame(file, xmlout, sample, snum, event_mgr)) - return; /* Not great error handling here */ - } - } - fprintf(xmlout, " </Track>\n"); + fprintf(xmlout, " <Track BoxType=\"trak\" Instance=\"%d\">\n", tnum); + xml_write_tkhd(file, xmlout, track, tnum); + // TO DO: TrackReferenceContainer 'tref' just used in hint track + // TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate + xml_write_mdia(file, xmlout, track, tnum); + xml_write_udta(file, xmlout, track, tnum); // NO-OP so far. Optional UserData 'udta', can contain multiple Copyright 'cprt' + + if(track->track_type==0) { /* Only do for visual track */ + /* sampleframe is from user option -f. 1 = first frame */ + /* sampleframe of 0 is a user requests: no jp2 header */ + /* Treat out-of-bounds values in the same way */ + if(sampleframe > 0 && sampleframe <= track->num_samples) { + mj2_sample_t *sample; + unsigned int snum; + + snum = sampleframe-1; + // Someday maybe do a smart range scan... for (snum=0; snum < track->num_samples; snum++){ + // fprintf(stdout,"Frame %d: ",snum+1); + sample = &track->sample[snum]; + if(xml_out_frame(file, xmlout, sample, snum, event_mgr)) + return; /* Not great error handling here */ + } + } + fprintf(xmlout, " </Track>\n"); } /* ------------- */ void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { - fprintf(xmlout, " <TrackHeader BoxType=\"tkhd\">\n"); - if(notes) { - fprintf(xmlout, " <!-- Not shown here: CreationTime, ModificationTime, Duration. -->\n"); - fprintf(xmlout, " <!-- These 3 fields are reported under MediaHeader below. When reading these 3, -->\n"); - fprintf(xmlout, " <!-- m2j_to_metadata currently doesn't distinguish between TrackHeader and MediaHeader source. -->\n"); - fprintf(xmlout, " <!-- If both found, value read from MediaHeader is used. -->\n"); - } - fprintf(xmlout, " <TrackID>%u</TrackID>\n", track->track_ID); - if(track->track_type==0) /* For visual track */ - { - fprintf(xmlout, " <TrackLayer>%d</TrackLayer>\n", track->layer); - if(notes) - fprintf(xmlout," <!-- front-to-back ordering of video tracks. 0 = normal, -1 is closer, etc. -->\n"); - } - if(track->track_type!=0) /* volume irrelevant for visual track */ - { + fprintf(xmlout, " <TrackHeader BoxType=\"tkhd\">\n"); + if(notes) { + fprintf(xmlout, " <!-- Not shown here: CreationTime, ModificationTime, Duration. -->\n"); + fprintf(xmlout, " <!-- These 3 fields are reported under MediaHeader below. When reading these 3, -->\n"); + fprintf(xmlout, " <!-- m2j_to_metadata currently doesn't distinguish between TrackHeader and MediaHeader source. -->\n"); + fprintf(xmlout, " <!-- If both found, value read from MediaHeader is used. -->\n"); + } + fprintf(xmlout, " <TrackID>%u</TrackID>\n", track->track_ID); + if(track->track_type==0) { /* For visual track */ + fprintf(xmlout, " <TrackLayer>%d</TrackLayer>\n", track->layer); + if(notes) + fprintf(xmlout," <!-- front-to-back ordering of video tracks. 0 = normal, -1 is closer, etc. -->\n"); + } + if(track->track_type!=0) { /* volume irrelevant for visual track */ #ifdef CURRENTSTRUCT - track->volume = track->volume << 8; + track->volume = track->volume << 8; #endif - fprintf(xmlout, " <Volume>\n"); - if(notes) { - fprintf(xmlout," <!-- Track audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); - fprintf(xmlout," <!-- Full, normal (default) value is 0x0100 (1.0) -->\n"); - } - if(raw) - fprintf(xmlout," <AsHex>0x%04x</AsHex>\n", track->volume); - if(derived) - fprintf(xmlout," <AsDecimal>%6.3f</AsDecimal>\n", (double)track->volume/(double)0x0100); - fprintf(xmlout, " </Volume>\n"); + fprintf(xmlout, " <Volume>\n"); + if(notes) { + fprintf(xmlout," <!-- Track audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); + fprintf(xmlout," <!-- Full, normal (default) value is 0x0100 (1.0) -->\n"); + } + if(raw) + fprintf(xmlout," <AsHex>0x%04x</AsHex>\n", track->volume); + if(derived) + fprintf(xmlout," <AsDecimal>%6.3f</AsDecimal>\n", (double)track->volume/(double)0x0100); + fprintf(xmlout, " </Volume>\n"); #ifdef CURRENTSTRUCT - if(notes) - fprintf(xmlout, " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - track->volume = track->volume >> 8; + if(notes) + fprintf(xmlout, " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); + track->volume = track->volume >> 8; #endif - } - if(track->track_type==0) - { - /* Transformation matrix for video */ - fprintf(xmlout, " <TransformationMatrix>\n"); - if(notes) { - fprintf(xmlout," <!-- Comments about matrix in MovieHeader apply here as well. -->\n"); - fprintf(xmlout," <!-- This matrix is applied before MovieHeader one. -->\n"); - } - fprintf(xmlout, " <TMa>0x%08x</TMa>\n", track->trans_matrix[0]); - fprintf(xmlout, " <TMb>0x%08x</TMb>\n", track->trans_matrix[1]); - fprintf(xmlout, " <TMu>0x%08x</TMu>\n", track->trans_matrix[2]); - fprintf(xmlout, " <TMc>0x%08x</TMc>\n", track->trans_matrix[3]); - fprintf(xmlout, " <TMd>0x%08x</TMd>\n", track->trans_matrix[4]); - fprintf(xmlout, " <TMv>0x%08x</TMv>\n", track->trans_matrix[5]); - fprintf(xmlout, " <TMx>0x%08x</TMx>\n", track->trans_matrix[6]); - fprintf(xmlout, " <TMy>0x%08x</TMy>\n", track->trans_matrix[7]); - fprintf(xmlout, " <TMw>0x%08x</TMw>\n", track->trans_matrix[8]); - fprintf(xmlout, " </TransformationMatrix>\n"); - } + } + if(track->track_type==0) { + /* Transformation matrix for video */ + fprintf(xmlout, " <TransformationMatrix>\n"); + if(notes) { + fprintf(xmlout," <!-- Comments about matrix in MovieHeader apply here as well. -->\n"); + fprintf(xmlout," <!-- This matrix is applied before MovieHeader one. -->\n"); + } + fprintf(xmlout, " <TMa>0x%08x</TMa>\n", track->trans_matrix[0]); + fprintf(xmlout, " <TMb>0x%08x</TMb>\n", track->trans_matrix[1]); + fprintf(xmlout, " <TMu>0x%08x</TMu>\n", track->trans_matrix[2]); + fprintf(xmlout, " <TMc>0x%08x</TMc>\n", track->trans_matrix[3]); + fprintf(xmlout, " <TMd>0x%08x</TMd>\n", track->trans_matrix[4]); + fprintf(xmlout, " <TMv>0x%08x</TMv>\n", track->trans_matrix[5]); + fprintf(xmlout, " <TMx>0x%08x</TMx>\n", track->trans_matrix[6]); + fprintf(xmlout, " <TMy>0x%08x</TMy>\n", track->trans_matrix[7]); + fprintf(xmlout, " <TMw>0x%08x</TMw>\n", track->trans_matrix[8]); + fprintf(xmlout, " </TransformationMatrix>\n"); + } #ifdef CURRENTSTRUCT - track->w = track->w << 16; - track->h = track->h << 16; + track->w = track->w << 16; + track->h = track->h << 16; #endif - if(notes) { - fprintf(xmlout, " <!-- Width and Height in pixels are for the presentation; frames will be scaled to this. -->\n"); - fprintf(xmlout, " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n"); - } - fprintf(xmlout, " <Width>\n"); - if(raw) - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->w); - if(derived) - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->w/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ - fprintf(xmlout, " </Width>\n"); - fprintf(xmlout, " <Height>\n"); - if(raw) - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->h); - if(derived) - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->h/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ - fprintf(xmlout, " </Height>\n"); + if(notes) { + fprintf(xmlout, " <!-- Width and Height in pixels are for the presentation; frames will be scaled to this. -->\n"); + fprintf(xmlout, " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n"); + } + fprintf(xmlout, " <Width>\n"); + if(raw) + fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->w); + if(derived) + fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->w/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ + fprintf(xmlout, " </Width>\n"); + fprintf(xmlout, " <Height>\n"); + if(raw) + fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->h); + if(derived) + fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->h/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ + fprintf(xmlout, " </Height>\n"); #ifdef CURRENTSTRUCT - if(notes) { - fprintf(xmlout, " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - fprintf(xmlout, " <!-- Also, width and height values shown here will actually be those read from track's <VisualSampleEntry> if given. -->\n"); - } - track->w = track->w >> 16; - track->h = track->h >> 16; + if(notes) { + fprintf(xmlout, " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); + fprintf(xmlout, " <!-- Also, width and height values shown here will actually be those read from track's <VisualSampleEntry> if given. -->\n"); + } + track->w = track->w >> 16; + track->h = track->h >> 16; #endif - fprintf(xmlout, " </TrackHeader>\n"); + fprintf(xmlout, " </TrackHeader>\n"); } /* ------------- */ -void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { - /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) - can contain multiple Copyright 'cprt' with different language codes */ - /* There may be nested non-standard boxes within udta */ +void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) +{ + /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) + can contain multiple Copyright 'cprt' with different language codes */ + /* There may be nested non-standard boxes within udta */ #ifdef NOTYET - IMAGINE track->udta, track->copyright_count, track->copyright_language[i] (array of 16bit ints), track->copyright_notice[i] (array of buffers) - PROBABLY ALSO NEED track->udta_len or special handler for non-standard boxes - char buf[5]; - int i; - - if(track->udta != 1) - return; /* Not present */ - - fprintf(xmlout, " <UserData BoxType=\"udta\">\n"); - for(i = 0; i < track->copyright_count; i++) { - fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n", i+1); - int16_to_3packedchars((short int)track->copyright_languages[i], buf); - fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ - fprintf(xmlout, " <Notice>%s</Notice>\n",track->copyright_notices[i]); - fprintf(xmlout, " </Copyright>\n", i+1); - } - /* TO DO: Non-standard boxes */ - fprintf(xmlout, " </UserData>\n"); + IMAGINE track->udta, track->copyright_count, track->copyright_language[i] (array of 16bit ints), track->copyright_notice[i] (array of buffers) + PROBABLY ALSO NEED track->udta_len or special handler for non-standard boxes + char buf[5]; + int i; + + if(track->udta != 1) + return; /* Not present */ + + fprintf(xmlout, " <UserData BoxType=\"udta\">\n"); + for(i = 0; i < track->copyright_count; i++) { + fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n", i+1); + int16_to_3packedchars((short int)track->copyright_languages[i], buf); + fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ + fprintf(xmlout, " <Notice>%s</Notice>\n",track->copyright_notices[i]); + fprintf(xmlout, " </Copyright>\n", i+1); + } + /* TO DO: Non-standard boxes */ + fprintf(xmlout, " </UserData>\n"); #endif } @@ -548,505 +546,504 @@ void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { - char buf[5]; - int i, k; - buf[4] = '\0'; - - fprintf(xmlout, " <Media BoxType=\"mdia\">\n"); - fprintf(xmlout, " <MediaHeader BoxType=\"mdhd\">\n"); - fprintf(xmlout, " <CreationTime>\n"); - if(raw) - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", track->creation_time); - if(notes) - fprintf(xmlout, " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n"); - /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ - /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time - should be local or UTC */ - if(derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, track->creation_time - 2082844800); - fprintf(xmlout,"</AsLocalTime>\n"); - } - fprintf(xmlout, " </CreationTime>\n"); - fprintf(xmlout, " <ModificationTime>\n"); - if(raw) - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", track->modification_time); - if(derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, track->modification_time - 2082844800); - fprintf(xmlout,"</AsLocalTime>\n"); - } - fprintf(xmlout, " </ModificationTime>\n"); - fprintf(xmlout, " <Timescale>%d</Timescale>\n", track->timescale); - if(notes) - fprintf(xmlout, " <!-- Timescale defines time units in one second -->\n"); - fprintf(xmlout, " <Duration>\n"); - if(raw) - fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", track->duration); - if(derived) - fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n", (double)track->duration/(double)track->timescale); // Make this double later to get fractional seconds - fprintf(xmlout, " </Duration>\n"); - int16_to_3packedchars((short int)track->language, buf); - fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ - fprintf(xmlout, " </MediaHeader>\n"); - fprintf(xmlout, " <HandlerReference BoxType=\"hdlr\">\n"); - switch(track->track_type) - { - case 0: - fprintf(xmlout, " <HandlerType Code=\"vide\">video media track</HandlerType>\n"); break; - case 1: - fprintf(xmlout, " <HandlerType Code=\"soun\">Sound</HandlerType>\n"); break; - case 2: - fprintf(xmlout, " <HandlerType Code=\"hint\">Hint</HandlerType>\n"); break; - } - if(notes) { - fprintf(xmlout, " <!-- String value shown is not actually read from file. -->\n"); - fprintf(xmlout, " <!-- Shown value is one used for our encode. -->\n"); - } - fprintf(xmlout, " </HandlerReference>\n"); - fprintf(xmlout, " <MediaInfoContainer BoxType=\"minf\">\n"); - switch(track->track_type) - { - case 0: - fprintf(xmlout, " <VideoMediaHeader BoxType=\"vmhd\">\n"); - fprintf(xmlout, " <GraphicsMode>0x%02x</GraphicsMode>\n", track->graphicsmode); - if(notes) { - fprintf(xmlout," <!-- Enumerated values of graphics mode: -->\n"); - fprintf(xmlout," <!-- 0x00 = copy (over existing image); -->\n"); - fprintf(xmlout," <!-- 0x24 = transparent; 'blue-screen' this image using opcolor; -->\n"); - fprintf(xmlout," <!-- 0x100 = alpha; alpha-blend this image -->\n"); -/* fprintf(xmlout," <!-- 0x101 = whitealpha; alpha-blend this image, which has been blended with white; -->\n"); This was evidently dropped upon amendment */ - fprintf(xmlout," <!-- 0x102 = pre-multiplied black alpha; image has been already been alpha-blended with black. -->\n"); - fprintf(xmlout," <!-- 0x110 = component alpha; blend alpha channel(s) and color channels individually. -->\n"); - } - fprintf(xmlout, " <Opcolor>\n"); - fprintf(xmlout, " <Red>0x%02x</Red>\n", track->opcolor[0]); - fprintf(xmlout, " <Green>0x%02x</Green>\n",track->opcolor[1]); - fprintf(xmlout, " <Blue>0x%02x</Blue>\n",track->opcolor[2]); - fprintf(xmlout, " </Opcolor>\n"); - fprintf(xmlout, " </VideoMediaHeader>\n"); - break; - case 1: - fprintf(xmlout, " <SoundMediaHeader BoxType=\"smhd\">\n"); + char buf[5]; + int i, k; + buf[4] = '\0'; + + fprintf(xmlout, " <Media BoxType=\"mdia\">\n"); + fprintf(xmlout, " <MediaHeader BoxType=\"mdhd\">\n"); + fprintf(xmlout, " <CreationTime>\n"); + if(raw) + fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", track->creation_time); + if(notes) + fprintf(xmlout, " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n"); + /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ + /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time + should be local or UTC */ + if(derived) { + fprintf(xmlout, " <AsLocalTime>"); + xml_time_out(xmlout, track->creation_time - 2082844800); + fprintf(xmlout,"</AsLocalTime>\n"); + } + fprintf(xmlout, " </CreationTime>\n"); + fprintf(xmlout, " <ModificationTime>\n"); + if(raw) + fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", track->modification_time); + if(derived) { + fprintf(xmlout, " <AsLocalTime>"); + xml_time_out(xmlout, track->modification_time - 2082844800); + fprintf(xmlout,"</AsLocalTime>\n"); + } + fprintf(xmlout, " </ModificationTime>\n"); + fprintf(xmlout, " <Timescale>%d</Timescale>\n", track->timescale); + if(notes) + fprintf(xmlout, " <!-- Timescale defines time units in one second -->\n"); + fprintf(xmlout, " <Duration>\n"); + if(raw) + fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", track->duration); + if(derived) + fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n", (double)track->duration/(double)track->timescale); // Make this double later to get fractional seconds + fprintf(xmlout, " </Duration>\n"); + int16_to_3packedchars((short int)track->language, buf); + fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ + fprintf(xmlout, " </MediaHeader>\n"); + fprintf(xmlout, " <HandlerReference BoxType=\"hdlr\">\n"); + switch(track->track_type) { + case 0: + fprintf(xmlout, " <HandlerType Code=\"vide\">video media track</HandlerType>\n"); + break; + case 1: + fprintf(xmlout, " <HandlerType Code=\"soun\">Sound</HandlerType>\n"); + break; + case 2: + fprintf(xmlout, " <HandlerType Code=\"hint\">Hint</HandlerType>\n"); + break; + } + if(notes) { + fprintf(xmlout, " <!-- String value shown is not actually read from file. -->\n"); + fprintf(xmlout, " <!-- Shown value is one used for our encode. -->\n"); + } + fprintf(xmlout, " </HandlerReference>\n"); + fprintf(xmlout, " <MediaInfoContainer BoxType=\"minf\">\n"); + switch(track->track_type) { + case 0: + fprintf(xmlout, " <VideoMediaHeader BoxType=\"vmhd\">\n"); + fprintf(xmlout, " <GraphicsMode>0x%02x</GraphicsMode>\n", track->graphicsmode); + if(notes) { + fprintf(xmlout," <!-- Enumerated values of graphics mode: -->\n"); + fprintf(xmlout," <!-- 0x00 = copy (over existing image); -->\n"); + fprintf(xmlout," <!-- 0x24 = transparent; 'blue-screen' this image using opcolor; -->\n"); + fprintf(xmlout," <!-- 0x100 = alpha; alpha-blend this image -->\n"); + /* fprintf(xmlout," <!-- 0x101 = whitealpha; alpha-blend this image, which has been blended with white; -->\n"); This was evidently dropped upon amendment */ + fprintf(xmlout," <!-- 0x102 = pre-multiplied black alpha; image has been already been alpha-blended with black. -->\n"); + fprintf(xmlout," <!-- 0x110 = component alpha; blend alpha channel(s) and color channels individually. -->\n"); + } + fprintf(xmlout, " <Opcolor>\n"); + fprintf(xmlout, " <Red>0x%02x</Red>\n", track->opcolor[0]); + fprintf(xmlout, " <Green>0x%02x</Green>\n",track->opcolor[1]); + fprintf(xmlout, " <Blue>0x%02x</Blue>\n",track->opcolor[2]); + fprintf(xmlout, " </Opcolor>\n"); + fprintf(xmlout, " </VideoMediaHeader>\n"); + break; + case 1: + fprintf(xmlout, " <SoundMediaHeader BoxType=\"smhd\">\n"); #ifdef CURRENTSTRUCT - track->balance = track->balance << 8; + track->balance = track->balance << 8; #endif - fprintf(xmlout, " <Balance>\n"); - if(notes) { - fprintf(xmlout," <!-- Track audio balance fixes mono track in stereo space. -->\n"); - fprintf(xmlout," <!-- Stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); - fprintf(xmlout," <!-- 0.0 = center, -1.0 = full left, 1.0 = full right -->\n"); - } - if(raw) - fprintf(xmlout," <AsHex>0x%04x</AsHex>\n", track->balance); - if(derived) - fprintf(xmlout," <AsDecimal>%6.3f</AsDecimal>\n", (double)track->balance/(double)0x0100); - fprintf(xmlout, " </Balance>\n"); + fprintf(xmlout, " <Balance>\n"); + if(notes) { + fprintf(xmlout," <!-- Track audio balance fixes mono track in stereo space. -->\n"); + fprintf(xmlout," <!-- Stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); + fprintf(xmlout," <!-- 0.0 = center, -1.0 = full left, 1.0 = full right -->\n"); + } + if(raw) + fprintf(xmlout," <AsHex>0x%04x</AsHex>\n", track->balance); + if(derived) + fprintf(xmlout," <AsDecimal>%6.3f</AsDecimal>\n", (double)track->balance/(double)0x0100); + fprintf(xmlout, " </Balance>\n"); #ifdef CURRENTSTRUCT - if(notes) - fprintf(xmlout," <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - track->balance = track->balance >> 8; + if(notes) + fprintf(xmlout," <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); + track->balance = track->balance >> 8; #endif - fprintf(xmlout, " </SoundMediaHeader>\n"); - break; - case 2: - fprintf(xmlout, " <HintMediaHeader BoxType=\"hmhd\">\n"); - fprintf(xmlout, " <MaxPDU_Size>%d</MaxPDU_Size>\n", track->maxPDUsize); - if(notes) - fprintf(xmlout," <!-- Size in bytes of largest PDU in this hint stream. -->\n"); - fprintf(xmlout, " <AvgPDU_Size>%d</AvgPDU_Size>\n", track->avgPDUsize); - if(notes) - fprintf(xmlout," <!-- Average size in bytes of a PDU over the entire presentation. -->\n"); - fprintf(xmlout, " <MaxBitRate>%d</MaxBitRate>\n", track->maxbitrate); - if(notes) - fprintf(xmlout," <!-- Maximum rate in bits per second over any window of 1 second. -->\n"); - fprintf(xmlout, " <AvgBitRate>%d</AvgBitRate>\n", track->avgbitrate); - if(notes) - fprintf(xmlout," <!-- Averate rate in bits per second over the entire presentation. -->\n"); - fprintf(xmlout, " <SlidingAvgBit>%d</SlidingAvgBitRate>\n", track->slidingavgbitrate); - if(notes) - fprintf(xmlout," <!-- Maximum rate in bits per second over any window of one minute. -->\n"); - fprintf(xmlout, " </HintMediaHeader>\n"); - break; - } - fprintf(xmlout, " <DataInfo BoxType=\"dinf\">\n"); - fprintf(xmlout, " <DataReference BoxType=\"dref\" URL_Count=\"%d\" URN_Count=\"%d\">\n", track->num_url, track->num_urn); // table w. flags, URLs, URNs - // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs. - // We could infer those, but for now just present everything as a DREF table. - if(notes) - fprintf(xmlout, " <!-- No entries here mean that file is self-contained, as required by Simple Profile. -->\n"); - for(k = 0; k < track->num_url; k++) { - fprintf(xmlout, " <DataEntryUrlBox BoxType=\"url[space]\">\n"); // table w. flags, URLs, URNs - if(notes) - fprintf(xmlout," <!-- Only the first 16 bytes of URL location are recorded in mj2_to_metadata data structure. -->\n"); - for(i = 0; i < 4; i++) { - uint_to_chars(track->url[track->num_url].location[i], buf); - fprintf(xmlout, " <Location>%s</Location>\n"); - } - fprintf(xmlout, " </DataEntryUrlBox>\n"); // table w. flags, URLs, URNs - } - for(k = 0; k < track->num_urn; k++) { - fprintf(xmlout," <DataEntryUrnBox BoxType=\"urn[space]\">\n"); // table w. flags, URLs, URNs - // Only the first 16 bytes are recorded in the data structure currently. + fprintf(xmlout, " </SoundMediaHeader>\n"); + break; + case 2: + fprintf(xmlout, " <HintMediaHeader BoxType=\"hmhd\">\n"); + fprintf(xmlout, " <MaxPDU_Size>%d</MaxPDU_Size>\n", track->maxPDUsize); + if(notes) + fprintf(xmlout," <!-- Size in bytes of largest PDU in this hint stream. -->\n"); + fprintf(xmlout, " <AvgPDU_Size>%d</AvgPDU_Size>\n", track->avgPDUsize); + if(notes) + fprintf(xmlout," <!-- Average size in bytes of a PDU over the entire presentation. -->\n"); + fprintf(xmlout, " <MaxBitRate>%d</MaxBitRate>\n", track->maxbitrate); + if(notes) + fprintf(xmlout," <!-- Maximum rate in bits per second over any window of 1 second. -->\n"); + fprintf(xmlout, " <AvgBitRate>%d</AvgBitRate>\n", track->avgbitrate); + if(notes) + fprintf(xmlout," <!-- Averate rate in bits per second over the entire presentation. -->\n"); + fprintf(xmlout, " <SlidingAvgBit>%d</SlidingAvgBitRate>\n", track->slidingavgbitrate); + if(notes) + fprintf(xmlout," <!-- Maximum rate in bits per second over any window of one minute. -->\n"); + fprintf(xmlout, " </HintMediaHeader>\n"); + break; + } + fprintf(xmlout, " <DataInfo BoxType=\"dinf\">\n"); + fprintf(xmlout, " <DataReference BoxType=\"dref\" URL_Count=\"%d\" URN_Count=\"%d\">\n", track->num_url, track->num_urn); // table w. flags, URLs, URNs + // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs. + // We could infer those, but for now just present everything as a DREF table. if(notes) - fprintf(xmlout," <!-- Only the first 16 bytes each of URN name and optional location are recorded in mj2_to_metadata data structure. -->\n"); - fprintf(xmlout, " <Name>"); - for(i = 0; i < 4; i++) { - uint_to_chars(track->urn[track->num_urn].name[i], buf); - fprintf(xmlout,"%s", buf); - } - fprintf(xmlout, "</Name>\n"); - fprintf(xmlout, " <Location>"); - for(i = 0; i < 4; i++) { - uint_to_chars(track->urn[track->num_urn].location[i], buf); - fprintf(xmlout,"%s"); - } - fprintf(xmlout, "</Location>\n"); - fprintf(xmlout, " </DataEntryUrnBox>\n"); - } - fprintf(xmlout, " </DataReference>\n"); - fprintf(xmlout, " </DataInfo>\n"); - - xml_write_stbl(file, xmlout, track, tnum); /* SampleTable */ - - fprintf(xmlout, " </MediaInfoContainer>\n"); - fprintf(xmlout, " </Media>\n"); + fprintf(xmlout, " <!-- No entries here mean that file is self-contained, as required by Simple Profile. -->\n"); + for(k = 0; k < track->num_url; k++) { + fprintf(xmlout, " <DataEntryUrlBox BoxType=\"url[space]\">\n"); // table w. flags, URLs, URNs + if(notes) + fprintf(xmlout," <!-- Only the first 16 bytes of URL location are recorded in mj2_to_metadata data structure. -->\n"); + for(i = 0; i < 4; i++) { + uint_to_chars(track->url[track->num_url].location[i], buf); + fprintf(xmlout, " <Location>%s</Location>\n"); + } + fprintf(xmlout, " </DataEntryUrlBox>\n"); // table w. flags, URLs, URNs + } + for(k = 0; k < track->num_urn; k++) { + fprintf(xmlout," <DataEntryUrnBox BoxType=\"urn[space]\">\n"); // table w. flags, URLs, URNs + // Only the first 16 bytes are recorded in the data structure currently. + if(notes) + fprintf(xmlout," <!-- Only the first 16 bytes each of URN name and optional location are recorded in mj2_to_metadata data structure. -->\n"); + fprintf(xmlout, " <Name>"); + for(i = 0; i < 4; i++) { + uint_to_chars(track->urn[track->num_urn].name[i], buf); + fprintf(xmlout,"%s", buf); + } + fprintf(xmlout, "</Name>\n"); + fprintf(xmlout, " <Location>"); + for(i = 0; i < 4; i++) { + uint_to_chars(track->urn[track->num_urn].location[i], buf); + fprintf(xmlout,"%s"); + } + fprintf(xmlout, "</Location>\n"); + fprintf(xmlout, " </DataEntryUrnBox>\n"); + } + fprintf(xmlout, " </DataReference>\n"); + fprintf(xmlout, " </DataInfo>\n"); + + xml_write_stbl(file, xmlout, track, tnum); /* SampleTable */ + + fprintf(xmlout, " </MediaInfoContainer>\n"); + fprintf(xmlout, " </Media>\n"); } /* ------------- */ void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { - char buf[5], buf33[33]; - int i, len; - buf[4] = '\0'; - - fprintf(xmlout, " <SampleTable BoxType=\"stbl\">\n"); - if(notes) - fprintf(xmlout, " <!-- What follows are specific instances of generic SampleDescription BoxType=\"stsd\" -->\n"); - switch(track->track_type) - { - case 0: - // There could be multiple instances of this, but "entry_count" is just a local at read-time. - // And it's used wrong, too, as count of just visual type, when it's really all 3 types. - // This is referred to as "smj2" within mj2.c - fprintf(xmlout, " <VisualSampleEntry BoxType=\"mjp2\">\n"); - if(notes) { - fprintf(xmlout, " <!-- If multiple instances of this box, only first is shown here. -->\n"); - fprintf(xmlout, " <!-- Width and Height are in pixels. Unlike the Track Header, there is no fractional part. -->\n"); - fprintf(xmlout, " <!-- In mj2_to_metadata implementation, the values are not represented separately from Track Header's values. -->\n"); - } - /* No shifting required. If CURRENTSTRUCT gets changed, then may need to revisit treatment of these */ - fprintf(xmlout, " <WidthAsInteger>%d</WidthAsInteger>\n", track->w); - fprintf(xmlout, " <HeightAsInteger>%d</HeightAsInteger>\n", track->h); + char buf[5], buf33[33]; + int i, len; + buf[4] = '\0'; + + fprintf(xmlout, " <SampleTable BoxType=\"stbl\">\n"); + if(notes) + fprintf(xmlout, " <!-- What follows are specific instances of generic SampleDescription BoxType=\"stsd\" -->\n"); + switch(track->track_type) { + case 0: + // There could be multiple instances of this, but "entry_count" is just a local at read-time. + // And it's used wrong, too, as count of just visual type, when it's really all 3 types. + // This is referred to as "smj2" within mj2.c + fprintf(xmlout, " <VisualSampleEntry BoxType=\"mjp2\">\n"); + if(notes) { + fprintf(xmlout, " <!-- If multiple instances of this box, only first is shown here. -->\n"); + fprintf(xmlout, " <!-- Width and Height are in pixels. Unlike the Track Header, there is no fractional part. -->\n"); + fprintf(xmlout, " <!-- In mj2_to_metadata implementation, the values are not represented separately from Track Header's values. -->\n"); + } + /* No shifting required. If CURRENTSTRUCT gets changed, then may need to revisit treatment of these */ + fprintf(xmlout, " <WidthAsInteger>%d</WidthAsInteger>\n", track->w); + fprintf(xmlout, " <HeightAsInteger>%d</HeightAsInteger>\n", track->h); // Horizresolution and vertresolution don't require shifting, already stored right in CURRENTSTRUCT - if(notes) { - fprintf(xmlout, " <!-- Resolutions are in pixels per inch, for the highest-resolution component (typically luminance). -->\n"); - fprintf(xmlout, " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n"); - fprintf(xmlout, " <!-- Typical value for both resolutions is 0x00480000 (72.0) -->\n"); - } - fprintf(xmlout, " <HorizontalRes>\n"); - if(raw) - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->horizresolution); - if(derived) - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->horizresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ - fprintf(xmlout, " </HorizontalRes>\n"); - fprintf(xmlout, " <VerticalRes>\n"); - if(raw) - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->vertresolution); - if(derived) - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->vertresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ - fprintf(xmlout, " </VerticalRes>\n"); - - buf33[0] = '\0'; - for(i = 0; i < 8; i++) { - uint_to_chars((unsigned int)track->compressorname[i], buf); - strcat(buf33, buf); /* This loads up (4 * 8) + 1 chars, but trailing ones are usually junk */ - } - len = (int)buf33[0]; /* First byte has string length in bytes. There may be garbage beyond it. */ - buf33[len+1] = '\0'; /* Suppress it */ - fprintf(xmlout, " <CompressorName>%s</CompressorName>\n", buf33+1); /* Start beyond first byte */ - if(notes) { - fprintf(xmlout, " <!-- Compressor name for debugging. Standard restricts max length to 31 bytes. -->\n"); - fprintf(xmlout, " <!-- Usually blank or \"Motion JPEG2000\" -->\n"); - } - fprintf(xmlout, " <Depth>0x%02x</Depth>\n",track->depth); - if(notes) { - fprintf(xmlout, " <!-- Depth is: -->\n"); - fprintf(xmlout, " <!-- 0x20: alpha channels present (color or grayscale) -->\n"); - fprintf(xmlout, " <!-- 0x28: grayscale without alpha -->\n"); - fprintf(xmlout, " <!-- 0x18: color without alpha -->\n"); - } - - xml_out_frame_jp2h(xmlout, &(track->jp2_struct)); /* JP2 Header */ - - /* Following subboxes are optional */ - fprintf(xmlout, " <FieldCoding BoxType=\"fiel\">\n"); - fprintf(xmlout, " <FieldCount>%d</FieldCount>\n", (unsigned int)track->fieldcount); /* uchar as 1 byte uint */ + if(notes) { + fprintf(xmlout, " <!-- Resolutions are in pixels per inch, for the highest-resolution component (typically luminance). -->\n"); + fprintf(xmlout, " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n"); + fprintf(xmlout, " <!-- Typical value for both resolutions is 0x00480000 (72.0) -->\n"); + } + fprintf(xmlout, " <HorizontalRes>\n"); + if(raw) + fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->horizresolution); + if(derived) + fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->horizresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ + fprintf(xmlout, " </HorizontalRes>\n"); + fprintf(xmlout, " <VerticalRes>\n"); + if(raw) + fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->vertresolution); + if(derived) + fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", (double)track->vertresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ + fprintf(xmlout, " </VerticalRes>\n"); + + buf33[0] = '\0'; + for(i = 0; i < 8; i++) { + uint_to_chars((unsigned int)track->compressorname[i], buf); + strcat(buf33, buf); /* This loads up (4 * 8) + 1 chars, but trailing ones are usually junk */ + } + len = (int)buf33[0]; /* First byte has string length in bytes. There may be garbage beyond it. */ + buf33[len+1] = '\0'; /* Suppress it */ + fprintf(xmlout, " <CompressorName>%s</CompressorName>\n", buf33+1); /* Start beyond first byte */ + if(notes) { + fprintf(xmlout, " <!-- Compressor name for debugging. Standard restricts max length to 31 bytes. -->\n"); + fprintf(xmlout, " <!-- Usually blank or \"Motion JPEG2000\" -->\n"); + } + fprintf(xmlout, " <Depth>0x%02x</Depth>\n",track->depth); + if(notes) { + fprintf(xmlout, " <!-- Depth is: -->\n"); + fprintf(xmlout, " <!-- 0x20: alpha channels present (color or grayscale) -->\n"); + fprintf(xmlout, " <!-- 0x28: grayscale without alpha -->\n"); + fprintf(xmlout, " <!-- 0x18: color without alpha -->\n"); + } + + xml_out_frame_jp2h(xmlout, &(track->jp2_struct)); /* JP2 Header */ + + /* Following subboxes are optional */ + fprintf(xmlout, " <FieldCoding BoxType=\"fiel\">\n"); + fprintf(xmlout, " <FieldCount>%d</FieldCount>\n", (unsigned int)track->fieldcount); /* uchar as 1 byte uint */ + if(notes) + fprintf(xmlout, " <!-- Must be either 1 or 2 -->\n"); + fprintf(xmlout, " <FieldOrder>%d</FieldOrder>\n", (unsigned int)track->fieldorder); /* uchar as 1 byte uint */ + if(notes) { + fprintf(xmlout, " <!-- When FieldCount=2, FieldOrder means: -->\n"); + fprintf(xmlout, " <!-- 0: Field coding unknown -->\n"); + fprintf(xmlout, " <!-- 1: Field with topmost line is stored first in sample; fields are in temporal order -->\n"); + fprintf(xmlout, " <!-- 6: Field with topmost line is stored second in sample; fields are in temporal order -->\n"); + fprintf(xmlout, " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n"); + fprintf(xmlout, " <!-- Current implementation doesn't retain whether box was actually present. -->\n"); + } + fprintf(xmlout, " </FieldCoding>\n"); + + fprintf(xmlout, " <MJP2_Profile BoxType=\"jp2p\" Count=\"%d\">\n",track->num_br); + for (i = 0; i < track->num_br; i++) { /* read routine stored in reverse order, so let's undo damage */ + uint_to_chars(track->br[i], buf); + fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n", buf); /*4 characters, each CLi */ + } + fprintf(xmlout, " </MJP2_Profile>\n"); + + fprintf(xmlout, " <MJP2_Prefix BoxType=\"jp2x\" Count=\"%d\">\n",track->num_jp2x); + for (i = 0; i < track->num_jp2x; i++) { + // We'll probably need better formatting than this + fprintf(xmlout, " <Data>0x%02x</Data>\n", track->jp2xdata[i]); /* Each entry is single byte */ + } + fprintf(xmlout, " </MJP2_Prefix>\n"); + + fprintf(xmlout, " <MJP2_SubSampling BoxType=\"jsub\">\n"); /* These values are all 1 byte */ + if(notes) + fprintf(xmlout, " <!-- Typical subsample value is 2 for 4:2:0 -->\n"); + fprintf(xmlout, " <HorizontalSub>%d</HorizontalSub>\n", track->hsub); + fprintf(xmlout, " <VerticalSub>%d</VerticalSub>\n", track->vsub); + fprintf(xmlout, " <HorizontalOffset>%d</HorizontalOffset>\n", track->hoff); + fprintf(xmlout, " <VerticalOffset>%d</VerticalOffset>\n", track->voff); + if(notes) { + fprintf(xmlout, " <!-- Typical {horizontal, vertical} chroma offset values: -->\n"); + fprintf(xmlout, " <!-- 4:2:2 format (CCIR601, H.262, MPEG2, MPEG4, recom. Exif): {0, 0} -->\n"); + fprintf(xmlout, " <!-- 4:2:2 format (JFIF): {1, 0} -->\n"); + fprintf(xmlout, " <!-- 4:2:0 format (H.262, MPEG2, MPEG4): {0, 1} -->\n"); + fprintf(xmlout, " <!-- 4:2:0 format (MPEG1, H.261, JFIF, recom. Exif): {1, 1} -->\n"); + } + fprintf(xmlout, " </MJP2_SubSampling>\n"); /* These values are all 1 byte */ + + fprintf(xmlout, " <MJP2_OriginalFormat BoxType=\"orfo\">\n"); /* Part III Appx. 2 */ + fprintf(xmlout, " <OriginalFieldCount>%u</OriginalFieldCount>\n", (unsigned int)track->or_fieldcount); /* uchar as 1-byte uint */ + if(notes) + fprintf(xmlout, " <!-- In original material before encoding. Must be either 1 or 2 -->\n"); + fprintf(xmlout, " <OriginalFieldOrder>%u</OriginalFieldOrder>\n", (unsigned int)track->or_fieldorder); /* uchar as 1-byte uint */ + if(notes) { + fprintf(xmlout, " <!-- When FieldCount=2, FieldOrder means: -->\n"); + fprintf(xmlout, " <!-- 0: Field coding unknown -->\n"); + fprintf(xmlout, " <!-- 11: Topmost line came from the earlier field; -->\n"); + fprintf(xmlout, " <!-- 16: Topmost line came form the later field. -->\n"); + fprintf(xmlout, " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n"); + fprintf(xmlout, " <!-- Current implementation doesn't retain whether box was actually present. -->\n"); + } + fprintf(xmlout, " </MJP2_OriginalFormat>\n"); + fprintf(xmlout, " </VisualSampleEntry>\n"); + break; + case 1: + case 2: + if(notes) + fprintf(xmlout, " <!-- mj2_to_metadata's data structure doesn't record this currently. -->\n"); + break; + } + fprintf(xmlout, " <TimeToSample BoxType=\"stts\">\n"); + fprintf(xmlout, " <SampleStatistics>\n"); + fprintf(xmlout, " <TotalSamples>%d</TotalSamples>\n", track->num_samples); if(notes) - fprintf(xmlout, " <!-- Must be either 1 or 2 -->\n"); - fprintf(xmlout, " <FieldOrder>%d</FieldOrder>\n", (unsigned int)track->fieldorder); /* uchar as 1 byte uint */ - if(notes) { - fprintf(xmlout, " <!-- When FieldCount=2, FieldOrder means: -->\n"); - fprintf(xmlout, " <!-- 0: Field coding unknown -->\n"); - fprintf(xmlout, " <!-- 1: Field with topmost line is stored first in sample; fields are in temporal order -->\n"); - fprintf(xmlout, " <!-- 6: Field with topmost line is stored second in sample; fields are in temporal order -->\n"); - fprintf(xmlout, " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n"); - fprintf(xmlout, " <!-- Current implementation doesn't retain whether box was actually present. -->\n"); - } - fprintf(xmlout, " </FieldCoding>\n"); - - fprintf(xmlout, " <MJP2_Profile BoxType=\"jp2p\" Count=\"%d\">\n",track->num_br); - for (i = 0; i < track->num_br; i++) /* read routine stored in reverse order, so let's undo damage */ - { - uint_to_chars(track->br[i], buf); - fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n", buf); /*4 characters, each CLi */ + fprintf(xmlout, " <!-- For video, gives the total frames in the track, by summing all entries in the Sample Table -->\n"); + fprintf(xmlout, " </SampleStatistics>\n"); + fprintf(xmlout, " <SampleEntries EntryCount=\"%d\">\n", track->num_tts); + for (i = 0; i < track->num_tts; i++) { + fprintf(xmlout, " <Table Entry=\"%u\" SampleCount=\"%d\" SampleDelta=\"%u\" />\n", + i+1, track->tts[i].sample_count, track->tts[i].sample_delta); } - fprintf(xmlout, " </MJP2_Profile>\n"); + fprintf(xmlout, " </SampleEntries>\n"); + fprintf(xmlout, " </TimeToSample>\n"); + + fprintf(xmlout, " <SampleToChunk BoxType=\"stsc\" Count=\"%d\">\n", track->num_samplestochunk); + for (i = 0; i < track->num_samplestochunk; i++) { + fprintf(xmlout, " <FirstChunk>%u</FirstChunk>\n",track->sampletochunk[i].first_chunk); /* 4 bytes */ + fprintf(xmlout, " <SamplesPerChunk>%u</SamplesPerChunk>\n",track->sampletochunk[i].samples_per_chunk); /* 4 bytes */ + fprintf(xmlout, " <SampleDescrIndex>%u</SampleDescrIndex>\n",track->sampletochunk[i].sample_descr_idx); /* 4 bytes */ + } + fprintf(xmlout, " </SampleToChunk>\n"); + // After reading this info in, track->num_chunks is calculated and a decompressed table established internally. + + fprintf(xmlout, " <SampleSize BoxType=\"stsz\">\n"); + if(track->same_sample_size) { + // all values in track->sample[i].sample_size are equal. Grab the first one. + fprintf(xmlout, " <Sample_Size>%u</Sample_Size>\n", track->sample[0].sample_size); + if(notes) { + fprintf(xmlout, " <!-- Non-zero value means all samples have that size. -->\n"); + fprintf(xmlout, " <!-- So <Sample_Count> (aka Entry_Count in std.) has no meaning, is suppressed from this output, and no table follows. -->\n"); + } + } else { + fprintf(xmlout, " <Sample_Size>0</Sample_Size>\n"); + if(notes) + if(sampletables) + fprintf(xmlout," <!-- Zero value means samples have different sizes, given in table next of length Sample_Count (aka Entry_Count in std). -->\n"); + else + fprintf(xmlout," <!-- Zero value means samples have different sizes, given in table (not shown) of length Sample_Count (aka Entry_Count in std). -->\n"); + fprintf(xmlout, " <Sample_Count>%u</Sample_Count>\n", track->num_samples); + if(sampletables) + for (i = 0; i < (int)track->num_samples; i++) { + fprintf(xmlout, " <EntrySize Num=\"%u\">%u</EntrySize>\n", i+1, track->sample[i].sample_size); + } + } + fprintf(xmlout, " </SampleSize>\n"); - fprintf(xmlout, " <MJP2_Prefix BoxType=\"jp2x\" Count=\"%d\">\n",track->num_jp2x); - for (i = 0; i < track->num_jp2x; i++) - { // We'll probably need better formatting than this - fprintf(xmlout, " <Data>0x%02x</Data>\n", track->jp2xdata[i]); /* Each entry is single byte */ + fprintf(xmlout, " <ChunkOffset BoxType=\"stco\">\n"); + // Structure not yet - Variant ChunkLargeOffset 'co64' + fprintf(xmlout, " <EntryCount>%u</EntryCount>\n", track->num_chunks); + if(notes) { + fprintf(xmlout, " <!-- For this implementation, EntryCount shown is one calculated during file read of <SampleToChunk> data. -->\n"); + fprintf(xmlout, " <!-- Implementation will report failure during file read of <ChunkOffset> data if read entry-count disagrees. -->\n"); } - fprintf(xmlout, " </MJP2_Prefix>\n"); + if(sampletables) + for (i = 0; i < (int)track->num_chunks; i++) + fprintf(xmlout, " <Chunk_Offset Num=\"%d\">%u</Chunk_Offset>\n", i+1, track->chunk[i].offset); + fprintf(xmlout, " </ChunkOffset>\n"); - fprintf(xmlout, " <MJP2_SubSampling BoxType=\"jsub\">\n"); /* These values are all 1 byte */ - if(notes) - fprintf(xmlout, " <!-- Typical subsample value is 2 for 4:2:0 -->\n"); - fprintf(xmlout, " <HorizontalSub>%d</HorizontalSub>\n", track->hsub); - fprintf(xmlout, " <VerticalSub>%d</VerticalSub>\n", track->vsub); - fprintf(xmlout, " <HorizontalOffset>%d</HorizontalOffset>\n", track->hoff); - fprintf(xmlout, " <VerticalOffset>%d</VerticalOffset>\n", track->voff); - if(notes) { - fprintf(xmlout, " <!-- Typical {horizontal, vertical} chroma offset values: -->\n"); - fprintf(xmlout, " <!-- 4:2:2 format (CCIR601, H.262, MPEG2, MPEG4, recom. Exif): {0, 0} -->\n"); - fprintf(xmlout, " <!-- 4:2:2 format (JFIF): {1, 0} -->\n"); - fprintf(xmlout, " <!-- 4:2:0 format (H.262, MPEG2, MPEG4): {0, 1} -->\n"); - fprintf(xmlout, " <!-- 4:2:0 format (MPEG1, H.261, JFIF, recom. Exif): {1, 1} -->\n"); - } - fprintf(xmlout, " </MJP2_SubSampling>\n"); /* These values are all 1 byte */ - - fprintf(xmlout, " <MJP2_OriginalFormat BoxType=\"orfo\">\n"); /* Part III Appx. 2 */ - fprintf(xmlout, " <OriginalFieldCount>%u</OriginalFieldCount>\n", (unsigned int)track->or_fieldcount); /* uchar as 1-byte uint */ - if(notes) - fprintf(xmlout, " <!-- In original material before encoding. Must be either 1 or 2 -->\n"); - fprintf(xmlout, " <OriginalFieldOrder>%u</OriginalFieldOrder>\n", (unsigned int)track->or_fieldorder); /* uchar as 1-byte uint */ - if(notes) { - fprintf(xmlout, " <!-- When FieldCount=2, FieldOrder means: -->\n"); - fprintf(xmlout, " <!-- 0: Field coding unknown -->\n"); - fprintf(xmlout, " <!-- 11: Topmost line came from the earlier field; -->\n"); - fprintf(xmlout, " <!-- 16: Topmost line came form the later field. -->\n"); - fprintf(xmlout, " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n"); - fprintf(xmlout, " <!-- Current implementation doesn't retain whether box was actually present. -->\n"); - } - fprintf(xmlout, " </MJP2_OriginalFormat>\n"); - fprintf(xmlout, " </VisualSampleEntry>\n"); - break; - case 1: case 2: - if(notes) - fprintf(xmlout, " <!-- mj2_to_metadata's data structure doesn't record this currently. -->\n"); break; - } - fprintf(xmlout, " <TimeToSample BoxType=\"stts\">\n"); - fprintf(xmlout, " <SampleStatistics>\n"); - fprintf(xmlout, " <TotalSamples>%d</TotalSamples>\n", track->num_samples); - if(notes) - fprintf(xmlout, " <!-- For video, gives the total frames in the track, by summing all entries in the Sample Table -->\n"); - fprintf(xmlout, " </SampleStatistics>\n"); - fprintf(xmlout, " <SampleEntries EntryCount=\"%d\">\n", track->num_tts); - for (i = 0; i < track->num_tts; i++) { - fprintf(xmlout, " <Table Entry=\"%u\" SampleCount=\"%d\" SampleDelta=\"%u\" />\n", - i+1, track->tts[i].sample_count, track->tts[i].sample_delta); - } - fprintf(xmlout, " </SampleEntries>\n"); - fprintf(xmlout, " </TimeToSample>\n"); - - fprintf(xmlout, " <SampleToChunk BoxType=\"stsc\" Count=\"%d\">\n", track->num_samplestochunk); - for (i = 0; i < track->num_samplestochunk; i++) { - fprintf(xmlout, " <FirstChunk>%u</FirstChunk>\n",track->sampletochunk[i].first_chunk); /* 4 bytes */ - fprintf(xmlout, " <SamplesPerChunk>%u</SamplesPerChunk>\n",track->sampletochunk[i].samples_per_chunk); /* 4 bytes */ - fprintf(xmlout, " <SampleDescrIndex>%u</SampleDescrIndex>\n",track->sampletochunk[i].sample_descr_idx); /* 4 bytes */ - } - fprintf(xmlout, " </SampleToChunk>\n"); - // After reading this info in, track->num_chunks is calculated and a decompressed table established internally. - - fprintf(xmlout, " <SampleSize BoxType=\"stsz\">\n"); - if(track->same_sample_size) { - // all values in track->sample[i].sample_size are equal. Grab the first one. - fprintf(xmlout, " <Sample_Size>%u</Sample_Size>\n", track->sample[0].sample_size); - if(notes) { - fprintf(xmlout, " <!-- Non-zero value means all samples have that size. -->\n"); - fprintf(xmlout, " <!-- So <Sample_Count> (aka Entry_Count in std.) has no meaning, is suppressed from this output, and no table follows. -->\n"); - } - } else { - fprintf(xmlout, " <Sample_Size>0</Sample_Size>\n"); - if(notes) - if(sampletables) - fprintf(xmlout," <!-- Zero value means samples have different sizes, given in table next of length Sample_Count (aka Entry_Count in std). -->\n"); - else - fprintf(xmlout," <!-- Zero value means samples have different sizes, given in table (not shown) of length Sample_Count (aka Entry_Count in std). -->\n"); - fprintf(xmlout, " <Sample_Count>%u</Sample_Count>\n", track->num_samples); - if(sampletables) - for (i = 0; i < (int)track->num_samples; i++) { - fprintf(xmlout, " <EntrySize Num=\"%u\">%u</EntrySize>\n", i+1, track->sample[i].sample_size); - } - } - fprintf(xmlout, " </SampleSize>\n"); - - fprintf(xmlout, " <ChunkOffset BoxType=\"stco\">\n"); - // Structure not yet - Variant ChunkLargeOffset 'co64' - fprintf(xmlout, " <EntryCount>%u</EntryCount>\n", track->num_chunks); - if(notes) { - fprintf(xmlout, " <!-- For this implementation, EntryCount shown is one calculated during file read of <SampleToChunk> data. -->\n"); - fprintf(xmlout, " <!-- Implementation will report failure during file read of <ChunkOffset> data if read entry-count disagrees. -->\n"); - } - if(sampletables) - for (i = 0; i < (int)track->num_chunks; i++) - fprintf(xmlout, " <Chunk_Offset Num=\"%d\">%u</Chunk_Offset>\n", i+1, track->chunk[i].offset); - fprintf(xmlout, " </ChunkOffset>\n"); - - fprintf(xmlout, " </SampleTable>\n"); + fprintf(xmlout, " </SampleTable>\n"); } /* ------------- */ int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum, opj_event_mgr_t *event_mgr) { - opj_dparameters_t parameters; /* decompression parameters */ - opj_image_t *img; - opj_cp_t *cp; - int i; - int numcomps; - unsigned char* frame_codestream; - opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ - opj_cio_t *cio = NULL; - opj_j2k_t *j2k; - - /* JPEG 2000 compressed image data */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_J2K); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, event_mgr, stderr); - - /* setup the decoder decoding parameters using the current image and user parameters */ - parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS; - opj_setup_decoder(dinfo, ¶meters); - - frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker */ - if(frame_codestream == NULL) - return 1; - - fseek(file,sample->offset+8,SEEK_SET); - fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do */ - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); - - /* Decode J2K to image: */ - img = opj_decode(dinfo, cio); - if (!img) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - return 1; - } - - j2k = (opj_j2k_t*)dinfo->j2k_handle; - j2k_default_tcp = j2k->default_tcp; - cp = j2k->cp; - - numcomps = img->numcomps; - /* Alignments: " < To help maintain xml pretty-printing */ - fprintf(xmlout, " <JP2_Frame Num=\"%d\">\n", snum+1); - fprintf(xmlout, " <MainHeader>\n"); - /* There can be multiple codestreams; a particular image is entirely within a single codestream */ - /* TO DO: A frame can be represented by two I-guess-contiguous codestreams if its interleaved. */ - fprintf(xmlout, " <StartOfCodestream Marker=\"SOC\" />\n"); - /* "cp" stands for "coding parameter"; "tcp" is tile coding parameters, "tccp" is tile-component coding parameters */ - xml_out_frame_siz(xmlout, img, cp); /* reqd in main */ - xml_out_frame_cod(xmlout, j2k_default_tcp); /* reqd in main */ - xml_out_frame_coc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ - xml_out_frame_qcd(xmlout, j2k_default_tcp); /* reqd in main */ - xml_out_frame_qcc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ - xml_out_frame_rgn(xmlout, j2k_default_tcp, numcomps); /* opt, at most 1 per component */ - xml_out_frame_poc(xmlout, j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */ - /* Next four get j2k_default_tcp passed globally: */ + opj_dparameters_t parameters; /* decompression parameters */ + opj_image_t *img; + opj_cp_t *cp; + int i; + int numcomps; + unsigned char* frame_codestream; + opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ + opj_cio_t *cio = NULL; + opj_j2k_t *j2k; + + /* JPEG 2000 compressed image data */ + + /* get a decoder handle */ + dinfo = opj_create_decompress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, event_mgr, stderr); + + /* setup the decoder decoding parameters using the current image and user parameters */ + parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS; + opj_setup_decoder(dinfo, ¶meters); + + frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker */ + if(frame_codestream == NULL) + return 1; + + fseek(file,sample->offset+8,SEEK_SET); + fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do */ + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); + + /* Decode J2K to image: */ + img = opj_decode(dinfo, cio); + if (!img) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + return 1; + } + + j2k = (opj_j2k_t*)dinfo->j2k_handle; + j2k_default_tcp = j2k->default_tcp; + cp = j2k->cp; + + numcomps = img->numcomps; + /* Alignments: " < To help maintain xml pretty-printing */ + fprintf(xmlout, " <JP2_Frame Num=\"%d\">\n", snum+1); + fprintf(xmlout, " <MainHeader>\n"); + /* There can be multiple codestreams; a particular image is entirely within a single codestream */ + /* TO DO: A frame can be represented by two I-guess-contiguous codestreams if its interleaved. */ + fprintf(xmlout, " <StartOfCodestream Marker=\"SOC\" />\n"); + /* "cp" stands for "coding parameter"; "tcp" is tile coding parameters, "tccp" is tile-component coding parameters */ + xml_out_frame_siz(xmlout, img, cp); /* reqd in main */ + xml_out_frame_cod(xmlout, j2k_default_tcp); /* reqd in main */ + xml_out_frame_coc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ + xml_out_frame_qcd(xmlout, j2k_default_tcp); /* reqd in main */ + xml_out_frame_qcc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ + xml_out_frame_rgn(xmlout, j2k_default_tcp, numcomps); /* opt, at most 1 per component */ + xml_out_frame_poc(xmlout, j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */ + /* Next four get j2k_default_tcp passed globally: */ #ifdef SUPPRESS_FOR_NOW - xml_out_frame_ppm(xmlout, cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */ + xml_out_frame_ppm(xmlout, cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */ #endif - xml_out_frame_tlm(xmlout); /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ /* opt */ - xml_out_frame_plm(xmlout); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* opt in main; can be used in conjunction with PLT */ - xml_out_frame_crg(xmlout); /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ - xml_out_frame_com(xmlout, j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ - - fprintf(xmlout, " </MainHeader>\n"); - - /* TO DO: all the tile headers (sigh) */ - fprintf(xmlout, " <TilePartHeaders Count=\"%d\">\n", cp->tileno_size); /* size of the vector tileno */ - for(i = 0; i < cp->tileno_size; i++) { /* I think cp->tileno_size will be same number as (cp->tw * cp->th) or as global j2k_curtileno */ - // Standard seems to use zero-based # for tile-part. - fprintf(xmlout, " <TilePartHeader Num=\"%d\" ID=\"%d\">\n", i, cp->tileno[i]); /* ID number of the tiles present in the codestream */ - fprintf(xmlout, " <StartOfTilePart Marker=\"SOT\" />\n"); - /* All markers in tile-part headers (between SOT and SOD) are optional, unless structure requires. */ - if(i == 0) { - xml_out_frame_cod(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ - xml_out_frame_coc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ - xml_out_frame_qcd(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ - xml_out_frame_qcc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ - xml_out_frame_rgn(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ - } - xml_out_frame_poc(xmlout, &(cp->tcps[i])); /* Reqd only if any progression order changes different from main POC */ + xml_out_frame_tlm(xmlout); /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ /* opt */ + xml_out_frame_plm(xmlout); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* opt in main; can be used in conjunction with PLT */ + xml_out_frame_crg(xmlout); /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ + xml_out_frame_com(xmlout, j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ + + fprintf(xmlout, " </MainHeader>\n"); + + /* TO DO: all the tile headers (sigh) */ + fprintf(xmlout, " <TilePartHeaders Count=\"%d\">\n", cp->tileno_size); /* size of the vector tileno */ + for(i = 0; i < cp->tileno_size; i++) { /* I think cp->tileno_size will be same number as (cp->tw * cp->th) or as global j2k_curtileno */ + // Standard seems to use zero-based # for tile-part. + fprintf(xmlout, " <TilePartHeader Num=\"%d\" ID=\"%d\">\n", i, cp->tileno[i]); /* ID number of the tiles present in the codestream */ + fprintf(xmlout, " <StartOfTilePart Marker=\"SOT\" />\n"); + /* All markers in tile-part headers (between SOT and SOD) are optional, unless structure requires. */ + if(i == 0) { + xml_out_frame_cod(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ + xml_out_frame_coc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ + xml_out_frame_qcd(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ + xml_out_frame_qcc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ + xml_out_frame_rgn(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ + } + xml_out_frame_poc(xmlout, &(cp->tcps[i])); /* Reqd only if any progression order changes different from main POC */ #ifdef SUPPRESS_FOR_NOW - xml_out_frame_ppt(xmlout, &(cp->tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */ + xml_out_frame_ppt(xmlout, &(cp->tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */ #endif - xml_out_frame_plt(xmlout, &(cp->tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */ - xml_out_frame_com(xmlout, &(cp->tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ - /* opj_tcp_t * cp->tcps; "tile coding parameters" */ - /* Maybe not: fprintf(xmlout, " <>%d</>, cp->matrice[i]; */ /* Fixed layer */ - fprintf(xmlout, " <StartOfData Marker=\"SOD\" />\n"); - if(notes) - fprintf(xmlout, " <!-- Tile-part bitstream, not shown, follows tile-part header and SOD marker. -->\n"); - fprintf(xmlout, " </TilePartHeader>\n"); - } - fprintf(xmlout, " </TilePartHeaders>\n"); /* size of the vector tileno */ + xml_out_frame_plt(xmlout, &(cp->tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */ + xml_out_frame_com(xmlout, &(cp->tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ + /* opj_tcp_t * cp->tcps; "tile coding parameters" */ + /* Maybe not: fprintf(xmlout, " <>%d</>, cp->matrice[i]; */ /* Fixed layer */ + fprintf(xmlout, " <StartOfData Marker=\"SOD\" />\n"); + if(notes) + fprintf(xmlout, " <!-- Tile-part bitstream, not shown, follows tile-part header and SOD marker. -->\n"); + fprintf(xmlout, " </TilePartHeader>\n"); + } + fprintf(xmlout, " </TilePartHeaders>\n"); /* size of the vector tileno */ #ifdef NOTYET - IMAGINE the cp object has data to support the following... but we could use an new different data structure instead - /* I'm unclear if the span of the original fread(frame_codestream...) included the following items if they're trailing. */ - /* ALSO TO DO, BUT DATA STRUCTURE DOESN'T HANDLE YET: boxes (anywhere in file except before the Filetype box): */ - xml_out_frame_jp2i(xmlout, &cp); /* IntellectualProperty 'jp2i' (no restrictions on location) */ - xml_out_frame_xml(xmlout, &cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ - xml_out_frame_uuid(xmlout, &cp); /* UUID 'uuid' (top level only) */ - xml_out_frame_uinf(xmlout, &cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ + IMAGINE the cp object has data to support the following... but we could use an new different data structure instead + /* I'm unclear if the span of the original fread(frame_codestream...) included the following items if they're trailing. */ + /* ALSO TO DO, BUT DATA STRUCTURE DOESN'T HANDLE YET: boxes (anywhere in file except before the Filetype box): */ + xml_out_frame_jp2i(xmlout, &cp); /* IntellectualProperty 'jp2i' (no restrictions on location) */ + xml_out_frame_xml(xmlout, &cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ + xml_out_frame_uuid(xmlout, &cp); /* UUID 'uuid' (top level only) */ + xml_out_frame_uinf(xmlout, &cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ #endif - fprintf(xmlout, " </JP2_Frame>\n"); + fprintf(xmlout, " </JP2_Frame>\n"); - /* Extra commentary: */ - if(notes) { - fprintf(xmlout, " <!-- Given the number and size of components, mj2_to_frame would try to convert this -->\n"); - if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) - && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) - || (img->numcomps == 1)) { - fprintf(xmlout, " <!-- file to a YUV movie in the normal manner. -->\n"); - } - else if ((img->numcomps == 3) && - (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& - (img->comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp - fprintf(xmlout, " <!-- YUV 4:4:4 file to a series of .bmp files. -->\n"); - } - else { - fprintf(xmlout, " <!-- file whose image component dimension are unknown, to a series of .j2k files. -->\n"); + /* Extra commentary: */ + if(notes) { + fprintf(xmlout, " <!-- Given the number and size of components, mj2_to_frame would try to convert this -->\n"); + if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) + && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) + || (img->numcomps == 1)) { + fprintf(xmlout, " <!-- file to a YUV movie in the normal manner. -->\n"); + } else if ((img->numcomps == 3) && + (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& + (img->comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp + fprintf(xmlout, " <!-- YUV 4:4:4 file to a series of .bmp files. -->\n"); + } else { + fprintf(xmlout, " <!-- file whose image component dimension are unknown, to a series of .j2k files. -->\n"); + } } - } - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(frame_codestream); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + free(frame_codestream); - return 0; + return 0; } /* ------------- */ @@ -1056,8 +1053,7 @@ void int16_to_3packedchars(short int value, char* buf) /* This is to retrieve the 3-letter ASCII language code */ /* Each char is packed into 5 bits, as difference from 0x60 */ int i; - for (i = 2; i >= 0; i--) - { + for (i = 2; i >= 0; i--) { buf[i] = (value & 0x001f) + 0x60; value = (value >>5); } @@ -1068,669 +1064,674 @@ void int16_to_3packedchars(short int value, char* buf) void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp) { - opj_image_comp_t *comp; - int i; - - fprintf(xmlout, " <ImageAndFileSize Marker=\"SIZ\">\n"); - // This is similar to j2k.c's j2k_dump_image. - // Not of interest: Lsiz, Rsiz - fprintf(xmlout, " <Xsiz>%d</Xsiz>\n", img->x1); - fprintf(xmlout, " <Ysiz>%d</Ysiz>\n", img->y1); - if(notes) - fprintf(xmlout, " <!-- Xsiz, Ysiz is the size of the reference grid. -->\n"); - fprintf(xmlout, " <XOsiz>%d</XOsiz>\n", img->x0); - fprintf(xmlout, " <YOsiz>%d</YOsiz>\n", img->y0); - if(notes) - fprintf(xmlout, " <!-- XOsiz, YOsiz are offsets from grid origin to image origin. -->\n"); - fprintf(xmlout, " <XTsiz>%d</XTsiz>\n", cp->tdx); - fprintf(xmlout, " <YTsiz>%d</YTsiz>\n", cp->tdy); - if(notes) - fprintf(xmlout, " <!-- XTsiz, YTsiz is the size of one tile with respect to the grid. -->\n"); - fprintf(xmlout, " <XTOsiz>%d</XTOsiz>\n", cp->tx0); - fprintf(xmlout, " <YTOsiz>%d</YTOsiz>\n", cp->ty0); - if(notes) - fprintf(xmlout, " <!-- XTOsiz, YTOsiz are offsets from grid origin to first tile origin. -->\n"); - fprintf(xmlout, " <Csiz>%d</Csiz>\n", img->numcomps); - if(notes) { - fprintf(xmlout, " <!-- Csiz is the number of components in the image. -->\n"); - fprintf(xmlout, " <!-- For image components next: -->\n"); - fprintf(xmlout, " <!-- XRsiz, YRsiz denote pixel-sample-spacing on the grid, per Part I Annex B. -->\n"); - //fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n"); - fprintf(xmlout, " <!-- Bits per pixel (bpp) is the pixel depth. -->\n"); - fprintf(xmlout, " <!-- WidthOfData and HeightOfData are calculated values, e.g.: w = roundup((Xsiz - XOsiz)/ XRsiz) -->\n"); - } - - for (i = 0; i < img->numcomps; i++) {/* image-components */ - comp = &(img->comps[i]); - fprintf(xmlout, " <Component Num=\"%d\">\n", i+1); - fprintf(xmlout, " <Ssiz>\n"); - if(raw) - fprintf(xmlout," <AsHex>0x%02x</AsHex>\n", (comp->sgnd << 7) & (comp->prec - 1)); - if(derived) { - fprintf(xmlout," <Signed>%d</Signed>\n", comp->sgnd); - fprintf(xmlout," <PrecisionInBits>%d</PrecisionInBits>\n", comp->prec); - } - fprintf(xmlout, " </Ssiz>\n"); - fprintf(xmlout, " <XRsiz>%d</XRsiz>\n", comp->dx); - fprintf(xmlout, " <YRsiz>%d</YRsiz>\n", comp->dy); - fprintf(xmlout, " <WidthOfData>%d</WidthOfData>\n", comp->w); - fprintf(xmlout, " <HeightOfData>%d</HeightOfData>\n", comp->h); - /* Rest of these aren't calculated when SIZ is read: - fprintf(xmlout, " <XO>%d</XO>\n", comp->x0); - fprintf(xmlout, " <YO>%d</YO>\n", comp->y0); - if(notes) - fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n"); - fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", comp->bpp); - fprintf(xmlout, " <NumberOfDecodedResolution>%d</NumberOfDecodedResolution>\n", comp->resno_decoded); */ - // SUPPRESS: n/a to mj2_to_metadata. fprintf(xmlout," <Factor>%d</Factor\n", comp->factor); - /* factor = number of division by 2 of the out image compare to the original size of image */ - // TO DO comp->data: int *data; /* image-component data */ - - fprintf(xmlout, " </Component>\n"); - } - fprintf(xmlout, " </ImageAndFileSize>\n"); -} - -/* ------------- */ + opj_image_comp_t *comp; + int i; -void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp) -{ -/* Could be called with tcp = &j2k_default_tcp; -/* Or, for tile-part header, with &j2k_cp->tcps[j2k_curtileno] -/* Alignment for main:" < < < < To help maintain xml pretty-printing */ -/* Alignment for tile:" < < < To help maintain xml pretty-printing */ - opj_tccp_t *tccp; - int i; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - tccp = &(tcp->tccps[0]); - - fprintf(xmlout, "%s<CodingStyleDefault Marker=\"COD\">\n",s); /* Required in main header */ - /* Not retained or of interest: Lcod */ - fprintf(xmlout, "%s <Scod>0x%02x</Scod>\n", s, tcp->csty); /* 1 byte */ - if(notes) { - fprintf(xmlout, "%s <!-- For Scod, specific bits mean (where bit 0 is lowest or rightmost): -->\n",s); - fprintf(xmlout, "%s <!-- bit 0: Defines entropy coder precincts -->\n",s); - fprintf(xmlout, "%s <!-- 0 = (PPx=15, PPy=15); 1 = precincts defined below. -->\n",s); - fprintf(xmlout, "%s <!-- bit 1: 1 = SOP marker may be used; 0 = not. -->\n",s); - fprintf(xmlout, "%s <!-- bit 2: 1 = EPH marker may be used; 0 = not. -->\n",s); - } - fprintf(xmlout, "%s <SGcod>\n",s); - fprintf(xmlout, "%s <ProgressionOrder>%d</ProgressionOrder>\n", s, tcp->prg); /* 1 byte, SGcod (A) */ - if(notes) { - fprintf(xmlout, "%s <!-- Defined Progression Order Values are: -->\n",s); - fprintf(xmlout, "%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n",s); - fprintf(xmlout, "%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n",s); - } - fprintf(xmlout, "%s <NumberOfLayers>%d</NumberOfLayers>\n", s, tcp->numlayers); /* 2 bytes, SGcod (B) */ - fprintf(xmlout, "%s <MultipleComponentTransformation>%d</MultipleComponentTransformation>\n", s, tcp->mct); /* 1 byte, SGcod (C). More or less boolean */ - if(notes) - fprintf(xmlout, "%s <!-- For MCT, 0 = none, 1 = transform first 3 components for efficiency, per Part I Annex G -->\n",s); - fprintf(xmlout, "%s </SGcod>\n",s); - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - fprintf(xmlout, "%s <SPcod>\n",s); - /* Internal data structure tccp defines separate defaults for each component, but they all get the same values */ - /* So we only have to report the first component's values here. */ - /* Compare j2k_read_cox(...) */ - fprintf(xmlout, "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ - fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ - fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ - if(notes) { - fprintf(xmlout, "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n",s); - fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s); - } - fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ - if(notes) { - fprintf(xmlout, "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n",s); - fprintf(xmlout, "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n",s); - fprintf(xmlout, "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n",s); - fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n",s); - fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n",s); - fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n",s); - fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n",s); - } - fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ - if(notes) - fprintf(xmlout, "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n",s); - if (tccp->csty & J2K_CP_CSTY_PRT) { - fprintf(xmlout, "%s <PrecinctSize>\n",s); /* 1 byte, SPcox (I_i) */ + fprintf(xmlout, " <ImageAndFileSize Marker=\"SIZ\">\n"); + // This is similar to j2k.c's j2k_dump_image. + // Not of interest: Lsiz, Rsiz + fprintf(xmlout, " <Xsiz>%d</Xsiz>\n", img->x1); + fprintf(xmlout, " <Ysiz>%d</Ysiz>\n", img->y1); + if(notes) + fprintf(xmlout, " <!-- Xsiz, Ysiz is the size of the reference grid. -->\n"); + fprintf(xmlout, " <XOsiz>%d</XOsiz>\n", img->x0); + fprintf(xmlout, " <YOsiz>%d</YOsiz>\n", img->y0); + if(notes) + fprintf(xmlout, " <!-- XOsiz, YOsiz are offsets from grid origin to image origin. -->\n"); + fprintf(xmlout, " <XTsiz>%d</XTsiz>\n", cp->tdx); + fprintf(xmlout, " <YTsiz>%d</YTsiz>\n", cp->tdy); if(notes) - fprintf(xmlout, "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n",s); - for (i = 0; i < tccp->numresolutions; i++) { - fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n", s, i); - if(raw) - fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ - if(derived) { - fprintf(xmlout,"%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s, tccp->prcw[i]); - fprintf(xmlout,"%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s, tccp->prch[i]); - } - fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i); - } - fprintf(xmlout, "%s </PrecinctSize>\n",s); /* 1 byte, SPcox (I_i) */ - } - fprintf(xmlout, "%s </SPcod>\n",s); - fprintf(xmlout, "%s</CodingStyleDefault>\n",s); + fprintf(xmlout, " <!-- XTsiz, YTsiz is the size of one tile with respect to the grid. -->\n"); + fprintf(xmlout, " <XTOsiz>%d</XTOsiz>\n", cp->tx0); + fprintf(xmlout, " <YTOsiz>%d</YTOsiz>\n", cp->ty0); + if(notes) + fprintf(xmlout, " <!-- XTOsiz, YTOsiz are offsets from grid origin to first tile origin. -->\n"); + fprintf(xmlout, " <Csiz>%d</Csiz>\n", img->numcomps); + if(notes) { + fprintf(xmlout, " <!-- Csiz is the number of components in the image. -->\n"); + fprintf(xmlout, " <!-- For image components next: -->\n"); + fprintf(xmlout, " <!-- XRsiz, YRsiz denote pixel-sample-spacing on the grid, per Part I Annex B. -->\n"); + //fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n"); + fprintf(xmlout, " <!-- Bits per pixel (bpp) is the pixel depth. -->\n"); + fprintf(xmlout, " <!-- WidthOfData and HeightOfData are calculated values, e.g.: w = roundup((Xsiz - XOsiz)/ XRsiz) -->\n"); + } + + for (i = 0; i < img->numcomps; i++) {/* image-components */ + comp = &(img->comps[i]); + fprintf(xmlout, " <Component Num=\"%d\">\n", i+1); + fprintf(xmlout, " <Ssiz>\n"); + if(raw) + fprintf(xmlout," <AsHex>0x%02x</AsHex>\n", (comp->sgnd << 7) & (comp->prec - 1)); + if(derived) { + fprintf(xmlout," <Signed>%d</Signed>\n", comp->sgnd); + fprintf(xmlout," <PrecisionInBits>%d</PrecisionInBits>\n", comp->prec); + } + fprintf(xmlout, " </Ssiz>\n"); + fprintf(xmlout, " <XRsiz>%d</XRsiz>\n", comp->dx); + fprintf(xmlout, " <YRsiz>%d</YRsiz>\n", comp->dy); + fprintf(xmlout, " <WidthOfData>%d</WidthOfData>\n", comp->w); + fprintf(xmlout, " <HeightOfData>%d</HeightOfData>\n", comp->h); + /* Rest of these aren't calculated when SIZ is read: + fprintf(xmlout, " <XO>%d</XO>\n", comp->x0); + fprintf(xmlout, " <YO>%d</YO>\n", comp->y0); + if(notes) + fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n"); + fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", comp->bpp); + fprintf(xmlout, " <NumberOfDecodedResolution>%d</NumberOfDecodedResolution>\n", comp->resno_decoded); */ + // SUPPRESS: n/a to mj2_to_metadata. fprintf(xmlout," <Factor>%d</Factor\n", comp->factor); + /* factor = number of division by 2 of the out image compare to the original size of image */ + // TO DO comp->data: int *data; /* image-component data */ + + fprintf(xmlout, " </Component>\n"); + } + fprintf(xmlout, " </ImageAndFileSize>\n"); } /* ------------- */ -void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) /* Optional in main & tile-part headers */ +void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp) { -/* Uses global j2k_default_tcp */ - opj_tccp_t *tccp, *firstcomp_tccp; - int i, compno; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - - firstcomp_tccp = &(tcp->tccps[0]); - /* Internal data structure tccp defines separate defaults for each component, set from main */ - /* default, then selectively overwritten. */ - /* Compare j2k_read_cox(...) */ - /* We don't really know which was the default, and which were not */ - /* Let's pretend that [0] is the default and all others are not */ - if(notes) { - fprintf(xmlout, "%s<!-- mj2_to_metadata implementation always reports component[0] as using default COD, -->\n", s); - if(tcp == j2k_default_tcp) - fprintf(xmlout, "%s<!-- and any other component, with main-header style values different from [0], as COC. -->\n", s); - else - fprintf(xmlout, "%s<!-- and any other component, with tile-part-header style values different from [0], as COC. -->\n", s); - } - for (compno = 1; compno < numcomps; compno++) /* spec says components are zero-based */ - { - tccp = &tcp->tccps[compno]; - if(same_component_style(firstcomp_tccp, tccp)) - continue; - -/* Alignments: " < < < < < To help maintain xml pretty-printing */ - fprintf(xmlout, "%s<CodingStyleComponent Marker=\"COC\">\n", s); /* Optional in main header, at most 1 per component */ - if(notes) - fprintf(xmlout, "%s <!-- See Ccoc below for zero-based component number. -->\n", s); - /* Overrides the main COD for the specific component */ - /* Not retained or of interest: Lcod */ - fprintf(xmlout, "%s <Scoc>0x%02x</Scoc>\n", s, tccp->csty); /* 1 byte */ - if(notes) { - fprintf(xmlout, "%s <!-- Scoc defines entropy coder precincts: -->\n", s); - fprintf(xmlout, "%s <!-- 0 = maximum, namely (PPx=15, PPy=15); 1 = precincts defined below. -->\n", s); - } - fprintf(xmlout, "%s <Ccoc>%d</Ccoc>\n", s, compno); /* 1 or 2 bytes */ - /* Unfortunately compo isn't retained in j2k_read_coc: compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ - /*if(j2k_img_numcomps <=256) - component is 1 byte - else - compno is 2 byte */ + /* Could be called with tcp = &j2k_default_tcp; + /* Or, for tile-part header, with &j2k_cp->tcps[j2k_curtileno] + /* Alignment for main:" < < < < To help maintain xml pretty-printing */ + /* Alignment for tile:" < < < To help maintain xml pretty-printing */ + opj_tccp_t *tccp; + int i; + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } + tccp = &(tcp->tccps[0]); + fprintf(xmlout, "%s<CodingStyleDefault Marker=\"COD\">\n",s); /* Required in main header */ + /* Not retained or of interest: Lcod */ + fprintf(xmlout, "%s <Scod>0x%02x</Scod>\n", s, tcp->csty); /* 1 byte */ + if(notes) { + fprintf(xmlout, "%s <!-- For Scod, specific bits mean (where bit 0 is lowest or rightmost): -->\n",s); + fprintf(xmlout, "%s <!-- bit 0: Defines entropy coder precincts -->\n",s); + fprintf(xmlout, "%s <!-- 0 = (PPx=15, PPy=15); 1 = precincts defined below. -->\n",s); + fprintf(xmlout, "%s <!-- bit 1: 1 = SOP marker may be used; 0 = not. -->\n",s); + fprintf(xmlout, "%s <!-- bit 2: 1 = EPH marker may be used; 0 = not. -->\n",s); + } + fprintf(xmlout, "%s <SGcod>\n",s); + fprintf(xmlout, "%s <ProgressionOrder>%d</ProgressionOrder>\n", s, tcp->prg); /* 1 byte, SGcod (A) */ + if(notes) { + fprintf(xmlout, "%s <!-- Defined Progression Order Values are: -->\n",s); + fprintf(xmlout, "%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n",s); + fprintf(xmlout, "%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n",s); + } + fprintf(xmlout, "%s <NumberOfLayers>%d</NumberOfLayers>\n", s, tcp->numlayers); /* 2 bytes, SGcod (B) */ + fprintf(xmlout, "%s <MultipleComponentTransformation>%d</MultipleComponentTransformation>\n", s, tcp->mct); /* 1 byte, SGcod (C). More or less boolean */ + if(notes) + fprintf(xmlout, "%s <!-- For MCT, 0 = none, 1 = transform first 3 components for efficiency, per Part I Annex G -->\n",s); + fprintf(xmlout, "%s </SGcod>\n",s); /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - fprintf(xmlout, "%s <SPcoc>\n", s); + fprintf(xmlout, "%s <SPcod>\n",s); + /* Internal data structure tccp defines separate defaults for each component, but they all get the same values */ + /* So we only have to report the first component's values here. */ + /* Compare j2k_read_cox(...) */ fprintf(xmlout, "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ - if(notes) { - fprintf(xmlout, "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n", s); - fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s); - } + if(notes) { + fprintf(xmlout, "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n",s); + fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s); + } fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ - if(notes) { - fprintf(xmlout, "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n", s); - fprintf(xmlout, "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n", s); - fprintf(xmlout, "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n", s); - fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n", s); - fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n", s); - fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n", s); - fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n", s); - } + if(notes) { + fprintf(xmlout, "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n",s); + fprintf(xmlout, "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n",s); + fprintf(xmlout, "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n",s); + fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n",s); + fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n",s); + fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n",s); + fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n",s); + } fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ if(notes) - fprintf(xmlout, "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n", s); + fprintf(xmlout, "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n",s); if (tccp->csty & J2K_CP_CSTY_PRT) { - fprintf(xmlout, "%s <PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ - if(notes) - fprintf(xmlout, "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n", s); - for (i = 0; i < tccp->numresolutions-1; i++) { /* subtract 1 to get # of decomposition levels */ - fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n", s, i); - if(raw) - fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ - if(derived) { - fprintf(xmlout,"%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s, tccp->prcw[i]); - fprintf(xmlout,"%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s, tccp->prch[i]); - } - fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i); - } - fprintf(xmlout, "%s </PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ - } - fprintf(xmlout, "%s </SPcoc>\n", s); - fprintf(xmlout, "%s</CodingStyleComponent>\n", s); - } + fprintf(xmlout, "%s <PrecinctSize>\n",s); /* 1 byte, SPcox (I_i) */ + if(notes) + fprintf(xmlout, "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n",s); + for (i = 0; i < tccp->numresolutions; i++) { + fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n", s, i); + if(raw) + fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ + if(derived) { + fprintf(xmlout,"%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s, tccp->prcw[i]); + fprintf(xmlout,"%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s, tccp->prch[i]); + } + fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i); + } + fprintf(xmlout, "%s </PrecinctSize>\n",s); /* 1 byte, SPcox (I_i) */ + } + fprintf(xmlout, "%s </SPcod>\n",s); + fprintf(xmlout, "%s</CodingStyleDefault>\n",s); } /* ------------- */ -BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2) +void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) /* Optional in main & tile-part headers */ { - int i; - - if(tccp1->numresolutions != tccp2->numresolutions) - return FALSE; - if(tccp1->cblkw != tccp2->cblkw) - return FALSE; - if(tccp1->cblkh != tccp2->cblkh) - return FALSE; - if(tccp1->cblksty != tccp2->cblksty) - return FALSE; - if(tccp1->csty != tccp2->csty) - return FALSE; - - if (tccp1->csty & J2K_CP_CSTY_PRT) { - for (i = 0; i < tccp1->numresolutions; i++) { - if(tccp1->prcw[i] != tccp2->prcw[i] || tccp1->prch[i] != tccp2->prch[i]) - return FALSE; - } - } - return TRUE; + /* Uses global j2k_default_tcp */ + opj_tccp_t *tccp, *firstcomp_tccp; + int i, compno; + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } + + firstcomp_tccp = &(tcp->tccps[0]); + /* Internal data structure tccp defines separate defaults for each component, set from main */ + /* default, then selectively overwritten. */ + /* Compare j2k_read_cox(...) */ + /* We don't really know which was the default, and which were not */ + /* Let's pretend that [0] is the default and all others are not */ + if(notes) { + fprintf(xmlout, "%s<!-- mj2_to_metadata implementation always reports component[0] as using default COD, -->\n", s); + if(tcp == j2k_default_tcp) + fprintf(xmlout, "%s<!-- and any other component, with main-header style values different from [0], as COC. -->\n", s); + else + fprintf(xmlout, "%s<!-- and any other component, with tile-part-header style values different from [0], as COC. -->\n", s); + } + for (compno = 1; compno < numcomps; compno++) { /* spec says components are zero-based */ + tccp = &tcp->tccps[compno]; + if(same_component_style(firstcomp_tccp, tccp)) + continue; + + /* Alignments: " < < < < < To help maintain xml pretty-printing */ + fprintf(xmlout, "%s<CodingStyleComponent Marker=\"COC\">\n", s); /* Optional in main header, at most 1 per component */ + if(notes) + fprintf(xmlout, "%s <!-- See Ccoc below for zero-based component number. -->\n", s); + /* Overrides the main COD for the specific component */ + /* Not retained or of interest: Lcod */ + fprintf(xmlout, "%s <Scoc>0x%02x</Scoc>\n", s, tccp->csty); /* 1 byte */ + if(notes) { + fprintf(xmlout, "%s <!-- Scoc defines entropy coder precincts: -->\n", s); + fprintf(xmlout, "%s <!-- 0 = maximum, namely (PPx=15, PPy=15); 1 = precincts defined below. -->\n", s); + } + fprintf(xmlout, "%s <Ccoc>%d</Ccoc>\n", s, compno); /* 1 or 2 bytes */ + /* Unfortunately compo isn't retained in j2k_read_coc: compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ + /*if(j2k_img_numcomps <=256) + component is 1 byte + else + compno is 2 byte */ + + /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ + fprintf(xmlout, "%s <SPcoc>\n", s); + fprintf(xmlout, "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ + fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ + fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ + if(notes) { + fprintf(xmlout, "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n", s); + fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s); + } + fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ + if(notes) { + fprintf(xmlout, "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n", s); + fprintf(xmlout, "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n", s); + fprintf(xmlout, "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n", s); + fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n", s); + fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n", s); + fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n", s); + fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n", s); + } + fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ + if(notes) + fprintf(xmlout, "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n", s); + if (tccp->csty & J2K_CP_CSTY_PRT) { + fprintf(xmlout, "%s <PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ + if(notes) + fprintf(xmlout, "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n", s); + for (i = 0; i < tccp->numresolutions-1; i++) { /* subtract 1 to get # of decomposition levels */ + fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n", s, i); + if(raw) + fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ + if(derived) { + fprintf(xmlout,"%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s, tccp->prcw[i]); + fprintf(xmlout,"%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s, tccp->prch[i]); + } + fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i); + } + fprintf(xmlout, "%s </PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ + } + fprintf(xmlout, "%s </SPcoc>\n", s); + fprintf(xmlout, "%s</CodingStyleComponent>\n", s); + } } /* ------------- */ -void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp) +BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - opj_tccp_t *tccp; - int bandno, numbands; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - - /* Compare j2k_read_qcx */ - fprintf(xmlout, "%s<QuantizationDefault Marker=\"QCD\">\n", s); /* Required in main header, single occurrence */ - tccp = &(tcp->tccps[0]); - /* Not retained or of interest: Lqcd */ - fprintf(xmlout, "%s <Sqcd>\n", s); /* 1 byte */ - if(notes) - fprintf(xmlout, "%s <!-- Default quantization style for all components. -->\n", s); - if(raw) - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->numgbits) << 5 | tccp->qntsty); - if(derived) - fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s, tccp->qntsty); - if(notes) { - fprintf(xmlout, "%s <!-- Quantization style (in Sqcd's low 5 bits) may be: -->\n", s); - fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcd size = 8 bits-->\n", s); - fprintf(xmlout, "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcd size = 16. -->\n", s); - fprintf(xmlout, "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcd size = 16. -->\n", s); - } - if(derived) - fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s, tccp->numgbits); - if(notes) - fprintf(xmlout, "%s <!-- 0-7 guard bits allowed (stored in Sqcd's high 3 bits) -->\n", s); - fprintf(xmlout, "%s </Sqcd>\n", s); - - /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ - /* So we'll just dump all internal values */ - /* We could calculate it, but I'm having trouble believing the length equations in the standard */ - - fprintf(xmlout, "%s <SPqcd>\n", s); - switch(tccp->qntsty) { - case J2K_CCP_QNTSTY_NOQNT: /* no quantization */ - /* This is what standard says, but I don't believe it: len = 4 + (3*decomp); */ - numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - /* Instead look for first zero exponent, quit there. Adequate? */ - fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s); - if(notes) { - fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); - fprintf(xmlout, "%s <!-- until an exponent with zero value is reached. -->\n", s); - fprintf(xmlout, "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s); - fprintf(xmlout, "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if(tccp->stepsizes[bandno].expn == 0) - break; /* Remove when we have real numbands */ - fprintf(xmlout, "%s <DynamicRangeExponent Subband=\"%d\">\n", s, bandno); - if(raw) - fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, tccp->stepsizes[bandno].expn << 3); - if(derived) - fprintf(xmlout,"%s <AsDecimal>%d</AsDecimal>\n", s, tccp->stepsizes[bandno].expn); - fprintf(xmlout, "%s </DynamicRangeExponent>\n", s); - } - fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s); - break; - case J2K_CCP_QNTSTY_SIQNT: /* scalar quantization derived */ - /* This is what standard says. Should I believe it:: len = 5; - /* numbands = 1; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if(notes) - fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); - fprintf(xmlout, "%s <QuantizationValues Subband=\"0\">\n", s); - if(notes) - fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s); - if(raw) - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant); - if(derived) { - fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[0].expn); - fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[0].mant); - } - fprintf(xmlout, "%s </QuantizationValues>\n", s); - if(notes) { - fprintf(xmlout, "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n", s); - fprintf(xmlout, "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n", s); - fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); - fprintf(xmlout, "%s <!-- until a subband with exponent of zero value is reached. -->\n", s); - } - - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - if(tccp->stepsizes[bandno].expn == 0) - break; + int i; + + if(tccp1->numresolutions != tccp2->numresolutions) + return FALSE; + if(tccp1->cblkw != tccp2->cblkw) + return FALSE; + if(tccp1->cblkh != tccp2->cblkh) + return FALSE; + if(tccp1->cblksty != tccp2->cblksty) + return FALSE; + if(tccp1->csty != tccp2->csty) + return FALSE; - fprintf(xmlout, "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s, bandno, tccp->stepsizes[bandno].expn); - } - - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; - - default: /* J2K_CCP_QNTSTY_SEQNT */ /* scalar quantization expounded */ - /* This is what standard says, but should I believe it: len = 5 + 6*decomp; */ - numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if(notes) { - fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); - fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); - fprintf(xmlout, "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n", s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) - break; /* Remove when we have real numbands */ - - fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno); - if(raw) - fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); - if(derived) { - fprintf(xmlout,"%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[bandno].expn); - fprintf(xmlout,"%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[bandno].mant); - } - fprintf(xmlout, "%s </QuantizationValues>\n", s); - } - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; - } /* switch */ - fprintf(xmlout, "%s </SPqcd>\n", s); - fprintf(xmlout, "%s</QuantizationDefault>\n", s); - -/* Alignments: " < < < < < To help maintain xml pretty-printing */ + if (tccp1->csty & J2K_CP_CSTY_PRT) { + for (i = 0; i < tccp1->numresolutions; i++) { + if(tccp1->prcw[i] != tccp2->prcw[i] || tccp1->prch[i] != tccp2->prch[i]) + return FALSE; + } + } + return TRUE; } /* ------------- */ -void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) +void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp) { -/* Uses global j2k_default_tcp */ - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - opj_tccp_t *tccp, *firstcomp_tccp; - int bandno, numbands; - int compno; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - - firstcomp_tccp = &(tcp->tccps[0]); - /* Internal data structure tccp defines separate defaults for each component, set from main */ - /* default, then selectively overwritten. */ - /* Compare j2k_read_qcx(...) */ - /* We don't really know which was the default, and which were not */ - /* Let's pretend that [0] is the default and all others are not */ - if(notes) { - fprintf(xmlout, "%s<!-- mj2_to_metadata implementation always reports component[0] as using default QCD, -->\n", s); - if(tcp == j2k_default_tcp) - fprintf(xmlout, "%s<!-- and any other component, with main-header quantization values different from [0], as QCC. -->\n", s); - else - fprintf(xmlout, "%s<!-- and any other component, with tile-part-header quantization values different from [0], as QCC. -->\n", s); - } - for (compno = 1; compno < numcomps; compno++) /* spec says components are zero-based */ - { - tccp = &(tcp->tccps[compno]); - if(same_component_quantization(firstcomp_tccp, tccp)) - continue; + /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ + opj_tccp_t *tccp; + int bandno, numbands; + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } /* Compare j2k_read_qcx */ - fprintf(xmlout, "%s<QuantizationComponent Marker=\"QCC\" Component=\"%d\">\n", s, compno); /* Required in main header, single occurrence */ - tccp = &j2k_default_tcp->tccps[0]; - /* Not retained or perhaps of interest: Lqcd It maybe can be calculated. */ - fprintf(xmlout, "%s <Sqcc>\n", s); /* 1 byte */ + fprintf(xmlout, "%s<QuantizationDefault Marker=\"QCD\">\n", s); /* Required in main header, single occurrence */ + tccp = &(tcp->tccps[0]); + /* Not retained or of interest: Lqcd */ + fprintf(xmlout, "%s <Sqcd>\n", s); /* 1 byte */ if(notes) - fprintf(xmlout, "%s <!-- Quantization style for this component. -->\n", s); - if(raw) - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->numgbits) << 5 | tccp->qntsty); - if(derived) - fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s, tccp->qntsty); - if(notes) { - fprintf(xmlout, "%s <!-- Quantization style (in Sqcc's low 5 bits) may be: -->\n", s); - fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcc size = 8 bits-->\n", s); - fprintf(xmlout, "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcc size = 16. -->\n", s); - fprintf(xmlout, "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcc size = 16. -->\n", s); - } - if(derived) - fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s, tccp->numgbits); + fprintf(xmlout, "%s <!-- Default quantization style for all components. -->\n", s); + if(raw) + fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->numgbits) << 5 | tccp->qntsty); + if(derived) + fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s, tccp->qntsty); + if(notes) { + fprintf(xmlout, "%s <!-- Quantization style (in Sqcd's low 5 bits) may be: -->\n", s); + fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcd size = 8 bits-->\n", s); + fprintf(xmlout, "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcd size = 16. -->\n", s); + fprintf(xmlout, "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcd size = 16. -->\n", s); + } + if(derived) + fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s, tccp->numgbits); if(notes) - fprintf(xmlout, "%s <!-- 0-7 guard bits allowed (stored in Sqcc's high 3 bits) -->\n", s); - fprintf(xmlout, "%s </Sqcc>\n", s); - + fprintf(xmlout, "%s <!-- 0-7 guard bits allowed (stored in Sqcd's high 3 bits) -->\n", s); + fprintf(xmlout, "%s </Sqcd>\n", s); + /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ /* So we'll just dump all internal values */ - fprintf(xmlout, "%s <SPqcc>\n", s); + /* We could calculate it, but I'm having trouble believing the length equations in the standard */ + + fprintf(xmlout, "%s <SPqcd>\n", s); switch(tccp->qntsty) { - case J2K_CCP_QNTSTY_NOQNT: - numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - - /* Instead look for first zero exponent, quit there. Adequate? */ - fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s); - if(notes) { - fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); - fprintf(xmlout, "%s <!-- until an exponent with zero value is reached. -->\n", s); - fprintf(xmlout, "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s); - fprintf(xmlout, "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if(tccp->stepsizes[bandno].expn == 0) - break; /* Remove this once we have real numbands */ - fprintf(xmlout, "%s <Exponent Subband=\"%d\">\n", s, bandno); - if(raw) - fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, tccp->stepsizes[bandno].expn << 3); - if(derived) - fprintf(xmlout,"%s <AsDecimal>%d</AsDecimal>\n", s, tccp->stepsizes[bandno].expn); - fprintf(xmlout, "%s </Exponent>\n", s); - } - fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s); - break; - case J2K_CCP_QNTSTY_SIQNT: - /* numbands = 1; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if(notes) - fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); - fprintf(xmlout, "%s <QuantizationValuesForSubband0>\n", s); - if(notes) - fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s); - if(raw) - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant); - if(derived) { - fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[0].expn); - fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[0].mant); - } - fprintf(xmlout, "%s </QuantizationValuesForSubband0>\n", s); - if(notes) { - fprintf(xmlout, "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n", s); - fprintf(xmlout, "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n", s); - fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); - fprintf(xmlout, "%s <!-- until a subband with exponent of zero value is reached. -->\n", s); + case J2K_CCP_QNTSTY_NOQNT: /* no quantization */ + /* This is what standard says, but I don't believe it: len = 4 + (3*decomp); */ + numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ + /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ + /* Instead look for first zero exponent, quit there. Adequate? */ + fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s); + if(notes) { + fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); + fprintf(xmlout, "%s <!-- until an exponent with zero value is reached. -->\n", s); + fprintf(xmlout, "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s); + fprintf(xmlout, "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s); + } + for (bandno = 0; bandno < numbands; bandno++) { + if(tccp->stepsizes[bandno].expn == 0) + break; /* Remove when we have real numbands */ + fprintf(xmlout, "%s <DynamicRangeExponent Subband=\"%d\">\n", s, bandno); + if(raw) + fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, tccp->stepsizes[bandno].expn << 3); + if(derived) + fprintf(xmlout,"%s <AsDecimal>%d</AsDecimal>\n", s, tccp->stepsizes[bandno].expn); + fprintf(xmlout, "%s </DynamicRangeExponent>\n", s); + } + fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s); + break; + case J2K_CCP_QNTSTY_SIQNT: /* scalar quantization derived */ + /* This is what standard says. Should I believe it:: len = 5; + /* numbands = 1; */ + fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); + if(notes) + fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); + fprintf(xmlout, "%s <QuantizationValues Subband=\"0\">\n", s); + if(notes) + fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s); + if(raw) + fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant); + if(derived) { + fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[0].expn); + fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[0].mant); + } + fprintf(xmlout, "%s </QuantizationValues>\n", s); + if(notes) { + fprintf(xmlout, "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n", s); + fprintf(xmlout, "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n", s); + fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); + fprintf(xmlout, "%s <!-- until a subband with exponent of zero value is reached. -->\n", s); } - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - if(tccp->stepsizes[bandno].expn == 0) - break; + for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { + if(tccp->stepsizes[bandno].expn == 0) + break; - fprintf(xmlout, "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s, bandno, tccp->stepsizes[bandno].expn); - } - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; + fprintf(xmlout, "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s, bandno, tccp->stepsizes[bandno].expn); + } - default: /* J2K_CCP_QNTSTY_SEQNT */ - numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if(notes) { - fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); - fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); - fprintf(xmlout, "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n", s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) - break; /* Remove this once we have real numbands count */ - fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno); - if(raw) - fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); - if(derived) { - fprintf(xmlout,"%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[bandno].expn); - fprintf(xmlout,"%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[bandno].mant); - } - fprintf(xmlout, "%s </QuantizationValues>\n", s); - } - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; + fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); + break; + + default: /* J2K_CCP_QNTSTY_SEQNT */ /* scalar quantization expounded */ + /* This is what standard says, but should I believe it: len = 5 + 6*decomp; */ + numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ + /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ + fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); + if(notes) { + fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); + fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); + fprintf(xmlout, "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n", s); + } + for (bandno = 0; bandno < numbands; bandno++) { + if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) + break; /* Remove when we have real numbands */ + + fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno); + if(raw) + fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); + if(derived) { + fprintf(xmlout,"%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[bandno].expn); + fprintf(xmlout,"%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[bandno].mant); + } + fprintf(xmlout, "%s </QuantizationValues>\n", s); + } + fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); + break; } /* switch */ - fprintf(xmlout, "%s </SPqcc>\n", s); - fprintf(xmlout, "%s</QuantizationComponent>\n", s); - } -/* Alignments: " < < < < < To help maintain xml pretty-printing */ + fprintf(xmlout, "%s </SPqcd>\n", s); + fprintf(xmlout, "%s</QuantizationDefault>\n", s); + + /* Alignments: " < < < < < To help maintain xml pretty-printing */ +} + +/* ------------- */ + +void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) +{ + /* Uses global j2k_default_tcp */ + /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ + opj_tccp_t *tccp, *firstcomp_tccp; + int bandno, numbands; + int compno; + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } + + firstcomp_tccp = &(tcp->tccps[0]); + /* Internal data structure tccp defines separate defaults for each component, set from main */ + /* default, then selectively overwritten. */ + /* Compare j2k_read_qcx(...) */ + /* We don't really know which was the default, and which were not */ + /* Let's pretend that [0] is the default and all others are not */ + if(notes) { + fprintf(xmlout, "%s<!-- mj2_to_metadata implementation always reports component[0] as using default QCD, -->\n", s); + if(tcp == j2k_default_tcp) + fprintf(xmlout, "%s<!-- and any other component, with main-header quantization values different from [0], as QCC. -->\n", s); + else + fprintf(xmlout, "%s<!-- and any other component, with tile-part-header quantization values different from [0], as QCC. -->\n", s); + } + for (compno = 1; compno < numcomps; compno++) { /* spec says components are zero-based */ + tccp = &(tcp->tccps[compno]); + if(same_component_quantization(firstcomp_tccp, tccp)) + continue; + + /* Compare j2k_read_qcx */ + fprintf(xmlout, "%s<QuantizationComponent Marker=\"QCC\" Component=\"%d\">\n", s, compno); /* Required in main header, single occurrence */ + tccp = &j2k_default_tcp->tccps[0]; + /* Not retained or perhaps of interest: Lqcd It maybe can be calculated. */ + fprintf(xmlout, "%s <Sqcc>\n", s); /* 1 byte */ + if(notes) + fprintf(xmlout, "%s <!-- Quantization style for this component. -->\n", s); + if(raw) + fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->numgbits) << 5 | tccp->qntsty); + if(derived) + fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s, tccp->qntsty); + if(notes) { + fprintf(xmlout, "%s <!-- Quantization style (in Sqcc's low 5 bits) may be: -->\n", s); + fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcc size = 8 bits-->\n", s); + fprintf(xmlout, "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcc size = 16. -->\n", s); + fprintf(xmlout, "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcc size = 16. -->\n", s); + } + if(derived) + fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s, tccp->numgbits); + if(notes) + fprintf(xmlout, "%s <!-- 0-7 guard bits allowed (stored in Sqcc's high 3 bits) -->\n", s); + fprintf(xmlout, "%s </Sqcc>\n", s); + + /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ + /* So we'll just dump all internal values */ + fprintf(xmlout, "%s <SPqcc>\n", s); + switch(tccp->qntsty) { + case J2K_CCP_QNTSTY_NOQNT: + numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ + /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ + + /* Instead look for first zero exponent, quit there. Adequate? */ + fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s); + if(notes) { + fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); + fprintf(xmlout, "%s <!-- until an exponent with zero value is reached. -->\n", s); + fprintf(xmlout, "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s); + fprintf(xmlout, "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s); + } + for (bandno = 0; bandno < numbands; bandno++) { + if(tccp->stepsizes[bandno].expn == 0) + break; /* Remove this once we have real numbands */ + fprintf(xmlout, "%s <Exponent Subband=\"%d\">\n", s, bandno); + if(raw) + fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, tccp->stepsizes[bandno].expn << 3); + if(derived) + fprintf(xmlout,"%s <AsDecimal>%d</AsDecimal>\n", s, tccp->stepsizes[bandno].expn); + fprintf(xmlout, "%s </Exponent>\n", s); + } + fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s); + break; + case J2K_CCP_QNTSTY_SIQNT: + /* numbands = 1; */ + fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); + if(notes) + fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); + fprintf(xmlout, "%s <QuantizationValuesForSubband0>\n", s); + if(notes) + fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s); + if(raw) + fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant); + if(derived) { + fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[0].expn); + fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[0].mant); + } + fprintf(xmlout, "%s </QuantizationValuesForSubband0>\n", s); + if(notes) { + fprintf(xmlout, "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n", s); + fprintf(xmlout, "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n", s); + fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); + fprintf(xmlout, "%s <!-- until a subband with exponent of zero value is reached. -->\n", s); + } + + for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { + if(tccp->stepsizes[bandno].expn == 0) + break; + + fprintf(xmlout, "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s, bandno, tccp->stepsizes[bandno].expn); + } + fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); + break; + + default: /* J2K_CCP_QNTSTY_SEQNT */ + numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ + /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ + fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); + if(notes) { + fprintf(xmlout, "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", s); + fprintf(xmlout, "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", s); + fprintf(xmlout, "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n", s); + } + for (bandno = 0; bandno < numbands; bandno++) { + if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) + break; /* Remove this once we have real numbands count */ + fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno); + if(raw) + fprintf(xmlout,"%s <AsHex>0x%02x</AsHex>\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); + if(derived) { + fprintf(xmlout,"%s <Exponent>%d</Exponent>\n", s, tccp->stepsizes[bandno].expn); + fprintf(xmlout,"%s <Mantissa>%d</Mantissa>\n", s, tccp->stepsizes[bandno].mant); + } + fprintf(xmlout, "%s </QuantizationValues>\n", s); + } + fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); + break; + } /* switch */ + fprintf(xmlout, "%s </SPqcc>\n", s); + fprintf(xmlout, "%s</QuantizationComponent>\n", s); + } + /* Alignments: " < < < < < To help maintain xml pretty-printing */ } /* ------------- */ BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { - int bandno, numbands; + int bandno, numbands; - if(tccp1->qntsty != tccp2->qntsty) - return FALSE; - if(tccp1->numgbits != tccp2->numgbits) - return FALSE; + if(tccp1->qntsty != tccp2->qntsty) + return FALSE; + if(tccp1->numgbits != tccp2->numgbits) + return FALSE; - switch(tccp1->qntsty) { + switch(tccp1->qntsty) { case J2K_CCP_QNTSTY_NOQNT: - numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ - /* Instead look for first zero exponent, quit there. Adequate? */ - for (bandno = 0; bandno < numbands; bandno++) { - if(tccp1->stepsizes[bandno].expn == 0) - break; - if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn) - return FALSE; - } - break; + numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ + /* Instead look for first zero exponent, quit there. Adequate? */ + for (bandno = 0; bandno < numbands; bandno++) { + if(tccp1->stepsizes[bandno].expn == 0) + break; + if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn) + return FALSE; + } + break; case J2K_CCP_QNTSTY_SIQNT: - /* numbands = 1; */ - if(tccp1->stepsizes[0].expn != tccp2->stepsizes[0].expn || tccp1->stepsizes[0].mant != tccp2->stepsizes[0].mant) - return FALSE; - /* Don't need to check remainder, since they are calculated from [0] */ - break; + /* numbands = 1; */ + if(tccp1->stepsizes[0].expn != tccp2->stepsizes[0].expn || tccp1->stepsizes[0].mant != tccp2->stepsizes[0].mant) + return FALSE; + /* Don't need to check remainder, since they are calculated from [0] */ + break; default: /* J2K_CCP_QNTSTY_SEQNT */ - numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ - /* This comparison may cause us problems with trailing junk values. */ - for (bandno = 0; bandno < numbands; bandno++) { - if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn || tccp1->stepsizes[bandno].mant != tccp2->stepsizes[bandno].mant); - return FALSE; - } - break; + numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ + /* This comparison may cause us problems with trailing junk values. */ + for (bandno = 0; bandno < numbands; bandno++) { + if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn || tccp1->stepsizes[bandno].mant != tccp2->stepsizes[bandno].mant); + return FALSE; + } + break; } /* switch */ - return TRUE; + return TRUE; } /* ------------- */ void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps) { - int compno, SPrgn; - /* MJ2 files can have regions of interest if hybridized with JPX Part II */ - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - - for(compno = 0; compno < numcomps; compno++) { - SPrgn = tcp->tccps[compno].roishift; /* 1 byte; SPrgn */ - if(SPrgn == 0) - continue; /* Yet another kludge */ - - fprintf(xmlout, "%s<RegionOfInterest Marker=\"RGN\">\n", s); /* Optional in main header, at most 1 per component */ - if(notes) - fprintf(xmlout, "%s<!-- See Crgn below for zero-based component number. -->\n", s); - /* Not retained or of interest: Lrgd */ - fprintf(xmlout, "%s <Srgn>0</Srgn>\n", s); /* 1 byte */ - if(notes) - fprintf(xmlout, "%s <!-- Srgn is ROI style. Only style=0 defined: Implicit ROI (max. shift) -->\n", s); - fprintf(xmlout, "%s <Crgn>%d</Crgn>\n", s, compno); /* 1 or 2 bytes */ - fprintf(xmlout, "%s <SPrgn>%d</SPrgn>\n", s, SPrgn); /* 1 byte */ - if(notes) - fprintf(xmlout, "%s <!-- SPrgn is implicit ROI shift, i.e., binary shifting of ROI coefficients above background. -->\n", s); - fprintf(xmlout, "</RegionOfInterest\n", s); /* Optional in main header, at most 1 per component */ - } + int compno, SPrgn; + /* MJ2 files can have regions of interest if hybridized with JPX Part II */ + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } + + for(compno = 0; compno < numcomps; compno++) { + SPrgn = tcp->tccps[compno].roishift; /* 1 byte; SPrgn */ + if(SPrgn == 0) + continue; /* Yet another kludge */ + + fprintf(xmlout, "%s<RegionOfInterest Marker=\"RGN\">\n", s); /* Optional in main header, at most 1 per component */ + if(notes) + fprintf(xmlout, "%s<!-- See Crgn below for zero-based component number. -->\n", s); + /* Not retained or of interest: Lrgd */ + fprintf(xmlout, "%s <Srgn>0</Srgn>\n", s); /* 1 byte */ + if(notes) + fprintf(xmlout, "%s <!-- Srgn is ROI style. Only style=0 defined: Implicit ROI (max. shift) -->\n", s); + fprintf(xmlout, "%s <Crgn>%d</Crgn>\n", s, compno); /* 1 or 2 bytes */ + fprintf(xmlout, "%s <SPrgn>%d</SPrgn>\n", s, SPrgn); /* 1 byte */ + if(notes) + fprintf(xmlout, "%s <!-- SPrgn is implicit ROI shift, i.e., binary shifting of ROI coefficients above background. -->\n", s); + fprintf(xmlout, "</RegionOfInterest\n", s); /* Optional in main header, at most 1 per component */ + } } /* ------------- */ -void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp) { /* Progression Order Change */ - /* Compare j2k_read_poc() */ - int i; - opj_poc_t *poc; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - - if(tcp->POC != 1) - return; /* Not present */ - - fprintf(xmlout, "%s<ProgressionOrderChange Marker=\"POC\">\n", s); /* Optional in main header, at most 1 per component */ - /* j2k_read_poc seems to allow accumulation of default pocs from multiple POC segments, but does - the spec really allow that? */ - /* 2 bytes, not retained; Lpoc */ - /* I probably didn't get this dump precisely right. */ - for (i = 0; i < tcp->numpocs; i++) { - poc = &tcp->pocs[i]; - fprintf(xmlout, "%s <Progression Num=\"%d\">\n", s, i+1); - fprintf(xmlout, "%S <RSpoc>%d</RSpoc>\n", s, poc->resno0); /* 1 byte, RSpoc_i */ - if(notes) - fprintf(xmlout,"%s <!-- Resolution level index (inclusive) for progression start. Range: 0 to 33 -->\n", s); - fprintf(xmlout, "%s <CSpoc>%d</CSpoc>\n", s, poc->compno0);/* j2k_img->numcomps <= 256 ? 1 byte : 2 bytes; CSpoc_i */ - if(notes) - fprintf(xmlout,"%s <!-- Component index (inclusive) for progression start. -->\n", s); - fprintf(xmlout, "%s <LYEpoc>%d</LYEpoc>\n", s, poc->layno1); /* int_min(cio_read(2), tcp->numlayers); /* 2 bytes; LYEpoc_i */ - if(notes) - fprintf(xmlout,"%s <!-- Layer index (exclusive) for progression end. -->\n", s); - fprintf(xmlout, "%s <REpoc>%d</REpoc>\n", s, poc->resno1); /*int_min(cio_read(1), tccp->numresolutions); /* REpoc_i */ - if(notes) - fprintf(xmlout,"%s <!-- Resolution level index (exclusive) for progression end. Range: RSpoc to 33 -->\n", s); - fprintf(xmlout, "%s <CEpoc>%d</CEpoc>\n", s, poc->compno1); /* int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps); /* CEpoc_i */ - if(notes) - fprintf(xmlout,"%s <!-- Component index (exclusive) for progression end. Minimum: CSpoc -->\n", s); - fprintf(xmlout, "%s <Ppoc>%d</Ppoc>\n", s, poc->prg); /* 1 byte Ppoc_i */ - if(notes) { - fprintf(xmlout,"%s <!-- Defined Progression Order Values are: -->\n", s); - fprintf(xmlout,"%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n", s); - fprintf(xmlout,"%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n", s); - } - fprintf(xmlout, "%s </Progression>\n", s); - } - fprintf(xmlout, "%s</ProgressionOrderChange\n", s); +void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp) /* Progression Order Change */ +{ + /* Compare j2k_read_poc() */ + int i; + opj_poc_t *poc; + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } + + if(tcp->POC != 1) + return; /* Not present */ + + fprintf(xmlout, "%s<ProgressionOrderChange Marker=\"POC\">\n", s); /* Optional in main header, at most 1 per component */ + /* j2k_read_poc seems to allow accumulation of default pocs from multiple POC segments, but does + the spec really allow that? */ + /* 2 bytes, not retained; Lpoc */ + /* I probably didn't get this dump precisely right. */ + for (i = 0; i < tcp->numpocs; i++) { + poc = &tcp->pocs[i]; + fprintf(xmlout, "%s <Progression Num=\"%d\">\n", s, i+1); + fprintf(xmlout, "%S <RSpoc>%d</RSpoc>\n", s, poc->resno0); /* 1 byte, RSpoc_i */ + if(notes) + fprintf(xmlout,"%s <!-- Resolution level index (inclusive) for progression start. Range: 0 to 33 -->\n", s); + fprintf(xmlout, "%s <CSpoc>%d</CSpoc>\n", s, poc->compno0);/* j2k_img->numcomps <= 256 ? 1 byte : 2 bytes; CSpoc_i */ + if(notes) + fprintf(xmlout,"%s <!-- Component index (inclusive) for progression start. -->\n", s); + fprintf(xmlout, "%s <LYEpoc>%d</LYEpoc>\n", s, poc->layno1); /* int_min(cio_read(2), tcp->numlayers); /* 2 bytes; LYEpoc_i */ + if(notes) + fprintf(xmlout,"%s <!-- Layer index (exclusive) for progression end. -->\n", s); + fprintf(xmlout, "%s <REpoc>%d</REpoc>\n", s, poc->resno1); /*int_min(cio_read(1), tccp->numresolutions); /* REpoc_i */ + if(notes) + fprintf(xmlout,"%s <!-- Resolution level index (exclusive) for progression end. Range: RSpoc to 33 -->\n", s); + fprintf(xmlout, "%s <CEpoc>%d</CEpoc>\n", s, poc->compno1); /* int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps); /* CEpoc_i */ + if(notes) + fprintf(xmlout,"%s <!-- Component index (exclusive) for progression end. Minimum: CSpoc -->\n", s); + fprintf(xmlout, "%s <Ppoc>%d</Ppoc>\n", s, poc->prg); /* 1 byte Ppoc_i */ + if(notes) { + fprintf(xmlout,"%s <!-- Defined Progression Order Values are: -->\n", s); + fprintf(xmlout,"%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n", s); + fprintf(xmlout,"%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n", s); + } + fprintf(xmlout, "%s </Progression>\n", s); + } + fprintf(xmlout, "%s</ProgressionOrderChange\n", s); } /* ------------- */ @@ -1739,135 +1740,143 @@ void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp) { /* Progression Order Chan /* Suppress PPM and PPT since we're not showing data from the third option, namely within the codestream, and that's evidently what frames_to_mj2 uses. And a hex dump isn't so useful anyway */ -void xml_out_frame_ppm(FILE *xmlout, opj_cp_t *cp) { /* For main header, not tile-part (which uses PPT instead). */ -/* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ -/* Use of PPM and PPT are mutually exclusive. */ -/* Compare j2k_read_ppm() */ - int j; - - if(cp->ppm != 1) - return; /* Not present */ -/* Main header uses indent of 10 spaces */ - fprintf(xmlout, " <PackedPacketHeadersMainHeader Marker=\"PPM\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */ - /* 2 bytes Lppm not saved */ - if(notes) { - fprintf(xmlout, " <!-- If there are multiple PPM marker segments in the main header, -->\n"); - fprintf(xmlout, " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPM header. -->\n"); - fprintf(xmlout, " <!-- The implementation can't currently segregate by tile-part. -->\n"); - fprintf(xmlout, " <!-- TO DO? further map the packet headers to xml. -->\n"); - } - - /* 1 byte, not retained ; Zppm is sequence # of this PPM header */ - /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppm_previous: Nppm */ - /* Use j symbol for index instead of i, to make comparable with j2k_read_ppm */ - /* Not real clear whether to use ppm->store or ppm_len as upper bound */ - fprintf(xmlout, " <PackedData>\n"); - xml_out_dump_hex(xmlout, cp->ppm_data, cp->ppm_len); - /* Dump packet headers 1 byte at a time: lppm[i][j] */ - fprintf(xmlout, " </PackedData>\n"); - fprintf(xmlout, " </PackedPacketHeadersMainHeader>\n"); /* Optional in main header, but if not, must be in PPT or codestream */ +void xml_out_frame_ppm(FILE *xmlout, opj_cp_t *cp) /* For main header, not tile-part (which uses PPT instead). */ +{ + /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ + /* Use of PPM and PPT are mutually exclusive. */ + /* Compare j2k_read_ppm() */ + int j; + + if(cp->ppm != 1) + return; /* Not present */ + /* Main header uses indent of 10 spaces */ + fprintf(xmlout, " <PackedPacketHeadersMainHeader Marker=\"PPM\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */ + /* 2 bytes Lppm not saved */ + if(notes) { + fprintf(xmlout, " <!-- If there are multiple PPM marker segments in the main header, -->\n"); + fprintf(xmlout, " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPM header. -->\n"); + fprintf(xmlout, " <!-- The implementation can't currently segregate by tile-part. -->\n"); + fprintf(xmlout, " <!-- TO DO? further map the packet headers to xml. -->\n"); + } + + /* 1 byte, not retained ; Zppm is sequence # of this PPM header */ + /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppm_previous: Nppm */ + /* Use j symbol for index instead of i, to make comparable with j2k_read_ppm */ + /* Not real clear whether to use ppm->store or ppm_len as upper bound */ + fprintf(xmlout, " <PackedData>\n"); + xml_out_dump_hex(xmlout, cp->ppm_data, cp->ppm_len); + /* Dump packet headers 1 byte at a time: lppm[i][j] */ + fprintf(xmlout, " </PackedData>\n"); + fprintf(xmlout, " </PackedPacketHeadersMainHeader>\n"); /* Optional in main header, but if not, must be in PPT or codestream */ } /* ------------- */ -void xml_out_frame_ppt(FILE *xmlout, opj_tcp_t *tcp) { /* For tile-part header, not main (which uses PPM instead). */ -/* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ -/* Use of PPM and PPT are mutually exclusive. */ -/* Compare j2k_read_ppt() */ - int j; - - if(tcp->ppt != 1) - return; /* Not present */ - - /* Tile-part indents are 12 spaces */ - fprintf(xmlout, " <PackedPacketHeadersTilePartHeader Marker=\"PPT\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */ - /* 2 bytes Lppm not saved */ - if(notes) { - fprintf(xmlout, " <!-- If there are multiple PPT marker segments in the tile-part header, -->\n"); - fprintf(xmlout, " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPT header. -->\n"); - fprintf(xmlout, " <!-- The implementation can't currently segregate by tile-part. -->\n"); - fprintf(xmlout, " <!-- TO DO? further map the packet headers to xml. -->\n"); - } - - /* 1 byte, not retained ; Zppt is sequence # of this PPT header */ - /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppt_previous: Nppt */ - /* Use j symbol for index instead of i, to make comparable with j2k_read_ppt */ - /* Not real clear whether to use ppt->store or ppt_len as upper bound */ - fprintf(xmlout, " <PackedData>\n"); - xml_out_dump_hex(xmlout, tcp->ppt_data, tcp->ppt_len); - /* Dump packet headers 1 byte at a time: lppt[i][j] */ - fprintf(xmlout, " </PackedData>\n"); - fprintf(xmlout, " </PackedPacketHeadersTileHeader>\n"); /* Optional in tile-part header, but if not, must be in PPM or codestream */ +void xml_out_frame_ppt(FILE *xmlout, opj_tcp_t *tcp) /* For tile-part header, not main (which uses PPM instead). */ +{ + /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ + /* Use of PPM and PPT are mutually exclusive. */ + /* Compare j2k_read_ppt() */ + int j; + + if(tcp->ppt != 1) + return; /* Not present */ + + /* Tile-part indents are 12 spaces */ + fprintf(xmlout, " <PackedPacketHeadersTilePartHeader Marker=\"PPT\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */ + /* 2 bytes Lppm not saved */ + if(notes) { + fprintf(xmlout, " <!-- If there are multiple PPT marker segments in the tile-part header, -->\n"); + fprintf(xmlout, " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPT header. -->\n"); + fprintf(xmlout, " <!-- The implementation can't currently segregate by tile-part. -->\n"); + fprintf(xmlout, " <!-- TO DO? further map the packet headers to xml. -->\n"); + } + + /* 1 byte, not retained ; Zppt is sequence # of this PPT header */ + /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppt_previous: Nppt */ + /* Use j symbol for index instead of i, to make comparable with j2k_read_ppt */ + /* Not real clear whether to use ppt->store or ppt_len as upper bound */ + fprintf(xmlout, " <PackedData>\n"); + xml_out_dump_hex(xmlout, tcp->ppt_data, tcp->ppt_len); + /* Dump packet headers 1 byte at a time: lppt[i][j] */ + fprintf(xmlout, " </PackedData>\n"); + fprintf(xmlout, " </PackedPacketHeadersTileHeader>\n"); /* Optional in tile-part header, but if not, must be in PPM or codestream */ } #endif SUPPRESS_FOR_NOW /* ------------- */ -void xml_out_frame_tlm(FILE* xmlout) { /* opt, main header only. May be multiple. */ -/* Compare j2k_read_tlm()... which doesn't retain anything! */ -/* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ -/* Main header indents are 10 spaces */ +void xml_out_frame_tlm(FILE* xmlout) /* opt, main header only. May be multiple. */ +{ + /* Compare j2k_read_tlm()... which doesn't retain anything! */ + /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ + /* Main header indents are 10 spaces */ } /* ------------- */ -void xml_out_frame_plm(FILE* xmlout) { /* opt, main header only; can be used in conjunction with tile-part's PLT */ -/* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ - /* Compare j2k_read_plm()... which doesn't retain anything! */ -/* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ -/* Main header indents are 10 spaces */ +void xml_out_frame_plm(FILE* xmlout) /* opt, main header only; can be used in conjunction with tile-part's PLT */ +{ + /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ + /* Compare j2k_read_plm()... which doesn't retain anything! */ + /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ + /* Main header indents are 10 spaces */ } /* ------------- */ -void xml_out_frame_plt(FILE* xmlout, opj_tcp_t *tcp) { /* opt, tile-part headers only; can be used in conjunction with main header's PLM */ -/* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ - /* Compare j2k_read_plt()... which doesn't retain anything! */ -/* Tile-part header indents are 12 spaces */ +void xml_out_frame_plt(FILE* xmlout, opj_tcp_t *tcp) /* opt, tile-part headers only; can be used in conjunction with main header's PLM */ +{ + /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ + /* Compare j2k_read_plt()... which doesn't retain anything! */ + /* Tile-part header indents are 12 spaces */ } /* ------------- */ -void xml_out_frame_crg(FILE* xmlout) { /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt, main header only; */ -/* Compare j2k_read_crg()... which doesn't retain anything! */ -/* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ +void xml_out_frame_crg(FILE* xmlout) +{ + /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt, main header only; */ + /* Compare j2k_read_crg()... which doesn't retain anything! */ + /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ #ifdef NOTYET - THIS PSEUDOCODE IMAGINES THESE EXIST: j2k_default_tcp->crg, j2k_default_tcp->crg_i, j2k_default_tcp->crg_xcrg*, j2k_default_tcp->crg_ycrg* - (POSSIBLY DON'T NEED crg_i, CAN GET NUMBER OR COMPONENTS FROM ELSEWHERE) - if(j2k_default_tcp->crg != 1 || j2k_default_tcp->crg_i == 0) - return; /* Not present */ - -/* Main header indents are 10 spaces */ - fprintf(xmlout, " <ComponentRegistration Marker=\"RG\" Count=\"%d\">\n", j2k_default_tcp->crg_i); - if(notes) { - fprintf(xmlout, " <!-- Fine tuning of registration of components with respect to each other, -->\n"); - fprintf(xmlout, " <!-- not required but potentially helpful for decoder. -->\n"); - fprintf(xmlout, " <!-- These supplementary fractional offsets are in units of 1/65536 of the horizontal -->\n"); - fprintf(xmlout, " <!-- or vertical separation (e.g., XRsiz[i] or YRsiz[i] for component i). -->\n"); - } - /* This isn't the most compact form of table, but is OK when number of components is small, as is likely. */ - for (i = 0; i < j2k_default_tcp->crg_i; i++) { +THIS PSEUDOCODE IMAGINES THESE EXIST: + j2k_default_tcp->crg, j2k_default_tcp->crg_i, j2k_default_tcp->crg_xcrg*, j2k_default_tcp->crg_ycrg* + (POSSIBLY DON'T NEED crg_i, CAN GET NUMBER OR COMPONENTS FROM ELSEWHERE) + if(j2k_default_tcp->crg != 1 || j2k_default_tcp->crg_i == 0) + return; /* Not present */ + + /* Main header indents are 10 spaces */ + fprintf(xmlout, " <ComponentRegistration Marker=\"RG\" Count=\"%d\">\n", j2k_default_tcp->crg_i); + if(notes) { + fprintf(xmlout, " <!-- Fine tuning of registration of components with respect to each other, -->\n"); + fprintf(xmlout, " <!-- not required but potentially helpful for decoder. -->\n"); + fprintf(xmlout, " <!-- These supplementary fractional offsets are in units of 1/65536 of the horizontal -->\n"); + fprintf(xmlout, " <!-- or vertical separation (e.g., XRsiz[i] or YRsiz[i] for component i). -->\n"); + } + /* This isn't the most compact form of table, but is OK when number of components is small, as is likely. */ + for (i = 0; i < j2k_default_tcp->crg_i; i++) { fprintf(xmlout, " <Component Num=\"%d\">\n", i+1); - fprintf(xmlout, " <Xcrg>\n"); - if(raw) - fprintf(xmlout," <AsNumerator>%d</AsNumerator>\n", j2k_default_tcp->crg_xcrg[i]); - if(derived) { - /* Calculate n * 100%/65536; 4 digits after decimal point is sufficiently accurate */ - fprintf(xmlout," <AsPercentage>%.4f</AsPercentage>\n", ((double)j2k_default_tcp->crg_xcrg[i])/655.36); - /* We could do another calculation that include XRsiz[i]; maybe later. */ - } - fprintf(xmlout, " </Xcrg>\n"); - fprintf(xmlout, " <Ycrg>\n"); - if(raw) - fprintf(xmlout," <AsNumerator>%d</AsNumerator>\n", j2k_default_tcp->crg_ycrg[i]); - if(derived) { - fprintf(xmlout," <AsPercentage>%f</AsPercentage>\n", ((double)j2k_default_tcp->crg_ycrg[i])/655.36); - } - fprintf(xmlout, " </Ycrg>\n"); - fprintf(xmlout, " </Component>\n"); - } - - fprintf(xmlout, " </ComponentRegistration>\n"); + fprintf(xmlout, " <Xcrg>\n"); + if(raw) + fprintf(xmlout," <AsNumerator>%d</AsNumerator>\n", j2k_default_tcp->crg_xcrg[i]); + if(derived) { + /* Calculate n * 100%/65536; 4 digits after decimal point is sufficiently accurate */ + fprintf(xmlout," <AsPercentage>%.4f</AsPercentage>\n", ((double)j2k_default_tcp->crg_xcrg[i])/655.36); + /* We could do another calculation that include XRsiz[i]; maybe later. */ + } + fprintf(xmlout, " </Xcrg>\n"); + fprintf(xmlout, " <Ycrg>\n"); + if(raw) + fprintf(xmlout," <AsNumerator>%d</AsNumerator>\n", j2k_default_tcp->crg_ycrg[i]); + if(derived) { + fprintf(xmlout," <AsPercentage>%f</AsPercentage>\n", ((double)j2k_default_tcp->crg_ycrg[i])/655.36); + } + fprintf(xmlout, " </Ycrg>\n"); + fprintf(xmlout, " </Component>\n"); + } + + fprintf(xmlout, " </ComponentRegistration>\n"); #endif } @@ -1875,307 +1884,313 @@ void xml_out_frame_crg(FILE* xmlout) { /* NO-OP. CRG NOT SAVED IN DATA STRUCTUR /* ------------- */ /* Regrettably from a metadata point of view, j2k_read_com() skips over any comments in main header or tile-part-header */ -void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp) { /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */ -/* Compare j2k_read_com()... which doesn't retain anything! */ +void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp) +{ + /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */ + /* Compare j2k_read_com()... which doesn't retain anything! */ #ifdef NOTYET - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if(tcp == &j2k_default_tcp) { - s++;s++; /* shorten s to 10 spaces if main */ - } - THIS PSEUDOCODE IMAGINES THESE EXIST: tcp->com, tcp->com_len, tcp->com_data array - if(tcp->com != 1) - return; /* Not present */ - - fprintf(xmlout, "%s<Comment Marker=\"COM\">\n", s); /* Optional in main or tile-part header */ - xml_out_dump_hex_and_ascii(tcp->com_data, tcp->com_len, s); - fprintf(xmlout, "%s</Comment>\n", s); + char spaces[13] = " "; /* 12 spaces if tilepart*/ + char* s = spaces; + if(tcp == &j2k_default_tcp) { + s++; + s++; /* shorten s to 10 spaces if main */ + } +THIS PSEUDOCODE IMAGINES THESE EXIST: + tcp->com, tcp->com_len, tcp->com_data array + if(tcp->com != 1) + return; /* Not present */ + + fprintf(xmlout, "%s<Comment Marker=\"COM\">\n", s); /* Optional in main or tile-part header */ + xml_out_dump_hex_and_ascii(tcp->com_data, tcp->com_len, s); + fprintf(xmlout, "%s</Comment>\n", s); #endif } -void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s) { - /* s is a string of spaces for indent */ - int i; - - /* This is called when raw is true, or there is no appropriate derived form */ - fprintf(xmlout, "%s<AsHex>\n", s); - fprintf(xmlout, "%s ", s); /* Inadequate for pretty printing */ - for (i = 0; i < data_len; i++) { /* Dump packet headers */ - fprintf(xmlout, "%02x", data[i]); - } - fprintf(xmlout, "%s</AsHex>\n", s); +void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s) +{ + /* s is a string of spaces for indent */ + int i; + + /* This is called when raw is true, or there is no appropriate derived form */ + fprintf(xmlout, "%s<AsHex>\n", s); + fprintf(xmlout, "%s ", s); /* Inadequate for pretty printing */ + for (i = 0; i < data_len; i++) { /* Dump packet headers */ + fprintf(xmlout, "%02x", data[i]); + } + fprintf(xmlout, "%s</AsHex>\n", s); } /* Define this as an even number: */ #define BYTES_PER_DUMP_LINE 40 /* Current total width for Hex and ASCII is : 11 spaces lead + (3 * BPDL) + 2 spaces + BPDL */ -void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s) { - /* s is a string of spaces for indent */ - int i,j; - - if(raw) - xml_out_dump_hex(xmlout, data, data_len, s); - - if(derived) { - fprintf(xmlout, "%s<AsHexAndASCII>\n", s); - for (i = 0; i < data_len; ) { - fprintf(xmlout,"%s ", s); /* Additional leading space added in loop */ - /* First column: hex */ - for (j = 0; j < BYTES_PER_DUMP_LINE; j++) /* Dump bytes */ - fprintf(xmlout," %02x", data[i+j]); - /* Space between columns... */ fprintf(xmlout, " "); - /* Second column: ASCII */ - for (j = 0; j < BYTES_PER_DUMP_LINE; j++, i++) { - if(isprint((int)data[i]) && i < data_len) - fprintf(xmlout,"%c", data[i]); - else - fprintf(xmlout," "); - } - /* If we also wanted to output UCS-2 Unicode as a third column, then entire document - must use fwprintf. Forget about it for now. As it stands, if data is UCS-2 format but still - the ASCII set, then we'll be able to read every other byte as ASCII in column 2. If - data is UTF-8 format but still ASCII, then we'll be able to read every byte as ASCII - in column 2. */ - } - fprintf(xmlout, "%s</AsHexAndASCII>\n", s); - } +void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s) +{ + /* s is a string of spaces for indent */ + int i,j; + + if(raw) + xml_out_dump_hex(xmlout, data, data_len, s); + + if(derived) { + fprintf(xmlout, "%s<AsHexAndASCII>\n", s); + for (i = 0; i < data_len; ) { + fprintf(xmlout,"%s ", s); /* Additional leading space added in loop */ + /* First column: hex */ + for (j = 0; j < BYTES_PER_DUMP_LINE; j++) /* Dump bytes */ + fprintf(xmlout," %02x", data[i+j]); + /* Space between columns... */ fprintf(xmlout, " "); + /* Second column: ASCII */ + for (j = 0; j < BYTES_PER_DUMP_LINE; j++, i++) { + if(isprint((int)data[i]) && i < data_len) + fprintf(xmlout,"%c", data[i]); + else + fprintf(xmlout," "); + } + /* If we also wanted to output UCS-2 Unicode as a third column, then entire document + must use fwprintf. Forget about it for now. As it stands, if data is UCS-2 format but still + the ASCII set, then we'll be able to read every other byte as ASCII in column 2. If + data is UTF-8 format but still ASCII, then we'll be able to read every byte as ASCII + in column 2. */ + } + fprintf(xmlout, "%s</AsHexAndASCII>\n", s); + } } /* ------------- */ -void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct) { /* JP2 Header */ -/* Compare jp2_read_jp2h(opj_jp2_t * jp2_struct) */ - int i; - - fprintf(xmlout, " <JP2Header BoxType=\"jp2h\">\n"); - -/* Compare jp2_read_ihdr(jp2_struct)) */ - fprintf(xmlout, " <ImageHeader BoxType=\"ihdr\">\n"); - fprintf(xmlout, " <HEIGHT>%d</HEIGHT>\n", jp2_struct->h); /* 4 bytes */ - fprintf(xmlout, " <WIDTH>%d</WIDTH>\n", jp2_struct->w); /* 4 bytes */ - if(notes) - fprintf(xmlout, " <!-- HEIGHT here, if 2 fields per image, is of total deinterlaced height. -->\n"); - fprintf(xmlout, " <NC>%d</NC>\n", jp2_struct->numcomps); /* 2 bytes */ - if(notes) - fprintf(xmlout, " <!-- NC is number of components -->\n"); /* 2 bytes */ - fprintf(xmlout, " <BPC>\n"); /* 1 byte */ - if(jp2_struct->bpc == 255) { - fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", jp2_struct->bpc); /* 1 byte */ +void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct) /* JP2 Header */ +{ + /* Compare jp2_read_jp2h(opj_jp2_t * jp2_struct) */ + int i; + + fprintf(xmlout, " <JP2Header BoxType=\"jp2h\">\n"); + + /* Compare jp2_read_ihdr(jp2_struct)) */ + fprintf(xmlout, " <ImageHeader BoxType=\"ihdr\">\n"); + fprintf(xmlout, " <HEIGHT>%d</HEIGHT>\n", jp2_struct->h); /* 4 bytes */ + fprintf(xmlout, " <WIDTH>%d</WIDTH>\n", jp2_struct->w); /* 4 bytes */ if(notes) - fprintf(xmlout, " <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n"); - } else { /* Not 0xff */ - if(raw) { - fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", jp2_struct->bpc); /* 1 byte */ - if(notes) - fprintf(xmlout," <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n"); - } - if(derived) { - fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", jp2_struct->bpc & 0x7f); - fprintf(xmlout, " <Signed>%d</Signed>\n", jp2_struct->bpc >> 7); - } - } - fprintf(xmlout, " </BPC>\n"); - fprintf(xmlout, " <C>%d</C>\n", jp2_struct->C); /* 1 byte */ - if(notes) - fprintf(xmlout, " <!-- C is compression type. Only \"7\" is allowed to date. -->\n"); /* 2 bytes */ - fprintf(xmlout, " <UnkC>%d</UnkC>\n", jp2_struct->UnkC); /* 1 byte */ - if(notes) - fprintf(xmlout, " <!-- Colourspace Unknown. 1 = unknown, 0 = known (e.g., colourspace spec is accurate) -->\n"); /* 1 byte */ - fprintf(xmlout, " <IPR>%d</IPR>\n", jp2_struct->IPR); /* 1 byte */ - if(notes) - fprintf(xmlout, " <!-- IPR is 1 if frame contains an Intellectual Property box; 0 otherwise. -->\n"); /* 2 bytes */ - fprintf(xmlout, " </ImageHeader>\n"); - - if (jp2_struct->bpc == 255) - { - fprintf(xmlout, " <BitsPerComponent BoxType=\"bpcc\">\n"); + fprintf(xmlout, " <!-- HEIGHT here, if 2 fields per image, is of total deinterlaced height. -->\n"); + fprintf(xmlout, " <NC>%d</NC>\n", jp2_struct->numcomps); /* 2 bytes */ if(notes) - fprintf(xmlout, " <!-- Pixel depth (range 1 to 38) is low 7 bits of hex value + 1 -->\n"); - /* Bits per pixel varies with components */ - /* Compare jp2_read_bpcc(jp2_struct) */ - for (i = 0; i < (int)jp2_struct->numcomps; i++) { - if(raw) - fprintf(xmlout," <AsHex>0x%02x</AsHex>\n", jp2_struct->comps[i].bpcc); /* 1 byte */ - if(derived) { - fprintf(xmlout," <BitsPerPixel>%d</BitsPerPixel>\n", (jp2_struct->comps[i].bpcc & 0x7f)+1); - fprintf(xmlout," <Signed>%d</Signed>\n", jp2_struct->comps[i].bpcc >> 7); - } - } - fprintf(xmlout, " </BitsPerComponent>\n"); - } - - /* Compare jp2_read_colr(jp2_struct) */ - fprintf(xmlout, " <ColourSpecification BoxType=\"colr\">\n"); - fprintf(xmlout, " <METH>%d</METH>\n", jp2_struct->meth); /* 1 byte */ - if(notes) { - fprintf(xmlout, " <!-- Valid values of specification method so far: -->\n"); - fprintf(xmlout, " <!-- 1 = Enumerated colourspace, in EnumCS field -->\n"); - fprintf(xmlout, " <!-- 2 = Restricted ICC Profile, in PROFILE field -->\n"); - } - fprintf(xmlout, " <PREC>%d</PREC>\n", jp2_struct->precedence); /* 1 byte */ - if(notes) - fprintf(xmlout, " <!-- 0 is only valid value of precedence so far. -->\n"); - fprintf(xmlout, " <APPROX>%d</APPROX>\n", jp2_struct->approx); /* 1 byte */ - if(notes) - fprintf(xmlout, " <!-- 0 is only valid value of colourspace approximation so far. -->\n"); - - if (jp2_struct->meth == 1) { - fprintf(xmlout, " <EnumCS>%d</EnumCS>\n", jp2_struct->enumcs); /* 4 bytes */ - if(notes) { - fprintf(xmlout, " <!-- Valid values of enumerated MJ2 colourspace so far: -->\n"); - fprintf(xmlout, " <!-- 16: sRGB as defined by IEC 61966-2-1. -->\n"); - fprintf(xmlout, " <!-- 17: greyscale (related to sRGB). -->\n"); - fprintf(xmlout, " <!-- 18: sRGB YCC (from JPEG 2000 Part II). -->\n"); - fprintf(xmlout, " <!-- (Additional JPX values are defined in Part II). -->\n"); - } - } - else + fprintf(xmlout, " <!-- NC is number of components -->\n"); /* 2 bytes */ + fprintf(xmlout, " <BPC>\n"); /* 1 byte */ + if(jp2_struct->bpc == 255) { + fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", jp2_struct->bpc); /* 1 byte */ + if(notes) + fprintf(xmlout, " <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n"); + } else { /* Not 0xff */ + if(raw) { + fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", jp2_struct->bpc); /* 1 byte */ + if(notes) + fprintf(xmlout," <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n"); + } + if(derived) { + fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", jp2_struct->bpc & 0x7f); + fprintf(xmlout, " <Signed>%d</Signed>\n", jp2_struct->bpc >> 7); + } + } + fprintf(xmlout, " </BPC>\n"); + fprintf(xmlout, " <C>%d</C>\n", jp2_struct->C); /* 1 byte */ + if(notes) + fprintf(xmlout, " <!-- C is compression type. Only \"7\" is allowed to date. -->\n"); /* 2 bytes */ + fprintf(xmlout, " <UnkC>%d</UnkC>\n", jp2_struct->UnkC); /* 1 byte */ + if(notes) + fprintf(xmlout, " <!-- Colourspace Unknown. 1 = unknown, 0 = known (e.g., colourspace spec is accurate) -->\n"); /* 1 byte */ + fprintf(xmlout, " <IPR>%d</IPR>\n", jp2_struct->IPR); /* 1 byte */ + if(notes) + fprintf(xmlout, " <!-- IPR is 1 if frame contains an Intellectual Property box; 0 otherwise. -->\n"); /* 2 bytes */ + fprintf(xmlout, " </ImageHeader>\n"); + + if (jp2_struct->bpc == 255) { + fprintf(xmlout, " <BitsPerComponent BoxType=\"bpcc\">\n"); + if(notes) + fprintf(xmlout, " <!-- Pixel depth (range 1 to 38) is low 7 bits of hex value + 1 -->\n"); + /* Bits per pixel varies with components */ + /* Compare jp2_read_bpcc(jp2_struct) */ + for (i = 0; i < (int)jp2_struct->numcomps; i++) { + if(raw) + fprintf(xmlout," <AsHex>0x%02x</AsHex>\n", jp2_struct->comps[i].bpcc); /* 1 byte */ + if(derived) { + fprintf(xmlout," <BitsPerPixel>%d</BitsPerPixel>\n", (jp2_struct->comps[i].bpcc & 0x7f)+1); + fprintf(xmlout," <Signed>%d</Signed>\n", jp2_struct->comps[i].bpcc >> 7); + } + } + fprintf(xmlout, " </BitsPerComponent>\n"); + } + + /* Compare jp2_read_colr(jp2_struct) */ + fprintf(xmlout, " <ColourSpecification BoxType=\"colr\">\n"); + fprintf(xmlout, " <METH>%d</METH>\n", jp2_struct->meth); /* 1 byte */ + if(notes) { + fprintf(xmlout, " <!-- Valid values of specification method so far: -->\n"); + fprintf(xmlout, " <!-- 1 = Enumerated colourspace, in EnumCS field -->\n"); + fprintf(xmlout, " <!-- 2 = Restricted ICC Profile, in PROFILE field -->\n"); + } + fprintf(xmlout, " <PREC>%d</PREC>\n", jp2_struct->precedence); /* 1 byte */ if(notes) - fprintf(xmlout, " <!-- PROFILE is not handled by current OpenJPEG implementation. -->\n"); + fprintf(xmlout, " <!-- 0 is only valid value of precedence so far. -->\n"); + fprintf(xmlout, " <APPROX>%d</APPROX>\n", jp2_struct->approx); /* 1 byte */ + if(notes) + fprintf(xmlout, " <!-- 0 is only valid value of colourspace approximation so far. -->\n"); + + if (jp2_struct->meth == 1) { + fprintf(xmlout, " <EnumCS>%d</EnumCS>\n", jp2_struct->enumcs); /* 4 bytes */ + if(notes) { + fprintf(xmlout, " <!-- Valid values of enumerated MJ2 colourspace so far: -->\n"); + fprintf(xmlout, " <!-- 16: sRGB as defined by IEC 61966-2-1. -->\n"); + fprintf(xmlout, " <!-- 17: greyscale (related to sRGB). -->\n"); + fprintf(xmlout, " <!-- 18: sRGB YCC (from JPEG 2000 Part II). -->\n"); + fprintf(xmlout, " <!-- (Additional JPX values are defined in Part II). -->\n"); + } + } else if(notes) + fprintf(xmlout, " <!-- PROFILE is not handled by current OpenJPEG implementation. -->\n"); /* only 1 byte is read and nothing stored */ - fprintf(xmlout, " </ColourSpecification>\n"); - - /* TO DO? No OpenJPEG support. - Palette 'pclr' - ComponentMapping 'cmap' - ChannelDefinition 'cdef' - Resolution 'res' - */ - fprintf(xmlout, " </JP2Header>\n"); + fprintf(xmlout, " </ColourSpecification>\n"); + + /* TO DO? No OpenJPEG support. + Palette 'pclr' + ComponentMapping 'cmap' + ChannelDefinition 'cdef' + Resolution 'res' + */ + fprintf(xmlout, " </JP2Header>\n"); } /* ------------- */ #ifdef NOTYET IMAGE these use cp structure, extended... but we could use a new data structure instead -void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp) { - /* IntellectualProperty 'jp2i' (no restrictions on location) */ - int i; - IMAGE cp->jp2i, cp->jp2i_count, cp->jp2i_data (array of chars), cp->cp2i_len (array of ints) - if(cp->jp2i != 1) - return; /* Not present */ - - for(i = 0; i < cp->jp2i_count; i++) - { - fprintf(xmlout, " <IntellectualProperty BoxType=\"jp2i\">\n"); - /* I think this can be anything, including binary, so do a dump */ - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. */ - xml_out_dump_hex_and_ascii(xmlout, cp->jp2i_data[i], cp->jp2i_len[i]); - fprintf(xmlout, " </IntellectualProperty>\n"); - } +void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp) +{ + /* IntellectualProperty 'jp2i' (no restrictions on location) */ + int i; + IMAGE cp->jp2i, cp->jp2i_count, cp->jp2i_data (array of chars), cp->cp2i_len (array of ints) + if(cp->jp2i != 1) + return; /* Not present */ + + for(i = 0; i < cp->jp2i_count; i++) { + fprintf(xmlout, " <IntellectualProperty BoxType=\"jp2i\">\n"); + /* I think this can be anything, including binary, so do a dump */ + /* Is it better to indent or not indent this content? Indent is better for reading, but + worse for cut/paste. */ + xml_out_dump_hex_and_ascii(xmlout, cp->jp2i_data[i], cp->jp2i_len[i]); + fprintf(xmlout, " </IntellectualProperty>\n"); + } } -void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp) { - /* XML 'xml\040' (0x786d6c20). Can appear multiply, before or after jp2c codestreams */ - IMAGE cp->xml, cp->xml_count, cp->xml_data (array of chars) - MAYBE WE DON'T NEED cp->xml_len (array of ints) IF WE ASSUME xml_data IS NULL-TERMINATED. - ASSUME ASSUME EACH LINE IS ENDED BY \n. - int i; - if(cp->xml != 1) - return; /* Not present */ - - for(i = 0; i < cp->xml_count; i++) - { +void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp) +{ + /* XML 'xml\040' (0x786d6c20). Can appear multiply, before or after jp2c codestreams */ + IMAGE cp->xml, cp->xml_count, cp->xml_data (array of chars) + MAYBE WE DON'T NEED cp->xml_len (array of ints) IF WE ASSUME xml_data IS NULL-TERMINATED. + ASSUME ASSUME EACH LINE IS ENDED BY \n. + int i; + if(cp->xml != 1) + return; /* Not present */ + + for(i = 0; i < cp->xml_count; i++) + { fprintf(xmlout, " <TextFormXML BoxType=\"xml[space]" Instance=\"%d\">\n", i+1); /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. Being lazy, didn't indent here. */ fprintf(xmlout,cp->xml_data[i]); /* May be multiple lines */ /* Could check if this is well-formed */ fprintf(xmlout, " </TextFormXML>\n"); - } } - -void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp) { - /* UUID 'uuid' (top level only) */ - /* Part I 1.7.2 says: may appear multiply in JP2 file, anywhere except before File Type box */ - /* Part III 5.2.1 says: Private extensions shall be achieved through the 'uuid' type. */ - /* A UUID is a 16-byte value. There is a conventional string representation for it: - "0x12345678-9ABC-DEF0-1234-567890ABCDEF". Let's assume that is what is stored in uuid_value */ - - /* Part III 6.1 Any other MJ2 box type could be alternatively written as a 'uuid' box, with value given - as : 0xXXXXXXXX-0011-0010-8000-00AA00389B71, where the Xs are the boxtype in hex. However, - such a file is "not compliant; systems may choose to read [such] objects ... as equivalent to the box of - the same type, or not." Here, we choose not to. */ - int i; - IMAGE cp->uuid, cp->uuid_count, cp->uuid_value (array of uuids... let's say fixed-length strings) cp->uuid_data (array of char buffers), cp->uuid_len (array of ints) - if(cp->juuid != 1) - return; /* Not present */ - - for(i = 0; i < cp->uuid_count; i++) - { - fprintf(xmlout, " <UniversalUniqueID BoxType=\"uuid\"> - fprintf(xmlout, " <UUID>%s</UUDI>\n", cp->uuid_value[i]); - fprintf(xmlout, " <Data>\n"); - /* I think this can be anything, including binary, so do a dump */ - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. */ - xml_out_dump_hex_and_ascii(xmlout, cp->uuid_data[i], cp->uuid_len[i]); - fprintf(xmlout, " </Data>\n"); - fprintf(xmlout, " </UniversalUniqueID>\n"); - } } -void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp) { - /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ - /* Part I 1.7.3 says: may appear multiply in JP2 file, anywhere at the top level except before File Type box */ - /* So there may be multiple ulst's, and each can have multiple UUIDs listed (with a single URL) */ - /* This is not quite as vendor-specific as UUIDs, or at least is meant to be generally readable */ - /* Assume UUIDs stored in canonical string format */ - int i, j; - IMAGE cp->uinf, cp->uinf_count, cp->uinf_ulst_nu (array of ints) - cp->uinf_uuid (2 dimensional array of uuids... let's say fixed-length strings), - cp->uinf_url (array of char buffers) - - if(cp->uinf != 1) - return; /* Not present */ - - for(i = 0; i < cp->uuid_count; i++) - { - fprintf(xmlout, " <UUIDInfo BoxType=\"uinf\">\n"); - fprintf(xmlout, " <UUIDList BoxType=\"ulst\" Count=\"%d\">\n",cp->cp->uinf_ulst_nu[i]); - for(j = 0; j < cp->uinf_ulst_nu[i]; j++) - fprintf(xmlout, " <ID Instance=\"%s\">%s</ID>\n", cp->uuif_uuid[i][j], j+1); - fprintf(xmlout, " </UUIDList>\n"); - fprintf(xmlout, " <DataEntryURL>\n"); - /* Could add VERS and FLAG here */ - fprintf(xmlout, " <LOC>\n"); - fprintf(xmlout, " %s",cp->uinf_url[i]); /* Probably single line, so indent works */ /* In theory, could check if this is well-formed, or good live link */ - fprintf(xmlout, " </LOC>\n"); - fprintf(xmlout, " </DataEntryURL>\n"); - fprintf(xmlout, " </UUIDInfo>\n"); - } -} +void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp) +{ + /* UUID 'uuid' (top level only) */ + /* Part I 1.7.2 says: may appear multiply in JP2 file, anywhere except before File Type box */ + /* Part III 5.2.1 says: Private extensions shall be achieved through the 'uuid' type. */ + /* A UUID is a 16-byte value. There is a conventional string representation for it: + "0x12345678-9ABC-DEF0-1234-567890ABCDEF". Let's assume that is what is stored in uuid_value */ + + /* Part III 6.1 Any other MJ2 box type could be alternatively written as a 'uuid' box, with value given + as : 0xXXXXXXXX-0011-0010-8000-00AA00389B71, where the Xs are the boxtype in hex. However, + such a file is "not compliant; systems may choose to read [such] objects ... as equivalent to the box of + the same type, or not." Here, we choose not to. */ + int i; + IMAGE cp->uuid, cp->uuid_count, cp->uuid_value (array of uuids... let's say fixed-length strings) cp->uuid_data (array of char buffers), cp->uuid_len (array of ints) + if(cp->juuid != 1) + return; /* Not present */ + + for(i = 0; i < cp->uuid_count; i++) + { + fprintf(xmlout, " <UniversalUniqueID BoxType=\"uuid\"> + fprintf(xmlout, " <UUID>%s</UUDI>\n", cp->uuid_value[i]); + fprintf(xmlout, " <Data>\n"); + /* I think this can be anything, including binary, so do a dump */ + /* Is it better to indent or not indent this content? Indent is better for reading, but + worse for cut/paste. */ + xml_out_dump_hex_and_ascii(xmlout, cp->uuid_data[i], cp->uuid_len[i]); + fprintf(xmlout, " </Data>\n"); + fprintf(xmlout, " </UniversalUniqueID>\n"); + } + } -IMAGE these use cp structure, extended... but we could use a new data structure instead -void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp) { - /* Part III 5.2.1 says "Type fields not defined here are reserved. Private extensions - shall be acieved through the 'uuid' type." [This implies an unknown - type would be an error, but then...] "Boxes not explicitly defined in this standard, - or otherwise unrecognized by a reader, may be ignored." - Also, it says "the following types are not and will not be used, or used only in - their existing sense, in future versions of this specification, to avoid conflict - with existing content using earlier pre-standard versions of this format: - clip, crgn, matt, kmat, pnot, ctab, load, imap; - track reference types tmcd, chap, sync,scpt, ssrc" - [But good luck figuring out the mapping.] - Part III Amend. 2 4.1 is stronger: "All these specifications [of this family, e.g., - JP2 Part I, ISO Base format (Part 12) leading to MP4, Quicktime, and possibly including - MJ2] require that readers ignore objects that are unrecognizable to them". - */ - int i; - IMAGE cp->unknown_type, cp->unknown_type_count, cp->unknown_type_boxtype (array of buf[5]s), cp->unknown_type_data (array of chars), cp->unknown_type_len (array of ints) - if(cp->unknown_type != 1) - return; /* Not present */ - - for(i = 0; i < cp->unknown_type_count; i++) - { - fprintf(xmlout, " <UnknownType BoxType=\"%s\">\n", cp->unknown_type_boxtype[i]); - /* Can be anything, including binary, so do a dump */ - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. */ - xml_out_dump_hex_and_ascii(xmlout, cp->unknown_type_data[i], cp->unknown_type_len[i]); - fprintf(xmlout, " </UnknownType>\n"); - } -} + void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp) { + /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ + /* Part I 1.7.3 says: may appear multiply in JP2 file, anywhere at the top level except before File Type box */ + /* So there may be multiple ulst's, and each can have multiple UUIDs listed (with a single URL) */ + /* This is not quite as vendor-specific as UUIDs, or at least is meant to be generally readable */ + /* Assume UUIDs stored in canonical string format */ + int i, j; + IMAGE cp->uinf, cp->uinf_count, cp->uinf_ulst_nu (array of ints) + cp->uinf_uuid (2 dimensional array of uuids... let's say fixed-length strings), + cp->uinf_url (array of char buffers) + + if(cp->uinf != 1) + return; /* Not present */ + + for(i = 0; i < cp->uuid_count; i++) + { + fprintf(xmlout, " <UUIDInfo BoxType=\"uinf\">\n"); + fprintf(xmlout, " <UUIDList BoxType=\"ulst\" Count=\"%d\">\n",cp->cp->uinf_ulst_nu[i]); + for(j = 0; j < cp->uinf_ulst_nu[i]; j++) + fprintf(xmlout, " <ID Instance=\"%s\">%s</ID>\n", cp->uuif_uuid[i][j], j+1); + fprintf(xmlout, " </UUIDList>\n"); + fprintf(xmlout, " <DataEntryURL>\n"); + /* Could add VERS and FLAG here */ + fprintf(xmlout, " <LOC>\n"); + fprintf(xmlout, " %s",cp->uinf_url[i]); /* Probably single line, so indent works */ /* In theory, could check if this is well-formed, or good live link */ + fprintf(xmlout, " </LOC>\n"); + fprintf(xmlout, " </DataEntryURL>\n"); + fprintf(xmlout, " </UUIDInfo>\n"); + } + } + + IMAGE these use cp structure, extended... but we could use a new data structure instead + void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp) { + /* Part III 5.2.1 says "Type fields not defined here are reserved. Private extensions + shall be acieved through the 'uuid' type." [This implies an unknown + type would be an error, but then...] "Boxes not explicitly defined in this standard, + or otherwise unrecognized by a reader, may be ignored." + Also, it says "the following types are not and will not be used, or used only in + their existing sense, in future versions of this specification, to avoid conflict + with existing content using earlier pre-standard versions of this format: + clip, crgn, matt, kmat, pnot, ctab, load, imap; + track reference types tmcd, chap, sync,scpt, ssrc" + [But good luck figuring out the mapping.] + Part III Amend. 2 4.1 is stronger: "All these specifications [of this family, e.g., + JP2 Part I, ISO Base format (Part 12) leading to MP4, Quicktime, and possibly including + MJ2] require that readers ignore objects that are unrecognizable to them". + */ + int i; + IMAGE cp->unknown_type, cp->unknown_type_count, cp->unknown_type_boxtype (array of buf[5]s), cp->unknown_type_data (array of chars), cp->unknown_type_len (array of ints) + if(cp->unknown_type != 1) + return; /* Not present */ + + for(i = 0; i < cp->unknown_type_count; i++) + { + fprintf(xmlout, " <UnknownType BoxType=\"%s\">\n", cp->unknown_type_boxtype[i]); + /* Can be anything, including binary, so do a dump */ + /* Is it better to indent or not indent this content? Indent is better for reading, but + worse for cut/paste. */ + xml_out_dump_hex_and_ascii(xmlout, cp->unknown_type_data[i], cp->unknown_type_len[i]); + fprintf(xmlout, " </UnknownType>\n"); + } + } #endif diff --git a/src/bin/mj2/mj2_to_metadata.c b/src/bin/mj2/mj2_to_metadata.c index 2ec2829d..21d3977e 100644 --- a/src/bin/mj2/mj2_to_metadata.c +++ b/src/bin/mj2/mj2_to_metadata.c @@ -3,7 +3,7 @@ /* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. The base code in this file was developed by the author as part of a video archiving -project for the U.S. National Library of Medicine, Bethesda, MD. +project for the U.S. National Library of Medicine, Bethesda, MD. It is the policy of NLM (and U.S. government) to not assert copyright. A non-exclusive copy of this code has been contributed to the Open JPEG project. @@ -23,23 +23,26 @@ can be bound by the Open JPEG open-source license and disclaimer, expressed else /** sample error callback expecting a FILE* client object */ -void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ -void info_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); +void info_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ @@ -50,263 +53,265 @@ void info_callback(const char *msg, void *client_data) { void help_display() { - /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ - fprintf(stdout," Help for the 'mj2_to_metadata' Program\n"); - fprintf(stdout," ======================================\n"); - fprintf(stdout,"The -h option displays this information on screen.\n\n"); - - fprintf(stdout,"mj2_to_metadata generates an XML file from a Motion JPEG 2000 file.\n"); - fprintf(stdout,"The generated XML shows the structural, but not (yet) curatorial,\n"); - fprintf(stdout,"metadata from the movie header and from the JPEG 2000 image and tile\n"); - fprintf(stdout,"headers of a sample frame. Excluded: low-level packed-bits image data.\n\n"); - - fprintf(stdout,"By Default\n"); - fprintf(stdout,"----------\n"); - fprintf(stdout,"The metadata includes the jp2 image and tile headers of the first frame.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Metadata values are shown in 'raw' form (e.g., hexadecimal) as stored in the\n"); - fprintf(stdout,"file, and, if apt, in a 'derived' form that is more quickly grasped.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Notes explaining the XML are embedded as terse comments. These include\n"); - fprintf(stdout," meaning of non-obvious tag abbreviations;\n"); - fprintf(stdout," range and precision of valid values;\n"); - fprintf(stdout," interpretations of values, such as enumerations; and\n"); - fprintf(stdout," current implementation limitations.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"The sample-size and chunk-offset tables, each with 1 row per frame, are not reported.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"The file is self-contained and no verification (e.g., against a DTD) is requested.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Required Parameters (except with -h)\n"); - fprintf(stdout,"------------------------------------\n"); - fprintf(stdout,"[Caution: file strings that contain spaces should be wrapped with quotes.]\n"); - fprintf(stdout,"-i input.mj2 : where 'input' is any source file name or path.\n"); - fprintf(stdout," MJ2 files created with 'frames_to_mj2' are supported so far.\n"); - fprintf(stdout," These are silent, single-track, 'MJ2 Simple Profile' videos.\n"); - fprintf(stdout,"-o output.xml : where 'output' is any destination file name or path.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Optional Parameters\n"); - fprintf(stdout,"-------------------\n"); - fprintf(stdout,"-h : Display this help information.\n"); - fprintf(stdout,"-n : Suppress all mj2_to_metadata notes.\n"); - fprintf(stdout,"-t : Include sample-size and chunk-offset tables.\n"); - fprintf(stdout,"-f n : where n > 0. Include jp2 header info for frame n [default=1].\n"); - fprintf(stdout,"-f 0 : No jp2 header info.\n"); - fprintf(stdout,"-r : Suppress all 'raw' data for which a 'derived' form exists.\n"); - fprintf(stdout,"-d : Suppress all 'derived' data.\n"); - fprintf(stdout," (If both -r and -d given, -r will be ignored.)\n"); - fprintf(stdout,"-v string : Verify against the DTD file located by the string.\n"); - fprintf(stdout," Prepend quoted 'string' with either SYSTEM or PUBLIC keyword.\n"); - fprintf(stdout," Thus, for the distributed DTD placed in the same directory as\n"); - fprintf(stdout," the output file: -v \"SYSTEM mj2_to_metadata.dtd\"\n"); - fprintf(stdout," \"PUBLIC\" is used with an access protocol (e.g., http:) + URL.\n"); - /* More to come */ - fprintf(stdout,"\n"); - /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ + /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ + fprintf(stdout," Help for the 'mj2_to_metadata' Program\n"); + fprintf(stdout," ======================================\n"); + fprintf(stdout,"The -h option displays this information on screen.\n\n"); + + fprintf(stdout,"mj2_to_metadata generates an XML file from a Motion JPEG 2000 file.\n"); + fprintf(stdout,"The generated XML shows the structural, but not (yet) curatorial,\n"); + fprintf(stdout,"metadata from the movie header and from the JPEG 2000 image and tile\n"); + fprintf(stdout,"headers of a sample frame. Excluded: low-level packed-bits image data.\n\n"); + + fprintf(stdout,"By Default\n"); + fprintf(stdout,"----------\n"); + fprintf(stdout,"The metadata includes the jp2 image and tile headers of the first frame.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Metadata values are shown in 'raw' form (e.g., hexadecimal) as stored in the\n"); + fprintf(stdout,"file, and, if apt, in a 'derived' form that is more quickly grasped.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Notes explaining the XML are embedded as terse comments. These include\n"); + fprintf(stdout," meaning of non-obvious tag abbreviations;\n"); + fprintf(stdout," range and precision of valid values;\n"); + fprintf(stdout," interpretations of values, such as enumerations; and\n"); + fprintf(stdout," current implementation limitations.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"The sample-size and chunk-offset tables, each with 1 row per frame, are not reported.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"The file is self-contained and no verification (e.g., against a DTD) is requested.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Required Parameters (except with -h)\n"); + fprintf(stdout,"------------------------------------\n"); + fprintf(stdout,"[Caution: file strings that contain spaces should be wrapped with quotes.]\n"); + fprintf(stdout,"-i input.mj2 : where 'input' is any source file name or path.\n"); + fprintf(stdout," MJ2 files created with 'frames_to_mj2' are supported so far.\n"); + fprintf(stdout," These are silent, single-track, 'MJ2 Simple Profile' videos.\n"); + fprintf(stdout,"-o output.xml : where 'output' is any destination file name or path.\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Optional Parameters\n"); + fprintf(stdout,"-------------------\n"); + fprintf(stdout,"-h : Display this help information.\n"); + fprintf(stdout,"-n : Suppress all mj2_to_metadata notes.\n"); + fprintf(stdout,"-t : Include sample-size and chunk-offset tables.\n"); + fprintf(stdout,"-f n : where n > 0. Include jp2 header info for frame n [default=1].\n"); + fprintf(stdout,"-f 0 : No jp2 header info.\n"); + fprintf(stdout,"-r : Suppress all 'raw' data for which a 'derived' form exists.\n"); + fprintf(stdout,"-d : Suppress all 'derived' data.\n"); + fprintf(stdout," (If both -r and -d given, -r will be ignored.)\n"); + fprintf(stdout,"-v string : Verify against the DTD file located by the string.\n"); + fprintf(stdout," Prepend quoted 'string' with either SYSTEM or PUBLIC keyword.\n"); + fprintf(stdout," Thus, for the distributed DTD placed in the same directory as\n"); + fprintf(stdout," the output file: -v \"SYSTEM mj2_to_metadata.dtd\"\n"); + fprintf(stdout," \"PUBLIC\" is used with an access protocol (e.g., http:) + URL.\n"); + /* More to come */ + fprintf(stdout,"\n"); + /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ } /* ------------- */ -int main(int argc, char *argv[]) { - - opj_dinfo_t* dinfo; - opj_event_mgr_t event_mgr; /* event manager */ - - FILE *file, *xmlout; -/* char xmloutname[50]; */ - opj_mj2_t *movie; - - char* infile = 0; - char* outfile = 0; - char* s, S1, S2, S3; - int len; - unsigned int sampleframe = 1; /* First frame */ - char* stringDTD = NULL; - BOOL notes = TRUE; - BOOL sampletables = FALSE; - BOOL raw = TRUE; - BOOL derived = TRUE; - mj2_dparameters_t parameters; - - while (TRUE) { - /* ':' after letter means it takes an argument */ - int c = getopt(argc, argv, "i:o:f:v:hntrd"); - /* FUTURE: Reserve 'p' for pruning file (which will probably make -t redundant) */ - if (c == -1) - break; - switch (c) { - case 'i': /* IN file */ - infile = optarg; - s = optarg; - while (*s) { s++; } /* Run to filename end */ - s--; - S3 = *s; - s--; - S2 = *s; - s--; - S1 = *s; - - if ((S1 == 'm' && S2 == 'j' && S3 == '2') - || (S1 == 'M' && S2 == 'J' && S3 == '2')) { - break; - } - fprintf(stderr, "Input file name must have .mj2 extension, not .%c%c%c.\n", S1, S2, S3); - return 1; - - /* ----------------------------------------------------- */ - case 'o': /* OUT file */ - outfile = optarg; - while (*outfile) { outfile++; } /* Run to filename end */ - outfile--; - S3 = *outfile; - outfile--; - S2 = *outfile; - outfile--; - S1 = *outfile; - - outfile = optarg; - - if ((S1 == 'x' && S2 == 'm' && S3 == 'l') - || (S1 == 'X' && S2 == 'M' && S3 == 'L')) - break; - - fprintf(stderr, - "Output file name must have .xml extension, not .%c%c%c\n", S1, S2, S3); - return 1; - - /* ----------------------------------------------------- */ - case 'f': /* Choose sample frame. 0 = none */ - sscanf(optarg, "%u", &sampleframe); - break; - - /* ----------------------------------------------------- */ - case 'v': /* Verification by DTD. */ - stringDTD = optarg; - /* We will not insist upon last 3 chars being "dtd", since non-file - access protocol may be used. */ - if(strchr(stringDTD,'"') != NULL) { - fprintf(stderr, "-D's string must not contain any embedded double-quote characters.\n"); - return 1; - } - - if (strncmp(stringDTD,"PUBLIC ",7) == 0 || strncmp(stringDTD,"SYSTEM ",7) == 0) - break; - - fprintf(stderr, "-D's string must start with \"PUBLIC \" or \"SYSTEM \"\n"); - return 1; - - /* ----------------------------------------------------- */ - case 'n': /* Suppress comments */ - notes = FALSE; - break; - - /* ----------------------------------------------------- */ - case 't': /* Show sample size and chunk offset tables */ - sampletables = TRUE; - break; - - /* ----------------------------------------------------- */ - case 'h': /* Display an help description */ - help_display(); - return 0; - - /* ----------------------------------------------------- */ - case 'r': /* Suppress raw data */ - raw = FALSE; - break; - - /* ----------------------------------------------------- */ - case 'd': /* Suppress derived data */ - derived = FALSE; - break; - - /* ----------------------------------------------------- */ - default: - return 1; - } /* switch */ - } /* while */ - - if(!raw && !derived) - raw = TRUE; /* At least one of 'raw' and 'derived' must be true */ +int main(int argc, char *argv[]) +{ + + opj_dinfo_t* dinfo; + opj_event_mgr_t event_mgr; /* event manager */ + + FILE *file, *xmlout; + /* char xmloutname[50]; */ + opj_mj2_t *movie; + + char* infile = 0; + char* outfile = 0; + char* s, S1, S2, S3; + int len; + unsigned int sampleframe = 1; /* First frame */ + char* stringDTD = NULL; + BOOL notes = TRUE; + BOOL sampletables = FALSE; + BOOL raw = TRUE; + BOOL derived = TRUE; + mj2_dparameters_t parameters; + + while (TRUE) { + /* ':' after letter means it takes an argument */ + int c = getopt(argc, argv, "i:o:f:v:hntrd"); + /* FUTURE: Reserve 'p' for pruning file (which will probably make -t redundant) */ + if (c == -1) + break; + switch (c) { + case 'i': /* IN file */ + infile = optarg; + s = optarg; + while (*s) { + s++; /* Run to filename end */ + } + s--; + S3 = *s; + s--; + S2 = *s; + s--; + S1 = *s; + + if ((S1 == 'm' && S2 == 'j' && S3 == '2') + || (S1 == 'M' && S2 == 'J' && S3 == '2')) { + break; + } + fprintf(stderr, "Input file name must have .mj2 extension, not .%c%c%c.\n", S1, S2, S3); + return 1; + + /* ----------------------------------------------------- */ + case 'o': /* OUT file */ + outfile = optarg; + while (*outfile) { + outfile++; /* Run to filename end */ + } + outfile--; + S3 = *outfile; + outfile--; + S2 = *outfile; + outfile--; + S1 = *outfile; + + outfile = optarg; + + if ((S1 == 'x' && S2 == 'm' && S3 == 'l') + || (S1 == 'X' && S2 == 'M' && S3 == 'L')) + break; + + fprintf(stderr, + "Output file name must have .xml extension, not .%c%c%c\n", S1, S2, S3); + return 1; + + /* ----------------------------------------------------- */ + case 'f': /* Choose sample frame. 0 = none */ + sscanf(optarg, "%u", &sampleframe); + break; + + /* ----------------------------------------------------- */ + case 'v': /* Verification by DTD. */ + stringDTD = optarg; + /* We will not insist upon last 3 chars being "dtd", since non-file + access protocol may be used. */ + if(strchr(stringDTD,'"') != NULL) { + fprintf(stderr, "-D's string must not contain any embedded double-quote characters.\n"); + return 1; + } + + if (strncmp(stringDTD,"PUBLIC ",7) == 0 || strncmp(stringDTD,"SYSTEM ",7) == 0) + break; + + fprintf(stderr, "-D's string must start with \"PUBLIC \" or \"SYSTEM \"\n"); + return 1; + + /* ----------------------------------------------------- */ + case 'n': /* Suppress comments */ + notes = FALSE; + break; + + /* ----------------------------------------------------- */ + case 't': /* Show sample size and chunk offset tables */ + sampletables = TRUE; + break; + + /* ----------------------------------------------------- */ + case 'h': /* Display an help description */ + help_display(); + return 0; + + /* ----------------------------------------------------- */ + case 'r': /* Suppress raw data */ + raw = FALSE; + break; + + /* ----------------------------------------------------- */ + case 'd': /* Suppress derived data */ + derived = FALSE; + break; + + /* ----------------------------------------------------- */ + default: + return 1; + } /* switch */ + } /* while */ + + if(!raw && !derived) + raw = TRUE; /* At least one of 'raw' and 'derived' must be true */ /* Error messages */ - /* -------------- */ - if (!infile || !outfile) { - fprintf(stderr,"Correct usage: mj2_to_metadata -i mj2-file -o xml-file (plus options)\n"); - return 1; - } - -/* was: - if (argc != 3) { - printf("Bad syntax: Usage: MJ2_to_metadata inputfile.mj2 outputfile.xml\n"); - printf("Example: MJ2_to_metadata foreman.mj2 foreman.xml\n"); - return 1; - } -*/ - len = strlen(infile); - if(infile[0] == ' ') - { - infile++; /* There may be a leading blank if user put space after -i */ - } - - file = fopen(infile, "rb"); /* was: argv[1] */ - - if (!file) { - fprintf(stderr, "Failed to open %s for reading.\n", infile); /* was: argv[1] */ - return 1; - } - - len = strlen(outfile); - if(outfile[0] == ' ') - { - outfile++; /* There may be a leading blank if user put space after -o */ - } - - // Checking output file - xmlout = fopen(outfile, "w"); /* was: argv[2] */ - if (!xmlout) { - fprintf(stderr, "Failed to open %s for writing.\n", outfile); /* was: argv[2] */ - return 1; - } - // Leave it open - - /* - configure the event callbacks (not required) - setting of each callback is optionnal - */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* get a MJ2 decompressor handle */ - dinfo = mj2_create_decompress(); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - movie = (opj_mj2_t*) dinfo->mj2_handle; - mj2_setup_decoder(dinfo->mj2_handle, ¶meters); - - if (mj2_read_struct(file, movie)) // Creating the movie structure - { + /* -------------- */ + if (!infile || !outfile) { + fprintf(stderr,"Correct usage: mj2_to_metadata -i mj2-file -o xml-file (plus options)\n"); + return 1; + } + + /* was: + if (argc != 3) { + printf("Bad syntax: Usage: MJ2_to_metadata inputfile.mj2 outputfile.xml\n"); + printf("Example: MJ2_to_metadata foreman.mj2 foreman.xml\n"); + return 1; + } + */ + len = strlen(infile); + if(infile[0] == ' ') { + infile++; /* There may be a leading blank if user put space after -i */ + } + + file = fopen(infile, "rb"); /* was: argv[1] */ + + if (!file) { + fprintf(stderr, "Failed to open %s for reading.\n", infile); /* was: argv[1] */ + return 1; + } + + len = strlen(outfile); + if(outfile[0] == ' ') { + outfile++; /* There may be a leading blank if user put space after -o */ + } + + // Checking output file + xmlout = fopen(outfile, "w"); /* was: argv[2] */ + if (!xmlout) { + fprintf(stderr, "Failed to open %s for writing.\n", outfile); /* was: argv[2] */ + return 1; + } + // Leave it open + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* get a MJ2 decompressor handle */ + dinfo = mj2_create_decompress(); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + movie = (opj_mj2_t*) dinfo->mj2_handle; + mj2_setup_decoder(dinfo->mj2_handle, ¶meters); + + if (mj2_read_struct(file, movie)) { // Creating the movie structure + fclose(xmlout); + return 1; + } + + xml_write_init(notes, sampletables, raw, derived); + xml_write_struct(file, xmlout, movie, sampleframe, stringDTD, &event_mgr); fclose(xmlout); - return 1; - } - - xml_write_init(notes, sampletables, raw, derived); - xml_write_struct(file, xmlout, movie, sampleframe, stringDTD, &event_mgr); - fclose(xmlout); - fprintf(stderr,"Metadata correctly extracted to XML file \n");; + fprintf(stderr,"Metadata correctly extracted to XML file \n");; - /* free remaining structures */ - if(dinfo) { - mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); - } + /* free remaining structures */ + if(dinfo) { + mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); + } - return 0; + return 0; } diff --git a/src/bin/mj2/opj_mj2_compress.c b/src/bin/mj2/opj_mj2_compress.c index afe37679..d9ace714 100644 --- a/src/bin/mj2/opj_mj2_compress.c +++ b/src/bin/mj2/opj_mj2_compress.c @@ -42,7 +42,7 @@ /** Size of memory first allocated for MOOV box */ -#define TEMP_BUF 10000 +#define TEMP_BUF 10000 /* -------------------------------------------------------------------------- */ @@ -50,16 +50,18 @@ Size of memory first allocated for MOOV box /** sample error callback expecting a FILE* client object */ -static void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +static void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -static void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +static void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /* -------------------------------------------------------------------------- */ @@ -67,157 +69,157 @@ static void warning_callback(const char *msg, void *client_data) { static void help_display() { - fprintf(stdout,"HELP for frames_to_mj2\n----\n\n"); - fprintf(stdout,"- the -h option displays this help information on screen\n\n"); - - - fprintf(stdout,"List of parameters for the MJ2 encoder:\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"REMARKS:\n"); - fprintf(stdout,"---------\n"); - fprintf(stdout,"\n"); - fprintf + fprintf(stdout,"HELP for frames_to_mj2\n----\n\n"); + fprintf(stdout,"- the -h option displays this help information on screen\n\n"); + + + fprintf(stdout,"List of parameters for the MJ2 encoder:\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"REMARKS:\n"); + fprintf(stdout,"---------\n"); + fprintf(stdout,"\n"); + fprintf (stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); - fprintf + fprintf (stdout,"COD and QCD never appear in the tile_header.\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"By default:\n"); - fprintf(stdout,"------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout," * Lossless\n"); - fprintf(stdout," * 1 tile\n"); - fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); - fprintf(stdout," * Size of code-block : 64 x 64\n"); - fprintf(stdout," * Number of resolutions: 6\n"); - fprintf(stdout," * No SOP marker in the codestream\n"); - fprintf(stdout," * No EPH marker in the codestream\n"); - fprintf(stdout," * No sub-sampling in x or y direction\n"); - fprintf(stdout," * No mode switch activated\n"); - fprintf(stdout," * Progression order: LRCP\n"); - fprintf(stdout," * No index file\n"); - fprintf(stdout," * No ROI upshifted\n"); - fprintf(stdout," * No offset of the origin of the image\n"); - fprintf(stdout," * No offset of the origin of the tiles\n"); - fprintf(stdout," * Reversible DWT 5-3\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Parameters:\n"); - fprintf(stdout,"------------\n"); - fprintf(stdout,"\n"); - fprintf + fprintf(stdout,"\n"); + fprintf(stdout,"By default:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout," * Lossless\n"); + fprintf(stdout," * 1 tile\n"); + fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); + fprintf(stdout," * Size of code-block : 64 x 64\n"); + fprintf(stdout," * Number of resolutions: 6\n"); + fprintf(stdout," * No SOP marker in the codestream\n"); + fprintf(stdout," * No EPH marker in the codestream\n"); + fprintf(stdout," * No sub-sampling in x or y direction\n"); + fprintf(stdout," * No mode switch activated\n"); + fprintf(stdout," * Progression order: LRCP\n"); + fprintf(stdout," * No index file\n"); + fprintf(stdout," * No ROI upshifted\n"); + fprintf(stdout," * No offset of the origin of the image\n"); + fprintf(stdout," * No offset of the origin of the tiles\n"); + fprintf(stdout," * Reversible DWT 5-3\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Parameters:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf (stdout,"Required Parameters (except with -h):\n"); - fprintf + fprintf (stdout,"-i : source file (-i source.yuv) \n"); - fprintf + fprintf (stdout,"-o : destination file (-o dest.mj2) \n"); - fprintf + fprintf (stdout,"Optional Parameters:\n"); - fprintf(stdout,"-h : display the help information \n"); - fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n"); - fprintf(stdout," - The rate specified for each quality level is the desired \n"); - fprintf(stdout," compression factor.\n"); - fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); - fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); - fprintf(stdout," (options -r and -q cannot be used together)\n"); - - fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n"); - fprintf(stdout," (options -r and -q cannot be used together)\n"); - - fprintf(stdout,"-n : number of resolutions (-n 3) \n"); - fprintf(stdout,"-b : size of code block (-b 32,32) \n"); - fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); - fprintf(stdout,"-t : size of tile (-t 512,512) \n"); - fprintf + fprintf(stdout,"-h : display the help information \n"); + fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n"); + fprintf(stdout," - The rate specified for each quality level is the desired \n"); + fprintf(stdout," compression factor.\n"); + fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); + fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); + fprintf(stdout," (options -r and -q cannot be used together)\n"); + + fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n"); + fprintf(stdout," (options -r and -q cannot be used together)\n"); + + fprintf(stdout,"-n : number of resolutions (-n 3) \n"); + fprintf(stdout,"-b : size of code block (-b 32,32) \n"); + fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); + fprintf(stdout,"-t : size of tile (-t 512,512) \n"); + fprintf (stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); - fprintf + fprintf (stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); - fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); - fprintf + fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); + fprintf (stdout,"-S : write SOP marker before each packet \n"); - fprintf + fprintf (stdout,"-E : write EPH marker after each header packet \n"); - fprintf + fprintf (stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); - fprintf + fprintf (stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); - fprintf + fprintf (stdout," Indicate multiple modes by adding their values. \n"); - fprintf + fprintf (stdout," Example: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); - fprintf + fprintf (stdout,"-R : c=%%d,U=%%d : quantization indices upshifted \n"); - fprintf + fprintf (stdout," for component c=%%d [%%d = 0,1,2]\n"); - fprintf + fprintf (stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n"); - fprintf + fprintf (stdout,"-d : offset of the origin of the image (-d 150,300) \n"); - fprintf + fprintf (stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); - fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); - fprintf(stdout,"-W : image width, height and the dx and dy subsampling \n"); - fprintf(stdout," of the Cb and Cr components for YUV files \n"); - fprintf(stdout," (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n"); - fprintf(stdout,"-F : video frame rate (set to 25 by default)\n"); - fprintf(stdout,"-D : depth, precision in bits [8 .. 16]; default:8\n"); - fprintf(stdout,"-C : comment\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"IMPORTANT:\n"); - fprintf(stdout,"-----------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"The index file has the structure below:\n"); - fprintf(stdout,"---------------------------------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Image_height Image_width\n"); - fprintf(stdout,"progression order\n"); - fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); - fprintf(stdout,"Components_nb\n"); - fprintf(stdout,"Layers_nb\n"); - fprintf(stdout,"decomposition_levels\n"); - fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); - fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); - fprintf(stdout,"Main_header_end_position\n"); - fprintf(stdout,"Codestream_size\n"); - fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n"); - fprintf(stdout,"Tile_1 '' '' '' '' '' ''\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Tile_Nt '' '' '' '' '' ''\n"); - fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); - - fprintf(stdout,"MaxDisto\n"); - - fprintf(stdout,"TotalDisto\n\n"); + fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); + fprintf(stdout,"-W : image width, height and the dx and dy subsampling \n"); + fprintf(stdout," of the Cb and Cr components for YUV files \n"); + fprintf(stdout," (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n"); + fprintf(stdout,"-F : video frame rate (set to 25 by default)\n"); + fprintf(stdout,"-D : depth, precision in bits [8 .. 16]; default:8\n"); + fprintf(stdout,"-C : comment\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"IMPORTANT:\n"); + fprintf(stdout,"-----------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"The index file has the structure below:\n"); + fprintf(stdout,"---------------------------------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Image_height Image_width\n"); + fprintf(stdout,"progression order\n"); + fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); + fprintf(stdout,"Components_nb\n"); + fprintf(stdout,"Layers_nb\n"); + fprintf(stdout,"decomposition_levels\n"); + fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); + fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); + fprintf(stdout,"Main_header_end_position\n"); + fprintf(stdout,"Codestream_size\n"); + fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n"); + fprintf(stdout,"Tile_1 '' '' '' '' '' ''\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Tile_Nt '' '' '' '' '' ''\n"); + fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); + + fprintf(stdout,"MaxDisto\n"); + + fprintf(stdout,"TotalDisto\n\n"); } static OPJ_PROG_ORDER give_progression(const char progression[5]) { - if (progression[0] == 'L' && progression[1] == 'R' - && progression[2] == 'C' && progression[3] == 'P') { - return LRCP; - } else { - if (progression[0] == 'R' && progression[1] == 'L' - && progression[2] == 'C' && progression[3] == 'P') { - return RLCP; + if (progression[0] == 'L' && progression[1] == 'R' + && progression[2] == 'C' && progression[3] == 'P') { + return LRCP; } else { - if (progression[0] == 'R' && progression[1] == 'P' - && progression[2] == 'C' && progression[3] == 'L') { - return RPCL; - } else { - if (progression[0] == 'P' && progression[1] == 'C' - && progression[2] == 'R' && progression[3] == 'L') { - return PCRL; - } else { - if (progression[0] == 'C' && progression[1] == 'P' - && progression[2] == 'R' && progression[3] == 'L') { - return CPRL; - } else { - return PROG_UNKNOWN; - } - } - } + if (progression[0] == 'R' && progression[1] == 'L' + && progression[2] == 'C' && progression[3] == 'P') { + return RLCP; + } else { + if (progression[0] == 'R' && progression[1] == 'P' + && progression[2] == 'C' && progression[3] == 'L') { + return RPCL; + } else { + if (progression[0] == 'P' && progression[1] == 'C' + && progression[2] == 'R' && progression[3] == 'L') { + return PCRL; + } else { + if (progression[0] == 'C' && progression[1] == 'P' + && progression[2] == 'R' && progression[3] == 'L') { + return CPRL; + } else { + return PROG_UNKNOWN; + } + } + } + } } - } } @@ -225,610 +227,587 @@ static OPJ_PROG_ORDER give_progression(const char progression[5]) int main(int argc, char **argv) { - mj2_cparameters_t mj2_parameters; /* MJ2 compression parameters */ - opj_cparameters_t *j2k_parameters; /* J2K compression parameters */ - opj_event_mgr_t event_mgr; /* event manager */ - opj_cio_t *cio; - int value; - opj_mj2_t *movie; - opj_image_t *img; - int i, j; - char *s, S1, S2, S3; - unsigned char *buf; - int x1, y1, len; - long mdat_initpos, offset; - FILE *mj2file; - int sampleno; - opj_cinfo_t* cinfo; - opj_bool bSuccess; - int numframes; - int prec = 8;/* DEFAULT */ - double total_time = 0; - - memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t)); - /* default value */ - /* ------------- */ - mj2_parameters.w = 352; /* CIF default value*/ - mj2_parameters.h = 288; /* CIF default value*/ - mj2_parameters.CbCr_subsampling_dx = 2; /* CIF default value*/ - mj2_parameters.CbCr_subsampling_dy = 2; /* CIF default value*/ - mj2_parameters.frame_rate = 25; - mj2_parameters.prec = 8; /* DEFAULT */ - mj2_parameters.enumcs = ENUMCS_SYCC; /* FIXME: ENUMCS_YUV420 */ - mj2_parameters.meth = 1; /* enumerated color space */ + mj2_cparameters_t mj2_parameters; /* MJ2 compression parameters */ + opj_cparameters_t *j2k_parameters; /* J2K compression parameters */ + opj_event_mgr_t event_mgr; /* event manager */ + opj_cio_t *cio; + int value; + opj_mj2_t *movie; + opj_image_t *img; + int i, j; + char *s, S1, S2, S3; + unsigned char *buf; + int x1, y1, len; + long mdat_initpos, offset; + FILE *mj2file; + int sampleno; + opj_cinfo_t* cinfo; + opj_bool bSuccess; + int numframes; + int prec = 8;/* DEFAULT */ + double total_time = 0; + + memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t)); + /* default value */ + /* ------------- */ + mj2_parameters.w = 352; /* CIF default value*/ + mj2_parameters.h = 288; /* CIF default value*/ + mj2_parameters.CbCr_subsampling_dx = 2; /* CIF default value*/ + mj2_parameters.CbCr_subsampling_dy = 2; /* CIF default value*/ + mj2_parameters.frame_rate = 25; + mj2_parameters.prec = 8; /* DEFAULT */ + mj2_parameters.enumcs = ENUMCS_SYCC; /* FIXME: ENUMCS_YUV420 */ + mj2_parameters.meth = 1; /* enumerated color space */ + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = NULL; + + /* set J2K encoding parameters to default values */ + opj_set_default_encoder_parameters(&mj2_parameters.j2k_parameters); + j2k_parameters = &mj2_parameters.j2k_parameters; + + /* Create comment for codestream */ + if(j2k_parameters->cp_comment == NULL) { + const char comment[] = "Created by OpenJPEG version "; + const size_t clen = strlen(comment); + const char *version = opj_version(); + j2k_parameters->cp_comment = (char*)malloc(clen+strlen(version)+1); + sprintf(j2k_parameters->cp_comment,"%s%s", comment, version); + } -/* - configure the event callbacks (not required) - setting of each callback is optionnal -*/ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = NULL; - - /* set J2K encoding parameters to default values */ - opj_set_default_encoder_parameters(&mj2_parameters.j2k_parameters); - j2k_parameters = &mj2_parameters.j2k_parameters; - - /* Create comment for codestream */ - if(j2k_parameters->cp_comment == NULL) { - const char comment[] = "Created by OpenJPEG version "; - const size_t clen = strlen(comment); - const char *version = opj_version(); - j2k_parameters->cp_comment = (char*)malloc(clen+strlen(version)+1); - sprintf(j2k_parameters->cp_comment,"%s%s", comment, version); - } - - while (1) { - int c = opj_getopt(argc, argv, - "i:o:r:q:f:t:n:c:b:p:s:d:P:S:E:M:R:T:C:I:W:F:D:h"); - if (c == -1) - break; - switch (c) { - case 'i': /* IN fill */ - { - char *infile = opj_optarg; - s = opj_optarg; - while (*s) { - s++; - } - s--; - S3 = *s; - s--; - S2 = *s; - s--; - S1 = *s; - - if ((S1 == 'y' && S2 == 'u' && S3 == 'v') - || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { - mj2_parameters.decod_format = YUV_DFMT; - } - else { - fprintf(stderr, - "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n", - S1, S2, S3); - return 1; - } - strncpy(mj2_parameters.infile, infile, sizeof(mj2_parameters.infile)-1); - } - break; - /* ----------------------------------------------------- */ - case 'o': /* OUT fill */ - { - char *outfile = opj_optarg; - while (*outfile) { - outfile++; - } - outfile--; - S3 = *outfile; - outfile--; - S2 = *outfile; - outfile--; - S1 = *outfile; - - outfile = opj_optarg; - - if ((S1 == 'm' && S2 == 'j' && S3 == '2') - || (S1 == 'M' && S2 == 'J' && S3 == '2')) - mj2_parameters.cod_format = MJ2_CFMT; - else { - fprintf(stderr, - "Unknown output format image *.%c%c%c [only *.mj2]!! \n", - S1, S2, S3); - return 1; - } - strncpy(mj2_parameters.outfile, outfile, sizeof(mj2_parameters.outfile)-1); - } - break; - /* ----------------------------------------------------- */ - case 'r': /* rates rates/distorsion */ - { - float rate; - s = opj_optarg; - while (sscanf(s, "%f", &rate) == 1) { - j2k_parameters->tcp_rates[j2k_parameters->tcp_numlayers] = rate * 2; - j2k_parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) - break; - s++; - } - j2k_parameters->cp_disto_alloc = 1; - } - break; - /* ----------------------------------------------------- */ - case 'q': /* add fixed_quality */ - s = opj_optarg; - while (sscanf(s, "%f", &j2k_parameters->tcp_distoratio[j2k_parameters->tcp_numlayers]) == 1) { - j2k_parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) - break; - s++; - } - j2k_parameters->cp_fixed_quality = 1; - break; - /* dda */ - /* ----------------------------------------------------- */ - case 'f': /* mod fixed_quality (before : -q) */ - { - int *row = NULL, *col = NULL; - int numlayers = 0, numresolution = 0, matrix_width = 0; - - s = opj_optarg; - sscanf(s, "%d", &numlayers); - s++; - if (numlayers > 9) - s++; - - j2k_parameters->tcp_numlayers = numlayers; - numresolution = j2k_parameters->numresolution; - matrix_width = numresolution * 3; - j2k_parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); - s = s + 2; - - for (i = 0; i < numlayers; i++) { - row = &j2k_parameters->cp_matrice[i * matrix_width]; - col = row; - j2k_parameters->tcp_rates[i] = 1; - sscanf(s, "%d,", &col[0]); - s += 2; - if (col[0] > 9) - s++; - col[1] = 0; - col[2] = 0; - for (j = 1; j < numresolution; j++) { - col += 3; - sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); - s += 6; - if (col[0] > 9) - s++; - if (col[1] > 9) - s++; - if (col[2] > 9) - s++; - } - if (i < numlayers - 1) - s++; - } - j2k_parameters->cp_fixed_alloc = 1; - } - break; - /* ----------------------------------------------------- */ - case 't': /* tiles */ - sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy); - j2k_parameters->tile_size_on = OPJ_TRUE; - break; - /* ----------------------------------------------------- */ - case 'n': /* resolution */ - sscanf(opj_optarg, "%d", &j2k_parameters->numresolution); - break; - /* ----------------------------------------------------- */ - case 'c': /* precinct dimension */ - { - char sep; - int res_spec = 0; - - char *s = opj_optarg; - do { - sep = 0; - sscanf(s, "[%d,%d]%c", &j2k_parameters->prcw_init[res_spec], - &j2k_parameters->prch_init[res_spec], &sep); - j2k_parameters->csty |= 0x01; - res_spec++; - s = strpbrk(s, "]") + 2; - } - while (sep == ','); - j2k_parameters->res_spec = res_spec; - } - break; - - /* ----------------------------------------------------- */ - case 'b': /* code-block dimension */ - { - int cblockw_init = 0, cblockh_init = 0; - sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init); - if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 - || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { - fprintf(stderr, - "!! Size of code_block error (option -b) !!\n\nRestriction :\n" - " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); - return 1; - } - j2k_parameters->cblockw_init = cblockw_init; - j2k_parameters->cblockh_init = cblockh_init; - } - break; - /* ----------------------------------------------------- */ - case 'p': /* progression order */ - { - char progression[5]; - - strncpy(progression, opj_optarg, 5); - j2k_parameters->prog_order = give_progression(progression); - if (j2k_parameters->prog_order == -1) { - fprintf(stderr, "Unrecognized progression order " - "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); - return 1; - } - } - break; - /* ----------------------------------------------------- */ - case 's': /* subsampling factor */ - { - if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->subsampling_dx, - &j2k_parameters->subsampling_dy) != 2) { - fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); - return 1; - } - } - break; - /* ----------------------------------------------------- */ - case 'd': /* coordonnate of the reference grid */ - { - if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->image_offset_x0, - &j2k_parameters->image_offset_y0) != 2) { - fprintf(stderr, "-d 'coordonnate of the reference grid' argument " - "error !! [-d x0,y0]\n"); - return 1; - } - } - break; - /* ----------------------------------------------------- */ - case 'h': /* Display an help description */ - help_display(); - return 0; - break; - /* ----------------------------------------------------- */ - case 'P': /* POC */ - { - int numpocs = 0; /* number of progression order change (POC) default 0 */ - opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ - - char *s = opj_optarg; - POC = j2k_parameters->POC; - - while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, - &POC[numpocs].resno0, &POC[numpocs].compno0, - &POC[numpocs].layno1, &POC[numpocs].resno1, - &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { - POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); - numpocs++; - while (*s && *s != '/') { - s++; - } - if (!*s) { - break; - } - s++; - } - j2k_parameters->numpocs = numpocs; - } - break; - /* ------------------------------------------------------ */ - case 'S': /* SOP marker */ - j2k_parameters->csty |= 0x02; - break; - /* ------------------------------------------------------ */ - case 'E': /* EPH marker */ - j2k_parameters->csty |= 0x04; - break; - /* ------------------------------------------------------ */ - case 'M': /* Mode switch pas tous au point !! */ - if (sscanf(opj_optarg, "%d", &value) == 1) { - for (i = 0; i <= 5; i++) { - int cache = value & (1 << i); - if (cache) - j2k_parameters->mode |= (1 << i); - } - } - break; - /* ------------------------------------------------------ */ - case 'R': /* ROI */ - { - if (sscanf(opj_optarg, "OI:c=%d,U=%d", &j2k_parameters->roi_compno, - &j2k_parameters->roi_shift) != 2) { - fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n"); - return 1; - } - } - break; - /* ------------------------------------------------------ */ - case 'T': /* Tile offset */ - { - if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tx0, &j2k_parameters->cp_ty0) != 2) { - fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); - return 1; - } - } - break; - /* ------------------------------------------------------ */ - case 'C': /* Add a comment */ - { - j2k_parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); - if(j2k_parameters->cp_comment) { - strcpy(j2k_parameters->cp_comment, opj_optarg); - } - } - break; - /* ------------------------------------------------------ */ - case 'I': /* reversible or not */ - { - j2k_parameters->irreversible = 1; - } - break; - /* ------------------------------------------------------ */ - case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */ - if (sscanf - (opj_optarg, "%d,%d,%d,%d", &mj2_parameters.w, &mj2_parameters.h, &mj2_parameters.CbCr_subsampling_dx, - &mj2_parameters.CbCr_subsampling_dy) != 4) { - fprintf(stderr, "-W argument error"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'F': /* Video frame rate */ - if (sscanf(opj_optarg, "%d", &mj2_parameters.frame_rate) != 1) { - fprintf(stderr, "-F argument error"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'D': /* Depth: the precision */ - if(sscanf(opj_optarg, "%d", &prec) != 1) prec = 0; - break; - - default: - return 1; + while (1) { + int c = opj_getopt(argc, argv, + "i:o:r:q:f:t:n:c:b:p:s:d:P:S:E:M:R:T:C:I:W:F:D:h"); + if (c == -1) + break; + switch (c) { + case 'i': { /* IN fill */ + char *infile = opj_optarg; + s = opj_optarg; + while (*s) { + s++; + } + s--; + S3 = *s; + s--; + S2 = *s; + s--; + S1 = *s; + + if ((S1 == 'y' && S2 == 'u' && S3 == 'v') + || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { + mj2_parameters.decod_format = YUV_DFMT; + } else { + fprintf(stderr, + "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n", + S1, S2, S3); + return 1; + } + strncpy(mj2_parameters.infile, infile, sizeof(mj2_parameters.infile)-1); + } + break; + /* ----------------------------------------------------- */ + case 'o': { /* OUT fill */ + char *outfile = opj_optarg; + while (*outfile) { + outfile++; + } + outfile--; + S3 = *outfile; + outfile--; + S2 = *outfile; + outfile--; + S1 = *outfile; + + outfile = opj_optarg; + + if ((S1 == 'm' && S2 == 'j' && S3 == '2') + || (S1 == 'M' && S2 == 'J' && S3 == '2')) + mj2_parameters.cod_format = MJ2_CFMT; + else { + fprintf(stderr, + "Unknown output format image *.%c%c%c [only *.mj2]!! \n", + S1, S2, S3); + return 1; + } + strncpy(mj2_parameters.outfile, outfile, sizeof(mj2_parameters.outfile)-1); + } + break; + /* ----------------------------------------------------- */ + case 'r': { /* rates rates/distorsion */ + float rate; + s = opj_optarg; + while (sscanf(s, "%f", &rate) == 1) { + j2k_parameters->tcp_rates[j2k_parameters->tcp_numlayers] = rate * 2; + j2k_parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + j2k_parameters->cp_disto_alloc = 1; + } + break; + /* ----------------------------------------------------- */ + case 'q': /* add fixed_quality */ + s = opj_optarg; + while (sscanf(s, "%f", &j2k_parameters->tcp_distoratio[j2k_parameters->tcp_numlayers]) == 1) { + j2k_parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + j2k_parameters->cp_fixed_quality = 1; + break; + /* dda */ + /* ----------------------------------------------------- */ + case 'f': { /* mod fixed_quality (before : -q) */ + int *row = NULL, *col = NULL; + int numlayers = 0, numresolution = 0, matrix_width = 0; + + s = opj_optarg; + sscanf(s, "%d", &numlayers); + s++; + if (numlayers > 9) + s++; + + j2k_parameters->tcp_numlayers = numlayers; + numresolution = j2k_parameters->numresolution; + matrix_width = numresolution * 3; + j2k_parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); + s = s + 2; + + for (i = 0; i < numlayers; i++) { + row = &j2k_parameters->cp_matrice[i * matrix_width]; + col = row; + j2k_parameters->tcp_rates[i] = 1; + sscanf(s, "%d,", &col[0]); + s += 2; + if (col[0] > 9) + s++; + col[1] = 0; + col[2] = 0; + for (j = 1; j < numresolution; j++) { + col += 3; + sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); + s += 6; + if (col[0] > 9) + s++; + if (col[1] > 9) + s++; + if (col[2] > 9) + s++; + } + if (i < numlayers - 1) + s++; + } + j2k_parameters->cp_fixed_alloc = 1; + } + break; + /* ----------------------------------------------------- */ + case 't': /* tiles */ + sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy); + j2k_parameters->tile_size_on = OPJ_TRUE; + break; + /* ----------------------------------------------------- */ + case 'n': /* resolution */ + sscanf(opj_optarg, "%d", &j2k_parameters->numresolution); + break; + /* ----------------------------------------------------- */ + case 'c': { /* precinct dimension */ + char sep; + int res_spec = 0; + + char *s = opj_optarg; + do { + sep = 0; + sscanf(s, "[%d,%d]%c", &j2k_parameters->prcw_init[res_spec], + &j2k_parameters->prch_init[res_spec], &sep); + j2k_parameters->csty |= 0x01; + res_spec++; + s = strpbrk(s, "]") + 2; + } while (sep == ','); + j2k_parameters->res_spec = res_spec; + } + break; + + /* ----------------------------------------------------- */ + case 'b': { /* code-block dimension */ + int cblockw_init = 0, cblockh_init = 0; + sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init); + if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 + || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { + fprintf(stderr, + "!! Size of code_block error (option -b) !!\n\nRestriction :\n" + " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); + return 1; + } + j2k_parameters->cblockw_init = cblockw_init; + j2k_parameters->cblockh_init = cblockh_init; + } + break; + /* ----------------------------------------------------- */ + case 'p': { /* progression order */ + char progression[5]; + + strncpy(progression, opj_optarg, 5); + j2k_parameters->prog_order = give_progression(progression); + if (j2k_parameters->prog_order == -1) { + fprintf(stderr, "Unrecognized progression order " + "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); + return 1; + } + } + break; + /* ----------------------------------------------------- */ + case 's': { /* subsampling factor */ + if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->subsampling_dx, + &j2k_parameters->subsampling_dy) != 2) { + fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); + return 1; + } + } + break; + /* ----------------------------------------------------- */ + case 'd': { /* coordonnate of the reference grid */ + if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->image_offset_x0, + &j2k_parameters->image_offset_y0) != 2) { + fprintf(stderr, "-d 'coordonnate of the reference grid' argument " + "error !! [-d x0,y0]\n"); + return 1; + } + } + break; + /* ----------------------------------------------------- */ + case 'h': /* Display an help description */ + help_display(); + return 0; + break; + /* ----------------------------------------------------- */ + case 'P': { /* POC */ + int numpocs = 0; /* number of progression order change (POC) default 0 */ + opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ + + char *s = opj_optarg; + POC = j2k_parameters->POC; + + while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, + &POC[numpocs].resno0, &POC[numpocs].compno0, + &POC[numpocs].layno1, &POC[numpocs].resno1, + &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { + POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); + numpocs++; + while (*s && *s != '/') { + s++; + } + if (!*s) { + break; + } + s++; + } + j2k_parameters->numpocs = numpocs; + } + break; + /* ------------------------------------------------------ */ + case 'S': /* SOP marker */ + j2k_parameters->csty |= 0x02; + break; + /* ------------------------------------------------------ */ + case 'E': /* EPH marker */ + j2k_parameters->csty |= 0x04; + break; + /* ------------------------------------------------------ */ + case 'M': /* Mode switch pas tous au point !! */ + if (sscanf(opj_optarg, "%d", &value) == 1) { + for (i = 0; i <= 5; i++) { + int cache = value & (1 << i); + if (cache) + j2k_parameters->mode |= (1 << i); + } + } + break; + /* ------------------------------------------------------ */ + case 'R': { /* ROI */ + if (sscanf(opj_optarg, "OI:c=%d,U=%d", &j2k_parameters->roi_compno, + &j2k_parameters->roi_shift) != 2) { + fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n"); + return 1; + } + } + break; + /* ------------------------------------------------------ */ + case 'T': { /* Tile offset */ + if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tx0, &j2k_parameters->cp_ty0) != 2) { + fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); + return 1; + } + } + break; + /* ------------------------------------------------------ */ + case 'C': { /* Add a comment */ + j2k_parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); + if(j2k_parameters->cp_comment) { + strcpy(j2k_parameters->cp_comment, opj_optarg); + } + } + break; + /* ------------------------------------------------------ */ + case 'I': { /* reversible or not */ + j2k_parameters->irreversible = 1; + } + break; + /* ------------------------------------------------------ */ + case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */ + if (sscanf + (opj_optarg, "%d,%d,%d,%d", &mj2_parameters.w, &mj2_parameters.h, &mj2_parameters.CbCr_subsampling_dx, + &mj2_parameters.CbCr_subsampling_dy) != 4) { + fprintf(stderr, "-W argument error"); + return 1; + } + break; + /* ------------------------------------------------------ */ + case 'F': /* Video frame rate */ + if (sscanf(opj_optarg, "%d", &mj2_parameters.frame_rate) != 1) { + fprintf(stderr, "-F argument error"); + return 1; + } + break; + /* ------------------------------------------------------ */ + case 'D': /* Depth: the precision */ + if(sscanf(opj_optarg, "%d", &prec) != 1) prec = 0; + break; + + default: + return 1; + } + } + + /* Error messages */ + /* -------------- */ + if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) { + fprintf(stderr, + "Usage: %s -i yuv-file -o mj2-file (+ options)\n",argv[0]); + return 1; + } + if(prec < 1 || prec > 16) { + fprintf(stderr, "Error: Depth %d must be in the range 8 .. 16\n",prec); + return 1; + } + if ((j2k_parameters->cp_disto_alloc || j2k_parameters->cp_fixed_alloc || j2k_parameters->cp_fixed_quality) + && (!(j2k_parameters->cp_disto_alloc ^ j2k_parameters->cp_fixed_alloc ^ j2k_parameters->cp_fixed_quality))) { + fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); + return 1; + } /* mod fixed_quality */ + + /* if no rate entered, lossless by default */ + if (j2k_parameters->tcp_numlayers == 0) { + j2k_parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ + j2k_parameters->tcp_numlayers++; + j2k_parameters->cp_disto_alloc = 1; + } + + if((j2k_parameters->cp_tx0 > j2k_parameters->image_offset_x0) || (j2k_parameters->cp_ty0 > j2k_parameters->image_offset_y0)) { + fprintf(stderr, + "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", + j2k_parameters->cp_tx0, j2k_parameters->image_offset_x0, j2k_parameters->cp_ty0, j2k_parameters->image_offset_y0); + return 1; + } + + for (i = 0; i < j2k_parameters->numpocs; i++) { + if (j2k_parameters->POC[i].prg == -1) { + fprintf(stderr, + "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", + i + 1); + } + } + + if (j2k_parameters->cp_tdx > mj2_parameters.Dim[0] || j2k_parameters->cp_tdy > mj2_parameters.Dim[1]) { + fprintf(stderr, + "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", + j2k_parameters->cp_tdx, mj2_parameters.Dim[0], j2k_parameters->cp_tdy, mj2_parameters.Dim[1]); + return 1; + } + + /* to respect profile - 0 */ + /* ---------------------- */ + + x1 = !mj2_parameters.Dim[0] ? (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + + 1 : mj2_parameters.Dim[0] + (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + 1; + y1 = !mj2_parameters.Dim[1] ? (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + + 1 : mj2_parameters.Dim[1] + (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + 1; + mj2_parameters.numcomps = 3; /* YUV files only have 3 components */ + + mj2_parameters.prec = prec; + + j2k_parameters->tcp_mct = 0; + + mj2file = fopen(mj2_parameters.outfile, "wb"); + + if (!mj2file) { + fprintf(stderr, "failed to open %s for writing\n", argv[2]); + return 1; } - } - - /* Error messages */ - /* -------------- */ - if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) { - fprintf(stderr, - "Usage: %s -i yuv-file -o mj2-file (+ options)\n",argv[0]); - return 1; - } - if(prec < 1 || prec > 16) - { - fprintf(stderr, "Error: Depth %d must be in the range 8 .. 16\n",prec); - return 1; - } - if ((j2k_parameters->cp_disto_alloc || j2k_parameters->cp_fixed_alloc || j2k_parameters->cp_fixed_quality) - && (!(j2k_parameters->cp_disto_alloc ^ j2k_parameters->cp_fixed_alloc ^ j2k_parameters->cp_fixed_quality))) { - fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); - return 1; - } /* mod fixed_quality */ - - /* if no rate entered, lossless by default */ - if (j2k_parameters->tcp_numlayers == 0) { - j2k_parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ - j2k_parameters->tcp_numlayers++; - j2k_parameters->cp_disto_alloc = 1; - } - - if((j2k_parameters->cp_tx0 > j2k_parameters->image_offset_x0) || (j2k_parameters->cp_ty0 > j2k_parameters->image_offset_y0)) { - fprintf(stderr, - "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", - j2k_parameters->cp_tx0, j2k_parameters->image_offset_x0, j2k_parameters->cp_ty0, j2k_parameters->image_offset_y0); - return 1; - } - - for (i = 0; i < j2k_parameters->numpocs; i++) { - if (j2k_parameters->POC[i].prg == -1) { - fprintf(stderr, - "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", - i + 1); - } - } - - if (j2k_parameters->cp_tdx > mj2_parameters.Dim[0] || j2k_parameters->cp_tdy > mj2_parameters.Dim[1]) { - fprintf(stderr, - "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", - j2k_parameters->cp_tdx, mj2_parameters.Dim[0], j2k_parameters->cp_tdy, mj2_parameters.Dim[1]); - return 1; - } - - /* to respect profile - 0 */ - /* ---------------------- */ - - x1 = !mj2_parameters.Dim[0] ? (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx - + 1 : mj2_parameters.Dim[0] + (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + 1; - y1 = !mj2_parameters.Dim[1] ? (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy - + 1 : mj2_parameters.Dim[1] + (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + 1; - mj2_parameters.numcomps = 3; /* YUV files only have 3 components */ - - mj2_parameters.prec = prec; - - j2k_parameters->tcp_mct = 0; - - mj2file = fopen(mj2_parameters.outfile, "wb"); - - if (!mj2file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - - /* get a MJ2 decompressor handle */ - cinfo = mj2_create_compress(); - movie = (opj_mj2_t*)cinfo->mj2_handle; - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup encoder parameters */ - mj2_setup_encoder(movie, &mj2_parameters); - - movie->tk[0].num_samples = - yuv_num_frames(&movie->tk[0],mj2_parameters.infile); - - if (movie->tk[0].num_samples == 0) { - return 1; - } - - /* One sample per chunk*/ - movie->tk[0].chunk = (mj2_chunk_t*) - malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t)); - movie->tk[0].sample = (mj2_sample_t*) - malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t)); - - if (mj2_init_stdmovie(movie)) { - fprintf(stderr, "Error with movie initialization"); - return 1; - } - -/* Writing JP, FTYP and MDAT boxes */ -/* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/ - buf = (unsigned char*) - malloc (300 * sizeof(unsigned char)); - - cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); - - mj2_write_jp(cio); - mj2_write_ftyp(movie, cio); - - mdat_initpos = cio_tell(cio); - cio_skip(cio, 4); - - cio_write(cio, MJ2_MDAT, 4); - - fwrite(buf,cio_tell(cio),1,mj2file); - - offset = cio_tell(cio); - opj_cio_close(cio); - free(buf); - - for(i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) - { - if(movie->tk[i].track_type != 0) - { - fprintf(stderr, "Unable to write sound or hint tracks\n"); - } - else - { - mj2_tk_t *tk; - int buflen = 0; - - tk = &movie->tk[i]; - tk->num_chunks = tk->num_samples; - numframes = tk->num_samples; - tk->depth = prec; - - fprintf(stderr, "Video Track number %d\n", i); - - img = mj2_image_create(tk, j2k_parameters); - - buflen = 2 * (tk->w * tk->h * 8); - buf = (unsigned char *) malloc(buflen*sizeof(unsigned char)); - - for(sampleno = 0; sampleno < numframes; sampleno++) - { - double init_time = opj_clock(); - double elapsed_time; - - if(yuvtoimage(tk, img, sampleno, j2k_parameters, - mj2_parameters.infile)) - { - fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); - return 1; - } - -/* setup the encoder parameters using the current image and user parameters */ - opj_setup_encoder(cinfo, j2k_parameters, img); - - cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen); - - cio_skip(cio, 4); - cio_write(cio, JP2_JP2C, 4); /* JP2C*/ - -/* encode the image */ - bSuccess = opj_encode(cinfo, cio, img, NULL); - - if (!bSuccess) { - opj_cio_close(cio); - fprintf(stderr, "failed to encode image\n"); - return 1; - } - - len = cio_tell(cio) - 8; - cio_seek(cio, 0); - cio_write(cio, len+8,4); - opj_cio_close(cio); - - tk->sample[sampleno].sample_size = len+8; - tk->sample[sampleno].offset = offset; - tk->chunk[sampleno].offset = offset; /* There is one sample per chunk */ - fwrite(buf, 1, len+8, mj2file); - offset += len+8; - - elapsed_time = opj_clock()-init_time; - fprintf(stderr, "Frame number %d/%d encoded in %.2f mseconds\n", - sampleno + 1, numframes, elapsed_time*1000); - total_time += elapsed_time; - } /* for(sampleno */ - - free(buf); - opj_image_destroy(img); - } - }/* for(i */ - - fseek(mj2file, mdat_initpos, SEEK_SET); - - buf = (unsigned char*) malloc(4*sizeof(unsigned char)); - -/* Init a cio to write box length variable in a little endian way */ - cio = opj_cio_open(NULL, buf, 4); - cio_write(cio, offset - mdat_initpos, 4); - fwrite(buf, 4, 1, mj2file); - fseek(mj2file,0,SEEK_END); - free(buf); - -/* Writing MOOV box */ - buf = (unsigned char*) - malloc ((TEMP_BUF+numframes*20) * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20)); - mj2_write_moov(movie, cio); - fwrite(buf,cio_tell(cio),1,mj2file); - free(buf); - - fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n", - total_time, numframes, (float)numframes/total_time); - - /* Ending program */ - - fclose(mj2file); -/* free remaining compression structures */ - mj2_destroy_compress(movie); - free(cinfo); - - if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment); - if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice); - opj_cio_close(cio); - - return 0; + + /* get a MJ2 decompressor handle */ + cinfo = mj2_create_compress(); + movie = (opj_mj2_t*)cinfo->mj2_handle; + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); + + /* setup encoder parameters */ + mj2_setup_encoder(movie, &mj2_parameters); + + movie->tk[0].num_samples = + yuv_num_frames(&movie->tk[0],mj2_parameters.infile); + + if (movie->tk[0].num_samples == 0) { + return 1; + } + + /* One sample per chunk*/ + movie->tk[0].chunk = (mj2_chunk_t*) + malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t)); + movie->tk[0].sample = (mj2_sample_t*) + malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t)); + + if (mj2_init_stdmovie(movie)) { + fprintf(stderr, "Error with movie initialization"); + return 1; + } + + /* Writing JP, FTYP and MDAT boxes */ + /* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/ + buf = (unsigned char*) + malloc (300 * sizeof(unsigned char)); + + cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); + + mj2_write_jp(cio); + mj2_write_ftyp(movie, cio); + + mdat_initpos = cio_tell(cio); + cio_skip(cio, 4); + + cio_write(cio, MJ2_MDAT, 4); + + fwrite(buf,cio_tell(cio),1,mj2file); + + offset = cio_tell(cio); + opj_cio_close(cio); + free(buf); + + for(i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) { + if(movie->tk[i].track_type != 0) { + fprintf(stderr, "Unable to write sound or hint tracks\n"); + } else { + mj2_tk_t *tk; + int buflen = 0; + + tk = &movie->tk[i]; + tk->num_chunks = tk->num_samples; + numframes = tk->num_samples; + tk->depth = prec; + + fprintf(stderr, "Video Track number %d\n", i); + + img = mj2_image_create(tk, j2k_parameters); + + buflen = 2 * (tk->w * tk->h * 8); + buf = (unsigned char *) malloc(buflen*sizeof(unsigned char)); + + for(sampleno = 0; sampleno < numframes; sampleno++) { + double init_time = opj_clock(); + double elapsed_time; + + if(yuvtoimage(tk, img, sampleno, j2k_parameters, + mj2_parameters.infile)) { + fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); + return 1; + } + + /* setup the encoder parameters using the current image and user parameters */ + opj_setup_encoder(cinfo, j2k_parameters, img); + + cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen); + + cio_skip(cio, 4); + cio_write(cio, JP2_JP2C, 4); /* JP2C*/ + + /* encode the image */ + bSuccess = opj_encode(cinfo, cio, img, NULL); + + if (!bSuccess) { + opj_cio_close(cio); + fprintf(stderr, "failed to encode image\n"); + return 1; + } + + len = cio_tell(cio) - 8; + cio_seek(cio, 0); + cio_write(cio, len+8,4); + opj_cio_close(cio); + + tk->sample[sampleno].sample_size = len+8; + tk->sample[sampleno].offset = offset; + tk->chunk[sampleno].offset = offset; /* There is one sample per chunk */ + fwrite(buf, 1, len+8, mj2file); + offset += len+8; + + elapsed_time = opj_clock()-init_time; + fprintf(stderr, "Frame number %d/%d encoded in %.2f mseconds\n", + sampleno + 1, numframes, elapsed_time*1000); + total_time += elapsed_time; + } /* for(sampleno */ + + free(buf); + opj_image_destroy(img); + } + }/* for(i */ + + fseek(mj2file, mdat_initpos, SEEK_SET); + + buf = (unsigned char*) malloc(4*sizeof(unsigned char)); + + /* Init a cio to write box length variable in a little endian way */ + cio = opj_cio_open(NULL, buf, 4); + cio_write(cio, offset - mdat_initpos, 4); + fwrite(buf, 4, 1, mj2file); + fseek(mj2file,0,SEEK_END); + free(buf); + + /* Writing MOOV box */ + buf = (unsigned char*) + malloc ((TEMP_BUF+numframes*20) * sizeof(unsigned char)); + cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20)); + mj2_write_moov(movie, cio); + fwrite(buf,cio_tell(cio),1,mj2file); + free(buf); + + fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n", + total_time, numframes, (float)numframes/total_time); + + /* Ending program */ + + fclose(mj2file); + /* free remaining compression structures */ + mj2_destroy_compress(movie); + free(cinfo); + + if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment); + if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice); + opj_cio_close(cio); + + return 0; } diff --git a/src/bin/mj2/opj_mj2_decompress.c b/src/bin/mj2/opj_mj2_decompress.c index 086918c7..2168622a 100644 --- a/src/bin/mj2/opj_mj2_decompress.c +++ b/src/bin/mj2/opj_mj2_decompress.c @@ -50,196 +50,194 @@ /** sample error callback expecting a FILE* client object */ -static void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +static void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -static void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +static void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /* -------------------------------------------------------------------------- */ -int main(int argc, char *argv[]) { - mj2_dparameters_t mj2_parameters; /* decompression parameters */ - opj_dinfo_t* dinfo; - opj_event_mgr_t event_mgr; /* event manager */ - opj_cio_t *cio = NULL; - unsigned int tnum, snum; - opj_mj2_t *movie; - mj2_tk_t *track; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *file, *outfile; - char outfilename[50]; - opj_image_t *img = NULL; - unsigned int max_codstrm_size = 0; - double total_time = 0; - unsigned int numframes = 0; - - if (argc != 3) { - printf("Usage: %s inputfile.mj2 outputfile.yuv\n",argv[0]); - return 1; - } - - file = fopen(argv[1], "rb"); - - if (!file) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - /* Checking output file */ - outfile = fopen(argv[2], "w"); - if (!file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - fclose(outfile); - - /* - configure the event callbacks (not required) - setting of each callback is optionnal - */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = NULL; - - /* get a MJ2 decompressor handle */ - dinfo = mj2_create_decompress(); - movie = (opj_mj2_t*)dinfo->mj2_handle; - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - memset(&mj2_parameters, 0, sizeof(mj2_dparameters_t)); - /* set J2K decoding parameters to default values */ - opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters); - - /* setup the decoder decoding parameters using user parameters */ - mj2_setup_decoder(movie, &mj2_parameters); - - if (mj2_read_struct(file, movie)) /* Creating the movie structure */ - return 1; - - /* Decode first video track */ - for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) { - if (movie->tk[tnum].track_type == 0) - break; - } - - if (movie->tk[tnum].track_type != 0) { - printf("Error. Movie does not contain any video track\n"); - return 1; - } - - track = &movie->tk[tnum]; - - /* Output info on first video tracl */ - fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", - track->num_samples, track->w, track->h); - - max_codstrm_size = track->sample[0].sample_size-8; - frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(unsigned char)); - - numframes = track->num_samples; - - for (snum=0; snum < numframes; snum++) - { - double init_time = opj_clock(); - double elapsed_time; - - sample = &track->sample[snum]; - if (sample->sample_size-8 > max_codstrm_size) { - max_codstrm_size = sample->sample_size-8; - if ((frame_codestream = (unsigned char*) - realloc(frame_codestream, max_codstrm_size)) == NULL) { - printf("Error reallocation memory\n"); - return 1; - }; - } - fseek(file,sample->offset+8,SEEK_SET); - fread(frame_codestream, sample->sample_size-8, 1, file); /* Assuming that jp and ftyp markers size do */ - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); - - img = opj_decode(dinfo, cio); /* Decode J2K to image */ +int main(int argc, char *argv[]) +{ + mj2_dparameters_t mj2_parameters; /* decompression parameters */ + opj_dinfo_t* dinfo; + opj_event_mgr_t event_mgr; /* event manager */ + opj_cio_t *cio = NULL; + unsigned int tnum, snum; + opj_mj2_t *movie; + mj2_tk_t *track; + mj2_sample_t *sample; + unsigned char* frame_codestream; + FILE *file, *outfile; + char outfilename[50]; + opj_image_t *img = NULL; + unsigned int max_codstrm_size = 0; + double total_time = 0; + unsigned int numframes = 0; + + if (argc != 3) { + printf("Usage: %s inputfile.mj2 outputfile.yuv\n",argv[0]); + return 1; + } + + file = fopen(argv[1], "rb"); + + if (!file) { + fprintf(stderr, "failed to open %s for reading\n", argv[1]); + return 1; + } + + /* Checking output file */ + outfile = fopen(argv[2], "w"); + if (!file) { + fprintf(stderr, "failed to open %s for writing\n", argv[2]); + return 1; + } + fclose(outfile); + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = NULL; + + /* get a MJ2 decompressor handle */ + dinfo = mj2_create_decompress(); + movie = (opj_mj2_t*)dinfo->mj2_handle; + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + memset(&mj2_parameters, 0, sizeof(mj2_dparameters_t)); + /* set J2K decoding parameters to default values */ + opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters); + + /* setup the decoder decoding parameters using user parameters */ + mj2_setup_decoder(movie, &mj2_parameters); + + if (mj2_read_struct(file, movie)) /* Creating the movie structure */ + return 1; + + /* Decode first video track */ + for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) { + if (movie->tk[tnum].track_type == 0) + break; + } + + if (movie->tk[tnum].track_type != 0) { + printf("Error. Movie does not contain any video track\n"); + return 1; + } + + track = &movie->tk[tnum]; + + /* Output info on first video tracl */ + fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", + track->num_samples, track->w, track->h); + + max_codstrm_size = track->sample[0].sample_size-8; + frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(unsigned char)); + + numframes = track->num_samples; + + for (snum=0; snum < numframes; snum++) { + double init_time = opj_clock(); + double elapsed_time; + + sample = &track->sample[snum]; + if (sample->sample_size-8 > max_codstrm_size) { + max_codstrm_size = sample->sample_size-8; + if ((frame_codestream = (unsigned char*) + realloc(frame_codestream, max_codstrm_size)) == NULL) { + printf("Error reallocation memory\n"); + return 1; + }; + } + fseek(file,sample->offset+8,SEEK_SET); + fread(frame_codestream, sample->sample_size-8, 1, file); /* Assuming that jp and ftyp markers size do */ + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); + + img = opj_decode(dinfo, cio); /* Decode J2K to image */ #ifdef WANT_SYCC_TO_RGB - if(img->color_space == CLRSPC_SYCC) - { - color_sycc_to_rgb(img); - } + if(img->color_space == CLRSPC_SYCC) { + color_sycc_to_rgb(img); + } #endif - if(img->icc_profile_buf) - { + if(img->icc_profile_buf) { #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) - color_apply_icc_profile(img); + color_apply_icc_profile(img); #endif - free(img->icc_profile_buf); - img->icc_profile_buf = NULL; img->icc_profile_len = 0; - } + free(img->icc_profile_buf); + img->icc_profile_buf = NULL; + img->icc_profile_len = 0; + } + + if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) + && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) + || (img->numcomps == 1)) { + + if (!imagetoyuv(img, argv[2])) /* Convert image to YUV */ + return 1; + } else if ((img->numcomps == 3) && + (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& + (img->comps[2].dx == 1)) { /* If YUV 4:4:4 input --> to bmp */ + fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n"); + sprintf(outfilename,"output_%d.bmp",snum); + if (imagetobmp(img, outfilename)) /* Convert image to BMP */ + return 1; + + } else { + fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n"); + fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n"); + + sprintf(outfilename,"output_%d.j2k",snum); + outfile = fopen(outfilename, "wb"); + if (!outfile) { + fprintf(stderr, "failed to open %s for writing\n",outfilename); + return 1; + } + fwrite(frame_codestream,sample->sample_size-8,1,outfile); + fclose(outfile); + } + /* close the byte stream */ + opj_cio_close(cio); + /* free image data structure */ + opj_image_destroy(img); + elapsed_time = opj_clock()-init_time; + fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, numframes, elapsed_time*1000); + total_time += elapsed_time; - if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) - && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) - || (img->numcomps == 1)) { - - if (!imagetoyuv(img, argv[2])) /* Convert image to YUV */ - return 1; } - else if ((img->numcomps == 3) && - (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& - (img->comps[2].dx == 1))/* If YUV 4:4:4 input --> to bmp */ - { - fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n"); - sprintf(outfilename,"output_%d.bmp",snum); - if (imagetobmp(img, outfilename)) /* Convert image to BMP */ - return 1; - - } - else { - fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n"); - fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n"); - - sprintf(outfilename,"output_%d.j2k",snum); - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n",outfilename); - return 1; - } - fwrite(frame_codestream,sample->sample_size-8,1,outfile); - fclose(outfile); + + free(frame_codestream); + fclose(file); + + /* free remaining structures */ + if(dinfo) { + mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); } - /* close the byte stream */ - opj_cio_close(cio); - /* free image data structure */ - opj_image_destroy(img); - elapsed_time = opj_clock()-init_time; - fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, numframes, elapsed_time*1000); - total_time += elapsed_time; - - } - - free(frame_codestream); - fclose(file); - - /* free remaining structures */ - if(dinfo) { - mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); - } - free(dinfo); - - fprintf(stdout, "%d frame(s) correctly decompressed\n", snum); - fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n", total_time, (float)numframes/total_time); - - return 0; + free(dinfo); + + fprintf(stdout, "%d frame(s) correctly decompressed\n", snum); + fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n", total_time, (float)numframes/total_time); + + return 0; } diff --git a/src/bin/mj2/opj_mj2_extract.c b/src/bin/mj2/opj_mj2_extract.c index 25e6b79b..cb95788f 100644 --- a/src/bin/mj2/opj_mj2_extract.c +++ b/src/bin/mj2/opj_mj2_extract.c @@ -1,12 +1,12 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,110 +46,113 @@ /** sample error callback expecting a FILE* client object */ -void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ -void info_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); +void info_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ -int main(int argc, char *argv[]) { - opj_dinfo_t* dinfo; - opj_event_mgr_t event_mgr; /* event manager */ - int tnum; - unsigned int snum; - opj_mj2_t *movie; - mj2_tk_t *track; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *file, *outfile; - char outfilename[50]; - mj2_dparameters_t parameters; - - if (argc != 3) { - printf("Usage: %s mj2filename output_location\n",argv[0]); - printf("Example: %s foreman.mj2 output/foreman\n",argv[0]); - return 1; - } - - file = fopen(argv[1], "rb"); - - if (!file) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - /* - configure the event callbacks (not required) - setting of each callback is optionnal - */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* get a MJ2 decompressor handle */ - dinfo = mj2_create_decompress(); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - memset(¶meters, 0, sizeof(mj2_dparameters_t)); - movie = (opj_mj2_t*) dinfo->mj2_handle; - mj2_setup_decoder(movie, ¶meters); - - if (mj2_read_struct(file, movie)) /* Creating the movie structure*/ - return 1; - - /* Decode first video track */ - tnum = 0; - while (movie->tk[tnum].track_type != 0) - tnum ++; - - track = &movie->tk[tnum]; - - fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); - - for (snum=0; snum < track->num_samples; snum++) - { - sample = &track->sample[snum]; - frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker*/ - fseek(file,sample->offset+8,SEEK_SET); - fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do*/ - - sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n",outfilename); - return 1; +int main(int argc, char *argv[]) +{ + opj_dinfo_t* dinfo; + opj_event_mgr_t event_mgr; /* event manager */ + int tnum; + unsigned int snum; + opj_mj2_t *movie; + mj2_tk_t *track; + mj2_sample_t *sample; + unsigned char* frame_codestream; + FILE *file, *outfile; + char outfilename[50]; + mj2_dparameters_t parameters; + + if (argc != 3) { + printf("Usage: %s mj2filename output_location\n",argv[0]); + printf("Example: %s foreman.mj2 output/foreman\n",argv[0]); + return 1; } - fwrite(frame_codestream,sample->sample_size-8,1,outfile); - fclose(outfile); - free(frame_codestream); + + file = fopen(argv[1], "rb"); + + if (!file) { + fprintf(stderr, "failed to open %s for reading\n", argv[1]); + return 1; + } + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* get a MJ2 decompressor handle */ + dinfo = mj2_create_decompress(); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + memset(¶meters, 0, sizeof(mj2_dparameters_t)); + movie = (opj_mj2_t*) dinfo->mj2_handle; + mj2_setup_decoder(movie, ¶meters); + + if (mj2_read_struct(file, movie)) /* Creating the movie structure*/ + return 1; + + /* Decode first video track */ + tnum = 0; + while (movie->tk[tnum].track_type != 0) + tnum ++; + + track = &movie->tk[tnum]; + + fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); + + for (snum=0; snum < track->num_samples; snum++) { + sample = &track->sample[snum]; + frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker*/ + fseek(file,sample->offset+8,SEEK_SET); + fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do*/ + + sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); + outfile = fopen(outfilename, "wb"); + if (!outfile) { + fprintf(stderr, "failed to open %s for writing\n",outfilename); + return 1; + } + fwrite(frame_codestream,sample->sample_size-8,1,outfile); + fclose(outfile); + free(frame_codestream); } - fclose(file); - fprintf(stdout, "%d frames correctly extracted\n", snum); - - /* free remaining structures */ - if(dinfo) { - mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); - } - - return 0; + fclose(file); + fprintf(stdout, "%d frames correctly extracted\n", snum); + + /* free remaining structures */ + if(dinfo) { + mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); + } + + return 0; } diff --git a/src/bin/mj2/opj_mj2_wrap.c b/src/bin/mj2/opj_mj2_wrap.c index 59fb871d..515fc353 100644 --- a/src/bin/mj2/opj_mj2_wrap.c +++ b/src/bin/mj2/opj_mj2_wrap.c @@ -1,12 +1,12 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2007, Francois-Olivier Devaux * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,14 +41,15 @@ #include "jp2.h" #include "mj2.h" -static int int_ceildiv(int a, int b) { - return (a + b - 1) / b; +static int int_ceildiv(int a, int b) +{ + return (a + b - 1) / b; } /** Size of memory first allocated for MOOV box */ -#define TEMP_BUF 10000 +#define TEMP_BUF 10000 #define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51" @@ -56,153 +57,141 @@ Size of memory first allocated for MOOV box static int test_image(const char *fname, mj2_cparameters_t *cp) { - FILE *reader; - opj_image_t *image; - unsigned char *src; - opj_dinfo_t *dinfo; - opj_cio_t *cio; - opj_dparameters_t dparameters; - int success; - long src_len; - - success = 0; - - if((reader = fopen(fname, "rb")) == NULL) return success; - - fseek(reader, 0, SEEK_END); - src_len = ftell(reader); - fseek(reader, 0, SEEK_SET); - src = (unsigned char*) malloc(src_len); - fread(src, 1, src_len, reader); - fclose(reader); - - if(memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) - { - free(src); return success; - } - memset(&dparameters, 0, sizeof(opj_dparameters_t)); - - opj_set_default_decoder_parameters(&dparameters); - - dinfo = opj_create_decompress(CODEC_J2K); - - opj_setup_decoder(dinfo, &dparameters); - - cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len); - - image = opj_decode(dinfo, cio); - - free(src); cio->buffer = NULL; - opj_cio_close(cio); - - if(image == NULL) goto fin; - - cp->numcomps = image->numcomps; - cp->w = image->comps[0].w; - cp->h = image->comps[0].h; - cp->prec = image->comps[0].prec; - - if(image->numcomps > 2 ) - { - if((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 2) - && (image->comps[2].dy == 2))/* horizontal and vertical*/ - { -/* Y420*/ - cp->enumcs = ENUMCS_SYCC; - cp->CbCr_subsampling_dx = 2; - cp->CbCr_subsampling_dy = 2; - } - else - if((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1))/* horizontal only*/ - { -/* Y422*/ - cp->enumcs = ENUMCS_SYCC; - cp->CbCr_subsampling_dx = 2; - cp->CbCr_subsampling_dy = 1; - } - else - if((image->comps[0].dx == 1) - && (image->comps[1].dx == 1) - && (image->comps[2].dx == 1) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) - { -/* Y444 or RGB */ - - if(image->color_space == CLRSPC_SRGB) - { - cp->enumcs = ENUMCS_SRGB; - -/* cp->CbCr_subsampling_dx = 0; */ -/* cp->CbCr_subsampling_dy = 0; */ - } - else - { - cp->enumcs = ENUMCS_SYCC; - - cp->CbCr_subsampling_dx = 1; - cp->CbCr_subsampling_dy = 1; - } - } - else - { - goto fin; - } - } - else - { - cp->enumcs = ENUMCS_GRAY; -/* cp->CbCr_subsampling_dx = 0; */ -/* cp->CbCr_subsampling_dy = 0; */ - } - if(image->icc_profile_buf) - { - cp->meth = 2; - free(image->icc_profile_buf); image->icc_profile_buf = NULL; - } - else cp->meth = 1; - - success = 1; + FILE *reader; + opj_image_t *image; + unsigned char *src; + opj_dinfo_t *dinfo; + opj_cio_t *cio; + opj_dparameters_t dparameters; + int success; + long src_len; + + success = 0; + + if((reader = fopen(fname, "rb")) == NULL) return success; + + fseek(reader, 0, SEEK_END); + src_len = ftell(reader); + fseek(reader, 0, SEEK_SET); + src = (unsigned char*) malloc(src_len); + fread(src, 1, src_len, reader); + fclose(reader); + + if(memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) { + free(src); + return success; + } + memset(&dparameters, 0, sizeof(opj_dparameters_t)); + + opj_set_default_decoder_parameters(&dparameters); + + dinfo = opj_create_decompress(CODEC_J2K); + + opj_setup_decoder(dinfo, &dparameters); + + cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len); + + image = opj_decode(dinfo, cio); + + free(src); + cio->buffer = NULL; + opj_cio_close(cio); + + if(image == NULL) goto fin; + + cp->numcomps = image->numcomps; + cp->w = image->comps[0].w; + cp->h = image->comps[0].h; + cp->prec = image->comps[0].prec; + + if(image->numcomps > 2 ) { + if((image->comps[0].dx == 1) + && (image->comps[1].dx == 2) + && (image->comps[2].dx == 2) + && (image->comps[0].dy == 1) + && (image->comps[1].dy == 2) + && (image->comps[2].dy == 2)) { /* horizontal and vertical*/ + /* Y420*/ + cp->enumcs = ENUMCS_SYCC; + cp->CbCr_subsampling_dx = 2; + cp->CbCr_subsampling_dy = 2; + } else if((image->comps[0].dx == 1) + && (image->comps[1].dx == 2) + && (image->comps[2].dx == 2) + && (image->comps[0].dy == 1) + && (image->comps[1].dy == 1) + && (image->comps[2].dy == 1)) { /* horizontal only*/ + /* Y422*/ + cp->enumcs = ENUMCS_SYCC; + cp->CbCr_subsampling_dx = 2; + cp->CbCr_subsampling_dy = 1; + } else if((image->comps[0].dx == 1) + && (image->comps[1].dx == 1) + && (image->comps[2].dx == 1) + && (image->comps[0].dy == 1) + && (image->comps[1].dy == 1) + && (image->comps[2].dy == 1)) { + /* Y444 or RGB */ + + if(image->color_space == CLRSPC_SRGB) { + cp->enumcs = ENUMCS_SRGB; + + /* cp->CbCr_subsampling_dx = 0; */ + /* cp->CbCr_subsampling_dy = 0; */ + } else { + cp->enumcs = ENUMCS_SYCC; + + cp->CbCr_subsampling_dx = 1; + cp->CbCr_subsampling_dy = 1; + } + } else { + goto fin; + } + } else { + cp->enumcs = ENUMCS_GRAY; + /* cp->CbCr_subsampling_dx = 0; */ + /* cp->CbCr_subsampling_dy = 0; */ + } + if(image->icc_profile_buf) { + cp->meth = 2; + free(image->icc_profile_buf); + image->icc_profile_buf = NULL; + } else cp->meth = 1; + + success = 1; fin: - if(dinfo) - opj_destroy_decompress(dinfo); + if(dinfo) + opj_destroy_decompress(dinfo); - if(image) - opj_image_destroy(image); + if(image) + opj_image_destroy(image); - return success; + return success; } /** sample error callback expecting a FILE* client object */ -static void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +static void error_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ -static void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +static void warning_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ -static void info_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); +static void info_callback(const char *msg, void *client_data) +{ + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ @@ -211,316 +200,311 @@ static void info_callback(const char *msg, void *client_data) { static void read_siz_marker(FILE *file, opj_image_t *image) { - int len,i; - char buf, buf2[2]; - unsigned char *siz_buffer; - opj_cio_t *cio; - - fseek(file, 0, SEEK_SET); - do { - fread(&buf,1,1, file); - if (buf==(char)0xff) - fread(&buf,1,1, file); - } - while (!(buf==(char)0x51)); - - fread(buf2,2,1,file); /* Lsiz */ - len = ((buf2[0])<<8) + buf2[1]; - - siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char)); - fread(siz_buffer,len, 1, file); - cio = opj_cio_open(NULL, siz_buffer, len); - - cio_read(cio, 2); /* Rsiz (capabilities) */ - image->x1 = cio_read(cio, 4); /* Xsiz */ - image->y1 = cio_read(cio, 4); /* Ysiz */ - image->x0 = cio_read(cio, 4); /* X0siz */ - image->y0 = cio_read(cio, 4); /* Y0siz */ - cio_skip(cio, 16); /* XTsiz, YTsiz, XT0siz, YT0siz */ - - image->numcomps = cio_read(cio,2); /* Csiz */ - image->comps = - (opj_image_comp_t *) malloc(image->numcomps * sizeof(opj_image_comp_t)); - - for (i = 0; i < image->numcomps; i++) { - int tmp; - tmp = cio_read(cio,1); /* Ssiz_i */ - image->comps[i].prec = (tmp & 0x7f) + 1; - image->comps[i].sgnd = tmp >> 7; - image->comps[i].dx = cio_read(cio,1); /* XRsiz_i */ - image->comps[i].dy = cio_read(cio,1); /* YRsiz_i */ - image->comps[i].resno_decoded = 0; /* number of resolution decoded */ - image->comps[i].factor = 0; /* reducing factor by component */ - } - fseek(file, 0, SEEK_SET); - opj_cio_close(cio); - free(siz_buffer); + int len,i; + char buf, buf2[2]; + unsigned char *siz_buffer; + opj_cio_t *cio; + + fseek(file, 0, SEEK_SET); + do { + fread(&buf,1,1, file); + if (buf==(char)0xff) + fread(&buf,1,1, file); + } while (!(buf==(char)0x51)); + + fread(buf2,2,1,file); /* Lsiz */ + len = ((buf2[0])<<8) + buf2[1]; + + siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char)); + fread(siz_buffer,len, 1, file); + cio = opj_cio_open(NULL, siz_buffer, len); + + cio_read(cio, 2); /* Rsiz (capabilities) */ + image->x1 = cio_read(cio, 4); /* Xsiz */ + image->y1 = cio_read(cio, 4); /* Ysiz */ + image->x0 = cio_read(cio, 4); /* X0siz */ + image->y0 = cio_read(cio, 4); /* Y0siz */ + cio_skip(cio, 16); /* XTsiz, YTsiz, XT0siz, YT0siz */ + + image->numcomps = cio_read(cio,2); /* Csiz */ + image->comps = + (opj_image_comp_t *) malloc(image->numcomps * sizeof(opj_image_comp_t)); + + for (i = 0; i < image->numcomps; i++) { + int tmp; + tmp = cio_read(cio,1); /* Ssiz_i */ + image->comps[i].prec = (tmp & 0x7f) + 1; + image->comps[i].sgnd = tmp >> 7; + image->comps[i].dx = cio_read(cio,1); /* XRsiz_i */ + image->comps[i].dy = cio_read(cio,1); /* YRsiz_i */ + image->comps[i].resno_decoded = 0; /* number of resolution decoded */ + image->comps[i].factor = 0; /* reducing factor by component */ + } + fseek(file, 0, SEEK_SET); + opj_cio_close(cio); + free(siz_buffer); } -static void setparams(opj_mj2_t *movie, opj_image_t *image) { - int i, depth_0, depth, sign; - - movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); - movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); - mj2_init_stdmovie(movie); - - movie->tk[0].depth = image->comps[0].prec; - - if (image->numcomps==3) { - if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 1) - && (image->comps[2].dx == 1)) - movie->tk[0].CbCr_subsampling_dx = 1; - else - if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2)) - movie->tk[0].CbCr_subsampling_dx = 2; - else - fprintf(stderr,"Image component sizes are incoherent\n"); - - if ((image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) - movie->tk[0].CbCr_subsampling_dy = 1; - else - if ((image->comps[0].dy == 1) - && (image->comps[1].dy == 2) - && (image->comps[2].dy == 2)) - movie->tk[0].CbCr_subsampling_dy = 2; +static void setparams(opj_mj2_t *movie, opj_image_t *image) +{ + int i, depth_0, depth, sign; + + movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); + movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); + mj2_init_stdmovie(movie); + + movie->tk[0].depth = image->comps[0].prec; + + if (image->numcomps==3) { + if ((image->comps[0].dx == 1) + && (image->comps[1].dx == 1) + && (image->comps[2].dx == 1)) + movie->tk[0].CbCr_subsampling_dx = 1; + else if ((image->comps[0].dx == 1) + && (image->comps[1].dx == 2) + && (image->comps[2].dx == 2)) + movie->tk[0].CbCr_subsampling_dx = 2; + else + fprintf(stderr,"Image component sizes are incoherent\n"); + + if ((image->comps[0].dy == 1) + && (image->comps[1].dy == 1) + && (image->comps[2].dy == 1)) + movie->tk[0].CbCr_subsampling_dy = 1; + else if ((image->comps[0].dy == 1) + && (image->comps[1].dy == 2) + && (image->comps[2].dy == 2)) + movie->tk[0].CbCr_subsampling_dy = 2; + else + fprintf(stderr,"Image component sizes are incoherent\n"); + } + + movie->tk[0].sample_rate = 25; + + movie->tk[0].jp2_struct.numcomps = image->numcomps; /* NC */ + + /* Init Standard jp2 structure */ + + movie->tk[0].jp2_struct.comps = + (opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); + movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/ + movie->tk[0].jp2_struct.approx = 0; /* APPROX*/ + movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */ + movie->tk[0].jp2_struct.minversion = 0; /* MinV */ + movie->tk[0].jp2_struct.numcl = 1; + movie->tk[0].jp2_struct.cl = (unsigned int *) malloc(movie->tk[0].jp2_struct.numcl * sizeof(int)); + movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */ + movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/ + movie->tk[0].jp2_struct.UnkC = 0; /* UnkC, colorspace specified in colr box*/ + movie->tk[0].jp2_struct.IPR = 0; /* IPR, no intellectual property*/ + movie->tk[0].jp2_struct.w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); + movie->tk[0].jp2_struct.h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); + + depth_0 = image->comps[0].prec - 1; + sign = image->comps[0].sgnd; + movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7); + + for (i = 1; i < image->numcomps; i++) { + depth = image->comps[i].prec - 1; + sign = image->comps[i].sgnd; + if (depth_0 != depth) + movie->tk[0].jp2_struct.bpc = 255; + } + + for (i = 0; i < image->numcomps; i++) + movie->tk[0].jp2_struct.comps[i].bpcc = + image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); + + if ((image->numcomps == 1 || image->numcomps == 3) + && (movie->tk[0].jp2_struct.bpc != 255)) + movie->tk[0].jp2_struct.meth = 1; else - fprintf(stderr,"Image component sizes are incoherent\n"); - } - - movie->tk[0].sample_rate = 25; - - movie->tk[0].jp2_struct.numcomps = image->numcomps; /* NC */ - - /* Init Standard jp2 structure */ - - movie->tk[0].jp2_struct.comps = - (opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); - movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/ - movie->tk[0].jp2_struct.approx = 0; /* APPROX*/ - movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */ - movie->tk[0].jp2_struct.minversion = 0; /* MinV */ - movie->tk[0].jp2_struct.numcl = 1; - movie->tk[0].jp2_struct.cl = (unsigned int *) malloc(movie->tk[0].jp2_struct.numcl * sizeof(int)); - movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */ - movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/ - movie->tk[0].jp2_struct.UnkC = 0; /* UnkC, colorspace specified in colr box*/ - movie->tk[0].jp2_struct.IPR = 0; /* IPR, no intellectual property*/ - movie->tk[0].jp2_struct.w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); - movie->tk[0].jp2_struct.h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); - - depth_0 = image->comps[0].prec - 1; - sign = image->comps[0].sgnd; - movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7); - - for (i = 1; i < image->numcomps; i++) { - depth = image->comps[i].prec - 1; - sign = image->comps[i].sgnd; - if (depth_0 != depth) - movie->tk[0].jp2_struct.bpc = 255; - } - - for (i = 0; i < image->numcomps; i++) - movie->tk[0].jp2_struct.comps[i].bpcc = - image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); - - if ((image->numcomps == 1 || image->numcomps == 3) - && (movie->tk[0].jp2_struct.bpc != 255)) - movie->tk[0].jp2_struct.meth = 1; - else - movie->tk[0].jp2_struct.meth = 2; - + movie->tk[0].jp2_struct.meth = 2; + if (image->numcomps == 1) - movie->tk[0].jp2_struct.enumcs = 17; /* Grayscale */ - - else - if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 1) - && (image->comps[2].dx == 1) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) - movie->tk[0].jp2_struct.enumcs = 16; /* RGB */ - - else - if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 2) - && (image->comps[2].dy == 2)) - movie->tk[0].jp2_struct.enumcs = 18; /* YUV */ - - else - movie->tk[0].jp2_struct.enumcs = 0; /* Unknown profile */ + movie->tk[0].jp2_struct.enumcs = 17; /* Grayscale */ + + else if ((image->comps[0].dx == 1) + && (image->comps[1].dx == 1) + && (image->comps[2].dx == 1) + && (image->comps[0].dy == 1) + && (image->comps[1].dy == 1) + && (image->comps[2].dy == 1)) + movie->tk[0].jp2_struct.enumcs = 16; /* RGB */ + + else if ((image->comps[0].dx == 1) + && (image->comps[1].dx == 2) + && (image->comps[2].dx == 2) + && (image->comps[0].dy == 1) + && (image->comps[1].dy == 2) + && (image->comps[2].dy == 2)) + movie->tk[0].jp2_struct.enumcs = 18; /* YUV */ + + else + movie->tk[0].jp2_struct.enumcs = 0; /* Unknown profile */ } -int main(int argc, char *argv[]) { - opj_cinfo_t* cinfo; - opj_event_mgr_t event_mgr; /* event manager */ - unsigned int snum; - opj_mj2_t *movie; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *mj2file, *j2kfile; - char *j2kfilename; - unsigned char *buf; - int offset, mdat_initpos; - opj_image_t img; - opj_cio_t *cio; - mj2_cparameters_t parameters; - - if (argc != 3) { - printf("Usage: %s source_location mj2_filename\n",argv[0]); - printf("Example: %s input/input output.mj2\n",argv[0]); - return 1; - } - - mj2file = fopen(argv[2], "wb"); - - if (!mj2file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - memset(&img, 0, sizeof(opj_image_t)); - /* - configure the event callbacks (not required) - setting of each callback is optionnal - */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* get a MJ2 decompressor handle */ - cinfo = mj2_create_compress(); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup the decoder encoding parameters using user parameters */ - memset(¶meters, 0, sizeof(mj2_cparameters_t)); - movie = (opj_mj2_t*) cinfo->mj2_handle; - - j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */ - sprintf(j2kfilename, "%s_00001.j2k",argv[1]); - - if(test_image(j2kfilename, ¶meters) == 0) goto fin; - - parameters.frame_rate = 25; /* DEFAULT */ - - mj2_setup_encoder(movie, ¶meters); - - - /* Writing JP, FTYP and MDAT boxes - Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ - - buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, 300); - mj2_write_jp(cio); - mj2_write_ftyp(movie, cio); - mdat_initpos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio,MJ2_MDAT, 4); - fwrite(buf,cio_tell(cio),1,mj2file); - free(buf); - - /* Insert each j2k codestream in a JP2C box */ - snum=0; - offset = 0; - while(1) - { - mj2_sample_t * new_sample; - mj2_chunk_t * new_chunk; - sample = &movie->tk[0].sample[snum]; - sprintf(j2kfilename,"%s_%05d.j2k",argv[1],snum); - j2kfile = fopen(j2kfilename, "rb"); - if (!j2kfile) { - if (snum==0) { /* Could not open a single codestream */ - fprintf(stderr, "failed to open %s for reading\n",j2kfilename); - return 1; - } - else { /* Tried to open a inexistant codestream */ - fprintf(stdout,"%d frames are being added to the MJ2 file\n",snum); - break; - } +int main(int argc, char *argv[]) +{ + opj_cinfo_t* cinfo; + opj_event_mgr_t event_mgr; /* event manager */ + unsigned int snum; + opj_mj2_t *movie; + mj2_sample_t *sample; + unsigned char* frame_codestream; + FILE *mj2file, *j2kfile; + char *j2kfilename; + unsigned char *buf; + int offset, mdat_initpos; + opj_image_t img; + opj_cio_t *cio; + mj2_cparameters_t parameters; + + if (argc != 3) { + printf("Usage: %s source_location mj2_filename\n",argv[0]); + printf("Example: %s input/input output.mj2\n",argv[0]); + return 1; } - /* Calculating offset for samples and chunks */ - offset += cio_tell(cio); - sample->offset = offset; - movie->tk[0].chunk[snum].offset = offset; /* There will be one sample per chunk */ - - /* Calculating sample size */ - fseek(j2kfile,0,SEEK_END); - sample->sample_size = ftell(j2kfile) + 8; /* Sample size is codestream + JP2C box header */ - fseek(j2kfile,0,SEEK_SET); - - /* Reading siz marker of j2k image for the first codestream */ - if (snum==0) - read_siz_marker(j2kfile, &img); - - /* Writing JP2C box header */ - frame_codestream = (unsigned char*) malloc (sample->sample_size+8); - cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); - cio_write(cio,sample->sample_size, 4); /* Sample size */ - cio_write(cio,JP2_JP2C, 4); /* JP2C */ - - /* Writing codestream from J2K file to MJ2 file */ - fread(frame_codestream+8,sample->sample_size-8,1,j2kfile); - fwrite(frame_codestream,sample->sample_size,1,mj2file); - cio_skip(cio, sample->sample_size-8); - - /* Ending loop */ - fclose(j2kfile); - snum++; - new_sample = (mj2_sample_t*) - realloc(movie->tk[0].sample, (snum+1) * sizeof(mj2_sample_t)); - new_chunk = (mj2_chunk_t*) - realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); - if (new_sample && new_chunk) { - movie->tk[0].sample = new_sample; - movie->tk[0].chunk = new_chunk; - } else { - fprintf(stderr, "Failed to allocate enough memory to read %s\n", j2kfilename); - return 1; + mj2file = fopen(argv[2], "wb"); + + if (!mj2file) { + fprintf(stderr, "failed to open %s for writing\n", argv[2]); + return 1; + } + memset(&img, 0, sizeof(opj_image_t)); + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* get a MJ2 decompressor handle */ + cinfo = mj2_create_compress(); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); + + /* setup the decoder encoding parameters using user parameters */ + memset(¶meters, 0, sizeof(mj2_cparameters_t)); + movie = (opj_mj2_t*) cinfo->mj2_handle; + + j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */ + sprintf(j2kfilename, "%s_00001.j2k",argv[1]); + + if(test_image(j2kfilename, ¶meters) == 0) goto fin; + + parameters.frame_rate = 25; /* DEFAULT */ + + mj2_setup_encoder(movie, ¶meters); + + + /* Writing JP, FTYP and MDAT boxes + Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ + + buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); + cio = opj_cio_open(movie->cinfo, buf, 300); + mj2_write_jp(cio); + mj2_write_ftyp(movie, cio); + mdat_initpos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio,MJ2_MDAT, 4); + fwrite(buf,cio_tell(cio),1,mj2file); + free(buf); + + /* Insert each j2k codestream in a JP2C box */ + snum=0; + offset = 0; + while(1) { + mj2_sample_t * new_sample; + mj2_chunk_t * new_chunk; + sample = &movie->tk[0].sample[snum]; + sprintf(j2kfilename,"%s_%05d.j2k",argv[1],snum); + j2kfile = fopen(j2kfilename, "rb"); + if (!j2kfile) { + if (snum==0) { /* Could not open a single codestream */ + fprintf(stderr, "failed to open %s for reading\n",j2kfilename); + return 1; + } else { /* Tried to open a inexistant codestream */ + fprintf(stdout,"%d frames are being added to the MJ2 file\n",snum); + break; + } + } + + /* Calculating offset for samples and chunks */ + offset += cio_tell(cio); + sample->offset = offset; + movie->tk[0].chunk[snum].offset = offset; /* There will be one sample per chunk */ + + /* Calculating sample size */ + fseek(j2kfile,0,SEEK_END); + sample->sample_size = ftell(j2kfile) + 8; /* Sample size is codestream + JP2C box header */ + fseek(j2kfile,0,SEEK_SET); + + /* Reading siz marker of j2k image for the first codestream */ + if (snum==0) + read_siz_marker(j2kfile, &img); + + /* Writing JP2C box header */ + frame_codestream = (unsigned char*) malloc (sample->sample_size+8); + cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); + cio_write(cio,sample->sample_size, 4); /* Sample size */ + cio_write(cio,JP2_JP2C, 4); /* JP2C */ + + /* Writing codestream from J2K file to MJ2 file */ + fread(frame_codestream+8,sample->sample_size-8,1,j2kfile); + fwrite(frame_codestream,sample->sample_size,1,mj2file); + cio_skip(cio, sample->sample_size-8); + + /* Ending loop */ + fclose(j2kfile); + snum++; + new_sample = (mj2_sample_t*) + realloc(movie->tk[0].sample, (snum+1) * sizeof(mj2_sample_t)); + new_chunk = (mj2_chunk_t*) + realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); + if (new_sample && new_chunk) { + movie->tk[0].sample = new_sample; + movie->tk[0].chunk = new_chunk; + } else { + fprintf(stderr, "Failed to allocate enough memory to read %s\n", j2kfilename); + return 1; + } + free(frame_codestream); } - free(frame_codestream); - } - - /* Writing the MDAT box length in header */ - offset += cio_tell(cio); - buf = (unsigned char*) malloc (4 * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, 4); - cio_write(cio,offset-mdat_initpos,4); - fseek(mj2file,(long)mdat_initpos,SEEK_SET); - fwrite(buf,4,1,mj2file); - fseek(mj2file,0,SEEK_END); - free(buf); - - /* Setting movie parameters */ - movie->tk[0].num_samples=snum; - movie->tk[0].num_chunks=snum; - setparams(movie, &img); - - /* Writing MOOV box */ - buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20)); - mj2_write_moov(movie, cio); - fwrite(buf,cio_tell(cio),1,mj2file); - - /* Ending program */ - free(img.comps); - opj_cio_close(cio); + + /* Writing the MDAT box length in header */ + offset += cio_tell(cio); + buf = (unsigned char*) malloc (4 * sizeof(unsigned char)); + cio = opj_cio_open(movie->cinfo, buf, 4); + cio_write(cio,offset-mdat_initpos,4); + fseek(mj2file,(long)mdat_initpos,SEEK_SET); + fwrite(buf,4,1,mj2file); + fseek(mj2file,0,SEEK_END); + free(buf); + + /* Setting movie parameters */ + movie->tk[0].num_samples=snum; + movie->tk[0].num_chunks=snum; + setparams(movie, &img); + + /* Writing MOOV box */ + buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char)); + cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20)); + mj2_write_moov(movie, cio); + fwrite(buf,cio_tell(cio),1,mj2file); + + /* Ending program */ + free(img.comps); + opj_cio_close(cio); fin: - fclose(mj2file); - mj2_destroy_compress(movie); - free(j2kfilename); + fclose(mj2file); + mj2_destroy_compress(movie); + free(j2kfilename); - return 0; + return 0; } diff --git a/src/bin/wx/OPJViewer/source/OPJViewer.h b/src/bin/wx/OPJViewer/source/OPJViewer.h index 0d49468a..ed081888 100644 --- a/src/bin/wx/OPJViewer/source/OPJViewer.h +++ b/src/bin/wx/OPJViewer/source/OPJViewer.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -180,73 +180,83 @@ class OPJChildFrame; ////////////////////////////////// class OPJViewerApp: public wxApp { - // public methods and variables - public: - - // class constructor - OPJViewerApp() { m_showImages = true; m_showButtons = false; } + // public methods and variables +public: - // other methods - bool OnInit(void); - int OnExit(void); - void SetShowImages(bool show) { m_showImages = show; } - bool ShowImages() const { return m_showImages; } - void ShowCmdLine(const wxCmdLineParser& parser); + // class constructor + OPJViewerApp() + { + m_showImages = true; + m_showButtons = false; + } + + // other methods + bool OnInit(void); + int OnExit(void); + void SetShowImages(bool show) + { + m_showImages = show; + } + bool ShowImages() const + { + return m_showImages; + } + void ShowCmdLine(const wxCmdLineParser& parser); - // all the threads currently alive - as soon as the thread terminates, it's - // removed from the array - wxArrayThread m_deco_threads, m_parse_threads, m_enco_threads; + // all the threads currently alive - as soon as the thread terminates, it's + // removed from the array + wxArrayThread m_deco_threads, m_parse_threads, m_enco_threads; - // crit section protects access to all of the arrays below - wxCriticalSection m_deco_critsect, m_parse_critsect, m_enco_critsect; + // crit section protects access to all of the arrays below + wxCriticalSection m_deco_critsect, m_parse_critsect, m_enco_critsect; - // semaphore used to wait for the threads to exit, see OPJFrame::OnQuit() - wxSemaphore m_deco_semAllDone, m_parse_semAllDone, m_enco_semAllDone; + // semaphore used to wait for the threads to exit, see OPJFrame::OnQuit() + wxSemaphore m_deco_semAllDone, m_parse_semAllDone, m_enco_semAllDone; - // the last exiting thread should post to m_semAllDone if this is true - // (protected by the same m_critsect) - bool m_deco_waitingUntilAllDone, m_parse_waitingUntilAllDone, m_enco_waitingUntilAllDone; + // the last exiting thread should post to m_semAllDone if this is true + // (protected by the same m_critsect) + bool m_deco_waitingUntilAllDone, m_parse_waitingUntilAllDone, m_enco_waitingUntilAllDone; - // the list of all filenames written in the command line - wxArrayString m_filelist; + // the list of all filenames written in the command line + wxArrayString m_filelist; - // displaying engine parameters - int m_resizemethod; + // displaying engine parameters + int m_resizemethod; - // decoding engine parameters - bool m_enabledeco, m_enableparse; - int m_reducefactor, m_qualitylayers, m_components, m_framenum; + // decoding engine parameters + bool m_enabledeco, m_enableparse; + int m_reducefactor, m_qualitylayers, m_components, m_framenum; #ifdef USE_JPWL - bool m_enablejpwl, m_enablejpwle; - int m_expcomps, m_maxtiles; + bool m_enablejpwl, m_enablejpwle; + int m_expcomps, m_maxtiles; #endif // USE_JPWL - int m_framewidth, m_frameheight; - - // encoding engine parameters - wxString m_subsampling, m_origin, m_rates, m_comment, m_index, m_quality; - wxString m_cbsize, m_prsize, m_tsize, m_torigin, m_poc; - bool m_enablecomm, m_enableidx, m_multicomp, m_irreversible, m_enablesop, m_enableeph; - bool m_enablebypass, m_enablereset, m_enablerestart, m_enablevsc, m_enableerterm; - bool m_enablesegmark, m_enablepoc; - bool m_enablequality; - int m_resolutions, m_progression; + int m_framewidth, m_frameheight; + + // encoding engine parameters + wxString m_subsampling, m_origin, m_rates, m_comment, m_index, m_quality; + wxString m_cbsize, m_prsize, m_tsize, m_torigin, m_poc; + bool m_enablecomm, m_enableidx, m_multicomp, m_irreversible, m_enablesop, m_enableeph; + bool m_enablebypass, m_enablereset, m_enablerestart, m_enablevsc, m_enableerterm; + bool m_enablesegmark, m_enablepoc; + bool m_enablequality; + int m_resolutions, m_progression; #ifdef USE_JPWL - int m_hprotsel[MYJPWL_MAX_NO_TILESPECS], m_pprotsel[MYJPWL_MAX_NO_TILESPECS]; - int m_htileval[MYJPWL_MAX_NO_TILESPECS], m_ptileval[MYJPWL_MAX_NO_TILESPECS], - m_ppackval[MYJPWL_MAX_NO_TILESPECS]; - int m_sensisel[MYJPWL_MAX_NO_TILESPECS], m_stileval[MYJPWL_MAX_NO_TILESPECS]; + int m_hprotsel[MYJPWL_MAX_NO_TILESPECS], m_pprotsel[MYJPWL_MAX_NO_TILESPECS]; + int m_htileval[MYJPWL_MAX_NO_TILESPECS], m_ptileval[MYJPWL_MAX_NO_TILESPECS], + m_ppackval[MYJPWL_MAX_NO_TILESPECS]; + int m_sensisel[MYJPWL_MAX_NO_TILESPECS], m_stileval[MYJPWL_MAX_NO_TILESPECS]; #endif // USE_JPWL - // some layout settings - bool m_showtoolbar, m_showbrowser, m_showpeeker; - int m_browserwidth, m_peekerheight; + // some layout settings + bool m_showtoolbar, m_showbrowser, m_showpeeker; + int m_browserwidth, m_peekerheight; - // application configuration - wxConfig *OPJconfig; + // application configuration + wxConfig *OPJconfig; - // private methods and variables - private: - bool m_showImages, m_showButtons; + // private methods and variables +private: + bool m_showImages, m_showButtons; }; @@ -257,37 +267,38 @@ DECLARE_APP(OPJViewerApp) /////////////////////////////////////////// class OPJCanvas: public wxScrolledWindow { - // public methods and variables - public: + // public methods and variables +public: - // class constructor - OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, const wxSize& size); + // class constructor + OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, const wxSize& size); - virtual void OnDraw(wxDC& dc); - void OnEvent(wxMouseEvent& event); - void WriteText(const wxString& text) { -#ifndef __WXGTK__ - wxMutexGuiEnter(); + virtual void OnDraw(wxDC& dc); + void OnEvent(wxMouseEvent& event); + void WriteText(const wxString& text) + { +#ifndef __WXGTK__ + wxMutexGuiEnter(); #endif //__WXGTK__ - wxLogMessage(text); -#ifndef __WXGTK__ - wxMutexGuiLeave(); + wxLogMessage(text); +#ifndef __WXGTK__ + wxMutexGuiLeave(); #endif //__WXGTK__ - } + } - void OnThreadSignal(wxCommandEvent& event); + void OnThreadSignal(wxCommandEvent& event); - OPJDecoThread *CreateDecoThread(void); - OPJEncoThread *CreateEncoThread(void); + OPJDecoThread *CreateDecoThread(void); + OPJEncoThread *CreateEncoThread(void); - OPJChildFrame *m_childframe; + OPJChildFrame *m_childframe; - wxBitmap m_image, m_image100; - wxFileName m_fname, m_savename; - long m_zooml; + wxBitmap m_image, m_image100; + wxFileName m_fname, m_savename; + long m_zooml; - DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; /////////////////////////////////////////////////// @@ -295,29 +306,38 @@ class OPJCanvas: public wxScrolledWindow /////////////////////////////////////////////////// class OPJMarkerData : public wxTreeItemData { - // public methods and variables - public: + // public methods and variables +public: - // class constructor - OPJMarkerData(const wxString& desc, const wxString& fname = wxT(""), wxFileOffset start = 0, wxFileOffset length = 0) : m_desc(desc), m_filestring(fname) { m_start = start; m_length = length; } + // class constructor + OPJMarkerData(const wxString& desc, const wxString& fname = wxT(""), wxFileOffset start = 0, wxFileOffset length = 0) : m_desc(desc), m_filestring(fname) + { + m_start = start; + m_length = length; + } - void ShowInfo(wxTreeCtrl *tree); - const wxChar *GetDesc1() const { return m_desc.c_str(); } - const wxChar *GetDesc2() const { return m_filestring.c_str(); } - wxFileOffset m_start, m_length; - wxString m_desc; + void ShowInfo(wxTreeCtrl *tree); + const wxChar *GetDesc1() const + { + return m_desc.c_str(); + } + const wxChar *GetDesc2() const + { + return m_filestring.c_str(); + } + wxFileOffset m_start, m_length; + wxString m_desc; - // private methods and variables - private: - wxString m_filestring; + // private methods and variables +private: + wxString m_filestring; }; class OPJMarkerTree : public wxTreeCtrl { public: - enum - { + enum { TreeCtrlIcon_File, TreeCtrlIcon_FileSelected, TreeCtrlIcon_Folder, @@ -327,15 +347,20 @@ public: OPJMarkerTree() { }; OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id, - const wxPoint& pos, const wxSize& size, - long style); - virtual ~OPJMarkerTree(){}; - OPJParseThread *CreateParseThread(wxTreeItemId parentid = 0x00, OPJChildFrame *subframe = NULL); - void WriteText(const wxString& text) { wxMutexGuiEnter(); wxLogMessage(text); wxMutexGuiLeave(); } + const wxPoint& pos, const wxSize& size, + long style); + virtual ~OPJMarkerTree() {}; + OPJParseThread *CreateParseThread(wxTreeItemId parentid = 0x00, OPJChildFrame *subframe = NULL); + void WriteText(const wxString& text) + { + wxMutexGuiEnter(); + wxLogMessage(text); + wxMutexGuiLeave(); + } - wxFileName m_fname; - wxTextCtrl *m_peektextCtrl; - OPJChildFrame *m_childframe; + wxFileName m_fname; + wxTextCtrl *m_peektextCtrl; + OPJChildFrame *m_childframe; /*void OnBeginDrag(wxTreeEvent& event); void OnBeginRDrag(wxTreeEvent& event); @@ -372,9 +397,15 @@ public: /*void DoToggleIcon(const wxTreeItemId& item);*/ /*void ShowMenu(wxTreeItemId id, const wxPoint& pt);*/ - int ImageSize(void) const { return m_imageSize; } + int ImageSize(void) const + { + return m_imageSize; + } - void SetLastItem(wxTreeItemId id) { m_lastItem = id; } + void SetLastItem(wxTreeItemId id) + { + m_lastItem = id; + } protected: /*virtual int OnCompareItems(const wxTreeItemId& i1, const wxTreeItemId& i2);*/ @@ -416,12 +447,12 @@ WX_DECLARE_HASH_MAP(int, OPJChildFrame*, wxIntegerHash, wxIntegerEqual, OPJChild // Define a new frame class OPJFrame: public wxMDIParentFrame { - public: +public: OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); ~OPJFrame(void); - void OnSize(wxSizeEvent& WXUNUSED(event)); + void OnSize(wxSizeEvent& WXUNUSED(event)); void OnAbout(wxCommandEvent& WXUNUSED(event)); void OnFileOpen(wxCommandEvent& WXUNUSED(event)); void OnFileSaveAs(wxCommandEvent& WXUNUSED(event)); @@ -429,43 +460,43 @@ class OPJFrame: public wxMDIParentFrame void OnQuit(wxCommandEvent& WXUNUSED(event)); void OnClose(wxCommandEvent& WXUNUSED(event)); void OnZoom(wxCommandEvent& WXUNUSED(event)); - void OnFit(wxCommandEvent& event); - void OnToggleBrowser(wxCommandEvent& WXUNUSED(event)); - void OnTogglePeeker(wxCommandEvent& WXUNUSED(event)); - void OnToggleToolbar(wxCommandEvent& WXUNUSED(event)); - void OnReload(wxCommandEvent& event); - void OnPrevFrame(wxCommandEvent& event); - void OnHomeFrame(wxCommandEvent& event); - void OnNextFrame(wxCommandEvent& event); - void OnLessLayers(wxCommandEvent& event); - void OnAllLayers(wxCommandEvent& event); - void OnMoreLayers(wxCommandEvent& event); - void OnLessRes(wxCommandEvent& event); - void OnFullRes(wxCommandEvent& event); - void OnMoreRes(wxCommandEvent& event); - void OnPrevComp(wxCommandEvent& event); - void OnAllComps(wxCommandEvent& event); - void OnNextComp(wxCommandEvent& event); - void OnSetsEnco(wxCommandEvent& event); - void OnSetsDeco(wxCommandEvent& event); - void OnSashDrag(wxSashEvent& event); - void OpenFiles(wxArrayString paths, wxArrayString filenames); - void SaveFile(wxArrayString paths, wxArrayString filenames); - void OnNotebook(wxNotebookEvent& event); - void Rescale(int scale, OPJChildFrame *child); - void OnThreadLogmsg(wxCommandEvent& event); - - OPJMarkerTreeHash m_treehash; - OPJChildFrameHash m_childhash; + void OnFit(wxCommandEvent& event); + void OnToggleBrowser(wxCommandEvent& WXUNUSED(event)); + void OnTogglePeeker(wxCommandEvent& WXUNUSED(event)); + void OnToggleToolbar(wxCommandEvent& WXUNUSED(event)); + void OnReload(wxCommandEvent& event); + void OnPrevFrame(wxCommandEvent& event); + void OnHomeFrame(wxCommandEvent& event); + void OnNextFrame(wxCommandEvent& event); + void OnLessLayers(wxCommandEvent& event); + void OnAllLayers(wxCommandEvent& event); + void OnMoreLayers(wxCommandEvent& event); + void OnLessRes(wxCommandEvent& event); + void OnFullRes(wxCommandEvent& event); + void OnMoreRes(wxCommandEvent& event); + void OnPrevComp(wxCommandEvent& event); + void OnAllComps(wxCommandEvent& event); + void OnNextComp(wxCommandEvent& event); + void OnSetsEnco(wxCommandEvent& event); + void OnSetsDeco(wxCommandEvent& event); + void OnSashDrag(wxSashEvent& event); + void OpenFiles(wxArrayString paths, wxArrayString filenames); + void SaveFile(wxArrayString paths, wxArrayString filenames); + void OnNotebook(wxNotebookEvent& event); + void Rescale(int scale, OPJChildFrame *child); + void OnThreadLogmsg(wxCommandEvent& event); + + OPJMarkerTreeHash m_treehash; + OPJChildFrameHash m_childhash; wxSashLayoutWindow* markerTreeWindow; wxSashLayoutWindow* loggingWindow; - wxToolBar* tool_bar; + wxToolBar* tool_bar; void Resize(int number); - wxNotebook *m_bookCtrl; - wxNotebook *m_bookCtrlbottom; + wxNotebook *m_bookCtrl; + wxNotebook *m_bookCtrlbottom; wxTextCtrl *m_textCtrlbrowse; - private: +private: void TogStyle(int id, long flag); void DoSort(bool reverse = false); @@ -479,70 +510,69 @@ protected: wxSashLayoutWindow* m_topWindow; wxSashLayoutWindow* m_leftWindow2; -DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; class OPJChildFrame: public wxMDIChildFrame { - public: +public: OPJCanvas *m_canvas; OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); ~OPJChildFrame(void); void OnActivate(wxActivateEvent& event); - /*void OnQuit(wxCommandEvent& WXUNUSED(event));*/ - void OnClose(wxCloseEvent& event); - void OnGotFocus(wxFocusEvent& event); - void OnLostFocus(wxFocusEvent& event); + /*void OnQuit(wxCommandEvent& WXUNUSED(event));*/ + void OnClose(wxCloseEvent& event); + void OnGotFocus(wxFocusEvent& event); + void OnLostFocus(wxFocusEvent& event); OPJFrame *m_frame; - wxFileName m_fname; - int m_winnumber; + wxFileName m_fname; + int m_winnumber; - unsigned long m_twidth, m_theight, m_tx, m_ty; + unsigned long m_twidth, m_theight, m_tx, m_ty; - DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; // frame and main menu ids enum { - OPJFRAME_FILEEXIT = wxID_EXIT, - OPJFRAME_HELPABOUT = wxID_ABOUT, - OPJFRAME_FILEOPEN, - OPJFRAME_MEMORYOPEN, - OPJFRAME_FILESAVEAS, - OPJFRAME_FILETOGGLEB, - OPJFRAME_FILETOGGLEP, - OPJFRAME_FILETOGGLET, - OPJFRAME_VIEWZOOM, - OPJFRAME_VIEWFIT, - OPJFRAME_VIEWRELOAD, - OPJFRAME_VIEWPREVFRAME, - OPJFRAME_VIEWHOMEFRAME, - OPJFRAME_VIEWNEXTFRAME, - OPJFRAME_VIEWLESSLAYERS, - OPJFRAME_VIEWALLLAYERS, - OPJFRAME_VIEWMORELAYERS, - OPJFRAME_VIEWLESSRES, - OPJFRAME_VIEWFULLRES, - OPJFRAME_VIEWMORERES, - OPJFRAME_VIEWPREVCOMP, - OPJFRAME_VIEWALLCOMPS, - OPJFRAME_VIEWNEXTCOMP, - OPJFRAME_FILECLOSE, - OPJFRAME_SETSENCO, - OPJFRAME_SETSDECO, - - OPJFRAME_BROWSEWIN = 10000, - OPJFRAME_LOGWIN, - OPJFRAME_TOOLBAR, - - OPJFRAME_THREADLOGMSG, - OPJCANVAS_THREADSIGNAL + OPJFRAME_FILEEXIT = wxID_EXIT, + OPJFRAME_HELPABOUT = wxID_ABOUT, + OPJFRAME_FILEOPEN, + OPJFRAME_MEMORYOPEN, + OPJFRAME_FILESAVEAS, + OPJFRAME_FILETOGGLEB, + OPJFRAME_FILETOGGLEP, + OPJFRAME_FILETOGGLET, + OPJFRAME_VIEWZOOM, + OPJFRAME_VIEWFIT, + OPJFRAME_VIEWRELOAD, + OPJFRAME_VIEWPREVFRAME, + OPJFRAME_VIEWHOMEFRAME, + OPJFRAME_VIEWNEXTFRAME, + OPJFRAME_VIEWLESSLAYERS, + OPJFRAME_VIEWALLLAYERS, + OPJFRAME_VIEWMORELAYERS, + OPJFRAME_VIEWLESSRES, + OPJFRAME_VIEWFULLRES, + OPJFRAME_VIEWMORERES, + OPJFRAME_VIEWPREVCOMP, + OPJFRAME_VIEWALLCOMPS, + OPJFRAME_VIEWNEXTCOMP, + OPJFRAME_FILECLOSE, + OPJFRAME_SETSENCO, + OPJFRAME_SETSDECO, + + OPJFRAME_BROWSEWIN = 10000, + OPJFRAME_LOGWIN, + OPJFRAME_TOOLBAR, + + OPJFRAME_THREADLOGMSG, + OPJCANVAS_THREADSIGNAL }; // menu and control ids -enum -{ +enum { TreeTest_Quit = wxID_EXIT, TreeTest_About = wxID_ABOUT, TreeTest_TogButtons = wxID_HIGHEST, @@ -587,8 +617,8 @@ enum TreeTest_Unselect, TreeTest_SelectRoot, TreeTest_Ctrl = 1000, - BOTTOM_NOTEBOOK_ID, - LEFT_NOTEBOOK_ID + BOTTOM_NOTEBOOK_ID, + LEFT_NOTEBOOK_ID }; class OPJEncoThread : public wxThread @@ -645,19 +675,19 @@ public: // write something to the text control void WriteText(const wxString& text); - void LoadFile(wxFileName fname); - void ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid); - void ParseJP2File(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid); + void LoadFile(wxFileName fname); + void ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid); + void ParseJP2File(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid); unsigned m_count; OPJMarkerTree *m_tree; - wxTreeItemId m_parentid; + wxTreeItemId m_parentid; private: - int jpeg2000parse(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, - wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint); - int box_handler_function(int boxtype, wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, - wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint); + int jpeg2000parse(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, + wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint); + int box_handler_function(int boxtype, wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, + wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint); }; @@ -666,7 +696,10 @@ private: class OPJDnDFile: public wxFileDropTarget { public: - OPJDnDFile(OPJFrame *pOwner) { m_pOwner = pOwner; } + OPJDnDFile(OPJFrame *pOwner) + { + m_pOwner = pOwner; + } virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); private: @@ -678,137 +711,137 @@ private: // Property sheet dialog: encoder class OPJEncoderDialog: public wxPropertySheetDialog { -DECLARE_CLASS(OPJEncoderDialog) + DECLARE_CLASS(OPJEncoderDialog) public: OPJEncoderDialog(wxWindow* parent, int dialogType); ~OPJEncoderDialog(); - wxBookCtrlBase* m_settingsNotebook; + wxBookCtrlBase* m_settingsNotebook; wxPanel* CreateMainSettingsPage(wxWindow* parent); wxPanel* CreatePart1_1SettingsPage(wxWindow* parent); wxPanel* CreatePart1_2SettingsPage(wxWindow* parent); -/* wxPanel* CreatePart3SettingsPage(wxWindow* parent);*/ - void OnEnableComm(wxCommandEvent& event); - void OnEnableIdx(wxCommandEvent& event); - void OnEnablePoc(wxCommandEvent& event); - void OnRadioQualityRate(wxCommandEvent& event); + /* wxPanel* CreatePart3SettingsPage(wxWindow* parent);*/ + void OnEnableComm(wxCommandEvent& event); + void OnEnableIdx(wxCommandEvent& event); + void OnEnablePoc(wxCommandEvent& event); + void OnRadioQualityRate(wxCommandEvent& event); #ifdef USE_JPWL - void OnEnableJPWL(wxCommandEvent& event); - wxPanel* CreatePart11SettingsPage(wxWindow* parent); - /*wxCheckBox *m_enablejpwlCheck;*/ - wxChoice *m_hprotChoice[MYJPWL_MAX_NO_TILESPECS]; - wxSpinCtrl *m_htileCtrl[MYJPWL_MAX_NO_TILESPECS]; - wxChoice *m_pprotChoice[MYJPWL_MAX_NO_TILESPECS]; - wxSpinCtrl *m_ptileCtrl[MYJPWL_MAX_NO_TILESPECS]; - wxSpinCtrl *m_ppackCtrl[MYJPWL_MAX_NO_TILESPECS]; - wxChoice *m_sensiChoice[MYJPWL_MAX_NO_TILESPECS]; - wxSpinCtrl *m_stileCtrl[MYJPWL_MAX_NO_TILESPECS]; - void OnHprotSelect(wxCommandEvent& event); - void OnPprotSelect(wxCommandEvent& event); - void OnSensiSelect(wxCommandEvent& event); + void OnEnableJPWL(wxCommandEvent& event); + wxPanel* CreatePart11SettingsPage(wxWindow* parent); + /*wxCheckBox *m_enablejpwlCheck;*/ + wxChoice *m_hprotChoice[MYJPWL_MAX_NO_TILESPECS]; + wxSpinCtrl *m_htileCtrl[MYJPWL_MAX_NO_TILESPECS]; + wxChoice *m_pprotChoice[MYJPWL_MAX_NO_TILESPECS]; + wxSpinCtrl *m_ptileCtrl[MYJPWL_MAX_NO_TILESPECS]; + wxSpinCtrl *m_ppackCtrl[MYJPWL_MAX_NO_TILESPECS]; + wxChoice *m_sensiChoice[MYJPWL_MAX_NO_TILESPECS]; + wxSpinCtrl *m_stileCtrl[MYJPWL_MAX_NO_TILESPECS]; + void OnHprotSelect(wxCommandEvent& event); + void OnPprotSelect(wxCommandEvent& event); + void OnSensiSelect(wxCommandEvent& event); #endif // USE_JPWL - wxTextCtrl *m_subsamplingCtrl, *m_originCtrl, *m_rateCtrl, *m_commentCtrl; - wxRadioButton *m_rateRadio, *m_qualityRadio; - wxTextCtrl *m_indexCtrl, *m_qualityCtrl, *m_cbsizeCtrl, *m_prsizeCtrl, *m_pocCtrl; - wxTextCtrl *m_tsizeCtrl, *m_toriginCtrl; - wxRadioBox *progressionBox; - wxCheckBox *m_enablecommCheck, *m_enableidxCheck, *m_mctCheck, *m_irrevCheck; - wxCheckBox *m_sopCheck, *m_ephCheck, *m_enablebypassCheck, *m_enableresetCheck, - *m_enablerestartCheck, *m_enablevscCheck, *m_enableertermCheck, *m_enablesegmarkCheck; - wxCheckBox *m_enablepocCheck, *m_enablejpwlCheck; - wxSpinCtrl *m_resolutionsCtrl; + wxTextCtrl *m_subsamplingCtrl, *m_originCtrl, *m_rateCtrl, *m_commentCtrl; + wxRadioButton *m_rateRadio, *m_qualityRadio; + wxTextCtrl *m_indexCtrl, *m_qualityCtrl, *m_cbsizeCtrl, *m_prsizeCtrl, *m_pocCtrl; + wxTextCtrl *m_tsizeCtrl, *m_toriginCtrl; + wxRadioBox *progressionBox; + wxCheckBox *m_enablecommCheck, *m_enableidxCheck, *m_mctCheck, *m_irrevCheck; + wxCheckBox *m_sopCheck, *m_ephCheck, *m_enablebypassCheck, *m_enableresetCheck, + *m_enablerestartCheck, *m_enablevscCheck, *m_enableertermCheck, *m_enablesegmarkCheck; + wxCheckBox *m_enablepocCheck, *m_enablejpwlCheck; + wxSpinCtrl *m_resolutionsCtrl; protected: enum { - OPJENCO_ENABLEJPWL = 100, - OPJENCO_RATEFACTOR, - OPJENCO_RATERADIO, - OPJENCO_QUALITYFACTOR, - OPJENCO_QUALITYRADIO, - OPJENCO_RESNUMBER, - OPJENCO_CODEBLOCKSIZE, - OPJENCO_PRECINCTSIZE, - OPJENCO_TILESIZE, - OPJENCO_PROGRESSION, - OPJENCO_SUBSAMPLING, - OPJENCO_ENABLESOP, - OPJENCO_ENABLEEPH, - OPJENCO_ENABLEBYPASS, - OPJENCO_ENABLERESET, - OPJENCO_ENABLERESTART, - OPJENCO_ENABLEVSC, - OPJENCO_ENABLEERTERM, - OPJENCO_ENABLESEGMARK, - OPJENCO_ENABLEPOC, - OPJENCO_ROICOMP, - OPJENCO_ROISHIFT, - OPJENCO_IMORIG, - OPJENCO_TILORIG, - OPJENCO_ENABLEMCT, - OPJENCO_ENABLEIRREV, - OPJENCO_ENABLEINDEX, - OPJENCO_INDEXNAME, - OPJENCO_POCSPEC, - OPJENCO_ENABLECOMM, - OPJENCO_COMMENTTEXT, - OPJENCO_HPROT, - OPJENCO_HTILE, - OPJENCO_PPROT, - OPJENCO_PTILE, - OPJENCO_PPACK, - OPJENCO_SENSI, - OPJENCO_STILE + OPJENCO_ENABLEJPWL = 100, + OPJENCO_RATEFACTOR, + OPJENCO_RATERADIO, + OPJENCO_QUALITYFACTOR, + OPJENCO_QUALITYRADIO, + OPJENCO_RESNUMBER, + OPJENCO_CODEBLOCKSIZE, + OPJENCO_PRECINCTSIZE, + OPJENCO_TILESIZE, + OPJENCO_PROGRESSION, + OPJENCO_SUBSAMPLING, + OPJENCO_ENABLESOP, + OPJENCO_ENABLEEPH, + OPJENCO_ENABLEBYPASS, + OPJENCO_ENABLERESET, + OPJENCO_ENABLERESTART, + OPJENCO_ENABLEVSC, + OPJENCO_ENABLEERTERM, + OPJENCO_ENABLESEGMARK, + OPJENCO_ENABLEPOC, + OPJENCO_ROICOMP, + OPJENCO_ROISHIFT, + OPJENCO_IMORIG, + OPJENCO_TILORIG, + OPJENCO_ENABLEMCT, + OPJENCO_ENABLEIRREV, + OPJENCO_ENABLEINDEX, + OPJENCO_INDEXNAME, + OPJENCO_POCSPEC, + OPJENCO_ENABLECOMM, + OPJENCO_COMMENTTEXT, + OPJENCO_HPROT, + OPJENCO_HTILE, + OPJENCO_PPROT, + OPJENCO_PTILE, + OPJENCO_PPACK, + OPJENCO_SENSI, + OPJENCO_STILE }; -DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; // Property sheet dialog: decoder class OPJDecoderDialog: public wxPropertySheetDialog { -DECLARE_CLASS(OPJDecoderDialog) + DECLARE_CLASS(OPJDecoderDialog) public: OPJDecoderDialog(wxWindow* parent, int dialogType); ~OPJDecoderDialog(); - wxBookCtrlBase* m_settingsNotebook; - wxCheckBox *m_enabledecoCheck, *m_enableparseCheck; - wxSpinCtrl *m_reduceCtrl, *m_layerCtrl, *m_numcompsCtrl; - wxRadioBox* m_resizeBox; + wxBookCtrlBase* m_settingsNotebook; + wxCheckBox *m_enabledecoCheck, *m_enableparseCheck; + wxSpinCtrl *m_reduceCtrl, *m_layerCtrl, *m_numcompsCtrl; + wxRadioBox* m_resizeBox; - void OnEnableDeco(wxCommandEvent& event); + void OnEnableDeco(wxCommandEvent& event); wxPanel* CreateMainSettingsPage(wxWindow* parent); wxPanel* CreatePart1SettingsPage(wxWindow* parent); wxPanel* CreatePart3SettingsPage(wxWindow* parent); #ifdef USE_JPWL - void OnEnableJPWL(wxCommandEvent& event); + void OnEnableJPWL(wxCommandEvent& event); wxPanel* CreatePart11SettingsPage(wxWindow* parent); - wxSpinCtrl *m_expcompsCtrl, *m_maxtilesCtrl; - wxCheckBox *m_enablejpwlCheck; + wxSpinCtrl *m_expcompsCtrl, *m_maxtilesCtrl; + wxCheckBox *m_enablejpwlCheck; #endif // USE_JPWL - wxSpinCtrl *m_framenumCtrl; + wxSpinCtrl *m_framenumCtrl; protected: enum { - OPJDECO_RESMETHOD = 100, - OPJDECO_REDUCEFACTOR, - OPJDECO_QUALITYLAYERS, - OPJDECO_NUMCOMPS, - OPJDECO_ENABLEDECO, - OPJDECO_ENABLEPARSE, - OPJDECO_ENABLEJPWL, - OPJDECO_EXPCOMPS, - OPJDECO_MAXTILES, - OPJDECO_FRAMENUM + OPJDECO_RESMETHOD = 100, + OPJDECO_REDUCEFACTOR, + OPJDECO_QUALITYLAYERS, + OPJDECO_NUMCOMPS, + OPJDECO_ENABLEDECO, + OPJDECO_ENABLEPARSE, + OPJDECO_ENABLEJPWL, + OPJDECO_EXPCOMPS, + OPJDECO_MAXTILES, + OPJDECO_FRAMENUM }; -DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; #endif //__OPJ_VIEWER_H__ diff --git a/src/bin/wx/OPJViewer/source/about_htm.h b/src/bin/wx/OPJViewer/source/about_htm.h index 79a859d8..cb389f8c 100644 --- a/src/bin/wx/OPJViewer/source/about_htm.h +++ b/src/bin/wx/OPJViewer/source/about_htm.h @@ -1,54 +1,54 @@ wxString htmlaboutpage = wxT( -"<html>" -"<body bgcolor=#FFFFFF>" -"<table cellspacing=7 cellpadding=1 border=0 width=100%>" -"<tr>" -"<td rowspan=3 valign=top align=center width=70>" -"<img src=\"memory:opj_logo.xpm\"><br><br>" -"</td>" -"<td align=center>" -"<font size=+0 color=#000000><b>" -OPJ_APPLICATION " " OPJ_APPLICATION_VERSION -"</b></font><br>" -"<font size=-1 color=#000000><b>A JPEG 2000 image viewer</b></font><br>" -"<font size=-2 color=#000000><b>" OPJ_APPLICATION_PLATFORM " version</b></font>" -"</td>" -"</tr>" -"<tr height=3 valign=center>" -"<td valign=center bgcolor=#cc3300></td>" -"</tr>" -"<tr>" -"<td align=justify>" -"<center><font size=+0 color=#000000><a href=\"http://www.openjpeg.org/\">OpenJPEG</a></font></center>" -"<p><font size=-1 color=#000000>The OpenJPEG library is an open-source JPEG 2000 codec written in C language. " -"In addition to the basic codec, various other features are under development.</font></p><br>" -"<font size=-2 color=red>* Build: ") + "<html>" + "<body bgcolor=#FFFFFF>" + "<table cellspacing=7 cellpadding=1 border=0 width=100%>" + "<tr>" + "<td rowspan=3 valign=top align=center width=70>" + "<img src=\"memory:opj_logo.xpm\"><br><br>" + "</td>" + "<td align=center>" + "<font size=+0 color=#000000><b>" + OPJ_APPLICATION " " OPJ_APPLICATION_VERSION + "</b></font><br>" + "<font size=-1 color=#000000><b>A JPEG 2000 image viewer</b></font><br>" + "<font size=-2 color=#000000><b>" OPJ_APPLICATION_PLATFORM " version</b></font>" + "</td>" + "</tr>" + "<tr height=3 valign=center>" + "<td valign=center bgcolor=#cc3300></td>" + "</tr>" + "<tr>" + "<td align=justify>" + "<center><font size=+0 color=#000000><a href=\"http://www.openjpeg.org/\">OpenJPEG</a></font></center>" + "<p><font size=-1 color=#000000>The OpenJPEG library is an open-source JPEG 2000 codec written in C language. " + "In addition to the basic codec, various other features are under development.</font></p><br>" + "<font size=-2 color=red>* Build: ") #include "build.h" -wxT(", " __DATE__ ", " __TIME__ "</font><br>") -wxT("<font size=-2 color=red>* " wxVERSION_STRING "</font><br>") -wxT("<font size=-2 color=red>* OpenJPEG " OPENJPEG_VERSION " (") + wxT(", " __DATE__ ", " __TIME__ "</font><br>") + wxT("<font size=-2 color=red>* " wxVERSION_STRING "</font><br>") + wxT("<font size=-2 color=red>* OpenJPEG " OPENJPEG_VERSION " (") #ifdef USE_JPWL -wxT("<font size=-2 color=green>JPWL</font> ") + wxT("<font size=-2 color=green>JPWL</font> ") #endif // USE_JPWL #ifdef USE_JPSEC -wxT("<font size=-2 color=green>JPSEC</font> ") + wxT("<font size=-2 color=green>JPSEC</font> ") #endif // USE_JPSEC -wxT(")</font><br>") + wxT(")</font><br>") #ifdef USE_MXF -wxT("<font size=-2 color=red>* MXFLib " MXFLIB_VERSION_MAJOR "." MXFLIB_VERSION_MINOR "." MXFLIB_VERSION_TWEAK " (" MXFLIB_VERSION_BUILD ")</font><br>") + wxT("<font size=-2 color=red>* MXFLib " MXFLIB_VERSION_MAJOR "." MXFLIB_VERSION_MINOR "." MXFLIB_VERSION_TWEAK " (" MXFLIB_VERSION_BUILD ")</font><br>") #endif // USE_MXF -wxT("</td>" -"</tr>" -"<tr>" -"<td colspan=2 bgcolor=#CC3300 height=3 valign=center></td>" -"</tr>" -"<tr>" -"<td colspan=2>" -"<font size=-2 color=#444444>OpenJPEG is © 2002-2008 <a href=\"http://www.tele.ucl.ac.be/\">TELE</a> - <a href=\"http://www.uclouvain.be/\">Universite' Catholique de Louvain</a></font><br>" -"<font size=-2 color=#444444>OPJViewer is © 2007-2008 <a href=\"http://dsplab.diei.unipg.it/\">DSPLab</a> - <a href=\"http://www.unipg.it/\">Universita' degli studi di Perugia</a></font>" -"</td>" -"</tr>" -"</table>" -"</body>" -"</html>" -); + wxT("</td>" + "</tr>" + "<tr>" + "<td colspan=2 bgcolor=#CC3300 height=3 valign=center></td>" + "</tr>" + "<tr>" + "<td colspan=2>" + "<font size=-2 color=#444444>OpenJPEG is © 2002-2008 <a href=\"http://www.tele.ucl.ac.be/\">TELE</a> - <a href=\"http://www.uclouvain.be/\">Universite' Catholique de Louvain</a></font><br>" + "<font size=-2 color=#444444>OPJViewer is © 2007-2008 <a href=\"http://dsplab.diei.unipg.it/\">DSPLab</a> - <a href=\"http://www.unipg.it/\">Universita' degli studi di Perugia</a></font>" + "</td>" + "</tr>" + "</table>" + "</body>" + "</html>" + ); diff --git a/src/bin/wx/OPJViewer/source/build.h b/src/bin/wx/OPJViewer/source/build.h index f0f072c8..d49d58b6 100644 --- a/src/bin/wx/OPJViewer/source/build.h +++ b/src/bin/wx/OPJViewer/source/build.h @@ -1 +1 @@ -wxT("491") +wxT("491") diff --git a/src/bin/wx/OPJViewer/source/imagjpeg2000.h b/src/bin/wx/OPJViewer/source/imagjpeg2000.h index 945bba5a..8ed0f50f 100644 --- a/src/bin/wx/OPJViewer/source/imagjpeg2000.h +++ b/src/bin/wx/OPJViewer/source/imagjpeg2000.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -64,105 +64,105 @@ public: m_type = wxBITMAP_TYPE_JPEG2000; m_mime = wxT("image/mj2"); - /* decoding */ - m_reducefactor = 0; - m_qualitylayers = 0; - m_components = 0; + /* decoding */ + m_reducefactor = 0; + m_qualitylayers = 0; + m_components = 0; #ifdef USE_JPWL - m_enablejpwl = true; - m_expcomps = JPWL_EXPECTED_COMPONENTS; - m_maxtiles = JPWL_MAXIMUM_TILES; + m_enablejpwl = true; + m_expcomps = JPWL_EXPECTED_COMPONENTS; + m_maxtiles = JPWL_MAXIMUM_TILES; #endif // USE_JPWL - /* encoding */ - m_subsampling = wxT("1,1"); - m_origin = wxT("0,0"); - m_rates = wxT("20,10,5"); - m_quality = wxT("30,35,40"); - m_enablequality = false; - m_multicomp = false; - m_irreversible = false; - m_resolutions = 6; - m_progression = 0; - m_cbsize = wxT("32,32"); - m_prsize = wxT("[128,128],[128,128]"); - m_tsize = wxT(""); - m_torigin = wxT("0,0"); - /*m_progression - m_resilience*/ - m_enablesop = false; - m_enableeph = false; - m_enablereset = false; - m_enablesegmark = false; - m_enablevsc = false; - m_enablerestart = false; - m_enableerterm = false; - m_enablebypass = false; - /*m_roicompo - m_roiup - m_indexfname*/ - m_enableidx = false; - m_index = wxT("index.txt"); - m_enablepoc = false; - m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"); - m_enablecomm = true; + /* encoding */ + m_subsampling = wxT("1,1"); + m_origin = wxT("0,0"); + m_rates = wxT("20,10,5"); + m_quality = wxT("30,35,40"); + m_enablequality = false; + m_multicomp = false; + m_irreversible = false; + m_resolutions = 6; + m_progression = 0; + m_cbsize = wxT("32,32"); + m_prsize = wxT("[128,128],[128,128]"); + m_tsize = wxT(""); + m_torigin = wxT("0,0"); + /*m_progression + m_resilience*/ + m_enablesop = false; + m_enableeph = false; + m_enablereset = false; + m_enablesegmark = false; + m_enablevsc = false; + m_enablerestart = false; + m_enableerterm = false; + m_enablebypass = false; + /*m_roicompo + m_roiup + m_indexfname*/ + m_enableidx = false; + m_index = wxT("index.txt"); + m_enablepoc = false; + m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"); + m_enablecomm = true; #if defined __WXMSW__ - m_comment = wxT("Created by OPJViewer Win32 - OpenJPEG version "); + m_comment = wxT("Created by OPJViewer Win32 - OpenJPEG version "); #elif defined __WXGTK__ - m_comment = wxT("Created by OPJViewer Lin32 - OpenJPEG version "); + m_comment = wxT("Created by OPJViewer Lin32 - OpenJPEG version "); #else - m_comment = wxT("Created by OPJViewer - OpenJPEG version "); + m_comment = wxT("Created by OPJViewer - OpenJPEG version "); #endif #ifdef USE_JPWL - m_comment += wxString::Format(wxT("%s with JPWL"), (char *) opj_version()); + m_comment += wxString::Format(wxT("%s with JPWL"), (char *) opj_version()); #else - m_comment += wxString::Format(wxT("%s"), (char *) opj_version()); + m_comment += wxString::Format(wxT("%s"), (char *) opj_version()); #endif } - // decoding engine parameters - int m_reducefactor, m_qualitylayers, m_components, m_framenum; + // decoding engine parameters + int m_reducefactor, m_qualitylayers, m_components, m_framenum; #ifdef USE_JPWL - bool m_enablejpwl; - int m_expcomps, m_maxtiles; + bool m_enablejpwl; + int m_expcomps, m_maxtiles; #endif // USE_JPWL - // encoding engine parameters - wxString m_subsampling; - wxString m_origin; - wxString m_rates; - wxString m_quality; - bool m_enablequality; - bool m_multicomp; - bool m_irreversible; - int m_resolutions; - int m_progression; - wxString m_cbsize; - wxString m_prsize; - wxString m_tsize; - wxString m_torigin; - /*m_progression - m_resilience*/ - bool m_enablesop; - bool m_enableeph; - bool m_enablebypass; - bool m_enableerterm; - bool m_enablerestart; - bool m_enablereset; - bool m_enablesegmark; - bool m_enablevsc; - /*m_roicompo - m_roiup - m_indexfname*/ - bool m_enableidx; - wxString m_index; - bool m_enablecomm; - wxString m_comment; - bool m_enablepoc; - wxString m_poc; + // encoding engine parameters + wxString m_subsampling; + wxString m_origin; + wxString m_rates; + wxString m_quality; + bool m_enablequality; + bool m_multicomp; + bool m_irreversible; + int m_resolutions; + int m_progression; + wxString m_cbsize; + wxString m_prsize; + wxString m_tsize; + wxString m_torigin; + /*m_progression + m_resilience*/ + bool m_enablesop; + bool m_enableeph; + bool m_enablebypass; + bool m_enableerterm; + bool m_enablerestart; + bool m_enablereset; + bool m_enablesegmark; + bool m_enablevsc; + /*m_roicompo + m_roiup + m_indexfname*/ + bool m_enableidx; + wxString m_index; + bool m_enablecomm; + wxString m_comment; + bool m_enablepoc; + wxString m_poc; #if wxUSE_STREAMS virtual bool LoadFile(wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1); @@ -172,7 +172,7 @@ protected: #endif private: - OPJ_PROG_ORDER give_progression(char progression[4]); + OPJ_PROG_ORDER give_progression(char progression[4]); DECLARE_DYNAMIC_CLASS(wxJPEG2000Handler) }; diff --git a/src/bin/wx/OPJViewer/source/imagmxf.h b/src/bin/wx/OPJViewer/source/imagmxf.h index e4cb35df..0605399c 100644 --- a/src/bin/wx/OPJViewer/source/imagmxf.h +++ b/src/bin/wx/OPJViewer/source/imagmxf.h @@ -1,6 +1,6 @@ /* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * @@ -66,23 +66,23 @@ public: m_type = wxBITMAP_TYPE_MXF; m_mime = wxT("image/mxf"); - m_reducefactor = 0; - m_qualitylayers = 0; - m_components = 0; - m_filename = wxT(""); + m_reducefactor = 0; + m_qualitylayers = 0; + m_components = 0; + m_filename = wxT(""); #ifdef USE_JPWL - m_enablejpwl = true; - m_expcomps = JPWL_EXPECTED_COMPONENTS; - m_maxtiles = JPWL_MAXIMUM_TILES; + m_enablejpwl = true; + m_expcomps = JPWL_EXPECTED_COMPONENTS; + m_maxtiles = JPWL_MAXIMUM_TILES; #endif // USE_JPWL } - // decoding engine parameters - int m_reducefactor, m_qualitylayers, m_components, m_framenum; - wxFileName m_filename; + // decoding engine parameters + int m_reducefactor, m_qualitylayers, m_components, m_framenum; + wxFileName m_filename; #ifdef USE_JPWL - bool m_enablejpwl; - int m_expcomps, m_maxtiles; + bool m_enablejpwl; + int m_expcomps, m_maxtiles; #endif // USE_JPWL #if wxUSE_STREAMS |
