diff options
Diffstat (limited to 'Ryujinx.Graphics/VDec/H264Decoder.cs')
| -rw-r--r-- | Ryujinx.Graphics/VDec/H264Decoder.cs | 298 |
1 files changed, 149 insertions, 149 deletions
diff --git a/Ryujinx.Graphics/VDec/H264Decoder.cs b/Ryujinx.Graphics/VDec/H264Decoder.cs index d5d46713..01085a73 100644 --- a/Ryujinx.Graphics/VDec/H264Decoder.cs +++ b/Ryujinx.Graphics/VDec/H264Decoder.cs @@ -4,195 +4,195 @@ namespace Ryujinx.Graphics.VDec { class H264Decoder { - private int Log2MaxPicOrderCntLsbMinus4; - private bool DeltaPicOrderAlwaysZeroFlag; - private bool FrameMbsOnlyFlag; - private int PicWidthInMbs; - private int PicHeightInMapUnits; - private bool EntropyCodingModeFlag; - private bool BottomFieldPicOrderInFramePresentFlag; - private int NumRefIdxL0DefaultActiveMinus1; - private int NumRefIdxL1DefaultActiveMinus1; - private bool DeblockingFilterControlPresentFlag; - private bool RedundantPicCntPresentFlag; - private bool Transform8x8ModeFlag; - private bool MbAdaptiveFrameFieldFlag; - private bool Direct8x8InferenceFlag; - private bool WeightedPredFlag; - private bool ConstrainedIntraPredFlag; - private bool FieldPicFlag; - private bool BottomFieldFlag; - private int Log2MaxFrameNumMinus4; - private int ChromaFormatIdc; - private int PicOrderCntType; - private int PicInitQpMinus26; - private int ChromaQpIndexOffset; - private int ChromaQpIndexOffset2; - private int WeightedBipredIdc; - private int FrameNumber; - private byte[] ScalingMatrix4; - private byte[] ScalingMatrix8; - - public void Decode(H264ParameterSets Params, H264Matrices Matrices, byte[] FrameData) + private int _log2MaxPicOrderCntLsbMinus4; + private bool _deltaPicOrderAlwaysZeroFlag; + private bool _frameMbsOnlyFlag; + private int _picWidthInMbs; + private int _picHeightInMapUnits; + private bool _entropyCodingModeFlag; + private bool _bottomFieldPicOrderInFramePresentFlag; + private int _numRefIdxL0DefaultActiveMinus1; + private int _numRefIdxL1DefaultActiveMinus1; + private bool _deblockingFilterControlPresentFlag; + private bool _redundantPicCntPresentFlag; + private bool _transform8x8ModeFlag; + private bool _mbAdaptiveFrameFieldFlag; + private bool _direct8x8InferenceFlag; + private bool _weightedPredFlag; + private bool _constrainedIntraPredFlag; + private bool _fieldPicFlag; + private bool _bottomFieldFlag; + private int _log2MaxFrameNumMinus4; + private int _chromaFormatIdc; + private int _picOrderCntType; + private int _picInitQpMinus26; + private int _chromaQpIndexOffset; + private int _chromaQpIndexOffset2; + private int _weightedBipredIdc; + private int _frameNumber; + private byte[] _scalingMatrix4; + private byte[] _scalingMatrix8; + + public void Decode(H264ParameterSets Params, H264Matrices matrices, byte[] frameData) { - Log2MaxPicOrderCntLsbMinus4 = Params.Log2MaxPicOrderCntLsbMinus4; - DeltaPicOrderAlwaysZeroFlag = Params.DeltaPicOrderAlwaysZeroFlag; - FrameMbsOnlyFlag = Params.FrameMbsOnlyFlag; - PicWidthInMbs = Params.PicWidthInMbs; - PicHeightInMapUnits = Params.PicHeightInMapUnits; - EntropyCodingModeFlag = Params.EntropyCodingModeFlag; - BottomFieldPicOrderInFramePresentFlag = Params.BottomFieldPicOrderInFramePresentFlag; - NumRefIdxL0DefaultActiveMinus1 = Params.NumRefIdxL0DefaultActiveMinus1; - NumRefIdxL1DefaultActiveMinus1 = Params.NumRefIdxL1DefaultActiveMinus1; - DeblockingFilterControlPresentFlag = Params.DeblockingFilterControlPresentFlag; - RedundantPicCntPresentFlag = Params.RedundantPicCntPresentFlag; - Transform8x8ModeFlag = Params.Transform8x8ModeFlag; - - MbAdaptiveFrameFieldFlag = ((Params.Flags >> 0) & 1) != 0; - Direct8x8InferenceFlag = ((Params.Flags >> 1) & 1) != 0; - WeightedPredFlag = ((Params.Flags >> 2) & 1) != 0; - ConstrainedIntraPredFlag = ((Params.Flags >> 3) & 1) != 0; - FieldPicFlag = ((Params.Flags >> 5) & 1) != 0; - BottomFieldFlag = ((Params.Flags >> 6) & 1) != 0; - - Log2MaxFrameNumMinus4 = (int)(Params.Flags >> 8) & 0xf; - ChromaFormatIdc = (int)(Params.Flags >> 12) & 0x3; - PicOrderCntType = (int)(Params.Flags >> 14) & 0x3; - PicInitQpMinus26 = (int)(Params.Flags >> 16) & 0x3f; - ChromaQpIndexOffset = (int)(Params.Flags >> 22) & 0x1f; - ChromaQpIndexOffset2 = (int)(Params.Flags >> 27) & 0x1f; - WeightedBipredIdc = (int)(Params.Flags >> 32) & 0x3; - FrameNumber = (int)(Params.Flags >> 46) & 0x1ffff; - - PicInitQpMinus26 = (PicInitQpMinus26 << 26) >> 26; - ChromaQpIndexOffset = (ChromaQpIndexOffset << 27) >> 27; - ChromaQpIndexOffset2 = (ChromaQpIndexOffset2 << 27) >> 27; - - ScalingMatrix4 = Matrices.ScalingMatrix4; - ScalingMatrix8 = Matrices.ScalingMatrix8; + _log2MaxPicOrderCntLsbMinus4 = Params.Log2MaxPicOrderCntLsbMinus4; + _deltaPicOrderAlwaysZeroFlag = Params.DeltaPicOrderAlwaysZeroFlag; + _frameMbsOnlyFlag = Params.FrameMbsOnlyFlag; + _picWidthInMbs = Params.PicWidthInMbs; + _picHeightInMapUnits = Params.PicHeightInMapUnits; + _entropyCodingModeFlag = Params.EntropyCodingModeFlag; + _bottomFieldPicOrderInFramePresentFlag = Params.BottomFieldPicOrderInFramePresentFlag; + _numRefIdxL0DefaultActiveMinus1 = Params.NumRefIdxL0DefaultActiveMinus1; + _numRefIdxL1DefaultActiveMinus1 = Params.NumRefIdxL1DefaultActiveMinus1; + _deblockingFilterControlPresentFlag = Params.DeblockingFilterControlPresentFlag; + _redundantPicCntPresentFlag = Params.RedundantPicCntPresentFlag; + _transform8x8ModeFlag = Params.Transform8x8ModeFlag; + + _mbAdaptiveFrameFieldFlag = ((Params.Flags >> 0) & 1) != 0; + _direct8x8InferenceFlag = ((Params.Flags >> 1) & 1) != 0; + _weightedPredFlag = ((Params.Flags >> 2) & 1) != 0; + _constrainedIntraPredFlag = ((Params.Flags >> 3) & 1) != 0; + _fieldPicFlag = ((Params.Flags >> 5) & 1) != 0; + _bottomFieldFlag = ((Params.Flags >> 6) & 1) != 0; + + _log2MaxFrameNumMinus4 = (int)(Params.Flags >> 8) & 0xf; + _chromaFormatIdc = (int)(Params.Flags >> 12) & 0x3; + _picOrderCntType = (int)(Params.Flags >> 14) & 0x3; + _picInitQpMinus26 = (int)(Params.Flags >> 16) & 0x3f; + _chromaQpIndexOffset = (int)(Params.Flags >> 22) & 0x1f; + _chromaQpIndexOffset2 = (int)(Params.Flags >> 27) & 0x1f; + _weightedBipredIdc = (int)(Params.Flags >> 32) & 0x3; + _frameNumber = (int)(Params.Flags >> 46) & 0x1ffff; + + _picInitQpMinus26 = (_picInitQpMinus26 << 26) >> 26; + _chromaQpIndexOffset = (_chromaQpIndexOffset << 27) >> 27; + _chromaQpIndexOffset2 = (_chromaQpIndexOffset2 << 27) >> 27; + + _scalingMatrix4 = matrices.ScalingMatrix4; + _scalingMatrix8 = matrices.ScalingMatrix8; if (FFmpegWrapper.IsInitialized) { - FFmpegWrapper.DecodeFrame(FrameData); + FFmpegWrapper.DecodeFrame(frameData); } else { FFmpegWrapper.H264Initialize(); - FFmpegWrapper.DecodeFrame(DecoderHelper.Combine(EncodeHeader(), FrameData)); + FFmpegWrapper.DecodeFrame(DecoderHelper.Combine(EncodeHeader(), frameData)); } } private byte[] EncodeHeader() { - using (MemoryStream Data = new MemoryStream()) + using (MemoryStream data = new MemoryStream()) { - H264BitStreamWriter Writer = new H264BitStreamWriter(Data); + H264BitStreamWriter writer = new H264BitStreamWriter(data); //Sequence Parameter Set. - Writer.WriteU(1, 24); - Writer.WriteU(0, 1); - Writer.WriteU(3, 2); - Writer.WriteU(7, 5); - Writer.WriteU(100, 8); - Writer.WriteU(0, 8); - Writer.WriteU(31, 8); - Writer.WriteUe(0); - Writer.WriteUe(ChromaFormatIdc); - - if (ChromaFormatIdc == 3) + writer.WriteU(1, 24); + writer.WriteU(0, 1); + writer.WriteU(3, 2); + writer.WriteU(7, 5); + writer.WriteU(100, 8); + writer.WriteU(0, 8); + writer.WriteU(31, 8); + writer.WriteUe(0); + writer.WriteUe(_chromaFormatIdc); + + if (_chromaFormatIdc == 3) { - Writer.WriteBit(false); + writer.WriteBit(false); } - Writer.WriteUe(0); - Writer.WriteUe(0); - Writer.WriteBit(false); - Writer.WriteBit(false); //Scaling matrix present flag + writer.WriteUe(0); + writer.WriteUe(0); + writer.WriteBit(false); + writer.WriteBit(false); //Scaling matrix present flag - Writer.WriteUe(Log2MaxFrameNumMinus4); - Writer.WriteUe(PicOrderCntType); + writer.WriteUe(_log2MaxFrameNumMinus4); + writer.WriteUe(_picOrderCntType); - if (PicOrderCntType == 0) + if (_picOrderCntType == 0) { - Writer.WriteUe(Log2MaxPicOrderCntLsbMinus4); + writer.WriteUe(_log2MaxPicOrderCntLsbMinus4); } - else if (PicOrderCntType == 1) + else if (_picOrderCntType == 1) { - Writer.WriteBit(DeltaPicOrderAlwaysZeroFlag); + writer.WriteBit(_deltaPicOrderAlwaysZeroFlag); - Writer.WriteSe(0); - Writer.WriteSe(0); - Writer.WriteUe(0); + writer.WriteSe(0); + writer.WriteSe(0); + writer.WriteUe(0); } - int PicHeightInMbs = PicHeightInMapUnits / (FrameMbsOnlyFlag ? 1 : 2); + int picHeightInMbs = _picHeightInMapUnits / (_frameMbsOnlyFlag ? 1 : 2); - Writer.WriteUe(16); - Writer.WriteBit(false); - Writer.WriteUe(PicWidthInMbs - 1); - Writer.WriteUe(PicHeightInMbs - 1); - Writer.WriteBit(FrameMbsOnlyFlag); + writer.WriteUe(16); + writer.WriteBit(false); + writer.WriteUe(_picWidthInMbs - 1); + writer.WriteUe(picHeightInMbs - 1); + writer.WriteBit(_frameMbsOnlyFlag); - if (!FrameMbsOnlyFlag) + if (!_frameMbsOnlyFlag) { - Writer.WriteBit(MbAdaptiveFrameFieldFlag); + writer.WriteBit(_mbAdaptiveFrameFieldFlag); } - Writer.WriteBit(Direct8x8InferenceFlag); - Writer.WriteBit(false); //Frame cropping flag - Writer.WriteBit(false); //VUI parameter present flag + writer.WriteBit(_direct8x8InferenceFlag); + writer.WriteBit(false); //Frame cropping flag + writer.WriteBit(false); //VUI parameter present flag - Writer.End(); + writer.End(); //Picture Parameter Set. - Writer.WriteU(1, 24); - Writer.WriteU(0, 1); - Writer.WriteU(3, 2); - Writer.WriteU(8, 5); - - Writer.WriteUe(0); - Writer.WriteUe(0); - - Writer.WriteBit(EntropyCodingModeFlag); - Writer.WriteBit(false); - Writer.WriteUe(0); - Writer.WriteUe(NumRefIdxL0DefaultActiveMinus1); - Writer.WriteUe(NumRefIdxL1DefaultActiveMinus1); - Writer.WriteBit(WeightedPredFlag); - Writer.WriteU(WeightedBipredIdc, 2); - Writer.WriteSe(PicInitQpMinus26); - Writer.WriteSe(0); - Writer.WriteSe(ChromaQpIndexOffset); - Writer.WriteBit(DeblockingFilterControlPresentFlag); - Writer.WriteBit(ConstrainedIntraPredFlag); - Writer.WriteBit(RedundantPicCntPresentFlag); - Writer.WriteBit(Transform8x8ModeFlag); - - Writer.WriteBit(true); - - for (int Index = 0; Index < 6; Index++) + writer.WriteU(1, 24); + writer.WriteU(0, 1); + writer.WriteU(3, 2); + writer.WriteU(8, 5); + + writer.WriteUe(0); + writer.WriteUe(0); + + writer.WriteBit(_entropyCodingModeFlag); + writer.WriteBit(false); + writer.WriteUe(0); + writer.WriteUe(_numRefIdxL0DefaultActiveMinus1); + writer.WriteUe(_numRefIdxL1DefaultActiveMinus1); + writer.WriteBit(_weightedPredFlag); + writer.WriteU(_weightedBipredIdc, 2); + writer.WriteSe(_picInitQpMinus26); + writer.WriteSe(0); + writer.WriteSe(_chromaQpIndexOffset); + writer.WriteBit(_deblockingFilterControlPresentFlag); + writer.WriteBit(_constrainedIntraPredFlag); + writer.WriteBit(_redundantPicCntPresentFlag); + writer.WriteBit(_transform8x8ModeFlag); + + writer.WriteBit(true); + + for (int index = 0; index < 6; index++) { - Writer.WriteBit(true); + writer.WriteBit(true); - WriteScalingList(Writer, ScalingMatrix4, Index * 16, 16); + WriteScalingList(writer, _scalingMatrix4, index * 16, 16); } - if (Transform8x8ModeFlag) + if (_transform8x8ModeFlag) { - for (int Index = 0; Index < 2; Index++) + for (int index = 0; index < 2; index++) { - Writer.WriteBit(true); + writer.WriteBit(true); - WriteScalingList(Writer, ScalingMatrix8, Index * 64, 64); + WriteScalingList(writer, _scalingMatrix8, index * 64, 64); } } - Writer.WriteSe(ChromaQpIndexOffset2); + writer.WriteSe(_chromaQpIndexOffset2); - Writer.End(); + writer.End(); - return Data.ToArray(); + return data.ToArray(); } } @@ -217,21 +217,21 @@ namespace Ryujinx.Graphics.VDec 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4 }; - private static void WriteScalingList(H264BitStreamWriter Writer, byte[] List, int Start, int Count) + private static void WriteScalingList(H264BitStreamWriter writer, byte[] list, int start, int count) { - byte[] Scan = Count == 16 ? ZigZagScan : ZigZagDirect; + byte[] scan = count == 16 ? ZigZagScan : ZigZagDirect; - int LastScale = 8; + int lastScale = 8; - for (int Index = 0; Index < Count; Index++) + for (int index = 0; index < count; index++) { - byte Value = List[Start + Scan[Index]]; + byte value = list[start + scan[index]]; - int DeltaScale = Value - LastScale; + int deltaScale = value - lastScale; - Writer.WriteSe(DeltaScale); + writer.WriteSe(deltaScale); - LastScale = Value; + lastScale = value; } } } |
