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: * * <pre> * [j=1..Ns](Hj x Vj) <= 10 * </pre> * * 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; } }