org.jcodec.codecs.mjpeg.ScanHeader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jcodec Show documentation
Show all versions of jcodec Show documentation
Pure Java implementation of video/audio codecs and formats
package org.jcodec.codecs.mjpeg;
import java.nio.ByteBuffer;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* This header specifies which component(s) are contained in the scan, specifies
* the destinations from which the entropy tables to be used with each component
* are retrieved, and (for the progressive DCT) which part of the DCT quantized
* coefficient data is contained in the scan. For lossless processes the scan
* parameters specify the predictor and the point transform.
*
* @author The JCodec project
*/
public class ScanHeader {
/**
* Scan header length. Specifies the length of the scan header shown in
* Figure B.4 (see B.1.1.4).
*/
int ls;
/**
* Number of image components in scan. Specifies the number of source image
* components in the scan. The value of Ns shall be equal to the number of
* sets of scan component specification parameters (Csj, Tdj, and Taj)
* present in the scan header.
*/
int ns;
public boolean isInterleaved() {
return ns > 1;
}
public static class Component {
/**
* Scan component selector. Selects which of the Nf image components
* specified in the frame parameters shall be the jth component in the
* scan. Each Csj shall match one of the Ci values specified in the
* frame header, and the ordering in the scan header shall follow the
* ordering in the frame header. If Ns > 1, the order of interleaved
* components in the MCU is Cs1 first, Cs2 second, etc. If Ns > 1, the
* following restriction shall be placed on the image components
* contained in the scan:
*
*
* [j=1..Ns](Hj x Vj) <= 10
*
*
* where Hj and Vj are the horizontal and vertical sampling factors for
* scan component j. These sampling factors are specified in the frame
* header for component i, where i is the frame component specification
* index for which frame component identifier Ci matches scan component
* selector Csj. As an example, consider an image having 3 components
* with maximum dimensions of 512 lines and 512 samples per line, and
* with the following sampling factors: Component Component 1 Component
* 2 2 0 4 1 1 2 2 2 0 0 1 1 2 H V H V H V = = = = = = , , Then the
* summation of Hj Vj is (4 1) + (1 2) + (2 2) = 10. The value of Csj
* shall be different from the values of Cs1 to Csj 1.
*/
int cs;
/**
* DC entropy coding table destination selector. Specifies one of four
* possible DC entropy coding table destinations from which the entropy
* table needed for decoding of the DC coefficients of component Csj is
* retrieved. The DC entropy table shall have been installed in this
* destination (see B.2.4.2 and B.2.4.3) by the time the decoder is
* ready to decode the current scan. This parameter specifies the
* entropy coding table destination for the lossless processes.
*/
int td;
/**
* AC entropy coding table destination selector. Specifies one of four
* possible AC entropy coding table destinations from which the entropy
* table needed for decoding of the AC coefficients of component Csj is
* retrieved. The AC entropy table selected shall have been installed in
* this destination (see B.2.4.2 and B.2.4.3) by the time the decoder is
* ready to decode the current scan. This parameter is zero for the
* lossless processes.
*/
int ta;
}
Component[] components;
/**
* Start of spectral or predictor selection. In the DCT modes of operation,
* this parameter specifies the first DCT coefficient in each block in
* zig-zag order which shall be coded in the scan. This parameter shall be
* set to zero for the sequential DCT processes. In the lossless mode of
* operations this parameter is used to select the predictor.
*/
int ss;
/**
* End of spectral selection. Specifies the last DCT coefficient in each
* block in zig-zag order which shall be coded in the scan. This parameter
* shall be set to 63 for the sequential DCT processes. In the lossless mode
* of operations this parameter has no meaning. It shall be set to zero.
*/
int se;
/**
* Successive approximation bit position high. This parameter specifies the
* point transform used in the preceding scan (i.e. successive approximation
* bit position low in the preceding scan) for the band of coefficients
* specified by Ss and Se. This parameter shall be set to zero for the first
* scan of each band of coefficients. In the lossless mode of operations
* this parameter has no meaning. It shall be set to zero.
*/
int ah;
/**
* Successive approximation bit position low or point transform. In the DCT
* modes of operation this parameter specifies the point transform, i.e. bit
* position low, used before coding the band of coefficients specified by Ss
* and Se. This parameter shall be set to zero for the sequential DCT
* processes. In the lossless mode of operations, this parameter specifies
* the point transform, Pt.
*/
int al;
public static ScanHeader read(ByteBuffer bb) {
ScanHeader scan = new ScanHeader();
scan.ls = bb.getShort() & 0xffff;
scan.ns = bb.get() & 0xff;
scan.components = new Component[scan.ns];
for (int i = 0; i < scan.components.length; i++) {
Component c = scan.components[i] = new Component();
c.cs = bb.get() & 0xff;
int tdta = bb.get() & 0xff;
c.td = (tdta & 0xf0) >>> 4;
c.ta = (tdta & 0x0f);
}
scan.ss = bb.get() & 0xff;
scan.se = bb.get() & 0xff;
int ahal = bb.get() & 0xff;
scan.ah = (ahal & 0xf0) >>> 4;
scan.al = (ahal & 0x0f);
return scan;
}
}