aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Nvdec/VDec/FFmpeg.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/VDec/FFmpeg.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/VDec/FFmpeg.cs')
-rw-r--r--Ryujinx.Graphics.Nvdec/VDec/FFmpeg.cs168
1 files changed, 0 insertions, 168 deletions
diff --git a/Ryujinx.Graphics.Nvdec/VDec/FFmpeg.cs b/Ryujinx.Graphics.Nvdec/VDec/FFmpeg.cs
deleted file mode 100644
index ccd01f0d..00000000
--- a/Ryujinx.Graphics.Nvdec/VDec/FFmpeg.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-using FFmpeg.AutoGen;
-using System;
-using System.Runtime.InteropServices;
-
-namespace Ryujinx.Graphics.VDec
-{
- static unsafe class FFmpegWrapper
- {
- private static AVCodec* _codec;
- private static AVCodecContext* _context;
- private static AVFrame* _frame;
- private static SwsContext* _scalerCtx;
-
- private static int _scalerWidth;
- private static int _scalerHeight;
-
- public static bool IsInitialized { get; private set; }
-
- public static void H264Initialize()
- {
- EnsureCodecInitialized(AVCodecID.AV_CODEC_ID_H264);
- }
-
- public static void Vp9Initialize()
- {
- EnsureCodecInitialized(AVCodecID.AV_CODEC_ID_VP9);
- }
-
- private static void EnsureCodecInitialized(AVCodecID codecId)
- {
- if (IsInitialized)
- {
- Uninitialize();
- }
-
- _codec = ffmpeg.avcodec_find_decoder(codecId);
- _context = ffmpeg.avcodec_alloc_context3(_codec);
- _frame = ffmpeg.av_frame_alloc();
-
- ffmpeg.avcodec_open2(_context, _codec, null);
-
- IsInitialized = true;
- }
-
- public static int DecodeFrame(byte[] data)
- {
- if (!IsInitialized)
- {
- throw new InvalidOperationException("Tried to use uninitialized codec!");
- }
-
- AVPacket packet;
-
- ffmpeg.av_init_packet(&packet);
-
- fixed (byte* ptr = data)
- {
- packet.data = ptr;
- packet.size = data.Length;
-
- ffmpeg.avcodec_send_packet(_context, &packet);
- }
-
- return ffmpeg.avcodec_receive_frame(_context, _frame);
- }
-
- public static FFmpegFrame GetFrame()
- {
- if (!IsInitialized)
- {
- throw new InvalidOperationException("Tried to use uninitialized codec!");
- }
-
- AVFrame managedFrame = Marshal.PtrToStructure<AVFrame>((IntPtr)_frame);
-
- byte*[] data = managedFrame.data.ToArray();
-
- return new FFmpegFrame()
- {
- Width = managedFrame.width,
- Height = managedFrame.height,
-
- LumaPtr = data[0],
- ChromaBPtr = data[1],
- ChromaRPtr = data[2]
- };
- }
-
- public static FFmpegFrame GetFrameRgba()
- {
- if (!IsInitialized)
- {
- throw new InvalidOperationException("Tried to use uninitialized codec!");
- }
-
- AVFrame managedFrame = Marshal.PtrToStructure<AVFrame>((IntPtr)_frame);
-
- EnsureScalerSetup(managedFrame.width, managedFrame.height);
-
- byte*[] data = managedFrame.data.ToArray();
-
- int[] lineSizes = managedFrame.linesize.ToArray();
-
- byte[] dst = new byte[managedFrame.width * managedFrame.height * 4];
-
- fixed (byte* ptr = dst)
- {
- byte*[] dstData = new byte*[] { ptr };
-
- int[] dstLineSizes = new int[] { managedFrame.width * 4 };
-
- ffmpeg.sws_scale(_scalerCtx, data, lineSizes, 0, managedFrame.height, dstData, dstLineSizes);
- }
-
- return new FFmpegFrame()
- {
- Width = managedFrame.width,
- Height = managedFrame.height,
-
- Data = dst
- };
- }
-
- private static void EnsureScalerSetup(int width, int height)
- {
- if (width == 0 || height == 0)
- {
- return;
- }
-
- if (_scalerCtx == null || _scalerWidth != width || _scalerHeight != height)
- {
- FreeScaler();
-
- _scalerCtx = ffmpeg.sws_getContext(
- width, height, AVPixelFormat.AV_PIX_FMT_YUV420P,
- width, height, AVPixelFormat.AV_PIX_FMT_RGBA, 0, null, null, null);
-
- _scalerWidth = width;
- _scalerHeight = height;
- }
- }
-
- public static void Uninitialize()
- {
- if (IsInitialized)
- {
- ffmpeg.av_frame_unref(_frame);
- ffmpeg.av_free(_frame);
- ffmpeg.avcodec_close(_context);
-
- FreeScaler();
-
- IsInitialized = false;
- }
- }
-
- private static void FreeScaler()
- {
- if (_scalerCtx != null)
- {
- ffmpeg.sws_freeContext(_scalerCtx);
-
- _scalerCtx = null;
- }
- }
- }
-} \ No newline at end of file