00001 
00018 #include "Jpeg2KTool.h"
00019 
00020 
00021 #ifdef ENABLE_OPENJPEG
00022 
00023 #if OPENJPEG_VER <= JP2K_VER_15
00024 
00025 
00026 using namespace jbxl;
00027 
00028 
00029 void  JPEG2KImage::init(void)
00030 {
00031     xs    = 0;
00032     ys    = 0;
00033     ws    = 0;
00034     hs    = 0;
00035     col   = 0;
00036     cmode = GRAPH_COLOR_RGBA;
00037     state = 0;
00038     image = NULL;
00039 }
00040 
00041 
00042 bool  JPEG2KImage::isNull(void)
00043 {
00044     if (image!=NULL && image->comps!=NULL) return false;
00045     return true;
00046 }
00047 
00048 
00049 void  JPEG2KImage::free(void)
00050 {
00051     if (image!=NULL) {
00052         opj_image_destroy(image);
00053     }
00054 
00055     init();
00056 }
00057 
00058 
00059 void  JPEG2KImage::fill(int v)
00060 {
00061     if (!isNull()) {
00062         for (int k=0; k<col; k++) {
00063             if (image->comps[k].data!=NULL) {   
00064                 for (int i=0; i<xs*ys; i++) {
00065                     image->comps[k].data[i] = v;
00066                 }
00067             }
00068         }
00069     }
00070 }
00071 
00072 
00073 void  JPEG2KImage::setup_image(void)
00074 {
00075     if (!isNull()) {
00076         
00077         xs = image->x1 - image->x0;
00078         ys = image->y1 - image->y0;
00079 
00080         int fac = (int)image->comps->factor;
00081         ws = (xs + (1<<fac) -1)>>fac;
00082         hs = (ys + (1<<fac) -1)>>fac;
00083 
00084         col = (int)image->numcomps;
00085         if (image->color_space==CLRSPC_SRGB) {
00086             col = 3;
00087         }
00088         else if (image->color_space==CLRSPC_GRAY) {
00089             col = 1;
00090         }
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102         
00103         cmode = GRAPH_COLOR_UNKNOWN;
00104         int depth = (int)image->comps->bpp;
00105         if (depth==0) {
00106             if      (col==3) cmode = GRAPH_COLOR_RGB;
00107             else if (col==4) cmode = GRAPH_COLOR_RGBA;
00108             else if (col==1) cmode = GRAPH_COLOR_MONO;
00109         }
00110         else if (depth==32) {
00111             if      (col==3) cmode = GRAPH_COLOR_RGB;
00112             else if (col==4) cmode = GRAPH_COLOR_RGBA;
00113         }
00114         else if (depth==24) {
00115             if      (col==3) cmode = GRAPH_COLOR_RGB;
00116         }
00117         else if (depth==16) {
00118             if      (col==1) cmode = GRAPH_COLOR_MONO16;
00119             else if (col==3) cmode = GRAPH_COLOR_RGB16;
00120             else if (col==4) cmode = GRAPH_COLOR_RGBA16;
00121         }
00122         else if (depth==8) {
00123             if      (col==1) cmode = GRAPH_COLOR_MONO;
00124         }
00125   
00126         
00127 #if OPENJPEG_VER > JP2K_VER_12
00128         freeNull(image->icc_profile_buf);
00129         image->icc_profile_len = 0;
00130 #endif
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154     }
00155 }
00156     
00157 
00158 
00160 
00161 JPEG2KImage  jbxl::readJPEG2KFile(const char* fname)
00162 {
00163     JPEG2KImage jp;
00164     
00165     if (fname==NULL) {
00166         jp.state = JBXL_GRAPH_IVDARG_ERROR;
00167         return jp;
00168     }
00169 
00170     int len = (int)file_size(fname);
00171 
00172     FILE* fp = fopen(fname, "rb");
00173     if (fp==NULL) {
00174         jp.state = JBXL_GRAPH_OPFILE_ERROR;
00175         return jp;
00176     }
00177 
00178     unsigned char* data = (unsigned char*)malloc(len);
00179     if (data==NULL) {
00180         fclose(fp);
00181         jp.state = JBXL_GRAPH_MEMORY_ERROR;
00182         return jp;
00183     }
00184 
00185     Buffer buf = read_Buffer_data(fp, 12);
00186     if (buf.vldsz<12) {
00187         free_Buffer(&buf);
00188         jp.state = JBXL_GRAPH_FILESZ_ERROR;
00189         fclose(fp);
00190         return jp;
00191     }
00192 
00193     fseek(fp, 0, 0);
00194     int format = isJPEG2KHeader(buf);
00195     if (format==JP2K_FMT_NONE) format = JP2K_FMT_JPT;
00196     free_Buffer(&buf);
00197 
00198     fread(data, len, 1, fp);
00199     fclose(fp);
00200 
00201     jp = readJPEG2KData(data, len, format);
00202     ::free(data);
00203 
00204     return jp;
00205 }
00206 
00207 
00208 JPEG2KImage  jbxl::readJPEG2KData(unsigned char* data, int len, int format)
00209 {
00210     JPEG2KImage jp;
00211 
00212     opj_dinfo_t* codec  = NULL;
00213     opj_cio_t*   stream = NULL;
00214 
00215     opj_dparameters_t parameters;   
00216     opj_set_default_decoder_parameters(¶meters);
00217 
00218     if (format==JP2K_FMT_J2K) {         
00219         codec = opj_create_decompress(CODEC_J2K);
00220     }   
00221     else if (format==JP2K_FMT_JP2) {    
00222         codec = opj_create_decompress(CODEC_JP2);
00223     }
00224     else if (format==JP2K_FMT_JPT) {    
00225         codec = opj_create_decompress(CODEC_JPT);
00226     }
00227     else {
00228         PRINT_MESG("JBXL::readJPEG2KData: ERROR: unknown file format!\n");
00229         jp.state = JBXL_GRAPH_NODATA_ERROR;
00230         return jp;
00231     }
00232 
00233     opj_setup_decoder(codec, ¶meters);
00234     stream = opj_cio_open((opj_common_ptr)codec, data, len);
00235     jp.image = opj_decode(codec, stream);
00236     if (jp.image==NULL) {
00237         opj_cio_close(stream);
00238         opj_destroy_decompress(codec);
00239         jp.state = JBXL_GRAPH_IVDDATA_ERROR;
00240         return jp;
00241     }
00242 
00243     jp.setup_image();
00244 
00245     opj_cio_close(stream);
00246     opj_destroy_decompress(codec);
00247 
00248     return jp;
00249 }
00250 
00251 
00259 int  jbxl::isJPEG2KHeader(Buffer buf)
00260 {
00261     int format = JP2K_FMT_NONE;
00262 
00263     if (!memcmp(buf.buf, JP2K_MAGIC_RFC3745_JP2, 12) || !memcmp(buf.buf, JP2K_MAGIC_JP2, 4)) {
00264         format = JP2K_FMT_JP2;
00265     }
00266     else if (!memcmp(buf.buf, JP2K_MAGIC_J2K, 4)) {
00267         format = JP2K_FMT_J2K;
00268     }
00269     return format;
00270 }
00271 
00272 
00273 #endif      // OPENJPEG_VER
00274 #endif      // ENABLE_OPENJPEG
00275 
00276