diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2018-12-03 00:38:47 -0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-03 00:38:47 -0200 |
| commit | c86aacde76b5f8e503e2b412385c8491ecc86b3b (patch) | |
| tree | 8e4737422fba15199c1a6ce7c6345996c0e907b5 /Ryujinx.Graphics/VDec/H264BitStreamWriter.cs | |
| parent | ad00fd02442cf9c0f00c4562635738042b521efa (diff) | |
NVDEC implementation using FFmpeg (#443)
* Initial nvdec implementation using FFmpeg
* Fix swapped channels on the video decoder and the G8R8 texture format
* Fix texture samplers not being set properly (regression)
* Rebased
* Remove unused code introduced on the rebase
* Add support for RGBA8 output format on the video image composer
* Correct spacing
* Some fixes for rebase and other tweaks
* Allow size mismatch on frame copy
* Get rid of GetHostAddress calls on VDec
Diffstat (limited to 'Ryujinx.Graphics/VDec/H264BitStreamWriter.cs')
| -rw-r--r-- | Ryujinx.Graphics/VDec/H264BitStreamWriter.cs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/VDec/H264BitStreamWriter.cs b/Ryujinx.Graphics/VDec/H264BitStreamWriter.cs new file mode 100644 index 00000000..b388a2aa --- /dev/null +++ b/Ryujinx.Graphics/VDec/H264BitStreamWriter.cs @@ -0,0 +1,79 @@ +using System.IO; + +namespace Ryujinx.Graphics.VDec +{ + class H264BitStreamWriter : BitStreamWriter + { + public H264BitStreamWriter(Stream BaseStream) : base(BaseStream) { } + + public void WriteU(int Value, int ValueSize) + { + WriteBits(Value, ValueSize); + } + + public void WriteSe(int Value) + { + WriteExpGolombCodedInt(Value); + } + + public void WriteUe(int Value) + { + WriteExpGolombCodedUInt((uint)Value); + } + + public void End() + { + WriteBit(true); + + Flush(); + } + + private void WriteExpGolombCodedInt(int Value) + { + int Sign = Value <= 0 ? 0 : 1; + + if (Value < 0) + { + Value = -Value; + } + + Value = (Value << 1) - Sign; + + WriteExpGolombCodedUInt((uint)Value); + } + + private void WriteExpGolombCodedUInt(uint Value) + { + int Size = 32 - CountLeadingZeros((int)Value + 1); + + WriteBits(1, Size); + + Value -= (1u << (Size - 1)) - 1; + + WriteBits((int)Value, Size - 1); + } + + private static readonly byte[] ClzNibbleTbl = { 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; + + private static int CountLeadingZeros(int Value) + { + if (Value == 0) + { + return 32; + } + + int NibbleIdx = 32; + int PreCount, Count = 0; + + do + { + NibbleIdx -= 4; + PreCount = ClzNibbleTbl[(Value >> NibbleIdx) & 0b1111]; + Count += PreCount; + } + while (PreCount == 4); + + return Count; + } + } +}
\ No newline at end of file |
