mirror of
https://github.com/jojo61/vdr-plugin-softhdcuvid.git
synced 2023-10-10 13:37:41 +02:00
improve OSD with screenresize
This commit is contained in:
parent
97f53c8274
commit
1aa7c1a998
6
codec.c
6
codec.c
@ -302,6 +302,12 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id)
|
||||
if (!(decoder->VideoCtx = avcodec_alloc_context3(video_codec))) {
|
||||
Fatal(_("codec: can't allocate video codec context\n"));
|
||||
}
|
||||
if (!HwDeviceContext) {
|
||||
Fatal("codec: no hw device context to be used");
|
||||
}
|
||||
decoder->VideoCtx->hw_device_ctx = av_buffer_ref(HwDeviceContext);
|
||||
|
||||
|
||||
// FIXME: for software decoder use all cpus, otherwise 1
|
||||
decoder->VideoCtx->thread_count = 1;
|
||||
|
||||
|
10
codec.h
10
codec.h
@ -98,6 +98,16 @@ typedef struct _video_decoder_ VideoDecoder;
|
||||
/// Audio decoder typedef.
|
||||
typedef struct _audio_decoder_ AudioDecoder;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
/// x11 display name
|
||||
extern const char *X11DisplayName;
|
||||
|
||||
/// HW device context from video module
|
||||
extern AVBufferRef *HwDeviceContext;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -776,6 +776,7 @@ bool cOglCmdCopyBufferToOutputFb::Execute(void) {
|
||||
fb->Blit(x, y + fb->Height(), x + fb->Width(), y);
|
||||
oFb->Unbind();
|
||||
pthread_mutex_unlock(&OSDMutex);
|
||||
printf("osdput fb x %d y %d %dx%d oFb %dx%d\n",x,y,fb->Width(), fb->Height(),oFb->Width(), oFb->Height());
|
||||
ActivateOsd(oFb->texture,x, y ,fb->Width(), fb->Height());
|
||||
|
||||
return true;
|
||||
@ -1901,7 +1902,7 @@ cOglOsd::cOglOsd(int Left, int Top, uint Level, std::shared_ptr<cOglThread> oglT
|
||||
|
||||
dsyslog("[softhddev]cOglOsd osdLeft %d osdTop %d screenWidth %d screenHeight %d", Left, Top, osdWidth, osdHeight);
|
||||
|
||||
//create vdpau output framebuffer
|
||||
//create output framebuffer
|
||||
if (!oFb) {
|
||||
oFb = new cOglOutputFb(osdWidth, osdHeight);
|
||||
oglThread->DoCmd(new cOglCmdInitOutputFb(oFb));
|
||||
|
57
video.c
57
video.c
@ -321,7 +321,7 @@ typedef struct {
|
||||
//----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
AVBufferRef *HwDeviceContext; ///< ffmpeg HW device context
|
||||
char VideoIgnoreRepeatPict; ///< disable repeat pict warning
|
||||
|
||||
static const char *VideoDriverName="cuvid"; ///< video output device
|
||||
@ -462,7 +462,7 @@ static XVisualInfo *GlxVisualInfo; ///< our gl visual
|
||||
static GLuint OsdGlTextures[2]; ///< gl texture for OSD
|
||||
static int OsdIndex=0; ///< index into OsdGlTextures
|
||||
static void GlxSetupWindow(xcb_window_t window, int width, int height, GLXContext context);
|
||||
|
||||
GLXContext OSDcontext;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Common Functions
|
||||
@ -1194,25 +1194,25 @@ static void GlxInit(void)
|
||||
return;
|
||||
}
|
||||
if (!vi->visual) {
|
||||
Error(_("video/glx: no valid visual found\n"));
|
||||
Fatal(_("video/glx: no valid visual found\n"));
|
||||
GlxEnabled = 0;
|
||||
return;
|
||||
}
|
||||
if (vi->bits_per_rgb < 8) {
|
||||
Error(_("video/glx: need atleast 8-bits per RGB\n"));
|
||||
Fatal(_("video/glx: need atleast 8-bits per RGB\n"));
|
||||
GlxEnabled = 0;
|
||||
return;
|
||||
}
|
||||
context = glXCreateContext(XlibDisplay, vi, NULL, GL_TRUE);
|
||||
if (!context) {
|
||||
Error(_("video/glx: can't create glx context\n"));
|
||||
Fatal(_("video/glx: can't create glx context\n"));
|
||||
GlxEnabled = 0;
|
||||
return;
|
||||
}
|
||||
GlxSharedContext = context;
|
||||
context = glXCreateContext(XlibDisplay, vi, GlxSharedContext, GL_TRUE);
|
||||
if (!context) {
|
||||
Error(_("video/glx: can't create glx context\n"));
|
||||
Fatal(_("video/glx: can't create glx context\n"));
|
||||
GlxEnabled = 0;
|
||||
glXDestroyContext(XlibDisplay, GlxSharedContext);
|
||||
GlxSharedContext = 0;
|
||||
@ -1314,6 +1314,9 @@ static void GlxExit(void)
|
||||
}
|
||||
if (GlxThreadContext) {
|
||||
glXDestroyContext(XlibDisplay, GlxThreadContext);
|
||||
}
|
||||
if (OSDcontext) {
|
||||
glXDestroyContext(XlibDisplay, OSDcontext);
|
||||
}
|
||||
// FIXME: must free GlxVisualInfo
|
||||
}
|
||||
@ -1625,7 +1628,7 @@ GLuint gl_shader=0,gl_prog = 0,gl_fbo=0; // shader programm
|
||||
GLint gl_colormatrix,gl_colormatrix_c;
|
||||
GLuint OSDfb=0;
|
||||
GLuint OSDtexture;
|
||||
GLXContext OSDcontext;
|
||||
|
||||
int OSDx,OSDy,OSDxsize,OSDysize;
|
||||
|
||||
static struct timespec CuvidFrameTime; ///< time of last display
|
||||
@ -1866,9 +1869,14 @@ static CuvidDecoder *CuvidNewHwDecoder(VideoStream * stream)
|
||||
Debug(3,"Cuvid New HW Decoder\n");
|
||||
if ((unsigned)CuvidDecoderN >= sizeof(CuvidDecoders) / sizeof(*CuvidDecoders)) {
|
||||
Error(_("video/cuvid: out of decoders\n"));
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
if (av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA, X11DisplayName, NULL, 0)) {
|
||||
Fatal("codec: can't allocate HW video codec context");
|
||||
}
|
||||
HwDeviceContext = av_buffer_ref(hw_device_ctx);
|
||||
|
||||
if (!(decoder = calloc(1, sizeof(*decoder)))) {
|
||||
Error(_("video/cuvid: out of memory\n"));
|
||||
return NULL;
|
||||
@ -1894,15 +1902,8 @@ static CuvidDecoder *CuvidNewHwDecoder(VideoStream * stream)
|
||||
decoder->SurfacesRb[i] = -1;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
if (VIDEO_SURFACES_MAX < 1 + 1 + 1 + 1) {
|
||||
Error(_("video/cuvid: need 1 future, 1 current, 1 back and 1 work surface\n"));
|
||||
}
|
||||
#endif
|
||||
|
||||
decoder->OutputWidth = VideoWindowWidth;
|
||||
decoder->OutputHeight = VideoWindowHeight;
|
||||
|
||||
decoder->PixFmt = AV_PIX_FMT_NONE;
|
||||
|
||||
#ifdef USE_AUTOCROP
|
||||
@ -1915,7 +1916,6 @@ static CuvidDecoder *CuvidNewHwDecoder(VideoStream * stream)
|
||||
decoder->SyncOnAudio = 1;
|
||||
}
|
||||
decoder->Closing = -300 - 1;
|
||||
|
||||
decoder->PTS = AV_NOPTS_VALUE;
|
||||
|
||||
CuvidDecoders[CuvidDecoderN++] = decoder;
|
||||
@ -1968,7 +1968,7 @@ static void CuvidDelHwDecoder(CuvidDecoder * decoder)
|
||||
{
|
||||
int i,n;
|
||||
Debug(3,"cuvid del hw decoder cuda_ctx %p\n",decoder->cuda_ctx);
|
||||
//#if 0
|
||||
|
||||
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext);
|
||||
GlxCheck();
|
||||
if (decoder->SurfaceFreeN || decoder->SurfaceUsedN) {
|
||||
@ -2206,7 +2206,7 @@ static int cuvid_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static void cuvid_uninit(AVCodecContext *avctx)
|
||||
{
|
||||
VideoDecoder *ist = avctx->opaque;
|
||||
@ -2273,7 +2273,7 @@ static int init_cuvid(AVCodecContext *avctx,CuvidDecoder * decoder)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
///
|
||||
/// Callback to negotiate the PixelFormat.
|
||||
///
|
||||
@ -2334,10 +2334,12 @@ static enum AVPixelFormat Cuvid_get_format(CuvidDecoder * decoder,
|
||||
|
||||
if (*fmt_idx == AV_PIX_FMT_CUDA ) { // HWACCEL used
|
||||
CuvidCleanup(decoder);
|
||||
if (init_cuvid(video_ctx,decoder)) {
|
||||
#if 0
|
||||
if (init_cuvid(video_ctx,decoder)) {
|
||||
Fatal(_("CUVID Init failed\n"));
|
||||
}
|
||||
CuvidMessage(2,"CUVID Init ok %dx%d\n",video_ctx->width,video_ctx->height);
|
||||
#endif
|
||||
CuvidMessage(2,"no CUVID Init ok %dx%d\n",video_ctx->width,video_ctx->height);
|
||||
ist->active_hwaccel_id = HWACCEL_CUVID;
|
||||
ist->hwaccel_pix_fmt = AV_PIX_FMT_CUDA;
|
||||
decoder->InputWidth = video_ctx->width;
|
||||
@ -3135,7 +3137,13 @@ static void CuvidDisplayFrame(void)
|
||||
GlxRenderTexture(OsdGlTextures[OsdIndex], 0,0, VideoWindowWidth, VideoWindowHeight);
|
||||
#else
|
||||
pthread_mutex_lock(&OSDMutex);
|
||||
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext );
|
||||
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext );
|
||||
glViewport(0, 0, VideoWindowWidth, VideoWindowHeight);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0.0, VideoWindowWidth, VideoWindowHeight, 0.0, -1.0, 1.0);
|
||||
GlxCheck();
|
||||
// printf("osd %d %dx%d\n",OSDtexture,VideoWindowWidth, VideoWindowHeight);
|
||||
GlxRenderTexture(OSDtexture, 0,0, VideoWindowWidth, VideoWindowHeight);
|
||||
pthread_mutex_unlock(&OSDMutex);
|
||||
#endif
|
||||
@ -5486,7 +5494,7 @@ void VideoInit(const char *display_name)
|
||||
VideoWindowHeight = screen->height_in_pixels;
|
||||
VideoWindowWidth = screen->width_in_pixels;
|
||||
//***********************************************************************************************
|
||||
#if DEBUG
|
||||
#if DEBUG_no
|
||||
if (strcmp(":0.0",display_name) == 0) {
|
||||
VideoWindowHeight = 1080;
|
||||
VideoWindowWidth = 1920;
|
||||
@ -5638,6 +5646,7 @@ int GlxInitopengl() {
|
||||
sleep(1); // wait until Init from video thread is ready
|
||||
// printf("GlxConext %p\n",GlxSharedContext);
|
||||
}
|
||||
glXMakeCurrent(XlibDisplay, None, NULL);
|
||||
OSDcontext = glXCreateContext(XlibDisplay, GlxVisualInfo, GlxSharedContext,GL_TRUE);
|
||||
if (!OSDcontext) {
|
||||
Debug(3,"video/osd: can't create glx context\n");
|
||||
|
Loading…
Reference in New Issue
Block a user