Exemplo n.º 1
0
        public Mpeg2VideoState(IMpeg2VideoConfiguration configuration, ISequenceState sequenceState, IPictureState pictureState, ISliceState sliceState)
        {
            _configuration = configuration;
            _sequenceState = sequenceState;
            _pictureState  = pictureState;
            _sliceState    = sliceState;

            Reset();
        }
        public MotionField(ISliceState sliceState)
        {
            _sliceState = sliceState;

            ISequenceState sequenceState = sliceState.PictureState.SequenceState;

            _picWidthInMbs  = sequenceState.PicWidthInMbs;
            _picHeightInMbs = sequenceState.FrameHeightInMbs / (sliceState.FieldPicFlag ? 2U : 1);

            _motionVectors = new byte[(_picWidthInMbs * _picHeightInMbs), 16, 2];
        }
Exemplo n.º 3
0
        private static bool CanParseNalUnitType(ISliceState sliceState, NalUnitType nalUnitType)
        {
            if (!IsSlice(nalUnitType))
            {
                return(true);
            }
            if (sliceState == null)
            {
                return(false);                // Slice with no picture parameter set available
            }

            // FIXME: certain CAVLC and CABAC files do not work, e.g. separate colour plane YCrCb 4:4:4 files

            return(true);            // H.264 slice that can be parsed
        }
Exemplo n.º 4
0
        public CodedCoefficients(ISliceState sliceState, uint picHeightInMbs, SubBlockPartition subBlockPartition)
        {
            _sliceState        = sliceState;
            _subBlockPartition = subBlockPartition;

            uint macroBlockCount = (picHeightInMbs * sliceState.PictureState.SequenceState.PicWidthInMbs);
            int  subBlockCount   = _subBlockPartition.SubBlockCount;

            _totalCoeffs = new byte[macroBlockCount, subBlockCount];

            // Clear the total (non-zero) coeffs array
            for (int i = 0; i < macroBlockCount; i++)
            {
                for (int j = 0; j < subBlockCount; j++)
                {
                    _totalCoeffs[i, j] = TotalCoeffUnavailable;
                }
            }
        }
Exemplo n.º 5
0
        public CavlcSliceData(INalUnitReader reader, IState readerState)
        {
            _reader                  = reader;
            _readerState             = readerState;
            _sliceState              = reader.State.SliceState;
            _pictureState            = _sliceState.PictureState;
            _sequenceState           = _pictureState.SequenceState;
            _coeffTokenChromaDc      = (ChromaFormat == ChromaFormat.YCbCr420) ? CoeffTokenChromaDc420 : CoeffTokenChromaDc422;
            _lumaCodedCoefficients   = new CodedCoefficients(_sliceState, PicHeightInMbs, SubBlockPartition.Luma);
            _chromaCodedCoefficients = new CodedCoefficients[2];
            _subMbTypes              = new ISubMacroblockType[4];

            SubBlockPartition chromaSubBlockPartition = ChromaArrayTypeSubBlockPartitions[_sequenceState.ChromaFormat.ChromaFormatIdc];

            for (int i = 0; i < _chromaCodedCoefficients.Length; i++)
            {
                _chromaCodedCoefficients[i] = new CodedCoefficients(_sliceState, PicHeightInMbs, chromaSubBlockPartition);
            }

            MbToSliceGroupMap = _mbToSliceGroup.CreateMacroBlockToSliceGroupMap(_sliceState);
        }
        public CabacSliceData(INalUnitReader reader, IState readerState)
        {
            _reader        = reader;
            _readerState   = readerState;
            _sliceState    = reader.State.SliceState;
            _pictureState  = _sliceState.PictureState;
            _sequenceState = _pictureState.SequenceState;
            _unavailableMacroblockState = _sliceState.IntraCoded
                                                        ? MacroblockState.UnavailableIntraCoded
                                                        : MacroblockState.UnavailableInterCoded;
            _macroblockStates  = new MacroblockState[PicSizeInMbs];
            _motionFieldL0     = IsList0Predicted ? new MotionField(_sliceState) : null;
            _motionFieldL1     = IsList1Predicted ? new MotionField(_sliceState) : null;
            _subMbTypes        = new ISubMacroblockType[4];
            _arithmeticDecoder = new ArithmeticDecoder(reader);

            for (int i = 0; i < _macroblockStates.Length; i++)
            {
                _macroblockStates[i] = _unavailableMacroblockState;
            }

            MbToSliceGroupMap = _mbToSliceGroup.CreateMacroBlockToSliceGroupMap(_sliceState);
        }
