X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_chroma%2Fi420_rgb.c;h=398ef57d1c29055a7a607a8213a258fb1a8704ce;hb=3a22cff898497cceffcf70666223a83eec0ec314;hp=1d56f9d5f1ce8e44ec03bd7dfbe6a8a7014b5e72;hpb=f1590d98ae55f55c1c5df515a5eabf68e1190d1e;p=vlc diff --git a/modules/video_chroma/i420_rgb.c b/modules/video_chroma/i420_rgb.c index 1d56f9d5f1..398ef57d1c 100644 --- a/modules/video_chroma/i420_rgb.c +++ b/modules/video_chroma/i420_rgb.c @@ -1,25 +1,25 @@ /***************************************************************************** * i420_rgb.c : YUV to bitmap RGB conversion module for vlc ***************************************************************************** - * Copyright (C) 2000, 2001, 2004, 2008 the VideoLAN team + * Copyright (C) 2000, 2001, 2004, 2008 VLC authors and VideoLAN * $Id$ * * Authors: Sam Hocevar * Damien Fouilleul * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -35,11 +35,22 @@ #include #include #include -#include +#include #include "i420_rgb.h" #if defined (MODULE_NAME_IS_i420_rgb) # include "i420_rgb_c.h" + static picture_t *I420_RGB8_Filter ( filter_t *, picture_t * ); +// static picture_t *I420_RGB16_dither_Filter ( filter_t *, picture_t * ); + static picture_t *I420_RGB16_Filter ( filter_t *, picture_t * ); + static picture_t *I420_RGB32_Filter ( filter_t *, picture_t * ); +#else + static picture_t *I420_R5G5B5_Filter ( filter_t *, picture_t * ); + static picture_t *I420_R5G6B5_Filter ( filter_t *, picture_t * ); + static picture_t *I420_A8R8G8B8_Filter ( filter_t *, picture_t * ); + static picture_t *I420_R8G8B8A8_Filter ( filter_t *, picture_t * ); + static picture_t *I420_B8G8R8A8_Filter ( filter_t *, picture_t * ); + static picture_t *I420_A8B8G8R8_Filter ( filter_t *, picture_t * ); #endif /***************************************************************************** @@ -73,16 +84,17 @@ vlc_module_begin () set_description( N_("I420,IYUV,YV12 to " "RGB2,RV15,RV16,RV24,RV32 conversions") ) set_capability( "video filter2", 80 ) +# define vlc_CPU_capable() (true) #elif defined (MODULE_NAME_IS_i420_rgb_mmx) set_description( N_( "MMX I420,IYUV,YV12 to " "RV15,RV16,RV24,RV32 conversions") ) set_capability( "video filter2", 100 ) - add_requirement( MMX ) +# define vlc_CPU_capable() vlc_CPU_MMX() #elif defined (MODULE_NAME_IS_i420_rgb_sse2) set_description( N_( "SSE2 I420,IYUV,YV12 to " "RV15,RV16,RV24,RV32 conversions") ) set_capability( "video filter2", 120 ) - add_requirement( SSE2 ) +# define vlc_CPU_capable() vlc_CPU_SSE2() #endif set_callbacks( Activate, Deactivate ) vlc_module_end () @@ -99,6 +111,8 @@ static int Activate( vlc_object_t *p_this ) size_t i_tables_size; #endif + if( !vlc_CPU_capable() ) + return VLC_EGENERIC; if( p_filter->fmt_out.video.i_width & 1 || p_filter->fmt_out.video.i_height & 1 ) { @@ -107,18 +121,17 @@ static int Activate( vlc_object_t *p_this ) 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'): + case VLC_CODEC_YV12: + case VLC_CODEC_I420: switch( p_filter->fmt_out.video.i_chroma ) { #if defined (MODULE_NAME_IS_i420_rgb) - case VLC_FOURCC('R','G','B','2'): + case VLC_CODEC_RGB8: p_filter->pf_video_filter = I420_RGB8_Filter; break; #endif - case VLC_FOURCC('R','V','1','5'): - case VLC_FOURCC('R','V','1','6'): + case VLC_CODEC_RGB15: + case VLC_CODEC_RGB16: #if ! defined (MODULE_NAME_IS_i420_rgb) /* If we don't have support for the bitmasks, bail out */ if( ( p_filter->fmt_out.video.i_rmask == 0x7c00 @@ -147,10 +160,10 @@ static int Activate( vlc_object_t *p_this ) #if 0 /* Hmmm, is there only X11 using 32bits per pixel for RV24 ? */ - case VLC_FOURCC('R','V','2','4'): + case VLC_CODEC_RGB24: #endif - case VLC_FOURCC('R','V','3','2'): + case VLC_CODEC_RGB32: #if ! defined (MODULE_NAME_IS_i420_rgb) /* If we don't have support for the bitmasks, bail out */ if( p_filter->fmt_out.video.i_rmask == 0x00ff0000 @@ -211,18 +224,18 @@ static int Activate( vlc_object_t *p_this ) switch( p_filter->fmt_out.video.i_chroma ) { #if defined (MODULE_NAME_IS_i420_rgb) - case VLC_FOURCC('R','G','B','2'): + case VLC_CODEC_RGB8: p_filter->p_sys->p_buffer = malloc( VOUT_MAX_WIDTH ); break; #endif - case VLC_FOURCC('R','V','1','5'): - case VLC_FOURCC('R','V','1','6'): + case VLC_CODEC_RGB15: + case VLC_CODEC_RGB16: p_filter->p_sys->p_buffer = malloc( VOUT_MAX_WIDTH * 2 ); break; - case VLC_FOURCC('R','V','2','4'): - case VLC_FOURCC('R','V','3','2'): + case VLC_CODEC_RGB24: + case VLC_CODEC_RGB32: p_filter->p_sys->p_buffer = malloc( VOUT_MAX_WIDTH * 4 ); break; @@ -239,7 +252,7 @@ static int Activate( vlc_object_t *p_this ) p_filter->p_sys->p_offset = malloc( p_filter->fmt_out.video.i_width * ( ( p_filter->fmt_out.video.i_chroma - == VLC_FOURCC('R','G','B','2') ) ? 2 : 1 ) + == VLC_CODEC_RGB8 ) ? 2 : 1 ) * sizeof( int ) ); if( p_filter->p_sys->p_offset == NULL ) { @@ -251,11 +264,11 @@ static int Activate( vlc_object_t *p_this ) #if defined (MODULE_NAME_IS_i420_rgb) switch( p_filter->fmt_out.video.i_chroma ) { - case VLC_FOURCC('R','G','B','2'): + case VLC_CODEC_RGB8: i_tables_size = sizeof( uint8_t ) * PALETTE_TABLE_SIZE; break; - case VLC_FOURCC('R','V','1','5'): - case VLC_FOURCC('R','V','1','6'): + case VLC_CODEC_RGB15: + case VLC_CODEC_RGB16: i_tables_size = sizeof( uint16_t ) * RGB_TABLE_SIZE; break; default: /* RV24, RV32 */ @@ -298,6 +311,7 @@ static void Deactivate( vlc_object_t *p_this ) #if defined (MODULE_NAME_IS_i420_rgb) VIDEO_FILTER_WRAPPER( I420_RGB8 ) VIDEO_FILTER_WRAPPER( I420_RGB16 ) +//VIDEO_FILTER_WRAPPER( I420_RGB16_dither ) VIDEO_FILTER_WRAPPER( I420_RGB32 ) #else VIDEO_FILTER_WRAPPER( I420_R5G5B5 ) @@ -348,13 +362,13 @@ static void SetYUV( filter_t *p_filter ) /* Color: build red, green and blue tables */ switch( p_filter->fmt_out.video.i_chroma ) { - case VLC_FOURCC('R','G','B','2'): + case VLC_CODEC_RGB8: p_filter->p_sys->p_rgb8 = (uint8_t *)p_filter->p_sys->p_base; Set8bppPalette( p_filter, p_filter->p_sys->p_rgb8 ); break; - case VLC_FOURCC('R','V','1','5'): - case VLC_FOURCC('R','V','1','6'): + case VLC_CODEC_RGB15: + case VLC_CODEC_RGB16: p_filter->p_sys->p_rgb16 = (uint16_t *)p_filter->p_sys->p_base; for( i_index = 0; i_index < RED_MARGIN; i_index++ ) { @@ -379,8 +393,8 @@ static void SetYUV( filter_t *p_filter ) } break; - case VLC_FOURCC('R','V','2','4'): - case VLC_FOURCC('R','V','3','2'): + case VLC_CODEC_RGB24: + case VLC_CODEC_RGB32: p_filter->p_sys->p_rgb32 = (uint32_t *)p_filter->p_sys->p_base; for( i_index = 0; i_index < RED_MARGIN; i_index++ ) {