X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_chroma%2Fi420_rgb.c;h=e74ec66eeea9352bc326b02950d6490158a4eadd;hb=139cf222f01e9d0f88d02d706618428b71147ba8;hp=4bf0342d409890272f1262f5009f548a8f6a9fe0;hpb=41a8349dba161e8704ac76dc5cea23bf13afff80;p=vlc diff --git a/modules/video_chroma/i420_rgb.c b/modules/video_chroma/i420_rgb.c index 4bf0342d40..e74ec66eee 100644 --- a/modules/video_chroma/i420_rgb.c +++ b/modules/video_chroma/i420_rgb.c @@ -1,16 +1,17 @@ /***************************************************************************** * i420_rgb.c : YUV to bitmap RGB conversion module for vlc ***************************************************************************** - * Copyright (C) 2000, 2001 VideoLAN - * $Id: i420_rgb.c,v 1.4 2003/08/29 18:58:05 fenrir Exp $ + * Copyright (C) 2000, 2001, 2004, 2008 the VideoLAN team + * $Id$ * - * Authors: Samuel Hocevar + * 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 * (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,34 +19,50 @@ * * 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 /* exp(), pow() */ -#include /* strerror() */ -#include /* malloc(), free() */ -#include -#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 /***************************************************************************** * RGB2PIXEL: assemble RGB components to a pixel value, returns a uint32_t *****************************************************************************/ -#define RGB2PIXEL( p_vout, i_r, i_g, i_b ) \ - (((((uint32_t)i_r) >> p_vout->output.i_rrshift) \ - << p_vout->output.i_lrshift) \ - | ((((uint32_t)i_g) >> p_vout->output.i_rgshift) \ - << p_vout->output.i_lgshift) \ - | ((((uint32_t)i_b) >> p_vout->output.i_rbshift) \ - << p_vout->output.i_lbshift)) +#define RGB2PIXEL( p_filter, i_r, i_g, i_b ) \ + (((((uint32_t)i_r) >> p_filter->fmt_out.video.i_rrshift) \ + << p_filter->fmt_out.video.i_lrshift) \ + | ((((uint32_t)i_g) >> p_filter->fmt_out.video.i_rgshift) \ + << p_filter->fmt_out.video.i_lgshift) \ + | ((((uint32_t)i_b) >> p_filter->fmt_out.video.i_rbshift) \ + << p_filter->fmt_out.video.i_lbshift)) /***************************************************************************** * Local and extern prototypes. @@ -55,26 +72,32 @@ static void Deactivate ( vlc_object_t * ); #if defined (MODULE_NAME_IS_i420_rgb) static void SetGammaTable ( int *pi_table, double f_gamma ); -static void SetYUV ( vout_thread_t * ); -static void Set8bppPalette ( vout_thread_t *, uint8_t * ); +static void SetYUV ( filter_t * ); +static void Set8bppPalette ( filter_t *, uint8_t * ); #endif /***************************************************************************** * Module descriptor. *****************************************************************************/ -vlc_module_begin(); +vlc_module_begin () #if defined (MODULE_NAME_IS_i420_rgb) - set_description( _("I420,IYUV,YV12 to " - "RGB2,RV15,RV16,RV24,RV32 conversions") ); - set_capability( "chroma", 80 ); + set_description( N_("I420,IYUV,YV12 to " + "RGB2,RV15,RV16,RV24,RV32 conversions") ) + set_capability( "video filter2", 80 ) +# define CPU_CAPABILITY 0 #elif defined (MODULE_NAME_IS_i420_rgb_mmx) - set_description( _( "MMX I420,IYUV,YV12 to " - "RV15,RV16,RV24,RV32 conversions") ); - set_capability( "chroma", 100 ); - add_requirement( MMX ); + set_description( N_( "MMX I420,IYUV,YV12 to " + "RV15,RV16,RV24,RV32 conversions") ) + set_capability( "video filter2", 100 ) +# define CPU_CAPABILITY CPU_CAPABILITY_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 ) +# define CPU_CAPABILITY CPU_CAPABILITY_SSE2 #endif - set_callbacks( Activate, Deactivate ); -vlc_module_end(); + set_callbacks( Activate, Deactivate ) +vlc_module_end () /***************************************************************************** * Activate: allocate a chroma function @@ -83,122 +106,171 @@ 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 defined (MODULE_NAME_IS_i420_rgb) size_t i_tables_size; #endif - if( p_vout->render.i_width & 1 || p_vout->render.i_height & 1 ) +#if CPU_CAPABILITY + if( !(vlc_CPU() & CPU_CAPABILITY) ) + return VLC_EGENERIC; +#endif + if( p_filter->fmt_out.video.i_width & 1 + || p_filter->fmt_out.video.i_height & 1 ) { - return -1; + return VLC_EGENERIC; } - switch( p_vout->render.i_chroma ) + 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 ) + 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'): - p_vout->chroma.pf_convert = E_(I420_RGB8); + 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'): -#if defined (MODULE_NAME_IS_i420_rgb_mmx) + 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_vout->output.i_rmask != 0x7c00 - || p_vout->output.i_gmask != 0x03e0 - || p_vout->output.i_bmask != 0x001f ) - && ( p_vout->output.i_rmask != 0xf800 - || p_vout->output.i_gmask != 0x07e0 - || p_vout->output.i_bmask != 0x001f ) ) + if( ( p_filter->fmt_out.video.i_rmask == 0x7c00 + && p_filter->fmt_out.video.i_gmask == 0x03e0 + && p_filter->fmt_out.video.i_bmask == 0x001f ) ) + { + /* R5G5B6 pixel format */ + msg_Dbg(p_this, "RGB pixel format is R5G5B5"); + p_filter->pf_video_filter = I420_R5G5B5_Filter; + } + else if( ( p_filter->fmt_out.video.i_rmask == 0xf800 + && p_filter->fmt_out.video.i_gmask == 0x07e0 + && p_filter->fmt_out.video.i_bmask == 0x001f ) ) { - return -1; + /* R5G6B5 pixel format */ + msg_Dbg(p_this, "RGB pixel format is R5G6B5"); + p_filter->pf_video_filter = I420_R5G6B5_Filter; } + else + return VLC_EGENERIC; +#else + // generic C chroma converter */ + p_filter->pf_video_filter = I420_RGB16_Filter; #endif - p_vout->chroma.pf_convert = E_(I420_RGB16); break; - case VLC_FOURCC('R','V','2','4'): - case VLC_FOURCC('R','V','3','2'): -#if defined (MODULE_NAME_IS_i420_rgb_mmx) +#if 0 + /* Hmmm, is there only X11 using 32bits per pixel for RV24 ? */ + case VLC_CODEC_RGB24: +#endif + + case VLC_CODEC_RGB32: +#if ! defined (MODULE_NAME_IS_i420_rgb) /* If we don't have support for the bitmasks, bail out */ - if( p_vout->output.i_rmask != 0x00ff0000 - || p_vout->output.i_gmask != 0x0000ff00 - || p_vout->output.i_bmask != 0x000000ff ) + if( p_filter->fmt_out.video.i_rmask == 0x00ff0000 + && p_filter->fmt_out.video.i_gmask == 0x0000ff00 + && p_filter->fmt_out.video.i_bmask == 0x000000ff ) + { + /* A8R8G8B8 pixel format */ + msg_Dbg(p_this, "RGB pixel format is A8R8G8B8"); + p_filter->pf_video_filter = I420_A8R8G8B8_Filter; + } + else if( p_filter->fmt_out.video.i_rmask == 0xff000000 + && p_filter->fmt_out.video.i_gmask == 0x00ff0000 + && p_filter->fmt_out.video.i_bmask == 0x0000ff00 ) + { + /* R8G8B8A8 pixel format */ + msg_Dbg(p_this, "RGB pixel format is R8G8B8A8"); + p_filter->pf_video_filter = I420_R8G8B8A8_Filter; + } + else if( p_filter->fmt_out.video.i_rmask == 0x0000ff00 + && p_filter->fmt_out.video.i_gmask == 0x00ff0000 + && p_filter->fmt_out.video.i_bmask == 0xff000000 ) + { + /* B8G8R8A8 pixel format */ + msg_Dbg(p_this, "RGB pixel format is B8G8R8A8"); + p_filter->pf_video_filter = I420_B8G8R8A8_Filter; + } + else if( p_filter->fmt_out.video.i_rmask == 0x000000ff + && p_filter->fmt_out.video.i_gmask == 0x0000ff00 + && p_filter->fmt_out.video.i_bmask == 0x00ff0000 ) { - return -1; + /* A8B8G8R8 pixel format */ + msg_Dbg(p_this, "RGB pixel format is A8B8G8R8"); + p_filter->pf_video_filter = I420_A8B8G8R8_Filter; } + else + return VLC_EGENERIC; +#else + /* generic C chroma converter */ + p_filter->pf_video_filter = I420_RGB32_Filter; #endif - p_vout->chroma.pf_convert = E_(I420_RGB32); break; default: - return -1; + return VLC_EGENERIC; } break; default: - return -1; + return VLC_EGENERIC; } - - p_vout->chroma.p_sys = malloc( sizeof( chroma_sys_t ) ); - if( p_vout->chroma.p_sys == NULL ) + + p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); + if( p_filter->p_sys == NULL ) { - return -1; + return VLC_EGENERIC; } - switch( p_vout->output.i_chroma ) + switch( p_filter->fmt_out.video.i_chroma ) { #if defined (MODULE_NAME_IS_i420_rgb) - case VLC_FOURCC('R','G','B','2'): - p_vout->chroma.p_sys->p_buffer = malloc( VOUT_MAX_WIDTH ); + 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'): - p_vout->chroma.p_sys->p_buffer = malloc( VOUT_MAX_WIDTH * 2 ); + 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'): - p_vout->chroma.p_sys->p_buffer = malloc( VOUT_MAX_WIDTH * 4 ); + case VLC_CODEC_RGB24: + case VLC_CODEC_RGB32: + p_filter->p_sys->p_buffer = malloc( VOUT_MAX_WIDTH * 4 ); break; default: - p_vout->chroma.p_sys->p_buffer = NULL; + p_filter->p_sys->p_buffer = NULL; break; } - if( p_vout->chroma.p_sys->p_buffer == NULL ) + if( p_filter->p_sys->p_buffer == NULL ) { - free( p_vout->chroma.p_sys ); - return -1; + free( p_filter->p_sys ); + return VLC_EGENERIC; } - p_vout->chroma.p_sys->p_offset = malloc( p_vout->output.i_width - * ( ( p_vout->output.i_chroma - == VLC_FOURCC('R','G','B','2') ) ? 2 : 1 ) + p_filter->p_sys->p_offset = malloc( p_filter->fmt_out.video.i_width + * ( ( p_filter->fmt_out.video.i_chroma + == VLC_CODEC_RGB8 ) ? 2 : 1 ) * sizeof( int ) ); - if( p_vout->chroma.p_sys->p_offset == NULL ) + if( p_filter->p_sys->p_offset == NULL ) { - free( p_vout->chroma.p_sys->p_buffer ); - free( p_vout->chroma.p_sys ); - return -1; + free( p_filter->p_sys->p_buffer ); + free( p_filter->p_sys ); + return VLC_EGENERIC; } #if defined (MODULE_NAME_IS_i420_rgb) - switch( p_vout->output.i_chroma ) + 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 */ @@ -206,19 +278,19 @@ static int Activate( vlc_object_t *p_this ) break; } - p_vout->chroma.p_sys->p_base = malloc( i_tables_size ); - if( p_vout->chroma.p_sys->p_base == NULL ) + p_filter->p_sys->p_base = malloc( i_tables_size ); + if( p_filter->p_sys->p_base == NULL ) { - free( p_vout->chroma.p_sys->p_offset ); - free( p_vout->chroma.p_sys->p_buffer ); - free( p_vout->chroma.p_sys ); + free( p_filter->p_sys->p_offset ); + free( p_filter->p_sys->p_buffer ); + free( p_filter->p_sys ); return -1; } - SetYUV( p_vout ); + SetYUV( p_filter ); #endif - return 0; + return 0; } /***************************************************************************** @@ -228,16 +300,30 @@ static int Activate( vlc_object_t *p_this ) *****************************************************************************/ static void Deactivate( vlc_object_t *p_this ) { - vout_thread_t *p_vout = (vout_thread_t *)p_this; + filter_t *p_filter = (filter_t *)p_this; #if defined (MODULE_NAME_IS_i420_rgb) - free( p_vout->chroma.p_sys->p_base ); + free( p_filter->p_sys->p_base ); #endif - free( p_vout->chroma.p_sys->p_offset ); - free( p_vout->chroma.p_sys->p_buffer ); - free( p_vout->chroma.p_sys ); + free( p_filter->p_sys->p_offset ); + free( p_filter->p_sys->p_buffer ); + free( p_filter->p_sys ); } +#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 ) +VIDEO_FILTER_WRAPPER( I420_R5G6B5 ) +VIDEO_FILTER_WRAPPER( I420_A8R8G8B8 ) +VIDEO_FILTER_WRAPPER( I420_R8G8B8A8 ) +VIDEO_FILTER_WRAPPER( I420_B8G8R8A8 ) +VIDEO_FILTER_WRAPPER( I420_A8B8G8R8 ) +#endif + #if defined (MODULE_NAME_IS_i420_rgb) /***************************************************************************** * SetGammaTable: return intensity table transformed by gamma curve. @@ -261,88 +347,93 @@ static void SetGammaTable( int *pi_table, double f_gamma ) /***************************************************************************** * SetYUV: compute tables and set function pointers *****************************************************************************/ -static void SetYUV( vout_thread_t *p_vout ) +static void SetYUV( filter_t *p_filter ) { - int pi_gamma[256]; /* gamma table */ - int i_index; /* index in tables */ + int pi_gamma[256]; /* gamma table */ + volatile int i_index; /* index in tables */ + /* We use volatile here to work around a strange gcc-3.3.4 + * optimization bug */ /* Build gamma table */ - SetGammaTable( pi_gamma, p_vout->f_gamma ); + SetGammaTable( pi_gamma, 0 ); //p_filter/*FIXME wasn't used anywhere anyway*/->f_gamma ); /* * Set pointers and build YUV tables */ /* Color: build red, green and blue tables */ - switch( p_vout->output.i_chroma ) + switch( p_filter->fmt_out.video.i_chroma ) { - case VLC_FOURCC('R','G','B','2'): - p_vout->chroma.p_sys->p_rgb8 = (uint8_t *)p_vout->chroma.p_sys->p_base; - Set8bppPalette( p_vout, p_vout->chroma.p_sys->p_rgb8 ); + 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'): - p_vout->chroma.p_sys->p_rgb16 = (uint16_t *)p_vout->chroma.p_sys->p_base; + 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++ ) { - p_vout->chroma.p_sys->p_rgb16[RED_OFFSET - RED_MARGIN + i_index] = RGB2PIXEL( p_vout, pi_gamma[0], 0, 0 ); - p_vout->chroma.p_sys->p_rgb16[RED_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, pi_gamma[255], 0, 0 ); + p_filter->p_sys->p_rgb16[RED_OFFSET - RED_MARGIN + i_index] = RGB2PIXEL( p_filter, pi_gamma[0], 0, 0 ); + p_filter->p_sys->p_rgb16[RED_OFFSET + 256 + i_index] = RGB2PIXEL( p_filter, pi_gamma[255], 0, 0 ); } for( i_index = 0; i_index < GREEN_MARGIN; i_index++ ) { - p_vout->chroma.p_sys->p_rgb16[GREEN_OFFSET - GREEN_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[0], 0 ); - p_vout->chroma.p_sys->p_rgb16[GREEN_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[255], 0 ); + p_filter->p_sys->p_rgb16[GREEN_OFFSET - GREEN_MARGIN + i_index] = RGB2PIXEL( p_filter, 0, pi_gamma[0], 0 ); + p_filter->p_sys->p_rgb16[GREEN_OFFSET + 256 + i_index] = RGB2PIXEL( p_filter, 0, pi_gamma[255], 0 ); } for( i_index = 0; i_index < BLUE_MARGIN; i_index++ ) { - p_vout->chroma.p_sys->p_rgb16[BLUE_OFFSET - BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[0] ); - p_vout->chroma.p_sys->p_rgb16[BLUE_OFFSET + BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[255] ); + p_filter->p_sys->p_rgb16[BLUE_OFFSET - BLUE_MARGIN + i_index] = RGB2PIXEL( p_filter, 0, 0, pi_gamma[0] ); + p_filter->p_sys->p_rgb16[BLUE_OFFSET + BLUE_MARGIN + i_index] = RGB2PIXEL( p_filter, 0, 0, pi_gamma[255] ); } for( i_index = 0; i_index < 256; i_index++ ) { - p_vout->chroma.p_sys->p_rgb16[RED_OFFSET + i_index] = RGB2PIXEL( p_vout, pi_gamma[ i_index ], 0, 0 ); - p_vout->chroma.p_sys->p_rgb16[GREEN_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[ i_index ], 0 ); - p_vout->chroma.p_sys->p_rgb16[BLUE_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[ i_index ] ); + p_filter->p_sys->p_rgb16[RED_OFFSET + i_index] = RGB2PIXEL( p_filter, pi_gamma[ i_index ], 0, 0 ); + p_filter->p_sys->p_rgb16[GREEN_OFFSET + i_index] = RGB2PIXEL( p_filter, 0, pi_gamma[ i_index ], 0 ); + p_filter->p_sys->p_rgb16[BLUE_OFFSET + i_index] = RGB2PIXEL( p_filter, 0, 0, pi_gamma[ i_index ] ); } break; - case VLC_FOURCC('R','V','2','4'): - case VLC_FOURCC('R','V','3','2'): - p_vout->chroma.p_sys->p_rgb32 = (uint32_t *)p_vout->chroma.p_sys->p_base; + 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++ ) { - p_vout->chroma.p_sys->p_rgb32[RED_OFFSET - RED_MARGIN + i_index] = RGB2PIXEL( p_vout, pi_gamma[0], 0, 0 ); - p_vout->chroma.p_sys->p_rgb32[RED_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, pi_gamma[255], 0, 0 ); + p_filter->p_sys->p_rgb32[RED_OFFSET - RED_MARGIN + i_index] = RGB2PIXEL( p_filter, pi_gamma[0], 0, 0 ); + p_filter->p_sys->p_rgb32[RED_OFFSET + 256 + i_index] = RGB2PIXEL( p_filter, pi_gamma[255], 0, 0 ); } for( i_index = 0; i_index < GREEN_MARGIN; i_index++ ) { - p_vout->chroma.p_sys->p_rgb32[GREEN_OFFSET - GREEN_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[0], 0 ); - p_vout->chroma.p_sys->p_rgb32[GREEN_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[255], 0 ); + p_filter->p_sys->p_rgb32[GREEN_OFFSET - GREEN_MARGIN + i_index] = RGB2PIXEL( p_filter, 0, pi_gamma[0], 0 ); + p_filter->p_sys->p_rgb32[GREEN_OFFSET + 256 + i_index] = RGB2PIXEL( p_filter, 0, pi_gamma[255], 0 ); } for( i_index = 0; i_index < BLUE_MARGIN; i_index++ ) { - p_vout->chroma.p_sys->p_rgb32[BLUE_OFFSET - BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[0] ); - p_vout->chroma.p_sys->p_rgb32[BLUE_OFFSET + BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[255] ); + p_filter->p_sys->p_rgb32[BLUE_OFFSET - BLUE_MARGIN + i_index] = RGB2PIXEL( p_filter, 0, 0, pi_gamma[0] ); + p_filter->p_sys->p_rgb32[BLUE_OFFSET + BLUE_MARGIN + i_index] = RGB2PIXEL( p_filter, 0, 0, pi_gamma[255] ); } for( i_index = 0; i_index < 256; i_index++ ) { - p_vout->chroma.p_sys->p_rgb32[RED_OFFSET + i_index] = RGB2PIXEL( p_vout, pi_gamma[ i_index ], 0, 0 ); - p_vout->chroma.p_sys->p_rgb32[GREEN_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[ i_index ], 0 ); - p_vout->chroma.p_sys->p_rgb32[BLUE_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[ i_index ] ); + p_filter->p_sys->p_rgb32[RED_OFFSET + i_index] = RGB2PIXEL( p_filter, pi_gamma[ i_index ], 0, 0 ); + p_filter->p_sys->p_rgb32[GREEN_OFFSET + i_index] = RGB2PIXEL( p_filter, 0, pi_gamma[ i_index ], 0 ); + p_filter->p_sys->p_rgb32[BLUE_OFFSET + i_index] = RGB2PIXEL( p_filter, 0, 0, pi_gamma[ i_index ] ); } break; } } -static void Set8bppPalette( vout_thread_t *p_vout, uint8_t *p_rgb8 ) +static void Set8bppPalette( filter_t *p_filter, uint8_t *p_rgb8 ) { #define CLIP( x ) ( ((x < 0) ? 0 : (x > 255) ? 255 : x) << 8 ) int y,u,v; int r,g,b; int i = 0, j = 0; - uint16_t red[ 256 ], green[ 256 ], blue[ 256 ]; + uint16_t *p_cmap_r = p_filter->p_sys->p_rgb_r; + uint16_t *p_cmap_g = p_filter->p_sys->p_rgb_g; + uint16_t *p_cmap_b = p_filter->p_sys->p_rgb_b; + unsigned char p_lookup[PALETTE_TABLE_SIZE]; /* This loop calculates the intersection of an YUV box and the RGB cube. */ @@ -364,14 +455,20 @@ static void Set8bppPalette( vout_thread_t *p_vout, uint8_t *p_rgb8 ) * fscked up my code */ if( j == 256 ) { - msg_Err( p_vout, "no colors left in palette" ); + msg_Err( p_filter, "no colors left in palette" ); break; } /* Clip the colors */ - red[ j ] = CLIP( r ); - green[ j ] = CLIP( g ); - blue[ j ] = CLIP( b ); + p_cmap_r[ j ] = CLIP( r ); + p_cmap_g[ j ] = CLIP( g ); + p_cmap_b[ j ] = CLIP( b ); + +#if 0 + printf("+++Alloc RGB cmap %d (%d, %d, %d)\n", j, + p_cmap_r[ j ] >>8, p_cmap_g[ j ] >>8, + p_cmap_b[ j ] >>8); +#endif /* Allocate color */ p_lookup[ i ] = 1; @@ -388,7 +485,8 @@ static void Set8bppPalette( vout_thread_t *p_vout, uint8_t *p_rgb8 ) } /* The colors have been allocated, we can set the palette */ - p_vout->output.pf_setpalette( p_vout, red, green, blue ); + /* FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME + p_filter->fmt_out.video.pf_setpalette( p_filter, p_cmap_r, p_cmap_g, p_cmap_b );*/ #if 0 /* There will eventually be a way to know which colors