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]; }
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 }
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; } } }
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); }
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)); }
private static ISliceData CreateSliceData(INalUnitReader reader, IState readerState, ISliceState sliceState) { if (sliceState.PictureState.EntropyCodingMode) { return(new CabacSliceData(reader, readerState)); } return(new CavlcSliceData(reader, readerState)); }