Commit 3ca216ee authored by Gildas Bazin's avatar Gildas Bazin

* modules/video_output/x11/xcommon.c, modules/video_output/opengl.c,...

* modules/video_output/x11/xcommon.c, modules/video_output/opengl.c, modules/video_filter/deinterlace.c: added on-the-fly cropping support to opengl and deinterlace.
parent d2a6a11d
...@@ -441,8 +441,25 @@ static void Destroy( vlc_object_t *p_this ) ...@@ -441,8 +441,25 @@ static void Destroy( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static void Render ( vout_thread_t *p_vout, picture_t *p_pic ) static void Render ( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vout_sys_t *p_sys = p_vout->p_sys;
picture_t *pp_outpic[2]; picture_t *pp_outpic[2];
p_vout->fmt_out.i_x_offset = p_sys->p_vout->fmt_in.i_x_offset =
p_vout->fmt_in.i_x_offset;
p_vout->fmt_out.i_y_offset = p_sys->p_vout->fmt_in.i_y_offset =
p_vout->fmt_in.i_y_offset;
p_vout->fmt_out.i_visible_width = p_sys->p_vout->fmt_in.i_visible_width =
p_vout->fmt_in.i_visible_width;
p_vout->fmt_out.i_visible_height = p_sys->p_vout->fmt_in.i_visible_height =
p_vout->fmt_in.i_visible_height;
if( p_vout->p_sys->i_mode == DEINTERLACE_MEAN ||
p_vout->p_sys->i_mode == DEINTERLACE_DISCARD )
{
p_vout->fmt_out.i_y_offset /= 2; p_sys->p_vout->fmt_in.i_y_offset /= 2;
p_vout->fmt_out.i_visible_height /= 2;
p_sys->p_vout->fmt_in.i_visible_height /= 2;
}
pp_outpic[0] = pp_outpic[1] = NULL; pp_outpic[0] = pp_outpic[1] = NULL;
vlc_mutex_lock( &p_vout->p_sys->filter_lock ); vlc_mutex_lock( &p_vout->p_sys->filter_lock );
......
...@@ -458,6 +458,15 @@ static int Manage( vout_thread_t *p_vout ) ...@@ -458,6 +458,15 @@ static int Manage( vout_thread_t *p_vout )
i_fullscreen_change = ( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ); i_fullscreen_change = ( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE );
p_vout->fmt_out.i_x_offset = p_sys->p_vout->fmt_in.i_x_offset =
p_vout->fmt_in.i_x_offset;
p_vout->fmt_out.i_y_offset = p_sys->p_vout->fmt_in.i_y_offset =
p_vout->fmt_in.i_y_offset;
p_vout->fmt_out.i_visible_width = p_sys->p_vout->fmt_in.i_visible_width =
p_vout->fmt_in.i_visible_width;
p_vout->fmt_out.i_visible_height = p_sys->p_vout->fmt_in.i_visible_height =
p_vout->fmt_in.i_visible_height;
p_sys->p_vout->i_changes = p_vout->i_changes; p_sys->p_vout->i_changes = p_vout->i_changes;
i_ret = p_sys->p_vout->pf_manage( p_sys->p_vout ); i_ret = p_sys->p_vout->pf_manage( p_sys->p_vout );
p_vout->i_changes = p_sys->p_vout->i_changes; p_vout->i_changes = p_sys->p_vout->i_changes;
...@@ -549,10 +558,9 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -549,10 +558,9 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
/* Update the texture */ /* Update the texture */
glBindTexture( VLCGL_TARGET, p_sys->p_textures[i_new_index] ); glBindTexture( VLCGL_TARGET, p_sys->p_textures[i_new_index] );
glTexSubImage2D( VLCGL_TARGET, 0, glTexSubImage2D( VLCGL_TARGET, 0, 0, 0,
p_vout->fmt_out.i_x_offset, p_vout->fmt_out.i_y_offset, p_vout->fmt_out.i_width,
p_vout->fmt_out.i_visible_width, p_vout->fmt_out.i_height,
p_vout->fmt_out.i_visible_height,
VLCGL_FORMAT, VLCGL_TYPE, p_sys->pp_buffer[i_new_index] ); VLCGL_FORMAT, VLCGL_TYPE, p_sys->pp_buffer[i_new_index] );
/* Bind to the previous texture for drawing */ /* Bind to the previous texture for drawing */
...@@ -564,10 +572,9 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -564,10 +572,9 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
#else #else
/* Update the texture */ /* Update the texture */
glTexSubImage2D( GL_TEXTURE_2D, 0, glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0,
p_vout->fmt_out.i_x_offset, p_vout->fmt_out.i_y_offset, p_vout->fmt_out.i_width,
p_vout->fmt_out.i_visible_width, p_vout->fmt_out.i_height,
p_vout->fmt_out.i_visible_height,
VLCGL_FORMAT, VLCGL_TYPE, p_sys->pp_buffer[0] ); VLCGL_FORMAT, VLCGL_TYPE, p_sys->pp_buffer[0] );
#endif #endif
...@@ -583,7 +590,7 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -583,7 +590,7 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vout_sys_t *p_sys = p_vout->p_sys; vout_sys_t *p_sys = p_vout->p_sys;
float f_width, f_height; float f_width, f_height, f_x, f_y;
if( p_sys->p_vout->pf_lock && if( p_sys->p_vout->pf_lock &&
p_sys->p_vout->pf_lock( p_sys->p_vout ) ) p_sys->p_vout->pf_lock( p_sys->p_vout ) )
...@@ -595,11 +602,19 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -595,11 +602,19 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
/* glTexCoord works differently with GL_TEXTURE_2D and /* glTexCoord works differently with GL_TEXTURE_2D and
GL_TEXTURE_RECTANGLE_EXT */ GL_TEXTURE_RECTANGLE_EXT */
#ifdef SYS_DARWIN #ifdef SYS_DARWIN
f_width = (float)p_vout->fmt_out.i_visible_width; f_x = (float)p_vout->fmt_out.i_x_offset;
f_height = (float)p_vout->fmt_out.i_visible_height; f_y = (float)p_vout->fmt_out.i_y_offset;
f_width = (float)p_vout->fmt_out.i_x_offset +
(float)p_vout->fmt_out.i_visible_width;
f_height = (float)p_vout->fmt_out.i_y_offset +
(float)p_vout->fmt_out.i_visible_height;
#else #else
f_width = (float)p_vout->fmt_out.i_visible_width / p_sys->i_tex_width; f_x = (float)p_vout->fmt_out.i_x_offset / p_sys->i_tex_width;
f_height = (float)p_vout->fmt_out.i_visible_height / p_sys->i_tex_height; f_y = (float)p_vout->fmt_out.i_y_offset / p_sys->i_tex_height;
f_width = ( (float)p_vout->fmt_out.i_x_offset +
p_vout->fmt_out.i_visible_width ) / p_sys->i_tex_width;
f_height = ( (float)p_vout->fmt_out.i_y_offset +
p_vout->fmt_out.i_visible_height ) / p_sys->i_tex_height;
#endif #endif
/* Why drawing here and not in Render()? Because this way, the /* Why drawing here and not in Render()? Because this way, the
...@@ -612,10 +627,10 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -612,10 +627,10 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
{ {
glEnable( VLCGL_TARGET ); glEnable( VLCGL_TARGET );
glBegin( GL_POLYGON ); glBegin( GL_POLYGON );
glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, 1.0 ); glTexCoord2f( f_x, f_y ); glVertex2f( -1.0, 1.0 );
glTexCoord2f( f_width, 0.0 ); glVertex2f( 1.0, 1.0 ); glTexCoord2f( f_width, f_y ); glVertex2f( 1.0, 1.0 );
glTexCoord2f( f_width, f_height ); glVertex2f( 1.0, -1.0 ); glTexCoord2f( f_width, f_height ); glVertex2f( 1.0, -1.0 );
glTexCoord2f( 0.0, f_height ); glVertex2f( -1.0, -1.0 ); glTexCoord2f( f_x, f_height ); glVertex2f( -1.0, -1.0 );
glEnd(); glEnd();
} }
else else
...@@ -626,40 +641,40 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -626,40 +641,40 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
glBegin( GL_QUADS ); glBegin( GL_QUADS );
/* Front */ /* Front */
glTexCoord2f( 0, 0 ); glVertex3f( - 1.0, 1.0, 1.0 ); glTexCoord2f( f_x, f_y ); glVertex3f( - 1.0, 1.0, 1.0 );
glTexCoord2f( 0, f_height ); glVertex3f( - 1.0, - 1.0, 1.0 ); glTexCoord2f( f_x, f_height ); glVertex3f( - 1.0, - 1.0, 1.0 );
glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, - 1.0, 1.0 ); glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, - 1.0, 1.0 );
glTexCoord2f( f_width, 0 ); glVertex3f( 1.0, 1.0, 1.0 ); glTexCoord2f( f_width, f_y ); glVertex3f( 1.0, 1.0, 1.0 );
/* Left */ /* Left */
glTexCoord2f( 0, 0 ); glVertex3f( - 1.0, 1.0, - 1.0 ); glTexCoord2f( f_x, f_y ); glVertex3f( - 1.0, 1.0, - 1.0 );
glTexCoord2f( 0, f_height ); glVertex3f( - 1.0, - 1.0, - 1.0 ); glTexCoord2f( f_x, f_height ); glVertex3f( - 1.0, - 1.0, - 1.0 );
glTexCoord2f( f_width, f_height ); glVertex3f( - 1.0, - 1.0, 1.0 ); glTexCoord2f( f_width, f_height ); glVertex3f( - 1.0, - 1.0, 1.0 );
glTexCoord2f( f_width, 0 ); glVertex3f( - 1.0, 1.0, 1.0 ); glTexCoord2f( f_width, f_y ); glVertex3f( - 1.0, 1.0, 1.0 );
/* Back */ /* Back */
glTexCoord2f( 0, 0 ); glVertex3f( 1.0, 1.0, - 1.0 ); glTexCoord2f( f_x, f_y ); glVertex3f( 1.0, 1.0, - 1.0 );
glTexCoord2f( 0, f_height ); glVertex3f( 1.0, - 1.0, - 1.0 ); glTexCoord2f( f_x, f_height ); glVertex3f( 1.0, - 1.0, - 1.0 );
glTexCoord2f( f_width, f_height ); glVertex3f( - 1.0, - 1.0, - 1.0 ); glTexCoord2f( f_width, f_height ); glVertex3f( - 1.0, - 1.0, - 1.0 );
glTexCoord2f( f_width, 0 ); glVertex3f( - 1.0, 1.0, - 1.0 ); glTexCoord2f( f_width, f_y ); glVertex3f( - 1.0, 1.0, - 1.0 );
/* Right */ /* Right */
glTexCoord2f( 0, 0 ); glVertex3f( 1.0, 1.0, 1.0 ); glTexCoord2f( f_x, f_y ); glVertex3f( 1.0, 1.0, 1.0 );
glTexCoord2f( 0, f_height ); glVertex3f( 1.0, - 1.0, 1.0 ); glTexCoord2f( f_x, f_height ); glVertex3f( 1.0, - 1.0, 1.0 );
glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, - 1.0, - 1.0 ); glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, - 1.0, - 1.0 );
glTexCoord2f( f_width, 0 ); glVertex3f( 1.0, 1.0, - 1.0 ); glTexCoord2f( f_width, f_y ); glVertex3f( 1.0, 1.0, - 1.0 );
/* Top */ /* Top */
glTexCoord2f( 0, 0 ); glVertex3f( - 1.0, 1.0, - 1.0 ); glTexCoord2f( f_x, f_y ); glVertex3f( - 1.0, 1.0, - 1.0 );
glTexCoord2f( 0, f_height ); glVertex3f( - 1.0, 1.0, 1.0 ); glTexCoord2f( f_x, f_height ); glVertex3f( - 1.0, 1.0, 1.0 );
glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, 1.0, 1.0 ); glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, 1.0, 1.0 );
glTexCoord2f( f_width, 0 ); glVertex3f( 1.0, 1.0, - 1.0 ); glTexCoord2f( f_width, f_y ); glVertex3f( 1.0, 1.0, - 1.0 );
/* Bottom */ /* Bottom */
glTexCoord2f( 0, 0 ); glVertex3f( - 1.0, - 1.0, 1.0 ); glTexCoord2f( f_x, f_y ); glVertex3f( - 1.0, - 1.0, 1.0 );
glTexCoord2f( 0, f_height ); glVertex3f( - 1.0, - 1.0, - 1.0 ); glTexCoord2f( f_x, f_height ); glVertex3f( - 1.0, - 1.0, - 1.0 );
glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, - 1.0, - 1.0 ); glTexCoord2f( f_width, f_height ); glVertex3f( 1.0, - 1.0, - 1.0 );
glTexCoord2f( f_width, 0 ); glVertex3f( 1.0, - 1.0, 1.0 ); glTexCoord2f( f_width, f_y ); glVertex3f( 1.0, - 1.0, 1.0 );
glEnd(); glEnd();
} }
......
...@@ -847,7 +847,7 @@ static int ManageVideo( vout_thread_t *p_vout ) ...@@ -847,7 +847,7 @@ static int ManageVideo( vout_thread_t *p_vout )
p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
} }
#ifdef MODULE_NAME_IS_xvideo #ifndef MODULE_NAME_IS_x11
if( p_vout->fmt_out.i_x_offset != p_vout->fmt_in.i_x_offset || if( p_vout->fmt_out.i_x_offset != p_vout->fmt_in.i_x_offset ||
p_vout->fmt_out.i_y_offset != p_vout->fmt_in.i_y_offset || p_vout->fmt_out.i_y_offset != p_vout->fmt_in.i_y_offset ||
p_vout->fmt_out.i_visible_width != p_vout->fmt_in.i_visible_width || p_vout->fmt_out.i_visible_width != p_vout->fmt_in.i_visible_width ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment