mirror of
https://github.com/jojo61/vdr-plugin-softhdcuvid.git
synced 2023-10-10 13:37:41 +02:00
Support for libplacebo API Version 106
Support for LIBPLACEBO with opengl -> needs API >= 106
This commit is contained in:
parent
184cc1aa05
commit
a7471e8800
122
Makefile
122
Makefile
@ -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
|
||||
|
@ -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
283
video.c
@ -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, ¶ms);
|
||||
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user