package org.jcodec.codecs.mpeg12.bitstream;
import org.jcodec.common.io.BitReader;
import org.jcodec.common.io.BitWriter;
import java.nio.ByteBuffer;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class QuantMatrixExtension implements MPEGHeader {
public int[] intra_quantiser_matrix;
public int[] non_intra_quantiser_matrix;
public int[] chroma_intra_quantiser_matrix;
public int[] chroma_non_intra_quantiser_matrix;
public static final int Quant_Matrix_Extension = 0x3;
public static QuantMatrixExtension read(BitReader _in) {
QuantMatrixExtension qme = new QuantMatrixExtension();
if (_in.read1Bit() != 0)
qme.intra_quantiser_matrix = readQMat(_in);
if (_in.read1Bit() != 0)
qme.non_intra_quantiser_matrix = readQMat(_in);
if (_in.read1Bit() != 0)
qme.chroma_intra_quantiser_matrix = readQMat(_in);
if (_in.read1Bit() != 0)
qme.chroma_non_intra_quantiser_matrix = readQMat(_in);
return qme;
}
private static int[] readQMat(BitReader _in) {
int[] qmat = new int[64];
for (int i = 0; i < 64; i++)
qmat[i] = _in.readNBit(8);
return qmat;
}
@Override
public void write(ByteBuffer bb) {
BitWriter bw = new BitWriter(bb);
bw.writeNBit(QuantMatrixExtension.Quant_Matrix_Extension, 4);
bw.write1Bit(intra_quantiser_matrix != null ? 1 : 0);
if (intra_quantiser_matrix != null)
writeQMat(intra_quantiser_matrix, bw);
bw.write1Bit(non_intra_quantiser_matrix != null ? 1 : 0);
if (non_intra_quantiser_matrix != null)
writeQMat(non_intra_quantiser_matrix, bw);
bw.write1Bit(chroma_intra_quantiser_matrix != null ? 1 : 0);
if (chroma_intra_quantiser_matrix != null)
writeQMat(chroma_intra_quantiser_matrix, bw);
bw.write1Bit(chroma_non_intra_quantiser_matrix != null ? 1 : 0);
if (chroma_non_intra_quantiser_matrix != null)
writeQMat(chroma_non_intra_quantiser_matrix, bw);
bw.flush();
}
private void writeQMat(int[] matrix, BitWriter ob) {
for (int i = 0; i < 64; i++)
ob.writeNBit(matrix[i], 8);
}
}