X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_chroma%2Fi420_ymga.c;h=6e0f77c8a102be984216bd5ce28b9884b66f10f5;hb=f1590d98ae55f55c1c5df515a5eabf68e1190d1e;hp=307184604e4c8c63138e7e93b3d070fede788064;hpb=82a67660c9c7fbc9a1ea78b7929e34af26ebca01;p=vlc diff --git a/modules/video_chroma/i420_ymga.c b/modules/video_chroma/i420_ymga.c index 307184604e..6e0f77c8a1 100644 --- a/modules/video_chroma/i420_ymga.c +++ b/modules/video_chroma/i420_ymga.c @@ -1,8 +1,8 @@ /***************************************************************************** * i420_ymga.c : YUV to YUV conversion module for vlc ***************************************************************************** - * Copyright (C) 2000, 2001 VideoLAN - * $Id: i420_ymga.c,v 1.3 2004/01/25 17:20:18 kuehne Exp $ + * Copyright (C) 2000, 2001 the VideoLAN team + * $Id$ * * Authors: Samuel Hocevar * @@ -10,7 +10,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,18 +18,23 @@ * * 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. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include /* ENOMEM */ -#include /* strerror() */ -#include /* malloc(), free() */ -#include -#include +#include +#include +#include +#include #define SRC_FOURCC "I420,IYUV,YV12" #define DEST_FOURCC "YMGA" @@ -38,22 +43,23 @@ * Local and extern prototypes. *****************************************************************************/ static int Activate ( vlc_object_t * ); -static void I420_YMGA ( vout_thread_t *, picture_t *, picture_t * ); +static void I420_YMGA ( filter_t *, picture_t *, picture_t * ); +static picture_t *I420_YMGA_Filter( filter_t *, picture_t * ); /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); +vlc_module_begin () #if defined (MODULE_NAME_IS_i420_ymga) - set_description( _("Conversions from " SRC_FOURCC " to " DEST_FOURCC) ); - set_capability( "chroma", 80 ); + set_description( N_("Conversions from " SRC_FOURCC " to " DEST_FOURCC) ) + set_capability( "video filter2", 80 ) #elif defined (MODULE_NAME_IS_i420_ymga_mmx) - set_description( _("MMX conversions from " SRC_FOURCC " to " DEST_FOURCC) ); - set_capability( "chroma", 100 ); - add_requirement( MMX ); + set_description( N_("MMX conversions from " SRC_FOURCC " to " DEST_FOURCC) ) + set_capability( "video filter2", 100 ) + add_requirement( MMX ) #endif - set_callbacks( Activate, NULL ); -vlc_module_end(); + set_callbacks( Activate, NULL ) +vlc_module_end () /***************************************************************************** * Activate: allocate a chroma function @@ -62,22 +68,27 @@ vlc_module_end(); *****************************************************************************/ static int Activate( vlc_object_t *p_this ) { - vout_thread_t *p_vout = (vout_thread_t *)p_this; + filter_t *p_filter = (filter_t *)p_this; - if( p_vout->render.i_width & 1 || p_vout->render.i_height & 1 ) + if( p_filter->fmt_in.video.i_width & 1 + || p_filter->fmt_in.video.i_height & 1 ) { return -1; } - switch( p_vout->render.i_chroma ) + if( p_filter->fmt_in.video.i_width != p_filter->fmt_out.video.i_width + || p_filter->fmt_in.video.i_height != p_filter->fmt_out.video.i_height ) + return -1; + + switch( p_filter->fmt_in.video.i_chroma ) { case VLC_FOURCC('Y','V','1','2'): case VLC_FOURCC('I','4','2','0'): case VLC_FOURCC('I','Y','U','V'): - switch( p_vout->output.i_chroma ) + switch( p_filter->fmt_out.video.i_chroma ) { case VLC_FOURCC('Y','M','G','A'): - p_vout->chroma.pf_convert = I420_YMGA; + p_filter->pf_video_filter = I420_YMGA_Filter; break; default: @@ -94,11 +105,13 @@ static int Activate( vlc_object_t *p_this ) /* Following functions are local */ +VIDEO_FILTER_WRAPPER( I420_YMGA ) + /***************************************************************************** * I420_YMGA: planar YUV 4:2:0 to Matrox's planar/packed YUV 4:2:0 *****************************************************************************/ -static void I420_YMGA( vout_thread_t *p_vout, picture_t *p_source, - picture_t *p_dest ) +static void I420_YMGA( filter_t *p_filter, picture_t *p_source, + picture_t *p_dest ) { uint8_t *p_uv = p_dest->U_PIXELS; uint8_t *p_u = p_source->U_PIXELS; @@ -107,11 +120,11 @@ static void I420_YMGA( vout_thread_t *p_vout, picture_t *p_source, int i_x; /* Copy the Y part */ - p_vout->p_vlc->pf_memcpy( p_dest->Y_PIXELS, p_source->Y_PIXELS, - p_dest->p[Y_PLANE].i_pitch * p_dest->p[Y_PLANE].i_lines ); + vlc_memcpy( p_dest->Y_PIXELS, p_source->Y_PIXELS, + p_dest->p[Y_PLANE].i_pitch * p_dest->p[Y_PLANE].i_visible_lines ); /* Copy the U:V part */ - for( i_x = p_dest->p[U_PLANE].i_pitch * p_dest->p[U_PLANE].i_lines / 64; + for( i_x = p_dest->p[U_PLANE].i_pitch * p_dest->p[U_PLANE].i_visible_lines / 64; i_x--; ) { #if defined (MODULE_NAME_IS_i420_ymga) @@ -124,7 +137,7 @@ static void I420_YMGA( vout_thread_t *p_vout, picture_t *p_source, *p_uv++ = *p_u++; *p_uv++ = *p_v++; *p_uv++ = *p_u++; *p_uv++ = *p_v++; *p_uv++ = *p_u++; *p_uv++ = *p_v++; *p_uv++ = *p_u++; *p_uv++ = *p_v++; #else - __asm__( ".align 32 \n\ + __asm__( ".p2align 5 \n\ movd (%0), %%mm0 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ movd 4(%0), %%mm2 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\ movd 8(%0), %%mm4 # Load 4 Cr 00 00 00 00 v3 v2 v1 v0 \n\