Support for libplacebo API Version 106

Support for LIBPLACEBO with opengl -> needs API >= 106
This commit is contained in:
jojo61 2021-01-10 13:55:09 +01:00
parent 184cc1aa05
commit a7471e8800
3 changed files with 293 additions and 114 deletions

122
Makefile
View File

@ -1,6 +1,6 @@
#
# Makefile for a Video Disk Recorder plugin
#
#
# $Id: 2a41981a57e5e83036463c6a08c84b86ed9d2be3 $
# The official name of this plugin.
@ -9,9 +9,9 @@
### Configuration (edit this for your needs)
# config as needed
# comment out if not needed
# what kind of decoder do we make -
# what kind of decoder do we make -
# if VAAPI is enabled the pluginname is softhdvaapi
# if CUVID is enabled the pluginname is softhdcuvid
# if DRM is enabled the pluginname is softhddrm
@ -19,22 +19,30 @@ VAAPI ?= 0
CUVID ?= 0
# if you enable DRM then the plugin will only run without X server
# only valid for VAAPI
# does not work with libplacebo
# only valid for VAAPI
DRM ?= 0
# use libplacebo - available for both decoders but not for DRM
# use libplacebo -
# available for all decoders but for DRM you need LIBPLACEBO_GL
LIBPLACEBO ?= 1
LIBPLACEBO_GL ?= 0
# use YADIF deint - only available with cuvid
#YADIF=1
# use gamma correction
#GAMMA ?= 0
CONFIG := #-DDEBUG # remove # to enable debug output
#--------------------- no more config needed past this point--------------------------------
# sanitize selections --------
@ -70,6 +78,8 @@ endif # MAKECMDGOALS!=indent
endif # MAKECMDGOALS!=clean
#--------------------------
PLUGIN = softhdcuvid
# support OPENGLOSD always needed
@ -126,7 +136,7 @@ TMPDIR ?= /tmp
### The compiler options:
export CFLAGS = $(call PKGCFG,cflags)
export CFLAGS = $(call PKGCFG,cflags)
export CXXFLAGS = $(call PKGCFG,cxxflags)
ifeq ($(CFLAGS),)
@ -146,33 +156,7 @@ APIVERSION = $(call PKGCFG,apiversion)
### Parse config
ifeq ($(VAAPI),1)
CONFIG += -DVAAPI
#LIBPLACEBO=1
PLUGIN = softhdvaapi
LIBS += -lEGL
endif
ifeq ($(DRM),1)
PLUGIN = softhddrm
CONFIG += -DUSE_DRM -DVAAPI
LIBPLACEBO=0
_CFLAGS += $(shell pkg-config --cflags libdrm)
LIBS += -lgbm -ldrm
LIBS += -lEGL
endif
ifeq ($(CUVID),1)
CONFIG += -DUSE_PIP # PIP support
CONFIG += -DCUVID # enable CUVID decoder
LIBS += -lEGL -lGL
ifeq ($(YADIF),1)
CONFIG += -DYADIF # Yadif only with CUVID
endif
endif
### Parse softhddevice config
ifeq ($(ALSA),1)
CONFIG += -DUSE_ALSA
@ -201,8 +185,45 @@ _CFLAGS += $(shell pkg-config --cflags freetype2)
LIBS += $(shell pkg-config --libs freetype2)
endif
ifeq ($(VAAPI),1)
CONFIG += -DVAAPI
#LIBPLACEBO=1
PLUGIN = softhdvaapi
endif
ifeq ($(LIBPLACEBO_GL),1)
CONFIG += -DPLACEBO_GL -DPLACEBO
LIBS += -lepoxy
LIBS += -lplacebo
else
LIBS += -lEGL
endif
ifeq ($(LIBPLACEBO),1)
CONFIG += -DPLACEBO
LIBS += -lEGL
LIBS += -lplacebo
endif
ifeq ($(DRM),1)
PLUGIN = softhddrm
CONFIG += -DUSE_DRM -DVAAPI
_CFLAGS += $(shell pkg-config --cflags libdrm)
LIBS += -lgbm -ldrm -lEGL
endif
ifeq ($(CUVID),1)
CONFIG += -DUSE_PIP # PIP support
CONFIG += -DCUVID # enable CUVID decoder
LIBS += -lEGL -lGL
ifeq ($(YADIF),1)
CONFIG += -DYADIF # Yadif only with CUVID
endif
endif
ifeq ($(GAMMA),1)
CONFIG += -DGAMMA
endif
@ -215,7 +236,7 @@ SOFILE = libvdr-$(PLUGIN).so
#
# Test that libswresample is available
# Test that libswresample is available
#
#ifneq (exists, $(shell pkg-config libswresample && echo exists))
# $(warning ******************************************************************)
@ -224,7 +245,7 @@ SOFILE = libvdr-$(PLUGIN).so
#endif
#
# Test and set config for libavutil
# Test and set config for libavutil
#
ifneq (exists, $(shell pkg-config libavutil && echo exists))
$(warning ******************************************************************)
@ -235,7 +256,7 @@ _CFLAGS += $(shell pkg-config --cflags libavutil)
LIBS += $(shell pkg-config --libs libavutil)
#
# Test and set config for libswscale
# Test and set config for libswscale
#
ifneq (exists, $(shell pkg-config libswscale && echo exists))
$(warning ******************************************************************)
@ -278,19 +299,19 @@ endif
_CFLAGS += $(shell pkg-config --cflags x11 x11-xcb xcb xcb-icccm)
LIBS += -lrt $(shell pkg-config --libs x11 x11-xcb xcb xcb-icccm)
#_CFLAGS += -I/usr/local/cuda/include
_CFLAGS += -I./opengl -I./
LIBS += -L/usr/lib64
LIBS += -L/usr/local/cuda/lib64
ifeq ($(LIBPLACEBO),1)
LIBS += -lplacebo
endif
ifeq ($(CUVID),1)
LIBS += -lcuda -lnvcuvid
#LIBS += -lcuda -L/usr/local/cuda/targets/x86_64-linux/lib -lcudart -lnvcuvid
LIBS += -lcuda -lnvcuvid
endif
LIBS += -lGLEW -lGLU -ldl -lglut
LIBS += -lGLEW -lGLU -ldl -lglut
### Includes and Defines (add further entries here):
INCLUDES +=
@ -301,16 +322,21 @@ DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' -D_GNU_SOURCE $(CONFIG) \
### Make it standard
override CXXFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \
-g -W -Wextra -Winit-self -Werror=overloaded-virtual -Wno-unused-parameter
-g -W -Wextra -Winit-self -Werror=overloaded-virtual -Wno-unused-parameter
override CFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \
-g -W -Wextra -Winit-self -Wdeclaration-after-statement
### The object files (add further files here):
OBJS = softhdcuvid.o softhddev.o video.o audio.o codec.o ringbuffer.o
ifeq ($(OPENGLOSD),1)
OBJS += openglosd.o
OBJS = softhdcuvid.o softhddev.o video.o audio.o codec.o ringbuffer.o openglosd.o
ifeq ($(GAMMA),1)
OBJS += colorramp.o
ifeq ($(DRM),1)
OBJS += gamma-drm.o
else
OBJS += gamma-vidmode.o
endif
endif
SRCS = $(wildcard $(OBJS:.o=.c)) *.cpp
@ -387,7 +413,9 @@ HDRS= $(wildcard *.h)
indent:
for i in $(SRCS) $(HDRS); do \
VERSION_CONTROL=none indent $$i; \
indent $$i; \
unexpand -a $$i | sed -e s/constconst/const/ > $$i.up; \
mv $$i.up $$i; \
done
video_test: video.c Makefile

