enable surfaces for SD and GRAB with OSD
This commit is contained in:
parent
15c04b8837
commit
cc1f3a987c
4
codec.c
4
codec.c
|
@ -326,8 +326,8 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id)
|
||||||
pthread_mutex_unlock(&CodecLockMutex);
|
pthread_mutex_unlock(&CodecLockMutex);
|
||||||
Fatal(_("codec: can't set option deint to video codec!\n"));
|
Fatal(_("codec: can't set option deint to video codec!\n"));
|
||||||
}
|
}
|
||||||
#if 0
|
#if 1
|
||||||
if (av_opt_set_int(decoder->VideoCtx->priv_data, "surfaces", 7 ,0) < 0) {
|
if (av_opt_set_int(decoder->VideoCtx->priv_data, "surfaces", 9 ,0) < 0) {
|
||||||
pthread_mutex_unlock(&CodecLockMutex);
|
pthread_mutex_unlock(&CodecLockMutex);
|
||||||
Fatal(_("codec: can't set option surfces to video codec!\n"));
|
Fatal(_("codec: can't set option surfces to video codec!\n"));
|
||||||
}
|
}
|
||||||
|
|
53
video.c
53
video.c
|
@ -279,7 +279,7 @@ typedef struct _video_module_
|
||||||
void (*const SetClosing) (const VideoHwDecoder *);
|
void (*const SetClosing) (const VideoHwDecoder *);
|
||||||
void (*const ResetStart) (const VideoHwDecoder *);
|
void (*const ResetStart) (const VideoHwDecoder *);
|
||||||
void (*const SetTrickSpeed) (const VideoHwDecoder *, int);
|
void (*const SetTrickSpeed) (const VideoHwDecoder *, int);
|
||||||
uint8_t *(*const GrabOutput)(int *, int *, int *);
|
uint8_t *(*const GrabOutput)(int *, int *, int *, int);
|
||||||
void (*const GetStats) (VideoHwDecoder *, int *, int *, int *, int *, float *);
|
void (*const GetStats) (VideoHwDecoder *, int *, int *, int *, int *, float *);
|
||||||
void (*const SetBackground) (uint32_t);
|
void (*const SetBackground) (uint32_t);
|
||||||
void (*const SetVideoMode) (void);
|
void (*const SetVideoMode) (void);
|
||||||
|
@ -799,7 +799,7 @@ static void GlxSetupDecoder(int width, int height, GLuint * textures)
|
||||||
/// @param width window width
|
/// @param width window width
|
||||||
/// @param height window height
|
/// @param height window height
|
||||||
///
|
///
|
||||||
static inline void GlxRenderTexture(GLuint texture, int x, int y, int width, int height)
|
static inline void GlxRenderTexture(GLuint texture, int x, int y, int width, int height, int flip)
|
||||||
{
|
{
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
@ -808,6 +808,7 @@ static inline void GlxRenderTexture(GLuint texture, int x, int y, int width, int
|
||||||
// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // no color
|
// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // no color
|
||||||
|
|
||||||
glBegin(GL_QUADS); {
|
glBegin(GL_QUADS); {
|
||||||
|
if (!flip) {
|
||||||
glTexCoord2f(1.0f, 1.0f);
|
glTexCoord2f(1.0f, 1.0f);
|
||||||
glVertex2i(x + width, y + height);
|
glVertex2i(x + width, y + height);
|
||||||
glTexCoord2f(0.0f, 1.0f);
|
glTexCoord2f(0.0f, 1.0f);
|
||||||
|
@ -816,6 +817,16 @@ static inline void GlxRenderTexture(GLuint texture, int x, int y, int width, int
|
||||||
glVertex2i(x, y);
|
glVertex2i(x, y);
|
||||||
glTexCoord2f(1.0f, 0.0f);
|
glTexCoord2f(1.0f, 0.0f);
|
||||||
glVertex2i(x + width, y);
|
glVertex2i(x + width, y);
|
||||||
|
} else {
|
||||||
|
glTexCoord2f(1.0f, 1.0f);
|
||||||
|
glVertex2i(x + width, y);
|
||||||
|
glTexCoord2f(0.0f, 1.0f);
|
||||||
|
glVertex2i(x, y);
|
||||||
|
glTexCoord2f(0.0f, 0.0f);
|
||||||
|
glVertex2i(x, y+height);
|
||||||
|
glTexCoord2f(1.0f, 0.0f);
|
||||||
|
glVertex2i(x + width, y+height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
|
@ -2371,7 +2382,24 @@ int get_RGB(CuvidDecoder *decoder) {
|
||||||
render_pass_quad(1,0.0,0.0);
|
render_pass_quad(1,0.0,0.0);
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
if (OsdShown && decoder->grab == 2) {
|
||||||
|
#ifndef USE_OPENGLOSD
|
||||||
|
glXMakeCurrent(XlibDisplay, VideoWindow, GlxThreadContext);
|
||||||
|
GlxRenderTexture(OsdGlTextures[OsdIndex], 0,0, width, height,1);
|
||||||
|
#else
|
||||||
|
pthread_mutex_lock(&OSDMutex);
|
||||||
|
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext );
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
glOrtho(0.0, width, height, 0.0, -1.0, 1.0);
|
||||||
|
GlxCheck();
|
||||||
|
GlxRenderTexture(OSDtexture, 0,0, width, height,1);
|
||||||
|
pthread_mutex_unlock(&OSDMutex);
|
||||||
|
#endif
|
||||||
|
// glXMakeCurrent(XlibDisplay, VideoWindow, GlxSharedContext);
|
||||||
|
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext);
|
||||||
|
}
|
||||||
Debug(3,"Read pixels %d %d\n",width,height);
|
Debug(3,"Read pixels %d %d\n",width,height);
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
@ -2393,7 +2421,7 @@ int get_RGB(CuvidDecoder *decoder) {
|
||||||
/// @param ret_width[in,out] width of output
|
/// @param ret_width[in,out] width of output
|
||||||
/// @param ret_height[in,out] height of output
|
/// @param ret_height[in,out] height of output
|
||||||
///
|
///
|
||||||
static uint8_t *CuvidGrabOutputSurfaceLocked(int *ret_size, int *ret_width, int *ret_height)
|
static uint8_t *CuvidGrabOutputSurfaceLocked(int *ret_size, int *ret_width, int *ret_height, int mitosd)
|
||||||
{
|
{
|
||||||
int surface,i;
|
int surface,i;
|
||||||
|
|
||||||
|
@ -2473,6 +2501,9 @@ static uint8_t *CuvidGrabOutputSurfaceLocked(int *ret_size, int *ret_width, int
|
||||||
decoder->grabbase = base;
|
decoder->grabbase = base;
|
||||||
decoder->grabwidth = width;
|
decoder->grabwidth = width;
|
||||||
decoder->grabheight = height;
|
decoder->grabheight = height;
|
||||||
|
if (mitosd)
|
||||||
|
decoder->grab = 2;
|
||||||
|
else
|
||||||
decoder->grab = 1;
|
decoder->grab = 1;
|
||||||
|
|
||||||
while(decoder->grab) {
|
while(decoder->grab) {
|
||||||
|
@ -2502,14 +2533,13 @@ static uint8_t *CuvidGrabOutputSurfaceLocked(int *ret_size, int *ret_width, int
|
||||||
/// @param ret_width[in,out] width of output
|
/// @param ret_width[in,out] width of output
|
||||||
/// @param ret_height[in,out] height of output
|
/// @param ret_height[in,out] height of output
|
||||||
///
|
///
|
||||||
static uint8_t *CuvidGrabOutputSurface(int *ret_size, int *ret_width,
|
static uint8_t *CuvidGrabOutputSurface(int *ret_size, int *ret_width, int *ret_height, int mitosd)
|
||||||
int *ret_height)
|
|
||||||
{
|
{
|
||||||
uint8_t *img;
|
uint8_t *img;
|
||||||
|
|
||||||
// pthread_mutex_lock(&CuvidGrabMutex);
|
// pthread_mutex_lock(&CuvidGrabMutex);
|
||||||
// pthread_mutex_lock(&VideoLockMutex);
|
// pthread_mutex_lock(&VideoLockMutex);
|
||||||
img = CuvidGrabOutputSurfaceLocked(ret_size, ret_width, ret_height);
|
img = CuvidGrabOutputSurfaceLocked(ret_size, ret_width, ret_height, mitosd);
|
||||||
// pthread_mutex_unlock(&VideoLockMutex);
|
// pthread_mutex_unlock(&VideoLockMutex);
|
||||||
// pthread_mutex_unlock(&CuvidGrabMutex);
|
// pthread_mutex_unlock(&CuvidGrabMutex);
|
||||||
return img;
|
return img;
|
||||||
|
@ -3118,7 +3148,7 @@ static void CuvidDisplayFrame(void)
|
||||||
if (OsdShown) {
|
if (OsdShown) {
|
||||||
#ifndef USE_OPENGLOSD
|
#ifndef USE_OPENGLOSD
|
||||||
glXMakeCurrent(XlibDisplay, VideoWindow, GlxThreadContext);
|
glXMakeCurrent(XlibDisplay, VideoWindow, GlxThreadContext);
|
||||||
GlxRenderTexture(OsdGlTextures[OsdIndex], 0,0, VideoWindowWidth, VideoWindowHeight);
|
GlxRenderTexture(OsdGlTextures[OsdIndex], 0,0, VideoWindowWidth, VideoWindowHeight,0);
|
||||||
#else
|
#else
|
||||||
pthread_mutex_lock(&OSDMutex);
|
pthread_mutex_lock(&OSDMutex);
|
||||||
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext );
|
glXMakeCurrent(XlibDisplay, VideoWindow, GlxContext );
|
||||||
|
@ -3127,7 +3157,7 @@ static void CuvidDisplayFrame(void)
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glOrtho(0.0, VideoWindowWidth, VideoWindowHeight, 0.0, -1.0, 1.0);
|
glOrtho(0.0, VideoWindowWidth, VideoWindowHeight, 0.0, -1.0, 1.0);
|
||||||
GlxCheck();
|
GlxCheck();
|
||||||
GlxRenderTexture(OSDtexture, 0,0, VideoWindowWidth, VideoWindowHeight);
|
GlxRenderTexture(OSDtexture, 0,0, VideoWindowWidth, VideoWindowHeight,0);
|
||||||
pthread_mutex_unlock(&OSDMutex);
|
pthread_mutex_unlock(&OSDMutex);
|
||||||
#endif
|
#endif
|
||||||
// glXMakeCurrent(XlibDisplay, VideoWindow, GlxSharedContext);
|
// glXMakeCurrent(XlibDisplay, VideoWindow, GlxSharedContext);
|
||||||
|
@ -4516,7 +4546,7 @@ uint8_t *VideoGrab(int *size, int *width, int *height, int write_header)
|
||||||
scale_width = *width;
|
scale_width = *width;
|
||||||
scale_height = *height;
|
scale_height = *height;
|
||||||
n = 0;
|
n = 0;
|
||||||
data = VideoUsedModule->GrabOutput(size, width, height);
|
data = VideoUsedModule->GrabOutput(size, width, height, 1);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -4618,7 +4648,7 @@ uint8_t *VideoGrabService(int *size, int *width, int *height)
|
||||||
|
|
||||||
#ifdef USE_GRAB
|
#ifdef USE_GRAB
|
||||||
if (VideoUsedModule->GrabOutput) {
|
if (VideoUsedModule->GrabOutput) {
|
||||||
return VideoUsedModule->GrabOutput(size, width, height);
|
return VideoUsedModule->GrabOutput(size, width, height, 0);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
@ -5091,6 +5121,7 @@ void VideoSetVideoMode( __attribute__ ((unused))
|
||||||
if ((unsigned)width == VideoWindowWidth && (unsigned)height == VideoWindowHeight) {
|
if ((unsigned)width == VideoWindowWidth && (unsigned)height == VideoWindowHeight) {
|
||||||
return; // same size nothing todo
|
return; // same size nothing todo
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_OPENGLOSD
|
#ifdef USE_OPENGLOSD
|
||||||
if (VideoEventCallback) {
|
if (VideoEventCallback) {
|
||||||
VideoEventCallback();
|
VideoEventCallback();
|
||||||
|
|
Loading…
Reference in New Issue