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