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/BitStreamWriter.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/BitStreamWriter.cs')
| -rw-r--r-- | Ryujinx.Graphics/VDec/BitStreamWriter.cs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/VDec/BitStreamWriter.cs b/Ryujinx.Graphics/VDec/BitStreamWriter.cs new file mode 100644 index 00000000..44d07906 --- /dev/null +++ b/Ryujinx.Graphics/VDec/BitStreamWriter.cs @@ -0,0 +1,75 @@ +using System.IO; + +namespace Ryujinx.Graphics.VDec +{ + class BitStreamWriter + { + private const int BufferSize = 8; + + private Stream BaseStream; + + private int Buffer; + private int BufferPos; + + public BitStreamWriter(Stream BaseStream) + { + this.BaseStream = BaseStream; + } + + public void WriteBit(bool Value) + { + WriteBits(Value ? 1 : 0, 1); + } + + public void WriteBits(int Value, int ValueSize) + { + int ValuePos = 0; + + int Remaining = ValueSize; + + while (Remaining > 0) + { + int CopySize = Remaining; + + int Free = GetFreeBufferBits(); + + if (CopySize > Free) + { + CopySize = Free; + } + + int Mask = (1 << CopySize) - 1; + + int SrcShift = (ValueSize - ValuePos) - CopySize; + int DstShift = (BufferSize - BufferPos) - CopySize; + + Buffer |= ((Value >> SrcShift) & Mask) << DstShift; + + ValuePos += CopySize; + BufferPos += CopySize; + Remaining -= CopySize; + } + } + + private int GetFreeBufferBits() + { + if (BufferPos == BufferSize) + { + Flush(); + } + + return BufferSize - BufferPos; + } + + public void Flush() + { + if (BufferPos != 0) + { + BaseStream.WriteByte((byte)Buffer); + + Buffer = 0; + BufferPos = 0; + } + } + } +}
\ No newline at end of file |
