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 PictureCodingExtension implements MPEGHeader {
public static final int Top_Field = 1;
public static final int Bottom_Field = 2;
public static final int Frame = 3;
public int[][] f_code;
public int intra_dc_precision;
public int picture_structure;
public int top_field_first;
public int frame_pred_frame_dct;
public int concealment_motion_vectors;
public int q_scale_type;
public int intra_vlc_format;
public int alternate_scan;
public int repeat_first_field;
public int chroma_420_type;
public int progressive_frame;
public CompositeDisplay compositeDisplay;
public static final int Picture_Coding_Extension = 0x8;
public PictureCodingExtension() {
this.f_code = new int[2][2];
}
public static class CompositeDisplay {
public int v_axis;
public int field_sequence;
public int sub_carrier;
public int burst_amplitude;
public int sub_carrier_phase;
public static CompositeDisplay read(BitReader _in) {
CompositeDisplay cd = new CompositeDisplay();
cd.v_axis = _in.read1Bit();
cd.field_sequence = _in.readNBit(3);
cd.sub_carrier = _in.read1Bit();
cd.burst_amplitude = _in.readNBit(7);
cd.sub_carrier_phase = _in.readNBit(8);
return cd;
}
public void write(BitWriter out) {
out.write1Bit(v_axis);
out.writeNBit(field_sequence, 3);
out.write1Bit(sub_carrier);
out.writeNBit(burst_amplitude, 7);
out.writeNBit(sub_carrier_phase, 8);
}
}
public static PictureCodingExtension read(BitReader _in) {
PictureCodingExtension pce = new PictureCodingExtension();
pce.f_code[0][0] = _in.readNBit(4);
pce.f_code[0][1] = _in.readNBit(4);
pce.f_code[1][0] = _in.readNBit(4);
pce.f_code[1][1] = _in.readNBit(4);
pce.intra_dc_precision = _in.readNBit(2);
pce.picture_structure = _in.readNBit(2);
pce.top_field_first = _in.read1Bit();
pce.frame_pred_frame_dct = _in.read1Bit();
pce.concealment_motion_vectors = _in.read1Bit();
pce.q_scale_type = _in.read1Bit();
pce.intra_vlc_format = _in.read1Bit();
pce.alternate_scan = _in.read1Bit();
pce.repeat_first_field = _in.read1Bit();
pce.chroma_420_type = _in.read1Bit();
pce.progressive_frame = _in.read1Bit();
if (_in.read1Bit() != 0) {
pce.compositeDisplay = CompositeDisplay.read(_in);
}
return pce;
}
@Override
public void write(ByteBuffer bb) {
BitWriter bw = new BitWriter(bb);
bw.writeNBit(PictureCodingExtension.Picture_Coding_Extension, 4);
bw.writeNBit(f_code[0][0], 4);
bw.writeNBit(f_code[0][1], 4);
bw.writeNBit(f_code[1][0], 4);
bw.writeNBit(f_code[1][1], 4);
bw.writeNBit(intra_dc_precision, 2);
bw.writeNBit(picture_structure, 2);
bw.write1Bit(top_field_first);
bw.write1Bit(frame_pred_frame_dct);
bw.write1Bit(concealment_motion_vectors);
bw.write1Bit(q_scale_type);
bw.write1Bit(intra_vlc_format);
bw.write1Bit(alternate_scan);
bw.write1Bit(repeat_first_field);
bw.write1Bit(chroma_420_type);
bw.write1Bit(progressive_frame);
bw.write1Bit(compositeDisplay != null ? 1 : 0);
if (compositeDisplay != null)
compositeDisplay.write(bw);
bw.flush();
}
}