/* * Source code originally from RtspClientSharp's player example: * https://github.com/BogdanovKirill/RtspClientSharp */ // ReSharper disable All using System; using System.Runtime.InteropServices; namespace IPCamLib.FFMPEG { internal enum FFmpegVideoCodecId { MJPEG = 7, H264 = 27 } [Flags] internal enum FFmpegScalingQuality { FastBilinear = 1, Bilinear = 2, Bicubic = 4, Point = 0x10, Area = 0x20, } internal enum FFmpegPixelFormat { None = -1, BGR24 = 3, GRAY8 = 8, BGRA = 28 } internal static class FFmpegVideoPInvoke { private const string LibraryName = "libffmpeghelper.dll"; [DllImport(LibraryName, EntryPoint = "create_video_decoder", CallingConvention = CallingConvention.Cdecl)] public static extern int CreateVideoDecoder(FFmpegVideoCodecId videoCodecId, out IntPtr handle); [DllImport(LibraryName, EntryPoint = "remove_video_decoder", CallingConvention = CallingConvention.Cdecl)] public static extern void RemoveVideoDecoder(IntPtr handle); [DllImport(LibraryName, EntryPoint = "set_video_decoder_extradata", CallingConvention = CallingConvention.Cdecl)] public static extern int SetVideoDecoderExtraData(IntPtr handle, IntPtr extradata, int extradataLength); [DllImport(LibraryName, EntryPoint = "decode_video_frame", CallingConvention = CallingConvention.Cdecl)] public static extern int DecodeFrame(IntPtr handle, IntPtr rawBuffer, int rawBufferLength, out int frameWidth, out int frameHeight, out FFmpegPixelFormat framePixelFormat); [DllImport(LibraryName, EntryPoint = "scale_decoded_video_frame", CallingConvention = CallingConvention.Cdecl)] public static extern int ScaleDecodedVideoFrame(IntPtr handle, IntPtr scalerHandle, IntPtr scaledBuffer, int scaledBufferStride); [DllImport(LibraryName, EntryPoint = "create_video_scaler", CallingConvention = CallingConvention.Cdecl)] public static extern int CreateVideoScaler(int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight, FFmpegPixelFormat sourcePixelFormat, int scaledWidth, int scaledHeight, FFmpegPixelFormat scaledPixelFormat, FFmpegScalingQuality qualityFlags, out IntPtr handle); [DllImport(LibraryName, EntryPoint = "remove_video_scaler", CallingConvention = CallingConvention.Cdecl)] public static extern void RemoveVideoScaler(IntPtr handle); } }