aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.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/Dsp/Prob.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/Dsp/Prob.cs')
-rw-r--r--Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs73
1 files changed, 73 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs b/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs
new file mode 100644
index 00000000..0d5e8b6e
--- /dev/null
+++ b/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs
@@ -0,0 +1,73 @@
+using Ryujinx.Graphics.Nvdec.Vp9.Common;
+using System;
+using System.Diagnostics;
+
+namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
+{
+ internal static class Prob
+ {
+ public const int MaxProb = 255;
+
+ private static byte GetProb(uint num, uint den)
+ {
+ Debug.Assert(den != 0);
+ {
+ int p = (int)(((ulong)num * 256 + (den >> 1)) / den);
+ // (p > 255) ? 255 : (p < 1) ? 1 : p;
+ int clippedProb = p | ((255 - p) >> 23) | (p == 0 ? 1 : 0);
+ return (byte)clippedProb;
+ }
+ }
+
+ /* This function assumes prob1 and prob2 are already within [1,255] range. */
+ public static byte WeightedProb(int prob1, int prob2, int factor)
+ {
+ return (byte)BitUtils.RoundPowerOfTwo(prob1 * (256 - factor) + prob2 * factor, 8);
+ }
+
+ // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT;
+ private static readonly uint[] CountToUpdateFactor = new uint[]
+ {
+ 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64,
+ 70, 76, 83, 89, 96, 102, 108, 115, 121, 128
+ };
+
+ private const int ModeMvCountSat = 20;
+
+ public static byte ModeMvMergeProbs(byte preProb, uint ct0, uint ct1)
+ {
+ uint den = ct0 + ct1;
+ if (den == 0)
+ {
+ return preProb;
+ }
+ else
+ {
+ uint count = Math.Min(den, ModeMvCountSat);
+ uint factor = CountToUpdateFactor[(int)count];
+ byte prob = GetProb(ct0, den);
+ return WeightedProb(preProb, prob, (int)factor);
+ }
+ }
+
+ private static uint TreeMergeProbsImpl(
+ uint i,
+ sbyte[] tree,
+ ReadOnlySpan<byte> preProbs,
+ ReadOnlySpan<uint> counts,
+ Span<byte> probs)
+ {
+ int l = tree[i];
+ uint leftCount = (l <= 0) ? counts[-l] : TreeMergeProbsImpl((uint)l, tree, preProbs, counts, probs);
+ int r = tree[i + 1];
+ uint rightCount = (r <= 0) ? counts[-r] : TreeMergeProbsImpl((uint)r, tree, preProbs, counts, probs);
+ probs[(int)(i >> 1)] = ModeMvMergeProbs(preProbs[(int)(i >> 1)], leftCount, rightCount);
+ return leftCount + rightCount;
+ }
+
+ public static void TreeMergeProbs(sbyte[] tree, ReadOnlySpan<byte> preProbs, ReadOnlySpan<uint> counts, Span<byte> probs)
+ {
+ TreeMergeProbsImpl(0, tree, preProbs, counts, probs);
+ }
+ }
+}