Exemplo n.º 7
0
        public IMbToSliceGroupMap CreateMacroBlockToSliceGroupMap(ISliceState sliceState)
        {
            IPictureState  pictureState = sliceState.PictureState;
            ISequenceState sequence     = sliceState.PictureState.SequenceState;

            uint picSizeInMapUnits     = sequence.PicSizeInMapUnits;
            uint sliceGroupChangeRate  = pictureState.SliceGroupChangeRate;
            uint mapUnitsInSliceGroup0 = Math.Min(sliceState.SliceGroupChangeCycle * sliceGroupChangeRate, picSizeInMapUnits);

            int[] mapUnitToSliceGroupMap;
            if (pictureState.SliceGroupCount == 1)
            {
                return(new SingleSliceGroupMap());
            }
            // num_slice_groups_minus1 is not equal to 0
            switch (pictureState.SliceGroupMapType)
            {
            case SliceGroupMapType.InterleavedSliceGroups:
                mapUnitToSliceGroupMap = InterleavedSliceGroupMapType(pictureState);
                break;

            case SliceGroupMapType.DispersedSliceGroups:
                mapUnitToSliceGroupMap = DispersedSliceGroupMapType(pictureState);
                break;

            case SliceGroupMapType.ForegroundAndLeftoverSliceGroups:
                mapUnitToSliceGroupMap = ForegroundWithLeftOverSliceGroupMapType(pictureState);
                break;

            case SliceGroupMapType.ChangingSliceGroups3:
                mapUnitToSliceGroupMap = BoxOutSliceGroupMapTypes(pictureState, mapUnitsInSliceGroup0);
                break;

            case SliceGroupMapType.ChangingSliceGroups4:
                mapUnitToSliceGroupMap = RasterScanSliceGroupMapTypes(pictureState, mapUnitsInSliceGroup0);
                break;

            case SliceGroupMapType.ChangingSliceGroups5:
                mapUnitToSliceGroupMap = WipeSliceGroupMapTypes(pictureState, mapUnitsInSliceGroup0);
                break;

            case SliceGroupMapType.ExplicitSliceGroups:
                mapUnitToSliceGroupMap = ExplicitSliceGroupMapType(pictureState);
                break;

            default:
                throw new InvalidOperationException();
            }
            if (sequence.FrameMbsOnlyFlag || sliceState.FieldPicFlag)
            {
                return(new OneMacroblockPerSliceGroupMap(mapUnitToSliceGroupMap));
            }

            if (sequence.MbAdaptiveFrameFieldFlag)             // mb_adaptive_frame_field_flag && !FieldPicFlag
            {
                return(new TwoMacroblocksPerSliceGroupMap(mapUnitToSliceGroupMap));
            }

            // if (!sequence.FrameMbsOnlyFlag && !sequence.MbAdaptiveFrameFieldFlag && !sliceState.FieldPicFlag)
            return(new OverlappingMbToSliceGroupMap(mapUnitToSliceGroupMap, sequence.PicWidthInMbs));
        }
Exemplo n.º 8
0
        private static ISliceData CreateSliceData(INalUnitReader reader, IState readerState, ISliceState sliceState)
        {
            if (sliceState.PictureState.EntropyCodingMode)
            {
                return(new CabacSliceData(reader, readerState));
            }

            return(new CavlcSliceData(reader, readerState));
        }