Changeset 2638


Ignore:
Timestamp:
04/19/07 08:10:31 (13 years ago)
Author:
melissa
Message:

Fixed native mjpb.

File:
1 edited

Legend:

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

    r2616 r2638  
    6161    0x48, 0x48, // X and Y density 
    6262    0x00, 0x00 // no thumbnail specified 
    63   }; 
    64  
    65   /** Luminance quantization table. */ 
    66   private static final byte[] LUM_QUANT = new byte[] { 
    67     3, 2, 2, 2, 2, 2, 3, 2, 
    68     2, 2, 3, 3, 3, 3, 4, 6, 
    69     4, 4, 4, 4, 4, 7, 5, 6, 
    70     5, 6, 9, 8, 9, 9, 8, 8, 
    71     8, 8, 9, 10, 13, 11, 9, 10, 
    72     13, 10, 8, 8, 12, 16, 12, 13, 
    73     14, 14, 15, 15, 15, 9, 11, 16, 
    74     17, 16, 14, 17, 13, 14, 15, 14 
    75   }; 
    76  
    77   /** Chrominance quantization table. */ 
    78   private static final byte[] CHROM_QUANT = new byte[] { 
    79     3, 3, 3, 4, 3, 4, 7, 4, 
    80     4, 7, 14, 10, 8, 10, 14, 14, 
    81     14, 14, 14, 14, 14, 14, 14, 14, 
    82     14, 14, 14, 14, 14, 14, 14, 14, 
    83     14, 14, 14, 14, 14, 14, 14, 14, 
    84     14, 14, 14, 14, 14, 14, 14, 14, 
    85     14, 14, 14, 14, 14, 14, 14, 14, 
    86     14, 14, 14, 14, 14, 14, 14, 14, 
    87   }; 
    88  
    89   /** Defines the number of entries in the luminance DC Huffman table. */ 
    90   private static final byte[] LUM_DC_BITS = new byte[] { 
    91     0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 
    92   }; 
    93  
    94   /** The luminance DC Huffman table. */ 
    95   private static final byte[] LUM_DC = new byte[] { 
    96     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 
    97   }; 
    98  
    99   /** Defines the number of entries in the chrominance DC Huffman table. */ 
    100   private static final byte[] CHROM_DC_BITS = new byte[] { 
    101     0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 
    102   }; 
    103  
    104   /** The chrominance DC Huffman table. */ 
    105   private static final byte[] CHROM_DC = new byte[] { 
    106     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 
    107   }; 
    108  
    109   /** Defines the number of entries in the luminance AC Huffman table. */ 
    110   private static final byte[] LUM_AC_BITS = new byte[] { 
    111     0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d 
    112   }; 
    113  
    114   /** The luminance AC Huffman table. */ 
    115   private static final byte[] LUM_AC = new byte[] { 
    116     1, 2, 3, 0, 4, 17, 5, 18, 33, 0x31, 0x41, 6, 19, 0x51, 0x61, 7, 
    117     34, 0x71, 20, 0x32, (byte) 0x81, (byte) 0x91, (byte) 161, 8, 35, 0x42, 
    118     (byte) 0xb1, (byte) 0xc1, 0x15, 0x52, (byte) 0xd1, (byte) 0xf0, 
    119     0x24, 0x33, 0x62, 0x72, (byte) 0x82, 9, 10, 22, 23, 24, 25, 26, 0x25, 
    120     0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 
    121     0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 
    122     0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 
    123     0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 
    124     0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 
    125     0x7a, (byte) 0x83, (byte) 0x84, (byte) 0x85, (byte) 0x86, (byte) 0x87, 
    126     (byte) 0x88, (byte) 0x89, (byte) 0x8a, (byte) 0x92, (byte) 0x93, 
    127     (byte) 0x94, (byte) 0x95, (byte) 0x96, (byte) 0x97, (byte) 0x98, 
    128     (byte) 0x99, (byte) 0x9a, (byte) 0xa2, (byte) 0xa3, (byte) 0xa4, 
    129     (byte) 0xa5, (byte) 0xa6, (byte) 0xa7, (byte) 0xa8, (byte) 0xa9, 
    130     (byte) 0xaa, (byte) 0xb2, (byte) 0xb3, (byte) 0xb4, (byte) 0xb5, 
    131     (byte) 0xb6, (byte) 0xb7, (byte) 0xb8, (byte) 0xb9, (byte) 0xba, 
    132     (byte) 0xc2, (byte) 0xc3, (byte) 0xc4, (byte) 0xc5, (byte) 0xc6, 
    133     (byte) 0xc7, (byte) 0xc8, (byte) 0xc9, (byte) 0xca, (byte) 0xd2, 
    134     (byte) 0xd3, (byte) 0xd4, (byte) 0xd5, (byte) 0xd6, (byte) 0xd7, 
    135     (byte) 0xd8, (byte) 0xd9, (byte) 0xda, (byte) 0xe1, (byte) 0xe2, 
    136     (byte) 0xe3, (byte) 0xe4, (byte) 0xe5, (byte) 0xe6, (byte) 0xe7, 
    137     (byte) 0xe8, (byte) 0xe9, (byte) 0xea, (byte) 0xf1, (byte) 0xf2, 
    138     (byte) 0xf3, (byte) 0xf4, (byte) 0xf5, (byte) 0xf6, (byte) 0xf7, 
    139     (byte) 0xf8, (byte) 0xf9, (byte) 0xfa 
    140   }; 
    141  
    142   /** Defines the number of entries in the chrominance AC Huffman table. */ 
    143   private static final byte[] CHROM_AC_BITS = new byte[] { 
    144     0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 
    145   }; 
    146  
    147   /** The chrominance AC Huffman table. */ 
    148   private static final byte[] CHROM_AC = new byte[] { 
    149     0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 
    150     0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 
    151     0x13, 0x22, 0x32, (byte) 0x81, 0x08, 0x14, 0x42, (byte) 0x91, (byte) 0xa1, 
    152     (byte) 0xb1, (byte) 0xc1, 0x09, 0x23, 0x33, 0x52, (byte) 0xf0, 
    153     0x15, 0x62, 0x72, (byte) 0xd1, 0x0a, 0x16, 0x24, 0x34, 
    154     (byte) 0xe1, 0x25, (byte) 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 
    155     0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 
    156     0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 
    157     0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 
    158     0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 
    159     0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 
    160     0x79, 0x7a, (byte) 0x82, (byte) 0x83, (byte) 0x84, (byte) 0x85, 
    161     (byte) 0x86, (byte) 0x87, (byte) 0x88, (byte) 0x89, (byte) 0x8a, 
    162     (byte) 0x92, (byte) 0x93, (byte) 0x94, (byte) 0x95, (byte) 0x96, 
    163     (byte) 0x97, (byte) 0x98, (byte) 0x99, (byte) 0x9a, (byte) 0xa2, 
    164     (byte) 0xa3, (byte) 0xa4, (byte) 0xa5, (byte) 0xa6, (byte) 0xa7, 
    165     (byte) 0xa8, (byte) 0xa9, (byte) 0xaa, (byte) 0xb2, (byte) 0xb3, 
    166     (byte) 0xb4, (byte) 0xb5, (byte) 0xb6, (byte) 0xb7, (byte) 0xb8, 
    167     (byte) 0xb9, (byte) 0xba, (byte) 0xc2, (byte) 0xc3, (byte) 0xc4, 
    168     (byte) 0xc5, (byte) 0xc6, (byte) 0xc7, (byte) 0xc8, (byte) 0xc9, 
    169     (byte) 0xca, (byte) 0xd2, (byte) 0xd3, (byte) 0xd4, (byte) 0xd5, 
    170     (byte) 0xd6, (byte) 0xd7, (byte) 0xd8, (byte) 0xd9, (byte) 0xda, 
    171     (byte) 0xe2, (byte) 0xe3, (byte) 0xe4, (byte) 0xe5, (byte) 0xe6, 
    172     (byte) 0xe7, (byte) 0xe8, (byte) 0xe9, (byte) 0xea, (byte) 0xf2, 
    173     (byte) 0xf3, (byte) 0xf4, (byte) 0xf5, (byte) 0xf6, (byte) 0xf7, 
    174     (byte) 0xf8, (byte) 0xf9, (byte) 0xfa 
    17563  }; 
    17664 
     
    1085973    if (pt >= input.length) pt = 0; 
    1086974 
     975    byte[] lumDcBits = null, lumAcBits = null, lumDc = null, lumAc = null; 
     976    byte[] quant = null; 
     977 
    1087978    // most MJPEG-B planes don't have this identifier 
    1088979    if (!(input[pt] != 'm' || input[pt+1] != 'j' || input[pt+2] != 'p' || 
     
    11371028        pt = quantOffset; 
    11381029        int length = DataTools.bytesToInt(input, pt, 2, core.littleEndian[0]); 
    1139         pt += length; 
     1030        pt += 3; 
     1031        quant = new byte[length - 3]; 
     1032        System.arraycopy(input, pt, quant, 0, quant.length); 
     1033        pt += quant.length; 
    11401034      } 
    11411035 
     
    11441038        pt = huffmanOffset; 
    11451039        int length = DataTools.bytesToInt(input, pt, 2, core.littleEndian[0]); 
    1146         pt += length; 
     1040        pt += 3; 
     1041        lumDcBits = new byte[16]; 
     1042        System.arraycopy(input, pt, lumDcBits, 0, lumDcBits.length); 
     1043        pt += lumDcBits.length; 
     1044        lumDc = new byte[12]; 
     1045        System.arraycopy(input, pt, lumDc, 0, lumDc.length); 
     1046        pt += lumDc.length + 1; 
     1047        lumAcBits = new byte[16]; 
     1048        System.arraycopy(input, pt, lumAcBits, 0, lumAcBits.length); 
     1049        pt += lumAcBits.length; 
     1050        lumAc = new byte[162]; 
     1051        System.arraycopy(input, pt, lumAc, 0, lumAc.length); 
     1052        pt += lumAc.length; 
    11471053      } 
    11481054 
     
    12191125    if (raw == null) raw = input; 
    12201126 
    1221     // "Because Motion-JPEG format B does not support markers, the JPEG 
    1222     // bitstream does not have null bytes (0x00) inserted after data bytes 
    1223     // that are set to 0xFF." 
    1224     // Thus quoth the specifications. 
    1225  
     1127    // insert zero after each byte equal to 0xff 
    12261128    ByteVector b = new ByteVector(); 
    12271129    for (int i=0; i<raw.length; i++) { 
     
    12501152    v.add(new byte[] {(byte) 0xff, (byte) 0xdb}); 
    12511153 
    1252     int length = LUM_QUANT.length + CHROM_QUANT.length + 4; 
     1154    int length = 67; 
    12531155    v.add((byte) ((length >>> 8) & 0xff)); 
    12541156    v.add((byte) (length & 0xff)); 
    12551157 
    12561158    v.add((byte) 0x00); 
    1257     v.add(LUM_QUANT); 
    1258     v.add((byte) 0x01); 
    1259     v.add(CHROM_QUANT); 
     1159    v.add(quant);  
    12601160 
    12611161    // add Huffman tables 
     
    12631163    v.add(new byte[] {(byte) 0xff, (byte) 0xc4}); 
    12641164 
    1265     length = LUM_DC_BITS.length + LUM_DC.length + CHROM_DC_BITS.length + 
    1266       CHROM_DC.length + LUM_AC_BITS.length + LUM_AC.length + 
    1267       CHROM_AC_BITS.length + CHROM_AC.length + 6; 
     1165    length = (lumDcBits.length + lumDc.length +  
     1166      lumAcBits.length + lumAc.length)*2 + 6;  
    12681167    v.add((byte) ((length >>> 8) & 0xff)); 
    12691168    v.add((byte) (length & 0xff)); 
     
    12721171 
    12731172    v.add((byte) 0x00); 
    1274     v.add(LUM_DC_BITS); 
    1275     v.add(LUM_DC); 
     1173    v.add(lumDcBits); 
     1174    v.add(lumDc); 
    12761175 
    12771176    v.add((byte) 0x01); 
    1278     v.add(CHROM_DC_BITS); 
    1279     v.add(CHROM_DC); 
     1177    v.add(lumDcBits); 
     1178    v.add(lumDc); 
    12801179 
    12811180    v.add((byte) 0x10); 
    1282     v.add(LUM_AC_BITS); 
    1283     v.add(LUM_AC); 
     1181    v.add(lumAcBits); 
     1182    v.add(lumAc); 
    12841183 
    12851184    v.add((byte) 0x11); 
    1286     v.add(CHROM_AC_BITS); 
    1287     v.add(CHROM_AC); 
     1185    v.add(lumAcBits); 
     1186    v.add(lumAc); 
    12881187 
    12891188    // add start-of-frame header 
     
    13651264      v2.add((byte) 0xff); 
    13661265      v2.add((byte) 0xd9); 
    1367  
     1266       
    13681267      BufferedImage top = bufferedJPEG(v.toByteArray()); 
    13691268      BufferedImage bottom = bufferedJPEG(v2.toByteArray()); 
Note: See TracChangeset for help on using the changeset viewer.