aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-07-12 00:07:01 -0300
committerGitHub <noreply@github.com>2020-07-12 05:07:01 +0200
commit4d02a2d2c0451b4de1f6de3bbce54c457cacebe2 (patch)
tree120fe4fb8cfa1ac1c6ef4c97d92be47e955e8c0f /Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs
parent38b26cf4242999fa7d8c550993ac0940cd03d55f (diff)
New NVDEC and VIC implementation (#1384)
* Initial NVDEC and VIC implementation * Update FFmpeg.AutoGen to 4.3.0 * Add nvdec dependencies for Windows * Unify some VP9 structures * Rename VP9 structure fields * Improvements to Video API * XML docs for Common.Memory * Remove now unused or redundant overloads from MemoryAccessor * NVDEC UV surface read/write scalar paths * Add FIXME comments about hacky things/stuff that will need to be fixed in the future * Cleaned up VP9 memory allocation * Remove some debug logs * Rename some VP9 structs * Remove unused struct * No need to compile Ryujinx.Graphics.Host1x with unsafe anymore * Name AsyncWorkQueue threads to make debugging easier * Make Vp9PictureInfo a ref struct * LayoutConverter no longer needs the depth argument (broken by rebase) * Pooling of VP9 buffers, plus fix a memory leak on VP9 * Really wish VS could rename projects properly... * Address feedback * Remove using * Catch OperationCanceledException * Add licensing informations * Add THIRDPARTY.md to release too Co-authored-by: Thog <me@thog.eu>
Diffstat (limited to 'Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs')
-rw-r--r--Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs189
1 files changed, 189 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs b/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs
new file mode 100644
index 00000000..c1f99ade
--- /dev/null
+++ b/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs
@@ -0,0 +1,189 @@
+using Ryujinx.Common.Memory;
+using Ryujinx.Graphics.Video;
+using System;
+using System.Diagnostics;
+
+namespace Ryujinx.Graphics.Nvdec.Vp9.Types
+{
+ internal struct Mv
+ {
+ public short Row;
+ public short Col;
+
+ private static readonly byte[] LogInBase2 = new byte[]
+ {
+ 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
+ };
+
+ public bool UseMvHp()
+ {
+ const int kMvRefThresh = 64; // Threshold for use of high-precision 1/8 mv
+ return Math.Abs(Row) < kMvRefThresh && Math.Abs(Col) < kMvRefThresh;
+ }
+
+ public static bool MvJointVertical(MvJointType type)
+ {
+ return type == MvJointType.MvJointHzvnz || type == MvJointType.MvJointHnzvnz;
+ }
+
+ public static bool MvJointHorizontal(MvJointType type)
+ {
+ return type == MvJointType.MvJointHnzvz || type == MvJointType.MvJointHnzvnz;
+ }
+
+ private static int MvClassBase(MvClassType c)
+ {
+ return c != 0 ? Constants.Class0Size << ((int)c + 2) : 0;
+ }
+
+ private static MvClassType GetMvClass(int z, Ptr<int> offset)
+ {
+ MvClassType c = (z >= Constants.Class0Size * 4096) ? MvClassType.MvClass10 : (MvClassType)LogInBase2[z >> 3];
+ if (!offset.IsNull)
+ {
+ offset.Value = z - MvClassBase(c);
+ }
+
+ return c;
+ }
+
+ private static void IncMvComponent(int v, ref Vp9BackwardUpdates counts, int comp, int incr, int usehp)
+ {
+ int s, z, c, o = 0, d, e, f;
+ Debug.Assert(v != 0); /* Should not be zero */
+ s = v < 0 ? 1 : 0;
+ counts.Sign[comp][s] += (uint)incr;
+ z = (s != 0 ? -v : v) - 1; /* Magnitude - 1 */
+
+ c = (int)GetMvClass(z, new Ptr<int>(ref o));
+ counts.Classes[comp][c] += (uint)incr;
+
+ d = (o >> 3); /* Int mv data */
+ f = (o >> 1) & 3; /* Fractional pel mv data */
+ e = (o & 1); /* High precision mv data */
+
+ if (c == (int)MvClassType.MvClass0)
+ {
+ counts.Class0[comp][d] += (uint)incr;
+ counts.Class0Fp[comp][d][f] += (uint)incr;
+ counts.Class0Hp[comp][e] += (uint)(usehp * incr);
+ }
+ else
+ {
+ int i;
+ int b = c + Constants.Class0Bits - 1; // Number of bits
+ for (i = 0; i < b; ++i)
+ {
+ counts.Bits[comp][i][((d >> i) & 1)] += (uint)incr;
+ }
+
+ counts.Fp[comp][f] += (uint)incr;
+ counts.Hp[comp][e] += (uint)(usehp * incr);
+ }
+ }
+
+ private MvJointType GetMvJoint()
+ {
+ if (Row == 0)
+ {
+ return Col == 0 ? MvJointType.MvJointZero : MvJointType.MvJointHnzvz;
+ }
+ else
+ {
+ return Col == 0 ? MvJointType.MvJointHzvnz : MvJointType.MvJointHnzvnz;
+ }
+ }
+
+ internal void IncMv(Ptr<Vp9BackwardUpdates> counts)
+ {
+ if (!counts.IsNull)
+ {
+ MvJointType j = GetMvJoint();
+ ++counts.Value.Joints[(int)j];
+
+ if (MvJointVertical(j))
+ {
+ IncMvComponent(Row, ref counts.Value, 0, 1, 1);
+ }
+
+ if (MvJointHorizontal(j))
+ {
+ IncMvComponent(Col, ref counts.Value, 1, 1, 1);
+ }
+ }
+ }
+
+ public void ClampMv(int minCol, int maxCol, int minRow, int maxRow)
+ {
+ Col = (short)Math.Clamp(Col, minCol, maxCol);
+ Row = (short)Math.Clamp(Row, minRow, maxRow);
+ }
+
+ private const int MvBorder = (16 << 3); // Allow 16 pels in 1/8th pel units
+
+ public void ClampMvRef(ref MacroBlockD xd)
+ {
+ ClampMv(
+ xd.MbToLeftEdge - MvBorder,
+ xd.MbToRightEdge + MvBorder,
+ xd.MbToTopEdge - MvBorder,
+ xd.MbToBottomEdge + MvBorder);
+ }
+
+ public void LowerMvPrecision(bool allowHP)
+ {
+ bool useHP = allowHP && UseMvHp();
+ if (!useHP)
+ {
+ if ((Row & 1) != 0)
+ {
+ Row += (short)(Row > 0 ? -1 : 1);
+ }
+
+ if ((Col & 1) != 0)
+ {
+ Col += (short)(Col > 0 ? -1 : 1);
+ }
+ }
+ }
+ }
+}