Changeset 2704


Ignore:
Timestamp:
04/30/07 09:27:36 (13 years ago)
Author:
melissa
Message:

Finished msrle support for AVI; fixed NPE in DICOM reader.

Location:
trunk/loci/formats/in
Files:
2 edited

Legend:

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

    r2701 r2704  
    4242  /** Offset to each plane. */ 
    4343  private Vector offsets; 
     44 
     45  /** Number of bytes in each plane. */ 
     46  private Vector lengths; 
    4447 
    4548  private String type = "error"; 
     
    6467  private boolean isRLE = false; 
    6568 
     69  private byte[] lastImage; 
     70 
    6671  // -- Constructor -- 
    6772 
     
    118123 
    119124    if (isRLE) { 
    120       long nextOff = no < core.imageCount[0] - 1 ? 
    121         ((Long) offsets.get(no + 1)).longValue() : in.length(); 
    122       byte[] b = new byte[(int) (nextOff - fileOff)]; 
     125      byte[] b = new byte[(int) ((Long) lengths.get(no)).longValue()];  
    123126      in.read(b); 
    124       return decodeRLE(b); 
     127       
     128      b = decodeRLE(b); 
     129      if (no == core.imageCount[0] - 1) lastImage = null;  
     130      byte[] colors = new byte[b.length * 3]; 
     131      for (int i=0; i<b.length; i++) { 
     132        int ndx = b[i]; 
     133        if (ndx < 0) ndx += 256; 
     134        colors[i*3] = pr[ndx]; 
     135        colors[i*3 + 1] = pg[ndx]; 
     136        colors[i*3 + 2] = pb[ndx]; 
     137      }  
     138      return colors;  
    125139    } 
    126140 
     
    161175 
    162176    offsets = new Vector(); 
     177    lengths = new Vector(); 
    163178 
    164179    byte[] list = new byte[4]; 
     
    382397            if (fcc.equals("movi")) { 
    383398              spos = in.getFilePointer(); 
     399              if (spos >= in.length() - 12) break; 
    384400              type = readStringBytes(); 
    385401              size = in.readInt(); 
     
    400416                  type.substring(2).equals("dc")) 
    401417                { 
    402                   if (size > 1000) offsets.add(new Long(in.getFilePointer())); 
     418                  offsets.add(new Long(in.getFilePointer())); 
     419                  lengths.add(new Long(size));  
    403420                  in.skipBytes(size); 
    404421                } 
     
    441458    core.imageCount[0] = offsets.size(); 
    442459 
    443     core.rgb[0] = bmpBitsPerPixel > 8; 
     460    core.rgb[0] = bmpBitsPerPixel > 8 || isRLE; 
    444461    core.sizeZ[0] = 1; 
    445462    core.sizeC[0] = core.rgb[0] ? 3 : 1; 
     
    475492  } 
    476493 
    477   /** Decodes an RLE-encoded frame. */ 
     494  /**  
     495   * Decodes an RLE-encoded frame. This code was adapted from the FFMPEG source, 
     496   * http://ffmpeg.mplayerhq.hu. 
     497   */ 
    478498  private byte[] decodeRLE(byte[] in) { 
    479     /* debug */ System.out.println("decoding input stream (" + in.length + ")"); 
    480  
    481499    int pt = 0; 
    482     int code = 0; 
    483     int extra = 0; 
    484     byte stream = 0; 
     500    short code = 0; 
     501    short extra = 0; 
     502    short stream = 0; 
    485503 
    486504    int pixelPt = 0; 
    487     int row = core.sizeX[0] * core.sizeC[0]; 
     505    int row = core.sizeX[0]; 
    488506    int rowPt = (core.sizeY[0] - 1) * row; 
    489507    int frameSize = core.sizeY[0] * row; 
    490508 
    491     byte[] output = new byte[frameSize]; 
    492  
    493     while (rowPt >= 0) { 
     509    if (lastImage == null) lastImage = new byte[frameSize]; 
     510 
     511    while (rowPt >= 0 && pt < in.length - 1 && pixelPt < lastImage.length) { 
     512      stream = in[pt++];  
     513      if (stream < 0) stream += 256;  
    494514      code = stream; 
    495515 
    496516      if (code == 0) { 
    497517        stream = in[pt++]; 
     518        if (stream < 0) stream += 256;  
    498519        if (stream == 0) { 
    499520          rowPt -= row; 
    500521          pixelPt = 0; 
    501522        } 
    502         else if (stream == 1) return output; 
     523        else if (stream == 1) return lastImage; 
    503524        else if (stream == 2) { 
    504525          stream = in[pt++]; 
     526          if (stream < 0) stream += 256;  
    505527          pixelPt += stream; 
    506528          stream = in[pt++]; 
     529          if (stream < 0) stream += 256;  
    507530          rowPt -= stream * row; 
    508531        } 
    509532        else { 
    510533          if ((rowPt + pixelPt + stream > frameSize) || (rowPt < 0)) { 
    511             return output; 
     534            return lastImage; 
    512535          } 
    513536 
    514537          code = stream; 
    515           extra = stream & 0x01; 
    516           if (stream + code + extra > in.length) return output; 
     538          extra = (short) (stream & 0x01); 
     539          if (stream + code + extra > in.length) return lastImage; 
    517540 
    518541          while (code-- > 0) { 
    519542            stream = in[pt++]; 
    520             output[rowPt + pixelPt] = stream; 
     543            lastImage[rowPt + pixelPt] = (byte) stream; 
    521544            pixelPt++; 
    522545          } 
     
    527550      else { 
    528551        if ((rowPt + pixelPt + stream > frameSize) || (rowPt < 0)) { 
    529           return output; 
     552          return lastImage; 
    530553        } 
    531554 
     
    533556 
    534557        while (code-- > 0) { 
    535           output[rowPt + pixelPt] = stream; 
     558          lastImage[rowPt + pixelPt] = (byte) stream; 
    536559          pixelPt++; 
    537560        } 
     
    539562    } 
    540563 
    541     return output; 
     564    return lastImage; 
    542565  } 
    543566 
  • trunk/loci/formats/in/DicomReader.java

    r2701 r2704  
    332332      Date d = parse.parse(stamp, new ParsePosition(0)); 
    333333      SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    334       stamp = fmt.format(d); 
     334      if (d != null) stamp = fmt.format(d); 
    335335    } 
    336336 
Note: See TracChangeset for help on using the changeset viewer.