Changeset 13918

Show
Ignore:
Timestamp:
03/03/08 16:05:51 (4 months ago)
Author:
warmerdam
Message:

Add VSI*L reading and writing (vsil_target) (#2255)
Remove KAKADU4 related ifdefs, we now assume at least KAKADU 4.2.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/frmts/jp2kak/jp2kakdataset.cpp

    r13883 r13918  
    4343 
    4444#include "subfile_source.h" 
     45#include "vsil_target.h" 
    4546 
    4647// Application level includes 
     
    5354#include "roi_sources.h" 
    5455 
    55 #ifdef J2_INPUT_MAX_BUFFER_BYTES 
    56 #  define KAKADU4 
    57  
    58 #  ifdef JP2_COMPRESSION_TYPE_NONE 
    59 #    define KAKADU41 
    60 #  endif 
    61 #endif                                                                   
    62  
    63 #if defined(KAKADU4) && defined(WIN32) && !defined(KAKADU41) 
     56#if defined(WIN32) 
    6457#  define USE_JPIP 
    6558#endif 
     
    7063#  define kdu_client void 
    7164#endif 
     65 
     66// #define KAKADU_JPX   1 
    7267 
    7368CPL_CVSID("$Id$"); 
     
    109104    kdu_compressed_source *poInput; 
    110105    kdu_compressed_source *poRawInput; 
    111 #ifdef KAKADU4 
    112106    jp2_family_src  *family; 
    113 #endif 
    114107    kdu_client      *jpip_client; 
    115108    kdu_dims dims;  
     
    325318    { 
    326319        int nRedIndex=-1, nGreenIndex=-1, nBlueIndex=-1, nLutIndex; 
    327 #ifdef KAKADU41 
    328320        int nCSI; 
    329 #endif 
    330321 
    331322        if( oJP2Channels.get_num_colours() == 3 ) 
    332323        { 
    333 #ifdef KAKADU41  
    334324            oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex, nCSI ); 
    335325            oJP2Channels.get_colour_mapping( 1, nGreenIndex, nLutIndex, nCSI ); 
    336326            oJP2Channels.get_colour_mapping( 2, nBlueIndex, nLutIndex, nCSI ); 
    337 #else 
    338             oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex ); 
    339             oJP2Channels.get_colour_mapping( 1, nGreenIndex, nLutIndex ); 
    340             oJP2Channels.get_colour_mapping( 2, nBlueIndex, nLutIndex ); 
    341 #endif 
    342327        } 
    343328        else 
    344329        { 
    345 #ifdef KAKADU41  
    346330            oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex, nCSI ); 
    347 #else 
    348             oJP2Channels.get_colour_mapping( 0, nRedIndex, nLutIndex ); 
    349 #endif 
    350331            if( nBand == 1 ) 
    351332                eInterp = GCI_GrayIndex; 
     
    377358                 color_idx < oJP2Channels.get_num_colours(); color_idx++ ) 
    378359            { 
    379 #ifdef KAKADU41  
    380360                if( oJP2Channels.get_opacity_mapping( color_idx, opacity_idx, 
    381361                                                      lut_idx, nCSI ) ) 
     
    390370                        eInterp = GCI_AlphaBand; 
    391371                } 
    392 #else 
    393                 if( oJP2Channels.get_opacity_mapping( color_idx, opacity_idx, 
    394                                                       lut_idx ) ) 
    395                 { 
    396                     if( opacity_idx == nBand - 1 ) 
    397                         eInterp = GCI_AlphaBand; 
    398                 } 
    399                 if( oJP2Channels.get_premult_mapping( color_idx, opacity_idx, 
    400                                                       lut_idx ) ) 
    401                 { 
    402                     if( opacity_idx == nBand - 1 ) 
    403                         eInterp = GCI_AlphaBand; 
    404                 } 
    405 #endif 
    406372            } 
    407373        } 
     
    941907    nGCPCount = 0; 
    942908    pasGCPList = NULL; 
    943 #ifdef KAKADU4 
    944909    family = NULL; 
    945 #endif 
    946910 
    947911    bGeoTransformValid = FALSE; 
     
    976940        poInput->close(); 
    977941        delete poInput; 
    978 #ifdef KAKADU4 
    979942        if( family ) 
    980943        { 
     
    982945            delete family; 
    983946        } 
    984 #endif 
    985947        if( poRawInput != NULL ) 
    986948            delete poRawInput; 
     
    11501112/*      Handle setting up datasource for JPIP.                          */ 
    11511113/* -------------------------------------------------------------------- */ 
     1114    KakaduInitialize(); 
     1115         
    11521116    pszExtension = CPLGetExtension( poOpenInfo->pszFilename ); 
    11531117    if( poOpenInfo->nHeaderBytes < 16 ) 
     
    11641128            static GByte abySubfileHeader[16]; 
    11651129 
    1166             KakaduInitialize(); 
    11671130            try 
    11681131            { 
    1169                 poRawInput = new subfile_source( poOpenInfo->pszFilename ); 
     1132                poRawInput = new subfile_source; 
     1133                poRawInput->open( poOpenInfo->pszFilename ); 
    11701134                poRawInput->seek( 0 ); 
    11711135 
     
    11901154    } 
    11911155 
    1192     KakaduInitialize(); 
    1193          
     1156/* -------------------------------------------------------------------- */ 
     1157/*      If we think this should be access via vsil, then open it        */ 
     1158/*      accordingly.                                                    */ 
     1159/* -------------------------------------------------------------------- */ 
     1160    if( poOpenInfo->fp == NULL 
     1161        && poRawInput == NULL 
     1162        && !bIsJPIP ) 
     1163    { 
     1164        try 
     1165        { 
     1166            poRawInput = new subfile_source; 
     1167            poRawInput->open( poOpenInfo->pszFilename ); 
     1168            poRawInput->seek( 0 ); 
     1169        } 
     1170        catch( ... ) 
     1171        { 
     1172            return NULL; 
     1173        } 
     1174    } 
     1175 
    11941176/* -------------------------------------------------------------------- */ 
    11951177/*      If the header is a JP2 header, mark this as a JP2 dataset.      */ 
     
    12061188    jp2_channels oJP2Channels; 
    12071189 
    1208 #ifdef KAKADU4 
    12091190    jp2_family_src *family = NULL; 
    1210 #endif 
    12111191 
    12121192    try 
     
    12771257            jp2_source *jp2_src; 
    12781258 
    1279 #ifdef KAKADU4 
    12801259            family = new jp2_family_src; 
    12811260            if( poRawInput != NULL ) 
     
    12861265            jp2_src->open( family ); 
    12871266            jp2_src->read_header(); 
    1288 #else 
    1289             jp2_src = new jp2_source; 
    1290             jp2_src->open( poOpenInfo->pszFilename, true ); 
    1291 #endif 
     1267 
    12921268            poInput = jp2_src; 
    12931269 
     
    13371313        poDS->jpip_client = jpip_client; 
    13381314 
    1339 #ifdef KAKADU4 
    13401315        poDS->family = family; 
    1341 #endif 
     1316 
    13421317/* -------------------------------------------------------------------- */ 
    13431318/*      Get overall image size.                                         */ 
     
    19611936/*      Write to a box on the JP2 file.                                 */ 
    19621937/* -------------------------------------------------------------------- */ 
    1963 #ifdef KAKADU4 
    19641938    jp2_out->open_next( nBoxType ); 
    19651939 
     
    19681942 
    19691943    jp2_out->close(); 
    1970 #else 
    1971     jp2_output_box &uuid_box = jp2_out->open_box( nBoxType ); 
    1972  
    1973     uuid_box.write( (kdu_byte *) poBox->GetWritableData(),  
    1974                     poBox->GetDataLength() ); 
    1975  
    1976     uuid_box.close(); 
    1977 #endif 
    19781944 
    19791945    delete poBox; 
     
    23432309/*      Open output file, and setup codestream.                         */ 
    23442310/* -------------------------------------------------------------------- */ 
    2345 #ifdef KAKADU4 
    23462311    jp2_family_tgt         family; 
    2347 #endif 
    2348 #ifdef KAKADU42 
     2312#ifdef KAKADU_JPX 
    23492313    jpx_family_tgt         jpx_family; 
    23502314    jpx_target             jpx_out; 
     
    23562320    kdu_compressed_target *poOutputFile = NULL; 
    23572321    jp2_target             jp2_out; 
    2358     kdu_simple_file_target jpc_out; 
    23592322    int                    bIsJP2 = !EQUAL(CPLGetExtension(pszFilename),"jpc") 
    23602323        && !bIsJPX; 
    23612324    kdu_codestream         oCodeStream; 
    23622325 
     2326    vsil_target            oVSILTarget; 
     2327 
    23632328    if( !pfnProgress( 0.0, NULL, pProgressData ) ) 
    23642329        return NULL; 
     
    23662331    try 
    23672332    { 
     2333        oVSILTarget.open( pszFilename, "w" ); 
     2334 
    23682335        if( bIsJP2 ) 
    23692336        { 
    2370 #ifdef KAKADU4 
    2371             family.open( pszFilename ); 
     2337            //family.open( pszFilename ); 
     2338            family.open( &oVSILTarget ); 
    23722339 
    23732340            jp2_out.open( &family ); 
    2374 #else 
    2375             jp2_out.open( pszFilename ); 
    2376 #endif 
    23772341            poOutputFile = &jp2_out; 
    23782342        } 
    2379 #ifdef KAKADU42 
     2343#ifdef KAKADU_JPX 
    23802344        else if( bIsJPX ) 
    23812345        { 
     
    23872351#endif 
    23882352        else 
    2389         { 
    2390             jpc_out.open( pszFilename ); 
    2391             poOutputFile = &jpc_out; 
    2392         } 
     2353            poOutputFile = &oVSILTarget; 
    23932354 
    23942355        oCodeStream.create(&oSizeParams, poOutputFile ); 
     
    25612522    } 
    25622523 
    2563 #ifdef KAKADU4 
    25642524    if( bIsJP2 ) 
    25652525    { 
    25662526        jp2_out.write_header(); 
    25672527    } 
    2568 #endif 
    25692528 
    25702529/* -------------------------------------------------------------------- */ 
     
    26302589/*      Open codestream box.                                            */ 
    26312590/* -------------------------------------------------------------------- */ 
    2632 #ifdef KAKADU4 
    26332591    if( bIsJP2 ) 
    26342592        jp2_out.open_codestream(); 
    2635 #endif 
    26362593 
    26372594/* -------------------------------------------------------------------- */ 
     
    27092666    { 
    27102667        jp2_out.close(); 
    2711 #ifdef KAKADU4 
    27122668        family.close(); 
    2713 #endif 
    27142669    } 
    27152670    else 
     
    27172672        poOutputFile->close(); 
    27182673    } 
     2674 
     2675    oVSILTarget.close(); 
    27192676 
    27202677    if( !pfnProgress( 1.0, NULL, pProgressData ) ) 
     
    27532710                                   "JPEG-2000 (based on Kakadu)" ); 
    27542711        poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,  
    2755                                    "frmt_jpeg2000.html" ); 
     2712                                   "frmt_jp2kak.html" ); 
    27562713        poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES,  
    27572714                                   "Byte Int16 UInt16" ); 
    27582715        poDriver->SetMetadataItem( GDAL_DMD_MIMETYPE, "image/jp2" ); 
    27592716        poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "jp2" ); 
     2717 
     2718        poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" ); 
    27602719 
    27612720        poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST,  
  • trunk/gdal/frmts/jp2kak/subfile_source.h

    r10645 r13918  
    3939  public:  
    4040    subfile_source() { file = NULL; } 
    41     subfile_source(const char *fname, bool allow_seeks=true) 
    42       { file = NULL; open(fname,allow_seeks); } 
    43  
    44  
    4541    ~subfile_source() { close(); } 
    4642 
     
    5046    bool operator!() { return (file == NULL); } 
    5147 
    52     void open(const char *fname, bool allow_seeks=true
     48    void open(const char *fname
    5349      { 
    5450          const char *real_filename; 
    5551          close(); 
    5652 
    57           if( sscanf( fname, "J2K_SUBFILE:%d,%d",  
    58                       &subfile_offset, &subfile_size ) != 2 ) 
     53          if( EQUALN( fname, "J2K_SUBFILE:",12) ) 
    5954          { 
    60               kdu_error e; 
    61  
    62               e << "Corrupt subfile definition:" << fname; 
    63               return; 
     55              if( sscanf( fname, "J2K_SUBFILE:%d,%d",  
     56                          &subfile_offset, &subfile_size ) != 2 ) 
     57              { 
     58                  kdu_error e; 
     59                   
     60                  e << "Corrupt subfile definition:" << fname; 
     61                  return; 
     62              } 
     63              real_filename = strstr(fname,","); 
     64              if( real_filename != NULL ) 
     65                  real_filename = strstr(real_filename+1,","); 
     66              if( real_filename != NULL ) 
     67                  real_filename++; 
     68              else 
     69              { 
     70                  kdu_error e; 
     71               
     72                  e << "Could not find filename in subfile definition." << fname; 
     73                  return; 
     74              } 
     75          } 
     76          else 
     77          { 
     78              real_filename = fname; 
     79              subfile_offset = 0; 
     80              subfile_size = 0;  
    6481          } 
    6582 
    66           real_filename = strstr(fname,","); 
    67           if( real_filename != NULL ) 
    68               real_filename = strstr(real_filename+1,","); 
    69           if( real_filename != NULL ) 
    70               real_filename++; 
    71           else 
    72           { 
    73               kdu_error e; 
    74  
    75               e << "Could not find filename in subfile definition." << fname; 
    76               return; 
    77           } 
    78  
    79           file = VSIFOpenL( real_filename, "rb" ); 
     83          file = VSIFOpenL( real_filename, "r"); 
    8084          if( file == NULL ) 
    8185          { 
     
    8690          } 
    8791 
    88           capabilities = KDU_SOURCE_CAP_SEQUENTIAL; 
    89           if (allow_seeks) 
    90               capabilities |= KDU_SOURCE_CAP_SEEKABLE; 
     92          capabilities = KDU_SOURCE_CAP_SEQUENTIAL | KDU_SOURCE_CAP_SEEKABLE; 
    9193 
    9294          seek_origin = subfile_offset; 
     
    122124      {  
    123125        if (file == NULL) return -1; 
    124         kdu_long result = VSIFTell( file ); 
     126        kdu_long result = VSIFTellL( file ); 
    125127        if (!absolute)  
    126128            result -= seek_origin;