IPCamAppBar/IPCamLib/FFMPEG/FFmpegVideoPInvoke.cs

66 lines
2.5 KiB
C#

/*
* 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);
}
}