X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Ftransform.c;h=2f771e84459e5024af8333558200df729e8a4ac5;hb=997c5859d2ab8e7bc613d1c8654335a92c41b0f8;hp=a5b93847802908fe1b06e2c31aafbbf69eb4b2de;hpb=5a13b475ceef886157d0d87decab17a3b0e354f8;p=vlc diff --git a/modules/video_filter/transform.c b/modules/video_filter/transform.c index a5b9384780..2f771e8445 100644 --- a/modules/video_filter/transform.c +++ b/modules/video_filter/transform.c @@ -1,8 +1,8 @@ /***************************************************************************** - * transform.c : transform image plugin for vlc + * transform.c : transform image module for vlc ***************************************************************************** - * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: transform.c,v 1.9 2003/02/20 01:52:46 sigmunau Exp $ + * Copyright (C) 2000-2004 the VideoLAN team + * $Id$ * * Authors: Samuel Hocevar * @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -54,17 +54,25 @@ static int SendEvents( vlc_object_t *, char const *, /***************************************************************************** * Module descriptor *****************************************************************************/ -#define TYPE_TEXT N_("transform type") +#define TYPE_TEXT N_("Transform type") #define TYPE_LONGTEXT N_("One of '90', '180', '270', 'hflip' and 'vflip'") -static char *type_list[] = { "90", "180", "270", "hflip", "vflip", NULL }; +static char *type_list[] = { "90", "180", "270", "hflip", "vflip" }; +static char *type_list_text[] = { N_("Rotate by 90 degrees"), + N_("Rotate by 180 degrees"), N_("Rotate by 270 degrees"), + N_("Flip horizontally"), N_("Flip vertically") }; vlc_module_begin(); - add_category_hint( N_("Miscellaneous"), NULL, VLC_FALSE ); - add_string_from_list( "transform-type", "90", type_list, NULL, - TYPE_TEXT, TYPE_LONGTEXT, VLC_FALSE); - set_description( _("image transformation module") ); + set_description( _("Video transformation filter") ); + set_shortname( N_("Transformation")); set_capability( "video filter", 0 ); + set_category( CAT_VIDEO ); + set_subcategory( SUBCAT_VIDEO_VFILTER ); + + add_string( "transform-type", "90", NULL, + TYPE_TEXT, TYPE_LONGTEXT, VLC_FALSE); + change_string_list( type_list, type_list_text, 0); + add_shortcut( "transform" ); set_callbacks( Create, Destroy ); vlc_module_end(); @@ -82,6 +90,14 @@ struct vout_sys_t vout_thread_t *p_vout; }; +/***************************************************************************** + * Control: control facility for the vout (forwards to child vout) + *****************************************************************************/ +static int Control( vout_thread_t *p_vout, int i_query, va_list args ) +{ + return vout_vaControl( p_vout->p_sys->p_vout, i_query, args ); +} + /***************************************************************************** * Create: allocates Transform video thread output method ***************************************************************************** @@ -105,6 +121,7 @@ static int Create( vlc_object_t *p_this ) p_vout->pf_manage = NULL; p_vout->pf_render = Render; p_vout->pf_display = NULL; + p_vout->pf_control = Control; /* Look what method was requested */ psz_method = config_GetPsz( p_vout, "transform-type" ); @@ -163,6 +180,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + video_format_t fmt = {0}; I_OUTPUTPICTURES = 0; @@ -171,26 +189,31 @@ static int Init( vout_thread_t *p_vout ) p_vout->output.i_width = p_vout->render.i_width; p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + p_vout->fmt_out = p_vout->fmt_in; + fmt = p_vout->fmt_out; /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video output" ); if( p_vout->p_sys->b_rotation ) { - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_height, p_vout->render.i_width, - p_vout->render.i_chroma, - (uint64_t)VOUT_ASPECT_FACTOR - * (uint64_t)VOUT_ASPECT_FACTOR - / (uint64_t)p_vout->render.i_aspect ); - } - else - { - p_vout->p_sys->p_vout = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + fmt.i_width = p_vout->fmt_out.i_height; + fmt.i_visible_width = p_vout->fmt_out.i_visible_height; + fmt.i_x_offset = p_vout->fmt_out.i_y_offset; + + fmt.i_height = p_vout->fmt_out.i_width; + fmt.i_visible_height = p_vout->fmt_out.i_visible_width; + fmt.i_y_offset = p_vout->fmt_out.i_x_offset; + + fmt.i_aspect = VOUT_ASPECT_FACTOR * + (uint64_t)VOUT_ASPECT_FACTOR / fmt.i_aspect; + + fmt.i_sar_num = p_vout->fmt_out.i_sar_den; + fmt.i_sar_den = p_vout->fmt_out.i_sar_num; } + p_vout->p_sys->p_vout = vout_Create( p_vout, &fmt ); + /* Everything failed */ if( p_vout->p_sys->p_vout == NULL ) { @@ -202,6 +225,8 @@ static int Init( vout_thread_t *p_vout ) ADD_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + ADD_PARENT_CALLBACKS( SendEventsToChild ); + return VLC_SUCCESS; } @@ -229,8 +254,14 @@ static void Destroy( vlc_object_t *p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; - DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); - vout_Destroy( p_vout->p_sys->p_vout ); + if( p_vout->p_sys->p_vout ) + { + DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); + vout_Destroy( p_vout->p_sys->p_vout ); + } + + DEL_PARENT_CALLBACKS( SendEventsToChild ); free( p_vout->p_sys ); } @@ -271,8 +302,9 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) uint8_t *p_in = p_pic->p[i_index].p_pixels; uint8_t *p_out = p_outpic->p[i_index].p_pixels; - uint8_t *p_out_end = p_out + p_outpic->p[i_index].i_lines - * p_outpic->p[i_index].i_pitch; + uint8_t *p_out_end = p_out + + p_outpic->p[i_index].i_visible_lines * + p_outpic->p[i_index].i_pitch; for( ; p_out < p_out_end ; ) { @@ -280,7 +312,8 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) p_out_end -= p_outpic->p[i_index].i_pitch - p_outpic->p[i_index].i_visible_pitch; - p_line_end = p_in + p_pic->p[i_index].i_lines * i_pitch; + p_line_end = p_in + p_pic->p[i_index].i_visible_lines * + i_pitch; for( ; p_in < p_line_end ; ) { @@ -297,7 +330,7 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) { uint8_t *p_in = p_pic->p[i_index].p_pixels; - uint8_t *p_in_end = p_in + p_pic->p[i_index].i_lines + uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines * p_pic->p[i_index].i_pitch; uint8_t *p_out = p_outpic->p[i_index].p_pixels; @@ -328,14 +361,16 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) uint8_t *p_in = p_pic->p[i_index].p_pixels; uint8_t *p_out = p_outpic->p[i_index].p_pixels; - uint8_t *p_out_end = p_out + p_outpic->p[i_index].i_lines - * p_outpic->p[i_index].i_pitch; + uint8_t *p_out_end = p_out + + p_outpic->p[i_index].i_visible_lines * + p_outpic->p[i_index].i_pitch; for( ; p_out < p_out_end ; ) { uint8_t *p_in_end; - p_in_end = p_in + p_pic->p[i_index].i_lines * i_pitch; + p_in_end = p_in + p_pic->p[i_index].i_visible_lines * + i_pitch; for( ; p_in < p_in_end ; ) { @@ -350,11 +385,11 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) } break; - case TRANSFORM_MODE_VFLIP: + case TRANSFORM_MODE_HFLIP: for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) { uint8_t *p_in = p_pic->p[i_index].p_pixels; - uint8_t *p_in_end = p_in + p_pic->p[i_index].i_lines + uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines * p_pic->p[i_index].i_pitch; uint8_t *p_out = p_outpic->p[i_index].p_pixels; @@ -362,18 +397,18 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) for( ; p_in < p_in_end ; ) { p_in_end -= p_pic->p[i_index].i_pitch; - p_vout->p_vlc->pf_memcpy( p_out, p_in_end, + p_vout->p_libvlc->pf_memcpy( p_out, p_in_end, p_pic->p[i_index].i_visible_pitch ); p_out += p_pic->p[i_index].i_pitch; } } break; - case TRANSFORM_MODE_HFLIP: + case TRANSFORM_MODE_VFLIP: for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ ) { uint8_t *p_in = p_pic->p[i_index].p_pixels; - uint8_t *p_in_end = p_in + p_pic->p[i_index].i_lines + uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines * p_pic->p[i_index].i_pitch; uint8_t *p_out = p_outpic->p[i_index].p_pixels; @@ -462,3 +497,13 @@ static int SendEvents( vlc_object_t *p_this, char const *psz_var, return VLC_SUCCESS; } +/***************************************************************************** + * SendEventsToChild: forward events to the child/children vout + *****************************************************************************/ +static int SendEventsToChild( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, void *p_data ) +{ + vout_thread_t *p_vout = (vout_thread_t *)p_this; + var_Set( p_vout->p_sys->p_vout, psz_var, newval ); + return VLC_SUCCESS; +}