示例#1
0
        public static void readExtension(MemoryStream bb, SequenceHeader sh)
        {
            m_hasExtensions = true;

            BitReader inb     = new BitReader(bb);
            int       extType = inb.readNBit(4);

            switch (extType)
            {
            case Sequence_Extension:
                sh.sequenceExtension = SequenceExtension.read(inb);
                break;

            case Sequence_Scalable_Extension:
                sh.sequenceScalableExtension = SequenceScalableExtension.read(inb);
                break;

            case Sequence_Display_Extension:
                sh.sequenceDisplayExtension = SequenceDisplayExtension.read(inb);
                break;

            default:
                throw new Exception("Unsupported extension: " + extType);
            }
        }
示例#2
0
        public static SequenceHeader read(MemoryStream bb)
        {
            BitReader      inb = new BitReader(bb);
            SequenceHeader sh  = new SequenceHeader();

            sh.horizontal_size          = inb.readNBit(12);
            sh.vertical_size            = inb.readNBit(12);
            sh.aspect_ratio_information = inb.readNBit(4);
            sh.frame_rate_code          = inb.readNBit(4);
            sh.bit_rate                    = inb.readNBit(18);
            sh.marker_bit                  = inb.read1Bit();
            sh.vbv_buffer_size_value       = inb.readNBit(10);
            sh.constrained_parameters_flag = inb.read1Bit();
            if (inb.read1Bit() != 0)
            {
                sh.intra_quantiser_matrix = new int[64];
                for (int i = 0; i < 64; i++)
                {
                    sh.intra_quantiser_matrix[i] = inb.readNBit(8);
                }
            }
            if (inb.read1Bit() != 0)
            {
                sh.non_intra_quantiser_matrix = new int[64];
                for (int i = 0; i < 64; i++)
                {
                    sh.non_intra_quantiser_matrix[i] = inb.readNBit(8);
                }
            }

            return(sh);
        }
示例#3
0
        private PictureHeader readHeader(MemoryStream buffer)
        {
            PictureHeader ph = null;
            MemoryStream  segment;
            MemoryStream  fork = buffer.duplicate();

            while ((segment = MPEGUtil.nextSegment(fork)) != null)
            {
                int code = segment.getInt() & 0xff;
                if (code == MPEGConst.SEQUENCE_HEADER_CODE)
                {
                    SequenceHeader newSh = SequenceHeader.read(segment);
                    if (sh != null)
                    {
                        newSh.copyExtensions(sh);
                    }
                    sh = newSh;
                }
                else if (code == MPEGConst.GROUP_START_CODE)
                {
                    gh = GOPHeader.read(segment);
                }
                else if (code == MPEGConst.PICTURE_START_CODE)
                {
                    ph = PictureHeader.read(segment);
                }
                else if (code == MPEGConst.EXTENSION_START_CODE)
                {
                    int extType = segment.get(4) >> 4;
                    if (extType == SequenceHeader.Sequence_Extension || extType == SequenceHeader.Sequence_Scalable_Extension ||
                        extType == SequenceHeader.Sequence_Display_Extension)
                    {
                        SequenceHeader.readExtension(segment, sh);
                    }
                    else
                    {
                        PictureHeader.readExtension(segment, ph, sh);
                    }
                }
                else if (code == MPEGConst.USER_DATA_START_CODE)
                {
                    // do nothing
                }
                else
                {
                    break;
                }
                buffer.position(fork.position());
            }
            return(ph);
        }
示例#4
0
        protected Context initContext(SequenceHeader sh, PictureHeader ph)
        {
            Context context = new Context();

            context.codedWidth  = (sh.horizontal_size + 15) & ~0xf;
            context.codedHeight = getCodedHeight(sh, ph);
            context.mbWidth     = (sh.horizontal_size + 15) >> 4;
            context.mbHeight    = (sh.vertical_size + 15) >> 4;
            context.picWidth    = sh.horizontal_size;
            context.picHeight   = sh.vertical_size;

            int chromaFormat = SequenceExtension.Chroma420;

            if (sh.sequenceExtension != null)
            {
                chromaFormat = sh.sequenceExtension.chroma_format;
            }

            context.color = getColor(chromaFormat);

            context.scan = MPEGConst.scan[ph.pictureCodingExtension == null ? 0 : ph.pictureCodingExtension.alternate_scan];

            int[] inter = sh.non_intra_quantiser_matrix == null?zigzag(MPEGConst.defaultQMatInter, context.scan)
                              : sh.non_intra_quantiser_matrix;

            int[] intra = sh.intra_quantiser_matrix == null?zigzag(MPEGConst.defaultQMatIntra, context.scan)
                              : sh.intra_quantiser_matrix;

            context.qMats = new int[][] { inter, inter, intra, intra };

            if (ph.quantMatrixExtension != null)
            {
                if (ph.quantMatrixExtension.non_intra_quantiser_matrix != null)
                {
                    context.qMats[0] = ph.quantMatrixExtension.non_intra_quantiser_matrix;
                }
                if (ph.quantMatrixExtension.chroma_non_intra_quantiser_matrix != null)
                {
                    context.qMats[1] = ph.quantMatrixExtension.chroma_non_intra_quantiser_matrix;
                }
                if (ph.quantMatrixExtension.intra_quantiser_matrix != null)
                {
                    context.qMats[2] = ph.quantMatrixExtension.intra_quantiser_matrix;
                }
                if (ph.quantMatrixExtension.chroma_intra_quantiser_matrix != null)
                {
                    context.qMats[3] = ph.quantMatrixExtension.chroma_intra_quantiser_matrix;
                }
            }
            return(context);
        }
示例#5
0
        private static SequenceHeader getSequenceHeader(MemoryStream data)
        {
            MemoryStream segment = MPEGUtil.nextSegment(data);

            while (segment != null)
            {
                int marker = segment.getInt();
                if (marker == (0x100 | MPEGConst.SEQUENCE_HEADER_CODE))
                {
                    return(SequenceHeader.read(segment));
                }
                segment = MPEGUtil.nextSegment(data);
            }
            return(null);
        }
示例#6
0
        public static void readExtension(MemoryStream bb, PictureHeader ph, SequenceHeader sh)
        {
            ph.m_hasExtensions = true;
            BitReader inb     = new BitReader(bb);
            int       extType = inb.readNBit(4);

            switch (extType)
            {
            case Quant_Matrix_Extension:
                ph.quantMatrixExtension = QuantMatrixExtension.read(inb);
                break;

            case Copyright_Extension:
                ph.copyrightExtension = CopyrightExtension.read(inb);
                break;

            case Picture_Display_Extension:
                ph.pictureDisplayExtension = PictureDisplayExtension.read(inb, sh.sequenceExtension,
                                                                          ph.pictureCodingExtension);
                break;

            case Picture_Coding_Extension:
                ph.pictureCodingExtension = PictureCodingExtension.read(inb);
                break;

            case Picture_Spatial_Scalable_Extension:
                ph.pictureSpatialScalableExtension = PictureSpatialScalableExtension.read(inb);
                break;

            case Picture_Temporal_Scalable_Extension:
                ph.pictureTemporalScalableExtension = PictureTemporalScalableExtension.read(inb);
                break;

            default:
                throw new Exception("Unsupported extension: " + extType);
            }
        }
示例#7
0
        public static Size getSize(MemoryStream data)
        {
            SequenceHeader sh = getSequenceHeader(data.duplicate());

            return(new Size(sh.horizontal_size, sh.vertical_size));
        }
示例#8
0
        public static int getCodedHeight(SequenceHeader sh, PictureHeader ph)
        {
            int field = ph.pictureCodingExtension != null && ph.pictureCodingExtension.picture_structure != PictureCodingExtension.Frame ? 1 : 0;

            return((((sh.vertical_size >> field) + 15) & ~0xf) << field);
        }
示例#9
0
 public MPEGDecoder(SequenceHeader sh, GOPHeader gh, string name, Media.Common.Binary.ByteOrder byteOrder, int defaultComponentCount, int defaultBitsPerComponent)
     : this(name, byteOrder, defaultComponentCount, defaultBitsPerComponent)
 {
     this.sh = sh;
     this.gh = gh;
 }
示例#10
0
 public void copyExtensions(SequenceHeader sh)
 {
     sequenceExtension         = sh.sequenceExtension;
     sequenceScalableExtension = sh.sequenceScalableExtension;
     sequenceDisplayExtension  = sh.sequenceDisplayExtension;
 }