Changeset 2861


Ignore:
Timestamp:
06/13/07 11:11:55 (13 years ago)
Author:
melissa
Message:

Added support for >2GB files; improved metadata parsing and axis size detection.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/ND2Reader.java

    r2857 r2861  
    164164    in.seek(offsets[no]); 
    165165 
    166     byte[] b; 
    167     if (no < getImageCount() - 1) { 
    168       b = new byte[(int) (offsets[no + 1] - offsets[no])]; 
    169     } 
    170     else b = new byte[(int) (in.length() - offsets[no])]; 
     166    long len = no < core.imageCount[0] - 1 ? offsets[no + 1] - offsets[no] : 
     167      in.length() - offsets[no]; 
     168 
     169    byte[] b = new byte[(int) len];  
    171170    in.readFully(b); 
    172171 
     
    191190    b = null; 
    192191 
    193     int dataType = 0; 
    194     switch (core.pixelType[0]) { 
    195       case FormatTools.INT8: 
    196         throw new FormatException("Unsupported pixel type: int8"); 
    197       case FormatTools.UINT8: 
    198         dataType = DataBuffer.TYPE_BYTE; 
    199         break; 
    200       case FormatTools.INT16: 
    201         dataType = DataBuffer.TYPE_SHORT; 
    202         break; 
    203       case FormatTools.UINT16: 
    204         dataType = DataBuffer.TYPE_USHORT; 
    205         break; 
    206       case FormatTools.INT32: 
    207       case FormatTools.UINT32: 
    208         dataType = DataBuffer.TYPE_INT; 
    209         break; 
    210       case FormatTools.FLOAT: 
    211         dataType = DataBuffer.TYPE_FLOAT; 
    212         break; 
    213       case FormatTools.DOUBLE: 
    214         dataType = DataBuffer.TYPE_DOUBLE; 
    215         break; 
    216     } 
    217  
    218192    return img; 
    219193  } 
     
    231205    status("Calculating image offsets"); 
    232206 
    233     try { 
    234       File f = new File(Location.getMappedId(id)); 
    235       if (f.exists()) { 
    236         r.setVar("id", Location.getMappedId(id)); 
    237         r.setVar("read", "r"); 
    238         r.setVar("size", 4096); 
    239         r.exec("in = new BEBufferedRandomAccessFile(id, read, size)"); 
    240       } 
    241       else { 
    242         r.setVar("id", in); 
    243         r.setVar("size", 65536); 
    244         r.setVar("inc", 4096); 
    245         r.setVar("max", (int) in.length()); 
    246         r.exec("in = new ISRandomAccessIO(id, size, inc, max)"); 
    247       } 
    248  
    249       r.setVar("j2kMetadata", null); 
    250       r.exec("ff = new FileFormatReader(in, j2kMetadata)"); 
    251  
    252       r.exec("ff.readFileFormat()"); 
    253       r.exec("offsets = ff.getCodeStreamPos()"); 
    254       offsets = (long[]) r.getVar("offsets"); 
    255     } 
    256     catch (ReflectException e) { throw new FormatException(e); } 
     207    Vector vs = new Vector(); 
     208 
     209    long pos = in.getFilePointer(); 
     210    boolean lastBoxFound = false; 
     211    int length = 0; 
     212    int box = 0; 
     213 
     214    while (!lastBoxFound) { 
     215      pos = in.getFilePointer(); 
     216      length = in.readInt(); 
     217      if (pos + length >= in.length()) lastBoxFound = true; 
     218      box = in.readInt(); 
     219      pos = in.getFilePointer(); 
     220      length -= 8; 
     221 
     222      if (box == 0x6a703263) {  
     223        vs.add(new Long(in.getFilePointer()));  
     224      } 
     225      if (!lastBoxFound) in.seek(pos + length);  
     226    } 
     227 
     228    offsets = new long[vs.size()]; 
     229    for (int i=0; i<offsets.length; i++) { 
     230      offsets[i] = ((Long) vs.get(i)).longValue(); 
     231    } 
    257232 
    258233    status("Finding XML metadata"); 
     
    267242 
    268243    boolean found = false; 
    269     int off = -1; 
     244    long off = -1; 
    270245    byte[] buf = new byte[2048]; 
    271246    while (!found && in.getFilePointer() < in.length()) { 
     
    283258        if (buf[i] == (byte) 0xff && buf[i+1] == (byte) 0xd9) { 
    284259          found = true; 
    285           off = (int) (in.getFilePointer() - (read+10) + i); 
     260          off = in.getFilePointer() - (read + 10) + i; 
    286261          i = buf.length; 
    287262          break; 
     
    301276      // sample files are; this means we need to manually parse it :-( 
    302277 
    303       // first, let's strip out all comments 
    304  
    305       StringBuffer sb = new StringBuffer(xml); 
    306       while (sb.indexOf("<!--") != -1) { 
    307         int ndx = sb.indexOf("<!--"); 
    308         sb.delete(ndx, sb.indexOf("-->", ndx)); 
    309       } 
    310       xml = sb.toString(); 
    311  
    312278      // strip out binary data at the end - this is irrelevant for our purposes 
    313279      xml = xml.substring(0, xml.lastIndexOf("</MetadataSeq>") + 14); 
    314280 
     281      // strip out all comments 
     282      xml = xml.replaceAll("<!--*-->", ""); 
     283       
    315284      // each chunk appears on a separate line, so split up the chunks 
    316285 
     
    341310                // strip out the data types 
    342311                if (key.indexOf("runtype") == -1) { 
     312                  if (prefix.startsWith("Metadata_V1.2")) { 
     313                    prefix = ""; 
     314                  }  
    343315                  String effectiveKey = prefix + " " + pre + " " + key; 
    344316                  if (!metadata.containsKey(effectiveKey)) { 
     
    352324                      } 
    353325                    } 
    354                     else if (effectiveKey.endsWith("dTimeMSec value")) { 
     326                    else if (effectiveKey.endsWith("dTimeAbsolute value")) { 
    355327                      long v = (long) Double.parseDouble(value); 
    356328                      if (!ts.contains(new Long(v))) { 
     
    402374 
    403375    for (int i=1; i<offsets.length; i++) { 
    404       if (offsets[i] - offsets[i - 1] < (core.sizeX[0] * core.sizeY[0] / 4)) { 
     376      if (offsets[i] - offsets[i - 1] < (core.sizeX[0] * core.sizeY[0] / 3)) { 
    405377        offsets[i - 1] = 0; 
    406378        numInvalid++; 
     
    542514    }  
    543515 
     516    if (core.sizeZ[0] * core.sizeT[0] * core.sizeC[0] < core.imageCount[0]) { 
     517      core.sizeC[0] = 1; 
     518      core.sizeT[0] = 1; 
     519      core.sizeZ[0] = core.imageCount[0]; 
     520    }  
     521 
    544522    core.rgb[0] = core.sizeC[0] == 3; 
    545523    core.interleaved[0] = true; 
Note: See TracChangeset for help on using the changeset viewer.