aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/VDec/H264BitStreamWriter.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/H264BitStreamWriter.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/H264BitStreamWriter.cs')
-rw-r--r--Ryujinx.Graphics/VDec/H264BitStreamWriter.cs79
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