Changeset 2917


Ignore:
Timestamp:
06/28/07 10:49:40 (12 years ago)
Author:
melissa
Message:

Moved MS-RLE codec out of AVIReader.

Location:
trunk/loci/formats
Files:
1 added
1 edited

Legend:

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

    r2725 r2917  
    2929import java.util.Vector; 
    3030import loci.formats.*; 
     31import loci.formats.codec.MSRLECodec; 
    3132 
    3233/** 
     
    5152  private long pos; 
    5253 
    53   // Stream Header chunk fields 
    54  
    55   private String fccStreamType; 
    56  
    5754  // Stream Format chunk fields 
    5855 
    59   private int bmpSizeOfBitmap; 
    6056  private int bmpColorsUsed, bmpWidth; 
    6157  private int bmpCompression, bmpScanLineSize; 
     
    126122      in.read(b); 
    127123 
    128       b = decodeRLE(b); 
     124      Object[] options = new Object[2]; 
     125      options[1] = lastImage; 
     126      options[0] = new int[] {core.sizeX[0], core.sizeY[0]}; 
     127 
     128      MSRLECodec codec = new MSRLECodec(); 
     129      b = codec.decompress(b, options);  
     130      lastImage = b;  
    129131      if (no == core.imageCount[0] - 1) lastImage = null; 
    130132      byte[] colors = new byte[b.length * 3]; 
     
    267269              if (type.equals("strh")) { 
    268270                spos = in.getFilePointer(); 
    269  
    270                 String fccStreamTypeOld = fccStreamType; 
    271                 fccStreamType = readStringBytes(); 
    272                 if (!fccStreamType.equals("vids")) { 
    273                   fccStreamType = fccStreamTypeOld; 
    274                 } 
     271                readStringBytes(); 
    275272 
    276273                in.skipBytes(36); 
     
    295292                bmpBitsPerPixel = in.readShort(); 
    296293                bmpCompression = in.readInt(); 
    297                 bmpSizeOfBitmap = in.readInt(); 
     294                in.skipBytes(4); 
    298295 
    299296                addMeta("Horizontal resolution", new Integer(in.readInt())); 
     
    353350 
    354351                  for (int i=0; i<bmpColorsUsed; i++) { 
    355                     pb[i] = (byte) in.read(); 
    356                     pg[i] = (byte) in.read(); 
    357                     pr[i] = (byte) in.read(); 
     352                    pb[i] = (byte) (in.read() & 0xff); 
     353                    pg[i] = (byte) (in.read() & 0xff); 
     354                    pr[i] = (byte) (in.read() & 0xff); 
    358355                    in.read(); 
    359356                  } 
     
    465462    core.littleEndian[0] = true; 
    466463 
    467     int bytesPerPixel = bmpBitsPerPixel / 8; 
    468  
    469464    if (bmpBitsPerPixel == 8) core.pixelType[0] = FormatTools.UINT8; 
    470465    else if (bmpBitsPerPixel == 16) core.pixelType[0] = FormatTools.UINT16; 
     
    492487  } 
    493488 
    494   /** 
    495    * Decodes an RLE-encoded frame. This code was adapted from the FFMPEG source, 
    496    * http://ffmpeg.mplayerhq.hu. 
    497    */ 
    498   private byte[] decodeRLE(byte[] in) { 
    499     int pt = 0; 
    500     short code = 0; 
    501     short extra = 0; 
    502     short stream = 0; 
    503  
    504     int pixelPt = 0; 
    505     int row = core.sizeX[0]; 
    506     int rowPt = (core.sizeY[0] - 1) * row; 
    507     int frameSize = core.sizeY[0] * row; 
    508  
    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; 
    514       code = stream; 
    515  
    516       if (code == 0) { 
    517         stream = in[pt++]; 
    518         if (stream < 0) stream += 256; 
    519         if (stream == 0) { 
    520           rowPt -= row; 
    521           pixelPt = 0; 
    522         } 
    523         else if (stream == 1) return lastImage; 
    524         else if (stream == 2) { 
    525           stream = in[pt++]; 
    526           if (stream < 0) stream += 256; 
    527           pixelPt += stream; 
    528           stream = in[pt++]; 
    529           if (stream < 0) stream += 256; 
    530           rowPt -= stream * row; 
    531         } 
    532         else { 
    533           if ((rowPt + pixelPt + stream > frameSize) || (rowPt < 0)) { 
    534             return lastImage; 
    535           } 
    536  
    537           code = stream; 
    538           extra = (short) (stream & 0x01); 
    539           if (stream + code + extra > in.length) return lastImage; 
    540  
    541           while (code-- > 0) { 
    542             stream = in[pt++]; 
    543             lastImage[rowPt + pixelPt] = (byte) stream; 
    544             pixelPt++; 
    545           } 
    546  
    547           if (extra != 0) pt++; 
    548         } 
    549       } 
    550       else { 
    551         if ((rowPt + pixelPt + stream > frameSize) || (rowPt < 0)) { 
    552           return lastImage; 
    553         } 
    554  
    555         stream = in[pt++]; 
    556  
    557         while (code-- > 0) { 
    558           lastImage[rowPt + pixelPt] = (byte) stream; 
    559           pixelPt++; 
    560         } 
    561       } 
    562     } 
    563  
    564     return lastImage; 
    565   } 
    566  
    567489} 
Note: See TracChangeset for help on using the changeset viewer.