aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/VDec/BitStreamWriter.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-12-03 00:38:47 -0200
committerGitHub <noreply@github.com>2018-12-03 00:38:47 -0200
commitc86aacde76b5f8e503e2b412385c8491ecc86b3b (patch)
tree8e4737422fba15199c1a6ce7c6345996c0e907b5 /Ryujinx.Graphics/VDec/BitStreamWriter.cs
parentad00fd02442cf9c0f00c4562635738042b521efa (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.cs75
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