void libraw_set_progress_handler(libraw_data_t* lr, progress_callback cb,void *data) { if(!lr) return; LibRaw *ip = (LibRaw*) lr->parent_class; ip->set_progress_handler(cb,data); }
int main(int ac, char *av[]) { int i, ret, verbose=0, output_thumbs=0; // don't use fixed size buffers in real apps! char outfn[1024],thumbfn[1024]; LibRaw RawProcessor; if(ac<2) { printf( "simple_dcraw - LibRaw %s sample. Emulates dcraw [-D] [-T] [-v] [-e] [-E]\n" " %d cameras supported\n" "Usage: %s [-D] [-T] [-v] [-e] raw-files....\n" "\t-D - document mode emulation\n" "\t-4 - 16-bit mode\n" "\t-v - verbose output\n" "\t-T - output TIFF files instead of .pgm/ppm\n" "\t-e - extract thumbnails (same as dcraw -e in separate run)\n",LibRaw::version(), LibRaw::cameraCount(), av[0]); return 0; } putenv ((char*)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field #define P1 RawProcessor.imgdata.idata #define S RawProcessor.imgdata.sizes #define C RawProcessor.imgdata.color #define T RawProcessor.imgdata.thumbnail #define P2 RawProcessor.imgdata.other #define OUT RawProcessor.imgdata.params for (i=1;i<ac;i++) { if(av[i][0]=='-') { if(av[i][1]=='T' && av[i][2]==0) OUT.output_tiff=1; if(av[i][1]=='v' && av[i][2]==0) verbose++; if(av[i][1]=='e' && av[i][2]==0) output_thumbs++; if(av[i][1]=='D' && av[i][2]==0) OUT.document_mode=2; if(av[i][1]=='4' && av[i][2]==0) OUT.output_bps=16; if(av[i][1]=='C' && av[i][2]==0) RawProcessor.set_progress_handler(my_progress_callback,NULL); continue; } if(verbose) printf("Processing file %s\n",av[i]); if( (ret = RawProcessor.open_file(av[i])) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot open_file %s: %s\n",av[i],libraw_strerror(ret)); continue; // no recycle b/c open file will recycle itself } if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot unpack %s: %s\n",av[i],libraw_strerror(ret)); continue; } // thumbnail unpacking and output in the middle of main // image processing - for test purposes! if(output_thumbs) { if( (ret = RawProcessor.unpack_thumb() ) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) continue; // skip to next file } else { snprintf(thumbfn,sizeof(thumbfn),"%s.%s", av[i],T.tformat == LIBRAW_THUMBNAIL_JPEG ? "thumb.jpg" : "thumb.ppm"); if(verbose) printf("Writing thumbnail file %s\n",thumbfn); if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_thumb_writer(thumbfn))) { fprintf(stderr,"Cannot write %s: %s\n",thumbfn,libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) continue; } } } if(OUT.document_mode) ret = RawProcessor.dcraw_document_mode_processing(); else ret = RawProcessor.dcraw_process(); if(LIBRAW_SUCCESS !=ret) { fprintf(stderr,"Cannot do postpocessing on %s: %s\n", av[i],libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) continue; } snprintf(outfn,sizeof(outfn), "%s.%s", av[i], OUT.output_tiff ? "tiff" : (P1.colors>1?"ppm":"pgm")); if(verbose) printf("Writing file %s\n",outfn); if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) fprintf(stderr,"Cannot write %s: %s\n",outfn,libraw_strerror(ret)); RawProcessor.recycle(); // just for show this call } return 0; }
bool KDcraw::extractRAWData(const QString& filePath, QByteArray& rawData, DcrawInfoContainer& identify, unsigned int shotSelect) { QFileInfo fileInfo(filePath); QString rawFilesExt(rawFiles()); QString ext = fileInfo.suffix().toUpper(); identify.isDecodable = false; if (!fileInfo.exists() || ext.isEmpty() || !rawFilesExt.toUpper().contains(ext)) return false; if (m_cancel) return false; d->setProgress(0.1); LibRaw raw; // Set progress call back function. raw.set_progress_handler(callbackForLibRaw, d); int ret = raw.open_file((const char*)(QFile::encodeName(filePath)).constData()); if (ret != LIBRAW_SUCCESS) { qCDebug(LIBKDCRAW_LOG) << "LibRaw: failed to run open_file: " << libraw_strerror(ret); raw.recycle(); return false; } if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.3); raw.imgdata.params.output_bps = 16; raw.imgdata.params.shot_select = shotSelect; ret = raw.unpack(); if (ret != LIBRAW_SUCCESS) { qCDebug(LIBKDCRAW_LOG) << "LibRaw: failed to run unpack: " << libraw_strerror(ret); raw.recycle(); return false; } if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.4); ret = raw.raw2image(); if (ret != LIBRAW_SUCCESS) { qCDebug(LIBKDCRAW_LOG) << "LibRaw: failed to run raw2image: " << libraw_strerror(ret); raw.recycle(); return false; } if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.6); Private::fillIndentifyInfo(&raw, identify); if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.8); rawData = QByteArray(); if (raw.imgdata.idata.filters == 0) { rawData.resize((int)(raw.imgdata.sizes.iwidth * raw.imgdata.sizes.iheight * raw.imgdata.idata.colors * sizeof(unsigned short))); unsigned short* output = reinterpret_cast<unsigned short*>(rawData.data()); for (unsigned int row = 0; row < raw.imgdata.sizes.iheight; row++) { for (unsigned int col = 0; col < raw.imgdata.sizes.iwidth; col++) { for (int color = 0; color < raw.imgdata.idata.colors; color++) { *output = raw.imgdata.image[raw.imgdata.sizes.iwidth*row + col][color]; output++; } } } } else { rawData.resize((int)(raw.imgdata.sizes.iwidth * raw.imgdata.sizes.iheight * sizeof(unsigned short))); unsigned short* output = reinterpret_cast<unsigned short*>(rawData.data()); for (uint row = 0; row < raw.imgdata.sizes.iheight; row++) { for (uint col = 0; col < raw.imgdata.sizes.iwidth; col++) { *output = raw.imgdata.image[raw.imgdata.sizes.iwidth*row + col][raw.COLOR(row, col)]; output++; } } } raw.recycle(); d->setProgress(1.0); return true; }
int main(int argc, char *argv[]) { if(argc==1) usage(argv[0]); LibRaw RawProcessor; int i,arg,c,ret; char opm,opt,*cp,*sp; int use_bigfile=0, use_timing=0,use_mem=0; #ifndef WIN32 int msize = 0,use_mmap=0; #endif void *iobuffer=0; #ifdef OUT #undef OUT #endif #define OUT RawProcessor.imgdata.params argv[argc] = (char*)""; for (arg=1; (((opm = argv[arg][0]) - 2) | 2) == '+'; ) { char *optstr = argv[arg]; opt = argv[arg++][1]; if ((cp = strchr (sp=(char*)"cnbrkStqmHABCgU", opt))!=0) for (i=0; i < "111411111144221"[cp-sp]-'0'; i++) if (!isdigit(argv[arg+i][0]) && !optstr[2]) { fprintf (stderr,"Non-numeric argument to \"-%c\"\n", opt); return 1; } if(!strchr("ftdeam",opt) && argv[arg-1][2]) fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); switch (opt) { case 'v': verbosity++; break; case 'G': OUT.green_matching = 1; break; case 'c': OUT.adjust_maximum_thr = (float)atof(argv[arg++]); break; case 'U': OUT.auto_bright_thr = (float)atof(argv[arg++]); break; case 'n': OUT.threshold = (float)atof(argv[arg++]); break; case 'b': OUT.bright = (float)atof(argv[arg++]); break; case 'P': OUT.bad_pixels = argv[arg++]; break; case 'K': OUT.dark_frame = argv[arg++]; break; case 'r': for(c=0;c<4;c++) OUT.user_mul[c] = (float)atof(argv[arg++]); break; case 'C': OUT.aber[0] = 1 / atof(argv[arg++]); OUT.aber[2] = 1 / atof(argv[arg++]); break; case 'g': OUT.gamm[0] = 1 / atof(argv[arg++]); OUT.gamm[1] = atof(argv[arg++]); break; case 'k': OUT.user_black = atoi(argv[arg++]); break; case 'S': OUT.user_sat = atoi(argv[arg++]); break; case 't': if(!strcmp(optstr,"-timing")) use_timing=1; else if(!argv[arg-1][2]) OUT.user_flip = atoi(argv[arg++]); else fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); break; case 'q': OUT.user_qual = atoi(argv[arg++]); break; case 'm': #ifndef WIN32 if(!strcmp(optstr,"-mmap")) use_mmap = 1; else #endif if(!strcmp(optstr,"-mem")) use_mem = 1; else { if(!argv[arg-1][2]) OUT.med_passes = atoi(argv[arg++]); else fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); } break; case 'H': OUT.highlight = atoi(argv[arg++]); break; case 's': OUT.shot_select = abs(atoi(argv[arg++])); break; case 'o': if(isdigit(argv[arg][0]) && !isdigit(argv[arg][1])) OUT.output_color = atoi(argv[arg++]); #ifndef NO_LCMS else OUT.output_profile = argv[arg++]; break; case 'p': OUT.camera_profile = argv[arg++]; #endif break; case 'h': OUT.half_size = 1; OUT.four_color_rgb = 1; break; case 'f': if(!strcmp(optstr,"-fbdd")) OUT.fbdd_noiserd = atoi(argv[arg++]); else { if(!argv[arg-1][2]) OUT.four_color_rgb = 1; else fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); } break; case 'A': for(c=0; c<4;c++) OUT.greybox[c] = atoi(argv[arg++]); break; case 'B': for(c=0; c<4;c++) OUT.cropbox[c] = atoi(argv[arg++]); break; case 'a': if(!strcmp(optstr,"-aexpo")) { OUT.exp_correc = 1; OUT.exp_shift = (float)atof(argv[arg++]); OUT.exp_preser = (float)atof(argv[arg++]); } else #ifdef LIBRAW_DEMOSAIC_PACK_GPL3 if(!strcmp(optstr,"-acae")) { OUT.ca_correc = 1; OUT.cared = (float)atof(argv[arg++]); OUT.cablue = (float)atof(argv[arg++]); } else if(!strcmp(optstr,"-aline")) { OUT.cfaline = 1; OUT.linenoise = (float)atof(argv[arg++]); } else if(!strcmp(optstr,"-aclean")) { OUT.cfa_clean = 1; OUT.lclean = (float)atof(argv[arg++]); OUT.cclean = (float)atof(argv[arg++]); } else if(!strcmp(optstr,"-agreen")) { OUT.cfa_green = 1; OUT.green_thresh =(float)atof(argv[arg++]); } else #endif if(!argv[arg-1][2]) OUT.use_auto_wb = 1; else fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); break; case 'w': OUT.use_camera_wb = 1; break; case 'M': OUT.use_camera_matrix = (opm == '+'); break; case 'j': OUT.use_fuji_rotate = 0; break; case 'W': OUT.no_auto_bright = 1; break; case 'T': OUT.output_tiff = 1; break; case '4': OUT.gamm[0] = OUT.gamm[1] = OUT.no_auto_bright = 1; /* no break here! */ case '6': OUT.output_bps = 16; break; case 'F': use_bigfile=1; break; case 'd': if(!strcmp(optstr,"-dcbi")) OUT.dcb_iterations = atoi(argv[arg++]); else if(!strcmp(optstr,"-disars")) OUT.use_rawspeed=0; else if(!strcmp(optstr,"-dcbe")) OUT.dcb_enhance_fl = 1; else if(!strcmp(optstr,"-dbnd")) { for(c=0; c<4; c++) OUT.wf_deband_treshold[c] = (float)atof(argv[arg++]); OUT.wf_debanding = 1; } else fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); break; #ifdef LIBRAW_DEMOSAIC_PACK_GPL2 case 'e': if(!strcmp(optstr,"-eeci")) OUT.eeci_refine = 1; else if(!strcmp(optstr,"-esmed")) OUT.es_med_passes = atoi(argv[arg++]); else fprintf (stderr,"Unknown option \"%s\".\n",argv[arg-1]); break; #endif default: fprintf (stderr,"Unknown option \"-%c\".\n", opt); return 1; } } #ifndef WIN32 putenv ((char*)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field #else _putenv ((char*)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field #endif #define P1 RawProcessor.imgdata.idata #define S RawProcessor.imgdata.sizes #define C RawProcessor.imgdata.color #define T RawProcessor.imgdata.thumbnail #define P2 RawProcessor.imgdata.other if(verbosity>1) RawProcessor.set_progress_handler(my_progress_callback,(void*)"Sample data passed"); #ifdef LIBRAW_USE_OPENMP if(verbosity) printf ("Using %d threads\n", omp_get_max_threads()); #endif for ( ; arg < argc; arg++) { char outfn[1024]; if(verbosity) printf("Processing file %s\n",argv[arg]); timerstart(); #ifndef WIN32 if(use_mmap) { int file = open(argv[arg],O_RDONLY); struct stat st; if(file<0) { fprintf(stderr,"Cannot open %s: %s\n",argv[arg],strerror(errno)); continue; } if(fstat(file,&st)) { fprintf(stderr,"Cannot stat %s: %s\n",argv[arg],strerror(errno)); close(file); continue; } int pgsz = getpagesize(); msize = ((st.st_size+pgsz-1)/pgsz)*pgsz; iobuffer = mmap(NULL,msize,PROT_READ,MAP_PRIVATE,file,0); if(!iobuffer) { fprintf(stderr,"Cannot mmap %s: %s\n",argv[arg],strerror(errno)); close(file); continue; } close(file); if( (ret = RawProcessor.open_buffer(iobuffer,st.st_size) != LIBRAW_SUCCESS)) { fprintf(stderr,"Cannot open_buffer %s: %s\n",argv[arg],libraw_strerror(ret)); continue; // no recycle b/c open file will recycle itself } } else #endif if (use_mem) { int file = open(argv[arg],O_RDONLY|O_BINARY); struct stat st; if(file<0) { fprintf(stderr,"Cannot open %s: %s\n",argv[arg],strerror(errno)); continue; } if(fstat(file,&st)) { fprintf(stderr,"Cannot stat %s: %s\n",argv[arg],strerror(errno)); close(file); continue; } if(!(iobuffer = malloc(st.st_size))) { fprintf(stderr,"Cannot allocate %d kbytes for memory buffer\n",(int)(st.st_size/1024)); close(file); continue; } int rd; if(st.st_size!=(rd=read(file,iobuffer,st.st_size))) { fprintf(stderr,"Cannot read %d bytes instead of %d to memory buffer\n",(int)rd,(int)st.st_size); close(file); free(iobuffer); continue; } close(file); if( (ret = RawProcessor.open_buffer(iobuffer,st.st_size) != LIBRAW_SUCCESS)) { fprintf(stderr,"Cannot open_buffer %s: %s\n",argv[arg],libraw_strerror(ret)); free(iobuffer); continue; // no recycle b/c open file will recycle itself } } else { if(use_bigfile) // force open_file switch to bigfile processing ret = RawProcessor.open_file(argv[arg],1); else ret = RawProcessor.open_file(argv[arg]); if( ret != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot open %s: %s\n",argv[arg],libraw_strerror(ret)); continue; // no recycle b/c open_file will recycle itself } } if(use_timing) timerprint("LibRaw::open_file()",argv[arg]); timerstart(); if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot unpack %s: %s\n",argv[arg],libraw_strerror(ret)); continue; } if(use_timing) timerprint("LibRaw::unpack()",argv[arg]); timerstart(); if (LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_process())) { fprintf(stderr,"Cannot do postpocessing on %s: %s\n",argv[arg],libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) continue; } if(use_timing) timerprint("LibRaw::dcraw_process()",argv[arg]); snprintf(outfn,sizeof(outfn), "%s.%s", argv[arg], OUT.output_tiff ? "tiff" : (P1.colors>1?"ppm":"pgm")); if(verbosity) { printf("Writing file %s\n",outfn); } if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) fprintf(stderr,"Cannot write %s: %s\n",outfn,libraw_strerror(ret)); #ifndef WIN32 if(use_mmap && iobuffer) { munmap(iobuffer,msize); iobuffer=0; } #endif else if(use_mem && iobuffer) { free(iobuffer); iobuffer = 0; } RawProcessor.recycle(); // just for show this call } return 0; }
int main(int argc, char *argv[]) { if(argc==1) usage(argv[0]); LibRaw RawProcessor; int i,arg,c,ret; char opm,opt,*cp,*sp; int use_mmap=0, msize; void *iobuffer; #define OUT RawProcessor.imgdata.params argv[argc] = (char*)""; for (arg=1; (((opm = argv[arg][0]) - 2) | 2) == '+'; ) { opt = argv[arg++][1]; if ((cp = strchr (sp=(char*)"cnbrkStqmHACgU", opt))) for (i=0; i < "111411111142"[cp-sp]-'0'; i++) if (!isdigit(argv[arg+i][0])) { fprintf (stderr,"Non-numeric argument to \"-%c\"\n", opt); return 1; } switch (opt) { case 'v': verbosity++; break; case 'c': OUT.adjust_maximum_thr = atof(argv[arg++]); break; case 'U': OUT.auto_bright_thr = atof(argv[arg++]); break; case 'n': OUT.threshold = atof(argv[arg++]); break; case 'b': OUT.bright = atof(argv[arg++]); break; case 'P': OUT.bad_pixels = argv[arg++]; break; case 'K': OUT.dark_frame = argv[arg++]; break; case 'r': for(c=0;c<4;c++) OUT.user_mul[c] = atof(argv[arg++]); break; case 'C': OUT.aber[0] = 1 / atof(argv[arg++]); OUT.aber[2] = 1 / atof(argv[arg++]); break; case 'g': OUT.gamm[0] = 1 / atof(argv[arg++]); OUT.gamm[1] = atof(argv[arg++]); break; case 'k': OUT.user_black = atoi(argv[arg++]); break; case 'S': OUT.user_sat = atoi(argv[arg++]); break; case 't': OUT.user_flip = atoi(argv[arg++]); break; case 'q': OUT.user_qual = atoi(argv[arg++]); break; case 'm': OUT.med_passes = atoi(argv[arg++]); break; case 'H': OUT.highlight = atoi(argv[arg++]); break; case 's': OUT.shot_select = abs(atoi(argv[arg++])); break; case 'o': if(isdigit(argv[arg][0]) && !isdigit(argv[arg][1])) OUT.output_color = atoi(argv[arg++]); #ifndef NO_LCMS else OUT.output_profile = argv[arg++]; break; case 'p': OUT.camera_profile = argv[arg++]; #endif break; case 'h': OUT.half_size = 1; // no break: "-h" implies "-f" case 'f': OUT.four_color_rgb = 1; break; case 'A': for(c=0; c<4;c++) OUT.greybox[c] = atoi(argv[arg++]); case 'a': OUT.use_auto_wb = 1; break; case 'w': OUT.use_camera_wb = 1; break; case 'M': OUT.use_camera_matrix = (opm == '+'); break; case 'j': OUT.use_fuji_rotate = 0; break; case 'W': OUT.no_auto_bright = 1; break; case 'T': OUT.output_tiff = 1; break; case '4': OUT.gamm[0] = OUT.gamm[1] = OUT.no_auto_bright = 1; /* no break here! */ case '6': OUT.output_bps = 16; break; #ifndef WIN32 case 'B': use_mmap = 1; break; #endif default: fprintf (stderr,"Unknown option \"-%c\".\n", opt); return 1; } } putenv ((char*)"TZ=UTC"); // dcraw compatibility, affects TIFF datestamp field OUT.filtering_mode = LIBRAW_FILTERING_AUTOMATIC; #define P1 RawProcessor.imgdata.idata #define S RawProcessor.imgdata.sizes #define C RawProcessor.imgdata.color #define T RawProcessor.imgdata.thumbnail #define P2 RawProcessor.imgdata.other if(verbosity>1) RawProcessor.set_progress_handler(my_progress_callback,(void*)"Sample data passed"); #ifdef _OPENMP if(verbosity) printf ("Using %d threads\n", omp_get_max_threads()); #endif for ( ; arg < argc; arg++) { char outfn[1024]; if(verbosity) printf("Processing file %s\n",argv[arg]); #ifndef WIN32 if(use_mmap) { int file = open(argv[arg],O_RDONLY); struct stat st; if(file<0) { fprintf(stderr,"Cannot open %s: %s\n",argv[arg],strerror(errno)); continue; } if(fstat(file,&st)) { fprintf(stderr,"Cannot stat %s: %s\n",argv[arg],strerror(errno)); close(file); continue; } int pgsz = getpagesize(); msize = ((st.st_size+pgsz-1)/pgsz)*pgsz; iobuffer = mmap(NULL,msize,PROT_READ,MAP_PRIVATE,file,0); if(!iobuffer) { fprintf(stderr,"Cannot mmap %s: %s\n",argv[arg],strerror(errno)); close(file); continue; } close(file); if( (ret = RawProcessor.open_buffer(iobuffer,st.st_size) != LIBRAW_SUCCESS)) { fprintf(stderr,"Cannot open_buffer %s: %s\n",argv[arg],libraw_strerror(ret)); continue; // no recycle b/c open file will recycle itself } } else #endif { if( (ret = RawProcessor.open_file(argv[arg])) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot open %s: %s\n",argv[arg],libraw_strerror(ret)); continue; // no recycle b/c open_file will recycle itself } } if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot unpack %s: %s\n",argv[arg],libraw_strerror(ret)); continue; } if (LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_process())) { fprintf(stderr,"Cannot do postpocessing on %s: %s\n",argv[arg],libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) continue; } snprintf(outfn,sizeof(outfn), "%s.%s", argv[arg], OUT.output_tiff ? "tiff" : (P1.colors>1?"ppm":"pgm")); if(verbosity) { printf("Writing file %s\n",outfn); } if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) fprintf(stderr,"Cannot write %s: %s\n",outfn,libraw_strerror(ret)); #ifndef WIN32 if(use_mmap && iobuffer) { munmap(iobuffer,msize); iobuffer=0; } #endif RawProcessor.recycle(); // just for show this call } return 0; }