|
|
|
@@ -172,6 +172,7 @@ typedef enum {
|
|
|
|
|
#if !defined PLACEBO_GL
|
|
|
|
|
#include <EGL/egl.h>
|
|
|
|
|
#include <EGL/eglext.h>
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef GL_OES_EGL_image
|
|
|
|
@@ -183,6 +184,7 @@ typedef void *EGLImageKHR;
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
#ifdef PLACEBO_GL
|
|
|
|
|
GLenum glewInit(void);
|
|
|
|
|
#include <libplacebo/opengl.h>
|
|
|
|
|
#else
|
|
|
|
|
#define VK_USE_PLATFORM_XCB_KHR
|
|
|
|
@@ -380,18 +382,12 @@ signed char VideoHardwareDecoder = -1; ///< flag use hardware decoder
|
|
|
|
|
|
|
|
|
|
static char VideoSurfaceModesChanged; ///< flag surface modes changed
|
|
|
|
|
|
|
|
|
|
/// flag use transparent OSD.
|
|
|
|
|
static const char VideoTransparentOsd = 1;
|
|
|
|
|
|
|
|
|
|
static uint32_t VideoBackground; ///< video background color
|
|
|
|
|
char VideoStudioLevels; ///< flag use studio levels
|
|
|
|
|
|
|
|
|
|
/// Default deinterlace mode.
|
|
|
|
|
static VideoDeinterlaceModes VideoDeinterlace[VideoResolutionMax];
|
|
|
|
|
|
|
|
|
|
/// Default number of deinterlace surfaces
|
|
|
|
|
static const int VideoDeinterlaceSurfaces = 4;
|
|
|
|
|
|
|
|
|
|
/// Default skip chroma deinterlace flag (CUVID only).
|
|
|
|
|
static char VideoSkipChromaDeinterlace[VideoResolutionMax];
|
|
|
|
|
|
|
|
|
@@ -430,7 +426,7 @@ static int DRMRefresh = 50;
|
|
|
|
|
|
|
|
|
|
static char Video60HzMode; ///< handle 60hz displays
|
|
|
|
|
static char VideoSoftStartSync; ///< soft start sync audio/video
|
|
|
|
|
static const int VideoSoftStartFrames = 100; ///< soft start frames
|
|
|
|
|
//static const int VideoSoftStartFrames = 100; ///< soft start frames
|
|
|
|
|
static char VideoShowBlackPicture; ///< flag show black picture
|
|
|
|
|
|
|
|
|
|
static float VideoBrightness = 0.0f;
|
|
|
|
@@ -442,11 +438,14 @@ static float VideoTemperature = 0.0f;
|
|
|
|
|
static int VulkanTargetColorSpace = 0;
|
|
|
|
|
static int VideoScalerTest = 0;
|
|
|
|
|
static int VideoColorBlindness = 0;
|
|
|
|
|
static float VideoColorBlindnessFaktor = 1.0f;
|
|
|
|
|
static float VideoColorBlindnessFaktor = 1.0;
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
static char *shadersp[NUM_SHADERS];
|
|
|
|
|
char MyConfigDir[200];
|
|
|
|
|
static int num_shaders = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int LUTon = -1;
|
|
|
|
|
|
|
|
|
|
static xcb_atom_t WmDeleteWindowAtom; ///< WM delete message atom
|
|
|
|
@@ -494,11 +493,11 @@ static char DPMSDisabled; ///< flag we have disabled dpms
|
|
|
|
|
static char EnableDPMSatBlackScreen; ///< flag we should enable dpms at black screen
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static unsigned int Count;
|
|
|
|
|
static int EglEnabled; ///< use EGL
|
|
|
|
|
static int GlxVSyncEnabled = 1; ///< enable/disable v-sync
|
|
|
|
|
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
static int GlxVSyncEnabled = 1; ///< enable/disable v-sync
|
|
|
|
|
static unsigned int Count;
|
|
|
|
|
static GLXContext glxSharedContext; ///< shared gl context
|
|
|
|
|
static GLXContext glxContext; ///< our gl context
|
|
|
|
|
|
|
|
|
@@ -509,11 +508,13 @@ static void GlxSetupWindow(xcb_window_t window, int width, int height, GLXContex
|
|
|
|
|
GLXContext OSDcontext;
|
|
|
|
|
#else
|
|
|
|
|
static EGLContext eglSharedContext; ///< shared gl context
|
|
|
|
|
#ifdef USE_DRM
|
|
|
|
|
static EGLContext eglOSDContext = NULL; ///< our gl context for the thread
|
|
|
|
|
#endif
|
|
|
|
|
static EGLContext eglContext; ///< our gl context
|
|
|
|
|
static EGLConfig eglConfig;
|
|
|
|
|
static EGLDisplay eglDisplay;
|
|
|
|
|
static EGLSurface eglSurface, eglOSDSurface;
|
|
|
|
|
static EGLSurface eglSurface;
|
|
|
|
|
static EGLint eglAttrs[10];
|
|
|
|
|
static int eglVersion = 2;
|
|
|
|
|
static EGLImageKHR(EGLAPIENTRY *CreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, const EGLint *);
|
|
|
|
@@ -531,9 +532,6 @@ static void GlxSetupWindow(xcb_window_t window, int width, int height, EGLContex
|
|
|
|
|
EGLContext OSDcontext;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static GLuint OsdGlTextures[2]; ///< gl texture for OSD
|
|
|
|
|
static int OsdIndex = 0; ///< index into OsdGlTextures
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
// Common Functions
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
@@ -630,8 +628,8 @@ static void VideoSetPts(int64_t *pts_p, int interlaced, const AVCodecContext *vi
|
|
|
|
|
// } else {
|
|
|
|
|
duration = interlaced ? 40 : 20; // 50Hz -> 20ms default
|
|
|
|
|
// }
|
|
|
|
|
// Debug(4, "video: %d/%d %" PRIx64 " -> %d\n", video_ctx->framerate.den,
|
|
|
|
|
// video_ctx->framerate.num, av_frame_get_pkt_duration(frame), duration);
|
|
|
|
|
Debug(4, "video: Framerate %d/%d \n", video_ctx->framerate.den,
|
|
|
|
|
video_ctx->framerate.num);
|
|
|
|
|
|
|
|
|
|
// update video clock
|
|
|
|
|
if (*pts_p != (int64_t)AV_NOPTS_VALUE) {
|
|
|
|
@@ -793,7 +791,7 @@ video_none:
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static uint64_t test_time = 0;
|
|
|
|
|
//static uint64_t test_time = 0;
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
/// Lock video thread.
|
|
|
|
@@ -871,18 +869,7 @@ static uint64_t test_time = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef USE_GLX
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
/// GLX extension functions
|
|
|
|
|
///@{
|
|
|
|
|
#ifdef GLX_MESA_swap_control
|
|
|
|
|
static PFNGLXSWAPINTERVALMESAPROC GlxSwapIntervalMESA;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef GLX_SGI_video_sync
|
|
|
|
|
static PFNGLXGETVIDEOSYNCSGIPROC GlxGetVideoSyncSGI;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef GLX_SGI_swap_control
|
|
|
|
|
static PFNGLXSWAPINTERVALSGIPROC GlxSwapIntervalSGI;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
/// GLX check error.
|
|
|
|
@@ -896,6 +883,21 @@ static PFNGLXSWAPINTERVALSGIPROC GlxSwapIntervalSGI;
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
///
|
|
|
|
|
/// GLX extension functions
|
|
|
|
|
///@{
|
|
|
|
|
#ifdef GLX_MESA_swap_control
|
|
|
|
|
static PFNGLXSWAPINTERVALMESAPROC GlxSwapIntervalMESA;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef GLX_SGI_video_sync
|
|
|
|
|
static PFNGLXGETVIDEOSYNCSGIPROC GlxGetVideoSyncSGI;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef GLX_SGI_swap_control
|
|
|
|
|
static PFNGLXSWAPINTERVALSGIPROC GlxSwapIntervalSGI;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
/// GLX check if a GLX extension is supported.
|
|
|
|
|
///
|
|
|
|
@@ -915,6 +917,7 @@ static int GlxIsExtensionSupported(const char *ext) {
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
/// Setup GLX window.
|
|
|
|
@@ -930,11 +933,12 @@ static void GlxSetupWindow(xcb_window_t window, int width, int height, GLXContex
|
|
|
|
|
static void GlxSetupWindow(xcb_window_t window, int width, int height, EGLContext context)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
uint32_t start;
|
|
|
|
|
uint32_t end;
|
|
|
|
|
int i;
|
|
|
|
|
unsigned count;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO_
|
|
|
|
|
return;
|
|
|
|
@@ -1170,6 +1174,7 @@ static void EglInit(void) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else // VAAPI
|
|
|
|
|
extern void make_egl(void);
|
|
|
|
|
static void EglInit(void) {
|
|
|
|
|
int redSize, greenSize, blueSize, alphaSize;
|
|
|
|
|
static int glewdone = 0;
|
|
|
|
@@ -1185,7 +1190,8 @@ static void EglInit(void) {
|
|
|
|
|
make_egl();
|
|
|
|
|
|
|
|
|
|
if (!glewdone) {
|
|
|
|
|
GLenum err = glewInit();
|
|
|
|
|
//GLenum err = glewInit();
|
|
|
|
|
glewInit();
|
|
|
|
|
|
|
|
|
|
glewdone = 1;
|
|
|
|
|
// if (err != GLEW_OK) {
|
|
|
|
@@ -1456,11 +1462,11 @@ typedef struct priv {
|
|
|
|
|
const struct pl_vulkan *vk;
|
|
|
|
|
const struct pl_vk_inst *vk_inst;
|
|
|
|
|
#endif
|
|
|
|
|
struct pl_context *ctx;
|
|
|
|
|
const struct pl_log_t *ctx;
|
|
|
|
|
struct pl_custom_lut *lut;
|
|
|
|
|
struct pl_renderer *renderer;
|
|
|
|
|
struct pl_renderer *renderertest;
|
|
|
|
|
const struct pl_swapchain *swapchain;
|
|
|
|
|
struct pl_renderer_t *renderer;
|
|
|
|
|
struct pl_renderer_t *renderertest;
|
|
|
|
|
const struct pl_swapchain_t *swapchain;
|
|
|
|
|
struct pl_log_params context;
|
|
|
|
|
#ifndef PLACEBO_GL
|
|
|
|
|
VkSurfaceKHR pSurface;
|
|
|
|
@@ -1468,7 +1474,7 @@ typedef struct priv {
|
|
|
|
|
int has_dma_buf;
|
|
|
|
|
#ifdef PLACEBO_GL
|
|
|
|
|
#if PL_API_VER >= 229
|
|
|
|
|
struct pl_opengl_t *gl;
|
|
|
|
|
const struct pl_opengl_t *gl;
|
|
|
|
|
#else
|
|
|
|
|
struct pl_opengl *gl;
|
|
|
|
|
#endif
|
|
|
|
@@ -1484,7 +1490,6 @@ static struct pl_overlay osdoverlay;
|
|
|
|
|
static struct pl_overlay_part part;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int semid;
|
|
|
|
|
struct itimerval itimer;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@@ -1816,11 +1821,6 @@ struct mp_egl_config_attr {
|
|
|
|
|
#define MP_EGL_ATTRIB(id) \
|
|
|
|
|
{ id, #id }
|
|
|
|
|
|
|
|
|
|
static const struct mp_egl_config_attr mp_egl_attribs[] = {
|
|
|
|
|
MP_EGL_ATTRIB(EGL_CONFIG_ID), MP_EGL_ATTRIB(EGL_RED_SIZE), MP_EGL_ATTRIB(EGL_GREEN_SIZE),
|
|
|
|
|
MP_EGL_ATTRIB(EGL_BLUE_SIZE), MP_EGL_ATTRIB(EGL_ALPHA_SIZE), MP_EGL_ATTRIB(EGL_COLOR_BUFFER_TYPE),
|
|
|
|
|
MP_EGL_ATTRIB(EGL_CONFIG_CAVEAT), MP_EGL_ATTRIB(EGL_CONFORMANT),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const int mpgl_preferred_gl_versions[] = {460, 440, 430, 400, 330, 320, 310, 300, 210, 0};
|
|
|
|
|
|
|
|
|
@@ -1952,7 +1952,7 @@ static bool create_context_cb(EGLDisplay display, int es_version, EGLContext *ou
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
make_egl() {
|
|
|
|
|
void make_egl(void) {
|
|
|
|
|
int bpp;
|
|
|
|
|
|
|
|
|
|
CreateImageKHR = (void *)eglGetProcAddress("eglCreateImageKHR");
|
|
|
|
@@ -1976,7 +1976,7 @@ make_egl() {
|
|
|
|
|
if (!create_context_cb(eglDisplay, 0, &eglContext, &eglConfig, &bpp)) {
|
|
|
|
|
Fatal(_("Could not create EGL Context\n"));
|
|
|
|
|
}
|
|
|
|
|
int vID, n;
|
|
|
|
|
int vID;
|
|
|
|
|
|
|
|
|
|
eglGetConfigAttrib(eglDisplay, eglConfig, EGL_NATIVE_VISUAL_ID, &vID);
|
|
|
|
|
Debug(3, "chose visual 0x%x bpp %d\n", vID, bpp);
|
|
|
|
@@ -2249,9 +2249,9 @@ void generateCUDAImage(CuvidDecoder *decoder, int index, const AVFrame *frame, i
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
void createTextureDst(CuvidDecoder *decoder, int anz, unsigned int size_x, unsigned int size_y,
|
|
|
|
|
enum AVPixelFormat PixFmt) {
|
|
|
|
|
int n, i, size = 1, fd;
|
|
|
|
|
const struct pl_fmt *fmt;
|
|
|
|
|
struct pl_tex *tex;
|
|
|
|
|
int n, i;
|
|
|
|
|
const struct pl_fmt_t *fmt;
|
|
|
|
|
//struct pl_tex *tex;
|
|
|
|
|
struct pl_frame *img;
|
|
|
|
|
struct pl_plane *pl;
|
|
|
|
|
|
|
|
|
@@ -2270,10 +2270,8 @@ void createTextureDst(CuvidDecoder *decoder, int anz, unsigned int size_x, unsig
|
|
|
|
|
|
|
|
|
|
if (PixFmt == AV_PIX_FMT_NV12) {
|
|
|
|
|
fmt = pl_find_named_fmt(p->gpu, n == 0 ? "r8" : "rg8"); // 8 Bit YUV
|
|
|
|
|
size = 1;
|
|
|
|
|
} else {
|
|
|
|
|
fmt = pl_find_named_fmt(p->gpu, n == 0 ? "r16" : "rg16"); // 10 Bit YUV
|
|
|
|
|
size = 2;
|
|
|
|
|
}
|
|
|
|
|
if (decoder->pl_frames[i].planes[n].texture) {
|
|
|
|
|
// #ifdef VAAPI
|
|
|
|
@@ -2285,7 +2283,7 @@ void createTextureDst(CuvidDecoder *decoder, int anz, unsigned int size_x, unsig
|
|
|
|
|
&decoder->pl_frames[i].planes[n].texture); // delete old texture
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//if (p->has_dma_buf == 0) {
|
|
|
|
|
if (p->has_dma_buf == 0) {
|
|
|
|
|
decoder->pl_frames[i].planes[n].texture = pl_tex_create(
|
|
|
|
|
p->gpu, &(struct pl_tex_params) {
|
|
|
|
|
.w = n == 0 ? size_x : size_x / 2, .h = n == 0 ? size_y : size_y / 2, .d = 0, .format = fmt,
|
|
|
|
@@ -2297,7 +2295,7 @@ void createTextureDst(CuvidDecoder *decoder, int anz, unsigned int size_x, unsig
|
|
|
|
|
.export_handle = PL_HANDLE_FD,
|
|
|
|
|
#endif
|
|
|
|
|
});
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// make planes for image
|
|
|
|
|
pl = &decoder->pl_frames[i].planes[n];
|
|
|
|
@@ -2320,7 +2318,7 @@ void createTextureDst(CuvidDecoder *decoder, int anz, unsigned int size_x, unsig
|
|
|
|
|
Fatal(_("Unable to create placebo textures"));
|
|
|
|
|
}
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
fd = dup(decoder->pl_frames[i].planes[n].texture->shared_mem.handle.fd);
|
|
|
|
|
int fd = dup(decoder->pl_frames[i].planes[n].texture->shared_mem.handle.fd);
|
|
|
|
|
CUDA_EXTERNAL_MEMORY_HANDLE_DESC ext_desc = {
|
|
|
|
|
.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,
|
|
|
|
|
.handle.fd = fd,
|
|
|
|
@@ -2372,10 +2370,8 @@ void createTextureDst(CuvidDecoder *decoder, int anz, unsigned int size_x, unsig
|
|
|
|
|
void generateVAAPIImage(CuvidDecoder *decoder, int index, const AVFrame *frame, int image_width, int image_height) {
|
|
|
|
|
int n;
|
|
|
|
|
VAStatus status;
|
|
|
|
|
int toggle = 0;
|
|
|
|
|
uint64_t first_time;
|
|
|
|
|
VADRMPRIMESurfaceDescriptor desc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vaSyncSurface(decoder->VaDisplay, (unsigned int)frame->data[3]);
|
|
|
|
|
status =
|
|
|
|
|
vaExportSurfaceHandle(decoder->VaDisplay, (unsigned int)frame->data[3], VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
|
|
|
|
@@ -2394,11 +2390,8 @@ void generateVAAPIImage(CuvidDecoder *decoder, int index, const AVFrame *frame,
|
|
|
|
|
int fd = desc.objects[id].fd;
|
|
|
|
|
uint32_t size = desc.objects[id].size;
|
|
|
|
|
uint32_t offset = desc.layers[n].offset[0];
|
|
|
|
|
#if PL_API_VER < 229
|
|
|
|
|
struct pl_fmt *fmt;
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
struct pl_fmt_t *fmt;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (fd == -1) {
|
|
|
|
|
printf("Fehler beim Import von Surface %d\n", index);
|
|
|
|
@@ -2409,15 +2402,14 @@ void generateVAAPIImage(CuvidDecoder *decoder, int index, const AVFrame *frame,
|
|
|
|
|
size = n == 0 ? desc.width * desc.height : desc.width * desc.height / 2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fmt = pl_find_fourcc(p->gpu,desc.layers[n].drm_format);
|
|
|
|
|
#if 1
|
|
|
|
|
// fmt = pl_find_fourcc(p->gpu,desc.lsayers[n].drm_format);
|
|
|
|
|
|
|
|
|
|
if (decoder->PixFmt == AV_PIX_FMT_NV12) {
|
|
|
|
|
fmt = pl_find_named_fmt(p->gpu, n == 0 ? "r8" : "rg8"); // 8 Bit YUV
|
|
|
|
|
} else {
|
|
|
|
|
fmt = pl_find_fourcc(p->gpu,
|
|
|
|
|
n == 0 ? 0x20363152 : 0x32335247); // 10 Bit YUV
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
assert(fmt != NULL);
|
|
|
|
|
#ifdef PLACEBO_GL
|
|
|
|
@@ -2570,8 +2562,6 @@ void generateVAAPIImage(CuvidDecoder *decoder, VASurfaceID index, const AVFrame
|
|
|
|
|
int image_height) {
|
|
|
|
|
VAStatus status;
|
|
|
|
|
|
|
|
|
|
uint64_t first_time;
|
|
|
|
|
|
|
|
|
|
#if defined(VAAPI)
|
|
|
|
|
VADRMPRIMESurfaceDescriptor desc;
|
|
|
|
|
|
|
|
|
@@ -2840,7 +2830,7 @@ static int init_generic_hwaccel(CuvidDecoder *decoder, enum AVPixelFormat hw_fmt
|
|
|
|
|
if (decoder->cached_hw_frames_ctx) {
|
|
|
|
|
AVHWFramesContext *old_fctx = (void *)decoder->cached_hw_frames_ctx->data;
|
|
|
|
|
|
|
|
|
|
Debug(3, "CMP %d:%d %d:%d %d:%d %d:%d %d:%d\,", new_fctx->format, old_fctx->format, new_fctx->sw_format,
|
|
|
|
|
Debug(3, "CMP %d:%d %d:%d %d:%d %d:%d %d:%d\n,", new_fctx->format, old_fctx->format, new_fctx->sw_format,
|
|
|
|
|
old_fctx->sw_format, new_fctx->width, old_fctx->width, new_fctx->height, old_fctx->height,
|
|
|
|
|
new_fctx->initial_pool_size, old_fctx->initial_pool_size);
|
|
|
|
|
if (new_fctx->format != old_fctx->format || new_fctx->sw_format != old_fctx->sw_format ||
|
|
|
|
@@ -2889,7 +2879,7 @@ error:
|
|
|
|
|
static enum AVPixelFormat Cuvid_get_format(CuvidDecoder *decoder, AVCodecContext *video_ctx,
|
|
|
|
|
const enum AVPixelFormat *fmt) {
|
|
|
|
|
const enum AVPixelFormat *fmt_idx;
|
|
|
|
|
int bitformat16 = 0, deint = 0;
|
|
|
|
|
int bitformat16 = 0;
|
|
|
|
|
|
|
|
|
|
VideoDecoder *ist = video_ctx->opaque;
|
|
|
|
|
|
|
|
|
@@ -2986,6 +2976,7 @@ static enum AVPixelFormat Cuvid_get_format(CuvidDecoder *decoder, AVCodecContext
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if defined YADIF && defined CUVID
|
|
|
|
|
int deint;
|
|
|
|
|
if (VideoDeinterlace[decoder->Resolution] == VideoDeinterlaceYadif) {
|
|
|
|
|
deint = 0;
|
|
|
|
|
ist->filter = 1; // init yadif_cuda
|
|
|
|
@@ -3004,7 +2995,10 @@ static enum AVPixelFormat Cuvid_get_format(CuvidDecoder *decoder, AVCodecContext
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
ist->active_hwaccel_id = HWACCEL_CUVID;
|
|
|
|
|
#else
|
|
|
|
|
if (VideoDeinterlace[decoder->Resolution]) {// need deinterlace
|
|
|
|
|
if (video_ctx->codec_id == AV_CODEC_ID_HEVC) {
|
|
|
|
|
ist->filter = 0;
|
|
|
|
|
}
|
|
|
|
|
else if (VideoDeinterlace[decoder->Resolution]) {// need deinterlace
|
|
|
|
|
ist->filter = 1; // init deint vaapi
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
@@ -3037,18 +3031,18 @@ int get_RGB(CuvidDecoder *decoder) {
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
struct pl_render_params render_params = pl_render_default_params;
|
|
|
|
|
struct pl_frame target = {0};
|
|
|
|
|
const struct pl_fmt *fmt;
|
|
|
|
|
const struct pl_fmt_t *fmt;
|
|
|
|
|
|
|
|
|
|
int offset, x1, y1, x0, y0;
|
|
|
|
|
int x1=0, y1=0, x0=0, y0=0;
|
|
|
|
|
float faktorx, faktory;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
uint8_t *base;
|
|
|
|
|
int width;
|
|
|
|
|
int height;
|
|
|
|
|
GLuint fb, texture;
|
|
|
|
|
|
|
|
|
|
int current;
|
|
|
|
|
GLint texLoc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
base = decoder->grabbase;
|
|
|
|
|
width = decoder->grabwidth;
|
|
|
|
@@ -3057,7 +3051,8 @@ int get_RGB(CuvidDecoder *decoder) {
|
|
|
|
|
current = decoder->SurfacesRb[decoder->SurfaceRead];
|
|
|
|
|
|
|
|
|
|
#ifndef PLACEBO
|
|
|
|
|
|
|
|
|
|
GLint texLoc;
|
|
|
|
|
GLuint fb, texture;
|
|
|
|
|
glGenTextures(1, &texture);
|
|
|
|
|
GlxCheck();
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture);
|
|
|
|
@@ -3496,7 +3491,6 @@ extern void cudaLaunchNV12toARGBDrv(uint32_t * d_srcNV12, size_t nSourcePitch, u
|
|
|
|
|
/// @param frame frame to display
|
|
|
|
|
///
|
|
|
|
|
static void CuvidRenderFrame(CuvidDecoder *decoder, const AVCodecContext *video_ctx, AVFrame *frame) {
|
|
|
|
|
uint64_t first_time;
|
|
|
|
|
int surface;
|
|
|
|
|
enum AVColorSpace color;
|
|
|
|
|
|
|
|
|
@@ -3524,33 +3518,40 @@ static void CuvidRenderFrame(CuvidDecoder *decoder, const AVCodecContext *video_
|
|
|
|
|
|
|
|
|
|
// Fix libav colorspace failure
|
|
|
|
|
color = frame->colorspace;
|
|
|
|
|
if (color == AVCOL_SPC_UNSPECIFIED) // failure with RTL HD and all SD channels
|
|
|
|
|
if (color == AVCOL_SPC_UNSPECIFIED) { // failure with RTL HD and all SD channels
|
|
|
|
|
// with vaapi
|
|
|
|
|
if (frame->width > 720)
|
|
|
|
|
if (frame->width > 720) {
|
|
|
|
|
color = AVCOL_SPC_BT709;
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
color = AVCOL_SPC_BT470BG;
|
|
|
|
|
if (color == AVCOL_SPC_RGB) // Cuvid decoder failure with SD channels
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (color == AVCOL_SPC_RGB) { // Cuvid decoder failure with SD channels
|
|
|
|
|
color = AVCOL_SPC_BT470BG;
|
|
|
|
|
}
|
|
|
|
|
frame->colorspace = color;
|
|
|
|
|
|
|
|
|
|
// Fix libav Color primaries failures
|
|
|
|
|
if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED) // failure with RTL HD and all SD channels with
|
|
|
|
|
if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED) { // failure with RTL HD and all SD channels with
|
|
|
|
|
// vaapi
|
|
|
|
|
if (frame->width > 720)
|
|
|
|
|
if (frame->width > 720) {
|
|
|
|
|
frame->color_primaries = AVCOL_PRI_BT709;
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
frame->color_primaries = AVCOL_PRI_BT470BG;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (frame->color_primaries == AVCOL_PRI_RESERVED0) // cuvid decoder failure with SD channels
|
|
|
|
|
frame->color_primaries = AVCOL_PRI_BT470BG;
|
|
|
|
|
|
|
|
|
|
// Fix libav Color TRC failures
|
|
|
|
|
if (frame->color_trc == AVCOL_TRC_UNSPECIFIED) // failure with RTL HD and all
|
|
|
|
|
if (frame->color_trc == AVCOL_TRC_UNSPECIFIED) { // failure with RTL HD and all
|
|
|
|
|
// SD channels with vaapi
|
|
|
|
|
if (frame->width > 720)
|
|
|
|
|
if (frame->width > 720) {
|
|
|
|
|
frame->color_trc = AVCOL_TRC_BT709;
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
frame->color_trc = AVCOL_TRC_SMPTE170M;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (frame->color_trc == AVCOL_TRC_RESERVED0) // cuvid decoder failure with SD channels
|
|
|
|
|
frame->color_trc = AVCOL_TRC_SMPTE170M;
|
|
|
|
|
|
|
|
|
@@ -3645,10 +3646,10 @@ static void CuvidRenderFrame(CuvidDecoder *decoder, const AVCodecContext *video_
|
|
|
|
|
/// @param decoder CUVID hw decoder
|
|
|
|
|
///
|
|
|
|
|
static void *CuvidGetHwAccelContext(CuvidDecoder *decoder) {
|
|
|
|
|
unsigned int version, ret;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(void)decoder;
|
|
|
|
|
Debug(3, "Initializing cuvid hwaccel thread ID:%ld\n", (long int)syscall(186));
|
|
|
|
|
// turn NULL;
|
|
|
|
|
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
if (decoder->cuda_ctx) {
|
|
|
|
|
Debug(3, "schon passiert\n");
|
|
|
|
@@ -3656,7 +3657,7 @@ static void *CuvidGetHwAccelContext(CuvidDecoder *decoder) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!cu) {
|
|
|
|
|
ret = cuda_load_functions(&cu, NULL);
|
|
|
|
|
int ret = cuda_load_functions(&cu, NULL);
|
|
|
|
|
if (ret < 0) {
|
|
|
|
|
Error(_("Could not dynamically load CUDA\n"));
|
|
|
|
|
return 0;
|
|
|
|
@@ -3668,7 +3669,7 @@ static void *CuvidGetHwAccelContext(CuvidDecoder *decoder) {
|
|
|
|
|
|
|
|
|
|
if (decoder->cuda_ctx == NULL)
|
|
|
|
|
Fatal(_("Kein Cuda device gefunden"));
|
|
|
|
|
|
|
|
|
|
// unsigned int version;
|
|
|
|
|
// cu->cuCtxGetApiVersion(decoder->cuda_ctx, &version);
|
|
|
|
|
// Debug(3, "***********CUDA API Version %d\n", version);
|
|
|
|
|
#endif
|
|
|
|
@@ -3727,7 +3728,7 @@ static void CuvidAdvanceDecoderFrame(CuvidDecoder *decoder) {
|
|
|
|
|
#if defined PLACEBO && PL_API_VER >= 58
|
|
|
|
|
|
|
|
|
|
static const struct pl_hook *parse_user_shader(char *shader) {
|
|
|
|
|
char tmp[200];
|
|
|
|
|
char tmp[400];
|
|
|
|
|
|
|
|
|
|
if (!shader)
|
|
|
|
|
return NULL;
|
|
|
|
@@ -3790,26 +3791,23 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
struct pl_deband_params deband;
|
|
|
|
|
struct pl_color_adjustment colors;
|
|
|
|
|
struct pl_cone_params cone;
|
|
|
|
|
struct pl_tex_vk *vkp;
|
|
|
|
|
//struct pl_tex_vk *vkp;
|
|
|
|
|
struct pl_plane *pl;
|
|
|
|
|
struct pl_tex *tex0, *tex1;
|
|
|
|
|
//struct pl_tex *tex0, *tex1;
|
|
|
|
|
|
|
|
|
|
struct pl_frame *img;
|
|
|
|
|
bool ok;
|
|
|
|
|
//bool ok;
|
|
|
|
|
VdpRect video_src_rect;
|
|
|
|
|
VdpRect dst_rect;
|
|
|
|
|
//VdpRect dst_rect;
|
|
|
|
|
VdpRect dst_video_rect;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
int current;
|
|
|
|
|
int y;
|
|
|
|
|
float xcropf, ycropf;
|
|
|
|
|
GLint texLoc;
|
|
|
|
|
AVFrame *frame;
|
|
|
|
|
AVFrameSideData *sd, *sd1 = NULL, *sd2 = NULL;
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
if (level) {
|
|
|
|
|
dst_rect.x0 = decoder->VideoX; // video window output (clip)
|
|
|
|
|
dst_rect.y0 = decoder->VideoY;
|
|
|
|
@@ -3821,7 +3819,7 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
dst_rect.x1 = VideoWindowWidth;
|
|
|
|
|
dst_rect.y1 = VideoWindowHeight;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
video_src_rect.x0 = decoder->CropX; // video source (crop)
|
|
|
|
|
video_src_rect.y0 = decoder->CropY;
|
|
|
|
|
video_src_rect.x1 = decoder->CropX + decoder->CropWidth;
|
|
|
|
@@ -3833,12 +3831,13 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
dst_video_rect.y1 = decoder->OutputY + decoder->OutputHeight;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
xcropf = (float)decoder->CropX / (float)decoder->InputWidth;
|
|
|
|
|
ycropf = (float)decoder->CropY / (float)decoder->InputHeight;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
current = decoder->SurfacesRb[decoder->SurfaceRead];
|
|
|
|
|
|
|
|
|
|
#ifdef USE_DRM
|
|
|
|
|
|
|
|
|
|
AVFrameSideData *sd, *sd1 = NULL, *sd2 = NULL;
|
|
|
|
|
if (!decoder->Closing) {
|
|
|
|
|
frame = decoder->frames[current];
|
|
|
|
|
sd1 = av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
|
|
|
|
@@ -3850,6 +3849,14 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
|
|
|
|
|
// Render Progressive frame
|
|
|
|
|
#ifndef PLACEBO
|
|
|
|
|
|
|
|
|
|
GLint texLoc;
|
|
|
|
|
int y;
|
|
|
|
|
float xcropf, ycropf;
|
|
|
|
|
|
|
|
|
|
xcropf = (float)decoder->CropX / (float)decoder->InputWidth;
|
|
|
|
|
ycropf = (float)decoder->CropY / (float)decoder->InputHeight;
|
|
|
|
|
|
|
|
|
|
y = VideoWindowHeight - decoder->OutputY - decoder->OutputHeight;
|
|
|
|
|
if (y < 0)
|
|
|
|
|
y = 0;
|
|
|
|
@@ -3888,8 +3895,7 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
else
|
|
|
|
|
render_params.lut = NULL;
|
|
|
|
|
|
|
|
|
|
frame = decoder->frames[current];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Fix Color Parameters
|
|
|
|
|
|
|
|
|
|
switch (decoder->ColorSpace) {
|
|
|
|
@@ -3972,6 +3978,9 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
// target.repr.bits.bit_shift =0;
|
|
|
|
|
|
|
|
|
|
#if USE_DRM
|
|
|
|
|
AVFrame *frame;
|
|
|
|
|
frame = decoder->frames[current];
|
|
|
|
|
|
|
|
|
|
switch (VulkanTargetColorSpace) {
|
|
|
|
|
case 0: // Monitor
|
|
|
|
|
memcpy(&target->color, &pl_color_space_monitor, sizeof(struct pl_color_space));
|
|
|
|
@@ -4100,7 +4109,11 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
render_params.downscaler = pl_filter_presets[VideoScaling[decoder->Resolution]].filter;
|
|
|
|
|
|
|
|
|
|
if (level)
|
|
|
|
|
#if PL_API_VER < 346
|
|
|
|
|
render_params.skip_target_clearing = 1;
|
|
|
|
|
#else
|
|
|
|
|
render_params.border = PL_CLEAR_SKIP;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
render_params.color_adjustment = &colors;
|
|
|
|
|
|
|
|
|
@@ -4196,7 +4209,11 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
|
|
|
|
|
// render_params.lut = NULL;
|
|
|
|
|
render_params.num_hooks = 0;
|
|
|
|
|
#if PL_API_VER < 346
|
|
|
|
|
render_params.skip_target_clearing = 1;
|
|
|
|
|
#else
|
|
|
|
|
render_params.border = PL_CLEAR_SKIP;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (!p->renderertest)
|
|
|
|
|
p->renderertest = pl_renderer_create(p->ctx, p->gpu);
|
|
|
|
@@ -4209,7 +4226,7 @@ static void CuvidMixVideo(CuvidDecoder *decoder, __attribute__((unused)) int lev
|
|
|
|
|
p->renderertest = NULL;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
Debug(4, "video/cuvid: yy video surface %p displayed\n", current, decoder->SurfaceRead);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
@@ -4217,7 +4234,7 @@ void make_osd_overlay(int x, int y, int width, int height) {
|
|
|
|
|
const struct pl_fmt *fmt;
|
|
|
|
|
struct pl_overlay *pl;
|
|
|
|
|
|
|
|
|
|
int offset = VideoWindowHeight - (VideoWindowHeight - height - y) - (VideoWindowHeight - y);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fmt = pl_find_named_fmt(p->gpu, "rgba8"); // 8 Bit RGB
|
|
|
|
|
|
|
|
|
@@ -4282,7 +4299,7 @@ void make_osd_overlay(int x, int y, int width, int height) {
|
|
|
|
|
pl->rect.x1 = x + width;
|
|
|
|
|
pl->rect.y0 = VideoWindowHeight - height - y;
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
int offset = VideoWindowHeight - (VideoWindowHeight - height - y) - (VideoWindowHeight - y);
|
|
|
|
|
pl->rect.x0 = x;
|
|
|
|
|
pl->rect.y0 = VideoWindowHeight - y + offset; // Boden von oben
|
|
|
|
|
pl->rect.x1 = x + width;
|
|
|
|
@@ -4297,6 +4314,7 @@ void make_osd_overlay(int x, int y, int width, int height) {
|
|
|
|
|
part.dst.x1 = x + width;
|
|
|
|
|
part.dst.y0 = VideoWindowHeight - height - y;
|
|
|
|
|
#else
|
|
|
|
|
int offset = VideoWindowHeight - (VideoWindowHeight - height - y) - (VideoWindowHeight - y);
|
|
|
|
|
part.dst.x0 = x;
|
|
|
|
|
part.dst.y0 = VideoWindowHeight - y + offset; // Boden von oben
|
|
|
|
|
part.dst.x1 = x + width;
|
|
|
|
@@ -4311,30 +4329,33 @@ void make_osd_overlay(int x, int y, int width, int height) {
|
|
|
|
|
|
|
|
|
|
static void CuvidDisplayFrame(void) {
|
|
|
|
|
|
|
|
|
|
static uint64_t first_time = 0, round_time = 0;
|
|
|
|
|
static uint64_t last_time = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
#if defined PLACEBO_GL || defined CUVID
|
|
|
|
|
static uint64_t round_time = 0;
|
|
|
|
|
//static uint64_t first_time = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
int filled;
|
|
|
|
|
CuvidDecoder *decoder;
|
|
|
|
|
int RTS_flag;
|
|
|
|
|
int valid_frame = 0;
|
|
|
|
|
float ldiff;
|
|
|
|
|
float turnaround;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
uint64_t diff;
|
|
|
|
|
static float fdiff = 23000.0;
|
|
|
|
|
//uint64_t diff;
|
|
|
|
|
//static float fdiff = 23000.0;
|
|
|
|
|
struct pl_swapchain_frame frame;
|
|
|
|
|
struct pl_frame target;
|
|
|
|
|
bool ok;
|
|
|
|
|
//bool ok;
|
|
|
|
|
|
|
|
|
|
const struct pl_fmt *fmt;
|
|
|
|
|
const float black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
|
|
|
|
|
//const struct pl_fmt *fmt;
|
|
|
|
|
//const float black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
|
|
|
|
|
#else
|
|
|
|
|
int valid_frame = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef PLACEBO
|
|
|
|
|
|
|
|
|
|
static uint64_t last_time = 0;
|
|
|
|
|
if (CuvidDecoderN)
|
|
|
|
|
CuvidDecoders[0]->Frameproc = (float)(GetusTicks() - last_time) / 1000000.0;
|
|
|
|
|
|
|
|
|
@@ -4370,7 +4391,7 @@ static void CuvidDisplayFrame(void) {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (CuvidDecoderN) {
|
|
|
|
|
ldiff = (float)(GetusTicks() - round_time) / 1000000.0;
|
|
|
|
|
float ldiff = (float)(GetusTicks() - round_time) / 1000000.0;
|
|
|
|
|
if (ldiff < 100.0 && ldiff > 0.0)
|
|
|
|
|
CuvidDecoders[0]->Frameproc = (CuvidDecoders[0]->Frameproc + ldiff + ldiff) / 3.0;
|
|
|
|
|
}
|
|
|
|
@@ -4384,7 +4405,7 @@ static void CuvidDisplayFrame(void) {
|
|
|
|
|
VideoThreadLock();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
last_time = GetusTicks();
|
|
|
|
|
//last_time = GetusTicks();
|
|
|
|
|
|
|
|
|
|
while (!pl_swapchain_start_frame(p->swapchain, &frame)) { // get new frame wait for previous to swap
|
|
|
|
|
usleep(5);
|
|
|
|
@@ -4439,7 +4460,7 @@ static void CuvidDisplayFrame(void) {
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
valid_frame = 1;
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO
|
|
|
|
|
//pthread_mutex_lock(&OSDMutex);
|
|
|
|
|
if (OsdShown == 1) { // New OSD opened
|
|
|
|
@@ -4467,6 +4488,7 @@ static void CuvidDisplayFrame(void) {
|
|
|
|
|
}
|
|
|
|
|
//pthread_mutex_unlock(&OSDMutex);
|
|
|
|
|
#else
|
|
|
|
|
valid_frame = 1;
|
|
|
|
|
CuvidMixVideo(decoder, i);
|
|
|
|
|
#endif
|
|
|
|
|
if (i == 0 && decoder->grab) { // Grab frame
|
|
|
|
@@ -4583,7 +4605,7 @@ static void CuvidDisplayFrame(void) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO_GL
|
|
|
|
|
CuvidSwapBuffer() {
|
|
|
|
|
void CuvidSwapBuffer() {
|
|
|
|
|
#ifndef USE_DRM
|
|
|
|
|
eglSwapBuffers(eglDisplay, eglSurface);
|
|
|
|
|
// eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
|
|
|
|
@@ -4699,7 +4721,6 @@ static void CuvidSyncDecoder(CuvidDecoder *decoder) {
|
|
|
|
|
int filled;
|
|
|
|
|
int64_t audio_clock;
|
|
|
|
|
int64_t video_clock;
|
|
|
|
|
int err = 0;
|
|
|
|
|
static int speedup = 3;
|
|
|
|
|
|
|
|
|
|
#ifdef GAMMA
|
|
|
|
@@ -4767,14 +4788,14 @@ static void CuvidSyncDecoder(CuvidDecoder *decoder) {
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
if (abs(diff) > 5000 * 90) { // more than 5s
|
|
|
|
|
err = CuvidMessage(2, "video: audio/video difference too big %d\n", diff / 90);
|
|
|
|
|
CuvidMessage(2, "video: audio/video difference too big %d\n", diff / 90);
|
|
|
|
|
// decoder->SyncCounter = 1;
|
|
|
|
|
// usleep(10);
|
|
|
|
|
goto skip_sync;
|
|
|
|
|
|
|
|
|
|
} else if (diff > 100 * 90) {
|
|
|
|
|
|
|
|
|
|
err = CuvidMessage(4, "video: slow down video, duping frame %d\n", diff / 90);
|
|
|
|
|
CuvidMessage(4, "video: slow down video, duping frame %d\n", diff / 90);
|
|
|
|
|
++decoder->FramesDuped;
|
|
|
|
|
if ((speedup && --speedup) || VideoSoftStartSync)
|
|
|
|
|
decoder->SyncCounter = 1;
|
|
|
|
@@ -4783,13 +4804,13 @@ static void CuvidSyncDecoder(CuvidDecoder *decoder) {
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
} else if (diff > 25 * 90) {
|
|
|
|
|
err = CuvidMessage(3, "video: slow down video, duping frame %d \n", diff / 90);
|
|
|
|
|
CuvidMessage(3, "video: slow down video, duping frame %d \n", diff / 90);
|
|
|
|
|
++decoder->FramesDuped;
|
|
|
|
|
decoder->SyncCounter = 1;
|
|
|
|
|
goto out;
|
|
|
|
|
} else if ((diff < -100 * 90)) {
|
|
|
|
|
if (filled > 2) {
|
|
|
|
|
err = CuvidMessage(3, "video: speed up video, droping frame %d\n", diff / 90);
|
|
|
|
|
CuvidMessage(3, "video: speed up video, droping frame %d\n", diff / 90);
|
|
|
|
|
++decoder->FramesDropped;
|
|
|
|
|
CuvidAdvanceDecoderFrame(decoder);
|
|
|
|
|
} else if ((diff < -100 * 90)) { // give it some time to get frames to drop
|
|
|
|
@@ -5279,7 +5300,7 @@ void VideoOsdDrawARGB(int xi, int yi, int width, int height, int pitch, const ui
|
|
|
|
|
}
|
|
|
|
|
Debug(3, "video: osd dirty %dx%d%+d%+d -> %dx%d%+d%+d\n", width, height, x, y, OsdDirtyWidth, OsdDirtyHeight,
|
|
|
|
|
OsdDirtyX, OsdDirtyY);
|
|
|
|
|
|
|
|
|
|
Debug(4," dummy print %d %d %d %s",xi,yi,pitch,argb);
|
|
|
|
|
VideoThreadUnlock();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -5583,7 +5604,7 @@ void pl_log_intern(void *stream, enum pl_log_level level, const char *msg) {
|
|
|
|
|
[PL_LOG_FATAL] = "fatal", [PL_LOG_ERR] = "error", [PL_LOG_WARN] = "warn",
|
|
|
|
|
[PL_LOG_INFO] = "info", [PL_LOG_DEBUG] = "debug", [PL_LOG_TRACE] = "trace",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
(void)stream;
|
|
|
|
|
printf("%5s: %s\n", prefix[level], msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -5693,7 +5714,8 @@ void InitPlacebo() {
|
|
|
|
|
if (!p->swapchain) {
|
|
|
|
|
Fatal(_("Failed creating vulkan swapchain!"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef VAAPI
|
|
|
|
|
if (!(p->gpu->import_caps.tex & PL_HANDLE_DMA_BUF)) {
|
|
|
|
|
p->has_dma_buf = 0;
|
|
|
|
|
Debug(3, "No support for dma_buf import \n");
|
|
|
|
@@ -5701,16 +5723,20 @@ void InitPlacebo() {
|
|
|
|
|
p->has_dma_buf = 1;
|
|
|
|
|
Debug(3, "dma_buf support available\n");
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
p->has_dma_buf = 0;
|
|
|
|
|
Debug(3, "No support for dma_buf import \n");
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef PLACEBO_GL
|
|
|
|
|
if (!pl_swapchain_resize(p->swapchain, &VideoWindowWidth, &VideoWindowHeight)) {
|
|
|
|
|
if (!pl_swapchain_resize(p->swapchain, (int *)&VideoWindowWidth, (int *)&VideoWindowHeight)) {
|
|
|
|
|
Fatal(_("libplacebo: failed initializing swapchain\n"));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#if PL_API_VER >= 113
|
|
|
|
|
// load LUT File
|
|
|
|
|
struct file lutf;
|
|
|
|
|
char tmp[200];
|
|
|
|
|
char tmp[400];
|
|
|
|
|
|
|
|
|
|
sprintf(tmp, "%s/%s", MyConfigDir, lut_file);
|
|
|
|
|
if (open_file(tmp, &lutf) && lutf.size) {
|
|
|
|
@@ -5816,10 +5842,9 @@ void exit_display() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void *VideoHandlerThread(void *dummy) {
|
|
|
|
|
#ifdef VAAPI
|
|
|
|
|
#if defined VAAPI && !defined PLACEBO_GL
|
|
|
|
|
EGLint contextAttrs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
|
|
|
|
|
#endif
|
|
|
|
|
int redSize, greenSize, blueSize, alphaSize;
|
|
|
|
|
|
|
|
|
|
prctl(PR_SET_NAME, "video display", 0, 0, 0);
|
|
|
|
|
|
|
|
|
@@ -6583,13 +6608,13 @@ int VideoSetShader(char *s) {
|
|
|
|
|
#if defined PLACEBO && PL_API_VER >= 58
|
|
|
|
|
if (num_shaders == NUM_SHADERS)
|
|
|
|
|
return -1;
|
|
|
|
|
p = malloc(strlen(s) + 1);
|
|
|
|
|
char *p = malloc(strlen(s) + 1);
|
|
|
|
|
memcpy(p, s, strlen(s) + 1);
|
|
|
|
|
shadersp[num_shaders++] = p;
|
|
|
|
|
CuvidMessage(2, "Use Shader %s\n", s);
|
|
|
|
|
return 0;
|
|
|
|
|
#else
|
|
|
|
|
printf("Shaders are only support with placebo\n");
|
|
|
|
|
printf("Shaders are only support with placebo (%s)\n",s);
|
|
|
|
|
return -1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
@@ -6905,7 +6930,8 @@ void VideoSetAbove() {
|
|
|
|
|
///
|
|
|
|
|
/// Set deinterlace mode.
|
|
|
|
|
///
|
|
|
|
|
void VideoSetDeinterlace(int mode[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetDeinterlace(int mode[]) {
|
|
|
|
|
|
|
|
|
|
#ifdef CUVID
|
|
|
|
|
VideoDeinterlace[0] = mode[0]; // 576i
|
|
|
|
|
VideoDeinterlace[1] = 0; // mode[1]; // 720p
|
|
|
|
@@ -6913,6 +6939,7 @@ void VideoSetDeinterlace(int mode[VideoResolutionMax]) {
|
|
|
|
|
VideoDeinterlace[3] = mode[3]; // 1080
|
|
|
|
|
VideoDeinterlace[4] = 0; // mode[4]; 2160p
|
|
|
|
|
#else
|
|
|
|
|
(void)mode;
|
|
|
|
|
VideoDeinterlace[0] = 1; // 576i
|
|
|
|
|
VideoDeinterlace[1] = 0; // mode[1]; // 720p
|
|
|
|
|
VideoDeinterlace[2] = 1; // fake 1080
|
|
|
|
@@ -6925,7 +6952,7 @@ void VideoSetDeinterlace(int mode[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// Set skip chroma deinterlace on/off.
|
|
|
|
|
///
|
|
|
|
|
void VideoSetSkipChromaDeinterlace(int onoff[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetSkipChromaDeinterlace(int onoff[]) {
|
|
|
|
|
VideoSkipChromaDeinterlace[0] = onoff[0];
|
|
|
|
|
VideoSkipChromaDeinterlace[1] = onoff[1];
|
|
|
|
|
VideoSkipChromaDeinterlace[2] = onoff[2];
|
|
|
|
@@ -6937,7 +6964,7 @@ void VideoSetSkipChromaDeinterlace(int onoff[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// Set inverse telecine on/off.
|
|
|
|
|
///
|
|
|
|
|
void VideoSetInverseTelecine(int onoff[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetInverseTelecine(int onoff[]) {
|
|
|
|
|
VideoInverseTelecine[0] = onoff[0];
|
|
|
|
|
VideoInverseTelecine[1] = onoff[1];
|
|
|
|
|
VideoInverseTelecine[2] = onoff[2];
|
|
|
|
@@ -6949,7 +6976,7 @@ void VideoSetInverseTelecine(int onoff[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// Set denoise level (0 .. 1000).
|
|
|
|
|
///
|
|
|
|
|
void VideoSetDenoise(int level[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetDenoise(int level[]) {
|
|
|
|
|
VideoDenoise[0] = level[0];
|
|
|
|
|
VideoDenoise[1] = level[1];
|
|
|
|
|
VideoDenoise[2] = level[2];
|
|
|
|
@@ -6961,7 +6988,7 @@ void VideoSetDenoise(int level[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// Set sharpness level (-1000 .. 1000).
|
|
|
|
|
///
|
|
|
|
|
void VideoSetSharpen(int level[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetSharpen(int level[]) {
|
|
|
|
|
VideoSharpen[0] = level[0];
|
|
|
|
|
VideoSharpen[1] = level[1];
|
|
|
|
|
VideoSharpen[2] = level[2];
|
|
|
|
@@ -6975,7 +7002,7 @@ void VideoSetSharpen(int level[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// @param mode table with VideoResolutionMax values
|
|
|
|
|
///
|
|
|
|
|
void VideoSetScaling(int mode[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetScaling(int mode[]) {
|
|
|
|
|
VideoScaling[0] = mode[0];
|
|
|
|
|
VideoScaling[1] = mode[1];
|
|
|
|
|
VideoScaling[2] = mode[2];
|
|
|
|
@@ -6989,7 +7016,7 @@ void VideoSetScaling(int mode[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// @param pixels table with VideoResolutionMax values
|
|
|
|
|
///
|
|
|
|
|
void VideoSetCutTopBottom(int pixels[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetCutTopBottom(int pixels[]) {
|
|
|
|
|
VideoCutTopBottom[0] = pixels[0];
|
|
|
|
|
VideoCutTopBottom[1] = pixels[1];
|
|
|
|
|
VideoCutTopBottom[2] = pixels[2];
|
|
|
|
@@ -7003,7 +7030,7 @@ void VideoSetCutTopBottom(int pixels[VideoResolutionMax]) {
|
|
|
|
|
///
|
|
|
|
|
/// @param pixels table with VideoResolutionMax values
|
|
|
|
|
///
|
|
|
|
|
void VideoSetCutLeftRight(int pixels[VideoResolutionMax]) {
|
|
|
|
|
void VideoSetCutLeftRight(int pixels[]) {
|
|
|
|
|
VideoCutLeftRight[0] = pixels[0];
|
|
|
|
|
VideoCutLeftRight[1] = pixels[1];
|
|
|
|
|
VideoCutLeftRight[2] = pixels[2];
|
|
|
|
|