View File

@ -61,7 +61,7 @@ extern "C"
/// vdr-plugin version number.
/// Makefile extracts the version number for generating the file name
/// for the distribution archive.
static const char *const VERSION = "3.2.4"
static const char *const VERSION = "3.3"
#ifdef GIT_REV
"-GIT" GIT_REV
#endif

283
video.c
View File

@ -38,8 +38,6 @@
/// @todo FIXME: use vaErrorStr for all VA-API errors.
///
//#define PLACEBO_GL
#define USE_XLIB_XCB ///< use xlib/xcb backend
#define noUSE_SCREENSAVER ///< support disable screensaver
@ -131,7 +129,11 @@ typedef enum
#endif
#ifdef USE_GLX
#ifndef PLACEBO_GL
#include <GL/glew.h>
#else
#include <epoxy/egl.h>
#endif
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/freeglut_ext.h>
@ -165,8 +167,11 @@ typedef enum
#include <assert.h>
// #define EGL_EGLEXT_PROTOTYPES
#if !defined PLACEBO_GL
#include <EGL/egl.h>
#include <EGL/eglext.h>
#endif
#ifndef GL_OES_EGL_image
typedef void *GLeglImageOES;
#endif
@ -690,8 +695,8 @@ static void VideoUpdateOutput(AVRational input_aspect_ratio, int input_width, in
// input not initialized yet, return immediately
if (!input_aspect_ratio.num || !input_aspect_ratio.den) {
output_width = video_width;
output_height = video_height;
*output_width = video_width;
*output_height = video_height;
return;
}
#ifdef USE_DRM
@ -820,6 +825,36 @@ static uint64_t test_time = 0;
}
// printf("Video Locked for %d\n",(GetusTicks()-test_time)/1000);
#ifdef PLACEBO_GL
#define Lock_and_SharedContext\
{\
VideoThreadLock();\
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, eglSharedContext);\
EglCheck();\
}
#define Unlock_and_NoContext {\
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);\
EglCheck();\
VideoThreadUnlock();\
}
#define SharedContext\
{\
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, eglSharedContext);\
EglCheck();\
}
#define NoContext {\
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);\
EglCheck();\
}
#else
#ifdef PLACEBO
#define Lock_and_SharedContext {VideoThreadLock();}
#define Unlock_and_NoContext {VideoThreadUnlock();}
#define SharedContext {}
#define NoContext {}
#endif
#endif
//----------------------------------------------------------------------------
// GLX
//----------------------------------------------------------------------------
@ -1127,23 +1162,23 @@ static void EglInit(void)
int redSize, greenSize, blueSize, alphaSize;
static int glewdone = 0;
#ifdef PLACEBO
#if defined PLACEBO && !defined PLACEBO_GL
return;
#endif
EGLContext context;
// create egl context
setenv("MESA_GL_VERSION_OVERRIDE", "3.3", 0);
setenv("V3D_DOUBLE_BUFFER", "1", 0);
// setenv("MESA_GL_VERSION_OVERRIDE", "3.3", 0);
// setenv("V3D_DOUBLE_BUFFER", "1", 0);
make_egl();
if (!glewdone) {
GLenum err = glewInit();
glewdone = 1;
if (err != GLEW_OK) {
Debug(3, "Error: %s\n", glewGetErrorString(err));
}
// if (err != GLEW_OK) {
// Debug(3, "Error: %s\n", glewGetErrorString(err));
// }
}
eglGetConfigAttrib(eglDisplay, eglConfig, EGL_BLUE_SIZE, &blueSize);
@ -1155,6 +1190,7 @@ static void EglInit(void)
eglSharedContext = eglContext;
context = eglCreateContext(eglDisplay, eglConfig, eglSharedContext, eglAttrs);
EglCheck();
if (!context) {
Fatal(_("video/egl: can't create egl context\n"));
@ -1169,7 +1205,7 @@ static void EglInit(void)
static void EglExit(void)
{
Debug(3, "video/egl: %s\n", __FUNCTION__);
#if defined PLACEBO
#if defined PLACEBO && !defined PLACEBO_GL
return;
#endif
@ -1577,20 +1613,26 @@ static void CuvidDestroySurfaces(CuvidDecoder * decoder)
close(decoder->pl_images[i].planes[j].texture->params.shared_mem.handle.fd);
}
#endif
SharedContext;
pl_tex_destroy(p->gpu, &decoder->pl_images[i].planes[j].texture);
NoContext;
}
#else
#ifdef CUVID
checkCudaErrors(cu->cuGraphicsUnregisterResource(decoder->cu_res[i][j]));
#endif
#ifdef VAAPI
if (decoder->images[i * Planes + j]) {
DestroyImageKHR(eglGetCurrentDisplay(), decoder->images[i * Planes + j]);
if (decoder->fds[i * Planes + j])
close(decoder->fds[i * Planes + j]);
}
decoder->fds[i * Planes + j] = 0;
decoder->images[i * Planes + j] = 0;
#ifdef PLACEBO
if (p->hasdma_buf) {
#endif
if (decoder->images[i * Planes + j]) {
DestroyImageKHR(eglGetCurrentDisplay(), decoder->images[i * Planes + j]);
if (decoder->fds[i * Planes + j])
close(decoder->fds[i * Planes + j]);
}
decoder->fds[i * Planes + j] = 0;
decoder->images[i * Planes + j] = 0;
#ifdef PLACEBO
}
#endif
#endif
}
@ -1671,6 +1713,7 @@ static void CuvidReleaseSurface(CuvidDecoder * decoder, int surface)
av_frame_free(&decoder->frames[surface]);
}
#ifdef PLACEBO
SharedContext;
if (p->has_dma_buf) {
if (decoder->pl_images[surface].planes[0].texture) {
if (decoder->pl_images[surface].planes[0].texture->params.shared_mem.handle.fd) {
@ -1685,6 +1728,7 @@ static void CuvidReleaseSurface(CuvidDecoder * decoder, int surface)
pl_tex_destroy(p->gpu, &decoder->pl_images[surface].planes[1].texture);
}
}
NoContext;
#else
#ifdef VAAPI
if (decoder->images[surface * Planes]) {
@ -1768,9 +1812,10 @@ static const struct mp_egl_config_attr mp_egl_attribs[] = {
};
const int mpgl_preferred_gl_versions[] = {
// 440,
// 430,
// 400,
460,
440,
430,
400,
330,
320,
310,
@ -1807,12 +1852,12 @@ static bool create_context_cb(EGLDisplay display, int es_version, EGLContext * o
Fatal(_("Wrong ES version \n"));;
}
Debug(3, "Trying to create %s context.\n", name);
if (!eglBindAPI(api)) {
Fatal(_(" Could not bind API!\n"));
}
Debug(3, "Trying to create %s context \n", name);
EGLint attributes8[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 8,
@ -1854,6 +1899,7 @@ static bool create_context_cb(EGLDisplay display, int es_version, EGLContext * o
num_configs = 0;
}
}
EGLConfig *configs = malloc(sizeof(EGLConfig) * num_configs);
if (!eglChooseConfig(display, attribs, configs, num_configs, &num_configs))
@ -2221,6 +2267,7 @@ void createTextureDst(CuvidDecoder * decoder, int anz, unsigned int size_x, unsi
struct pl_image *img;
struct pl_plane *pl;
SharedContext;
// printf("Create textures and planes %d %d\n",size_x,size_y);
Debug(3, "video/vulkan: create %d Textures Format %s w %d h %d \n", anz,
PixFmt == AV_PIX_FMT_NV12 ? "NV12" : "P010", size_x, size_y);
@ -2257,9 +2304,12 @@ void createTextureDst(CuvidDecoder * decoder, int anz, unsigned int size_x, unsi
.format = fmt,
.sampleable = true,
.host_writable = true,
.blit_dst = true,
.sample_mode = PL_TEX_SAMPLE_LINEAR,
.address_mode = PL_TEX_ADDRESS_CLAMP,
#if !defined PLACEBO_GL
.export_handle = PL_HANDLE_FD,
#endif
});
}
@ -2325,7 +2375,7 @@ void createTextureDst(CuvidDecoder * decoder, int anz, unsigned int size_x, unsi
img->height = size_y;
img->num_overlays = 0;
}
NoContext;
}
#ifdef VAAPI
@ -2348,13 +2398,13 @@ void generateVAAPIImage(CuvidDecoder * decoder, int index, const AVFrame * frame
return;
}
vaSyncSurface(decoder->VaDisplay, (unsigned int)frame->data[3]);
VideoThreadLock();
Lock_and_SharedContext;
for (n = 0; n < 2; n++) { // Set DMA_BUF from VAAPI decoder to Textures
int id = desc.layers[n].object_index[0];
int fd = desc.objects[id].fd;
uint32_t size = desc.objects[id].size;
uint32_t offset = desc.layers[n].offset[0];
const struct pl_fmt *fmt;
struct pl_fmt *fmt;
if (fd == -1) {
printf("Fehler beim Import von Surface %d\n", index);
@ -2366,15 +2416,21 @@ void generateVAAPIImage(CuvidDecoder * decoder, int index, const AVFrame * frame
} else {
fmt = pl_find_named_fmt(p->gpu, n == 0 ? "r16" : "rg16"); // 10 Bit YUV
}
#ifdef PLACEBO_GL
fmt->fourcc = desc.layers[n].drm_format;
#endif
struct pl_tex_params tex_params = {
.w = n == 0 ? image_width : image_width / 2,
.w = n == 0 ? image_width : image_width / 2,
.h = n == 0 ? image_height : image_height / 2,
.d = 0,
.format = fmt,
.sampleable = true,
.host_writable = false,
.address_mode = PL_TEX_ADDRESS_CLAMP,
.blit_dst = true,
.renderable = true,
.address_mode = PL_TEX_ADDRESS_CLAMP ,
.sample_mode = PL_TEX_SAMPLE_LINEAR,
.import_handle = PL_HANDLE_DMA_BUF,
.shared_mem = (struct pl_shared_mem) {
@ -2383,6 +2439,9 @@ void generateVAAPIImage(CuvidDecoder * decoder, int index, const AVFrame * frame
},
.size = size,
.offset = offset,
#ifdef PLACEBO_GL
.stride_w = desc.layers[n].pitch[0],
#endif
#if PL_API_VER > 87
.drm_format_mod = DRM_FORMAT_MOD_INVALID,
#endif
@ -2395,10 +2454,11 @@ void generateVAAPIImage(CuvidDecoder * decoder, int index, const AVFrame * frame
pl_tex_destroy(p->gpu, &decoder->pl_images[index].planes[n].texture);
}
decoder->pl_images[index].planes[n].texture = pl_tex_create(p->gpu, &tex_params);
}
VideoThreadUnlock();
decoder->pl_images[index].planes[n].texture = pl_tex_create(p->gpu, &tex_params);
}
Unlock_and_NoContext;
}
#endif
@ -3116,14 +3176,22 @@ int get_RGB(CuvidDecoder * decoder)
.format = fmt,
.sampleable = true,
.renderable = true,
.blit_dst = true,
.host_readable = true,
.sample_mode = PL_TEX_SAMPLE_LINEAR,
.address_mode = PL_TEX_ADDRESS_CLAMP,
});
#if PL_API_VER >= 100
target.crop.x0 = (float)decoder->OutputX * faktorx;
target.crop.y0 = (float)decoder->OutputY * faktory;
target.crop.x1 = (float)(decoder->OutputX + decoder->OutputWidth) * faktorx;
target.crop.y1 = (float)(decoder->OutputY + decoder->OutputHeight) * faktory;
#else
target.dst_rect.x0 = (float)decoder->OutputX * faktorx;
target.dst_rect.y0 = (float)decoder->OutputY * faktory;
target.dst_rect.x1 = (float)(decoder->OutputX + decoder->OutputWidth) * faktorx;
target.dst_rect.y1 = (float)(decoder->OutputY + decoder->OutputHeight) * faktory;
#endif
target.repr.sys = PL_COLOR_SYSTEM_RGB;
target.repr.levels = PL_COLOR_LEVELS_PC;
target.repr.alpha = PL_ALPHA_UNKNOWN;
@ -3786,35 +3854,76 @@ static void CuvidMixVideo(CuvidDecoder * decoder, __attribute__((unused))
break;
}
// Source crop
if (VideoScalerTest) { // right side defnied scaler
// pl_tex_clear(p->gpu,target->fbo,(float[4]){0}); // clear frame
if (VideoScalerTest) { // right side defined scaler
#if PL_API_VER >= 100
//Input crop
img->crop.x0 = video_src_rect.x1 / 2 + 1;
img->crop.y0 = video_src_rect.y0;
img->crop.x1 = video_src_rect.x1;
img->crop.y1 = video_src_rect.y1;
// Output scale
#ifdef PLACEBO_GL
target->crop.x0 = dst_video_rect.x1 / 2 + dst_video_rect.x0 / 2 + 1;
target->crop.y1 = dst_video_rect.y0;
target->crop.x1 = dst_video_rect.x1;
target->crop.y0 = dst_video_rect.y1;
#else
target->crop.x0 = dst_video_rect.x1 / 2 + dst_video_rect.x0 / 2 + 1;
target->crop.y0 = dst_video_rect.y0;
target->crop.x1 = dst_video_rect.x1;
target->crop.y1 = dst_video_rect.y1;
#endif
#else
// Input crop
img->src_rect.x0 = video_src_rect.x1 / 2 + 1;
img->src_rect.y0 = video_src_rect.y0;
img->src_rect.x1 = video_src_rect.x1;
img->src_rect.y1 = video_src_rect.y1;
// Video aspect ratio
// Output Scale
target->dst_rect.x0 = dst_video_rect.x1 / 2 + dst_video_rect.x0 / 2 + 1;
target->dst_rect.y0 = dst_video_rect.y0;
target->dst_rect.x1 = dst_video_rect.x1;
target->dst_rect.y1 = dst_video_rect.y1;
#endif
} else {
#if PL_API_VER >= 100
img->crop.x0 = video_src_rect.x0;
img->crop.y0 = video_src_rect.y0;
img->crop.x1 = video_src_rect.x1;
img->crop.y1 = video_src_rect.y1;
#ifdef PLACEBO_GL
target->crop.x0 = dst_video_rect.x0;
target->crop.y1 = dst_video_rect.y0;
target->crop.x1 = dst_video_rect.x1;
target->crop.y0 = dst_video_rect.y1;
#else
target->crop.x0 = dst_video_rect.x0;
target->crop.y0 = dst_video_rect.y0;
target->crop.x1 = dst_video_rect.x1;
target->crop.y1 = dst_video_rect.y1;
#endif
#else
img->src_rect.x0 = video_src_rect.x0;
img->src_rect.y0 = video_src_rect.y0;
img->src_rect.x1 = video_src_rect.x1;
img->src_rect.y1 = video_src_rect.y1;
// Video aspect ratio
target->dst_rect.x0 = dst_video_rect.x0;
target->dst_rect.y0 = dst_video_rect.y0;
target->dst_rect.x1 = dst_video_rect.x1;
target->dst_rect.y1 = dst_video_rect.y1;
target->dst_rect.y1 = dst_video_rect.y1;
#endif
}
if (level == 0)
pl_tex_clear(p->gpu, target->fbo, (float[4]) { 0 }
);
#if PL_API_VER < 100
if (level == 0)
pl_tex_clear(p->gpu, target->fbo, (float[4]) { 0 });
#else
if (!level && pl_frame_is_cropped(target))
pl_frame_clear(p->gpu, target, (float[3]) {0} );
#endif
if (VideoColorBlindness) {
switch (VideoColorBlindness) {
case 1:
@ -3881,10 +3990,12 @@ static void CuvidMixVideo(CuvidDecoder * decoder, __attribute__((unused))
}
}
render_params.hooks = &p->hook;
if (ovl)
render_params.num_hooks = 0; // no shaders when OSD activ
else
if (ovl || (video_src_rect.x1 > dst_video_rect.x1) || (video_src_rect.y1 > dst_video_rect.y1) ) {
render_params.num_hooks = 0; // no user shaders when OSD activ or downward scaling
}
else {
render_params.num_hooks = p->num_shaders;
}
#endif
if (decoder->newchannel && current == 0) {
@ -3900,10 +4011,29 @@ static void CuvidMixVideo(CuvidDecoder * decoder, __attribute__((unused))
decoder->newchannel = 0;
if (!pl_render_image(p->renderer, &decoder->pl_images[current], target, &render_params)) {
Debug(3, "Failed rendering frame!\n");
Debug(4, "Failed rendering frame!\n");
}
if (VideoScalerTest) { // left side test scaler
#if PL_API_VER >= 100
// Source crop
img->crop.x0 = video_src_rect.x0;
img->crop.y0 = video_src_rect.y0;
img->crop.x1 = video_src_rect.x1 / 2;
img->crop.y1 = video_src_rect.y1;
#ifdef PLACEBO_GL
target->crop.x0 = dst_video_rect.x0;
target->crop.y1 = dst_video_rect.y0;
target->crop.x1 = dst_video_rect.x1 / 2 + dst_video_rect.x0 / 2;
target->crop.y0 = dst_video_rect.y1;
#else
// Video aspect ratio
target->crop.x0 = dst_video_rect.x0;
target->crop.y0 = dst_video_rect.y0;
target->crop.x1 = dst_video_rect.x1 / 2 + dst_video_rect.x0 / 2;
target->crop.y1 = dst_video_rect.y1;
#endif
#else
// Source crop
img->src_rect.x0 = video_src_rect.x0;
img->src_rect.y0 = video_src_rect.y0;
@ -3915,6 +4045,7 @@ static void CuvidMixVideo(CuvidDecoder * decoder, __attribute__((unused))
target->dst_rect.y0 = dst_video_rect.y0;
target->dst_rect.x1 = dst_video_rect.x1 / 2 + dst_video_rect.x0 / 2;
target->dst_rect.y1 = dst_video_rect.y1;
#endif
render_params.upscaler = pl_named_filters[VideoScalerTest - 1].filter;
render_params.downscaler = pl_named_filters[VideoScalerTest - 1].filter;
@ -3922,7 +4053,7 @@ static void CuvidMixVideo(CuvidDecoder * decoder, __attribute__((unused))
p->renderertest = pl_renderer_create(p->ctx, p->gpu);
if (!pl_render_image(p->renderertest, &decoder->pl_images[current], target, &render_params)) {
Debug(3, "Failed rendering frame!\n");
Debug(4, "Failed rendering frame!\n");
}
} else if (p->renderertest) {
pl_renderer_destroy(&p->renderertest);
@ -3978,11 +4109,18 @@ void make_osd_overlay(int x, int y, int width, int height)
pl->repr.alpha = PL_ALPHA_INDEPENDENT;
memcpy(&osdoverlay.color, &pl_color_space_srgb, sizeof(struct pl_color_space));
#ifdef PLACEBO_GL
pl->rect.x0 = x;
pl->rect.y1 = VideoWindowHeight - y ; // Boden von oben
pl->rect.x1 = x + width;
pl->rect.y0 = VideoWindowHeight - height - y;
#else
pl->rect.x0 = x;
pl->rect.y0 = VideoWindowHeight - y + offset; // Boden von oben
pl->rect.x1 = x + width;
pl->rect.y1 = VideoWindowHeight - height - y + offset;
#endif
}
#endif
///
@ -4093,8 +4231,9 @@ static void CuvidDisplayFrame(void)
#ifdef VAAPI
VideoThreadLock();
#endif
pl_render_target_from_swapchain(&target, &frame); // make target frame
if (VideoSurfaceModesChanged) {
pl_renderer_destroy(&p->renderer);
p->renderer = pl_renderer_create(p->ctx, p->gpu);
@ -4260,17 +4399,15 @@ static void CuvidDisplayFrame(void)
glActiveTexture(GL_TEXTURE0);
// eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglThreadContext);
}
#endif
#ifdef PLACEBO
//#ifdef VAAPI
#if defined PLACEBO // && !defined PLACEBO_GL
// first_time = GetusTicks();
if (!pl_swapchain_submit_frame(p->swapchain))
Fatal(_("Failed to submit swapchain buffer\n"));
pl_swapchain_swap_buffers(p->swapchain); // swap buffers
//#endif
NoContext;
VideoThreadUnlock();
#else // not PLACEBO
#ifdef CUVID
@ -4297,17 +4434,11 @@ static void CuvidDisplayFrame(void)
#ifdef PLACEBO_GL
CuvidSwapBuffer() {
#ifdef CUVID
glXGetVideoSyncSGI(&Count); // get current frame
glXSwapBuffers(XlibDisplay, VideoWindow);
glXMakeCurrent(XlibDisplay, None, NULL);
#else
#ifndef USE_DRM
eglSwapBuffers(eglDisplay, eglSurface);
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
// eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
#else
drm_swap_buffers();
#endif
#endif
}
#endif
@ -5338,16 +5469,27 @@ void InitPlacebo()
}
#ifdef PLACEBO_GL
// eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, eglSharedContext);
struct pl_opengl_params params = pl_opengl_default_params;
params.egl_display = eglDisplay;
params.egl_context = eglContext;
p->gl = pl_opengl_create(p->ctx, &params);
if (!p->gl)
Fatal(_("Failed to create placebo opengl \n"));
p->swapchain = pl_opengl_create_swapchain(p->gl, &(struct pl_opengl_swapchain_params) {
.swap_buffers = (void (*)(void *)) CuvidSwapBuffer,
.priv = NULL,
.framebuffer.flipped = true,
.framebuffer.id = 0,
.max_swapchain_depth = 2,
.priv = VideoWindow,
});
p->gpu = p->gl->gpu;
#else
struct pl_vulkan_params params;
struct pl_vk_inst_params iparams = pl_vk_inst_default_params;
@ -5514,11 +5656,13 @@ void exit_display()
static void *VideoHandlerThread(void *dummy)
{
EGLint contextAttrs[] = {
#ifdef VAAPI
EGLint contextAttrs[] = {
EGL_CONTEXT_CLIENT_VERSION, 3,
EGL_NONE
};
#endif
int redSize, greenSize, blueSize, alphaSize;
prctl(PR_SET_NAME, "video display", 0, 0, 0);
#ifdef GAMMA
@ -5534,7 +5678,14 @@ static void *VideoHandlerThread(void *dummy)
}
#endif
#if (defined VAAPI && !defined PLACEBO) || (defined VAAPI && defined PLACEBO_GL)
#ifdef PLACEBO_GL
if (!eglBindAPI(EGL_OPENGL_API)) {
Fatal(_(" Could not bind API!\n"));
}
eglThreadContext = eglCreateContext(eglDisplay, eglConfig, eglSharedContext, eglAttrs);
#else
eglThreadContext = eglCreateContext(eglDisplay, eglConfig, eglSharedContext, contextAttrs);
#endif
if (!eglThreadContext) {
EglCheck();
Fatal(_("video/egl: can't create thread egl context\n"));
@ -7017,7 +7168,7 @@ void VideoInit(const char *display_name)
//xcb_prefetch_maximum_request_length(Connection);
xcb_flush(Connection);
#endif
#ifdef PLACEBO_
#ifdef PLACEBO_NOT
InitPlacebo();
#endif