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 SequenceExtension implements MPEGHeader {
public static final int Chroma420 = 0x1;
public static final int Chroma422 = 0x2;
public static final int Chroma444 = 0x3;
public int profile_and_level;
public int progressive_sequence;
public int chroma_format;
public int horizontal_size_extension;
public int vertical_size_extension;
public int bit_rate_extension;
public int vbv_buffer_size_extension;
public int low_delay;
public int frame_rate_extension_n;
public int frame_rate_extension_d;
public static final int Sequence_Extension = 0x1;
public static SequenceExtension createSequenceExtension(int profile_and_level, int progressive_sequence,
int chroma_format, int horizontal_size_extension, int vertical_size_extension, int bit_rate_extension,
int vbv_buffer_size_extension, int low_delay, int frame_rate_extension_n, int frame_rate_extension_d) {
SequenceExtension se = new SequenceExtension();
se.profile_and_level = profile_and_level;
se.progressive_sequence = progressive_sequence;
se.chroma_format = chroma_format;
se.horizontal_size_extension = horizontal_size_extension;
se.vertical_size_extension = vertical_size_extension;
se.bit_rate_extension = bit_rate_extension;
se.vbv_buffer_size_extension = vbv_buffer_size_extension;
se.low_delay = low_delay;
se.frame_rate_extension_n = frame_rate_extension_n;
se.frame_rate_extension_d = frame_rate_extension_d;
return se;
}
private SequenceExtension() {
}
public static SequenceExtension read(BitReader _in) {
SequenceExtension se = new SequenceExtension();
se.profile_and_level = _in.readNBit(8);
se.progressive_sequence = _in.read1Bit();
se.chroma_format = _in.readNBit(2);
se.horizontal_size_extension = _in.readNBit(2);
se.vertical_size_extension = _in.readNBit(2);
se.bit_rate_extension = _in.readNBit(12);
se.vbv_buffer_size_extension = _in.readNBit(8);
se.low_delay = _in.read1Bit();
se.frame_rate_extension_n = _in.readNBit(2);
se.frame_rate_extension_d = _in.readNBit(5);
return se;
}
@Override
public void write(ByteBuffer bb) {
BitWriter bw = new BitWriter(bb);
bw.writeNBit(SequenceExtension.Sequence_Extension, 4);
bw.writeNBit(profile_and_level, 8);
bw.write1Bit(progressive_sequence);
bw.writeNBit(chroma_format, 2);
bw.writeNBit(horizontal_size_extension, 2);
bw.writeNBit(vertical_size_extension, 2);
bw.writeNBit(bit_rate_extension, 12);
bw.write1Bit(1); // todo: verify this
bw.writeNBit(vbv_buffer_size_extension, 8);
bw.write1Bit(low_delay);
bw.writeNBit(frame_rate_extension_n, 2);
bw.writeNBit(frame_rate_extension_d, 5);
bw.flush();
}
}