X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_chroma%2Fi420_rgb.h;h=66171fbeee5ad0e40355391250d0c691739100b9;hb=d66255d540dfac647c8a7d8aded8522a02b3ca2d;hp=b6d8e2f435e60b089a9d17b861c3390f4b553740;hpb=b144a5efaba05eeae7714d4ec3a82cd9bf07f8c6;p=vlc diff --git a/modules/video_chroma/i420_rgb.h b/modules/video_chroma/i420_rgb.h index b6d8e2f435..66171fbeee 100644 --- a/modules/video_chroma/i420_rgb.h +++ b/modules/video_chroma/i420_rgb.h @@ -1,8 +1,8 @@ /***************************************************************************** * i420_rgb.h : YUV to bitmap RGB conversion module for vlc ***************************************************************************** - * Copyright (C) 2000 VideoLAN - * $Id: i420_rgb.h,v 1.3 2002/11/26 20:04:33 sam Exp $ + * Copyright (C) 2000, 2004 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,26 +18,37 @@ * * 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. *****************************************************************************/ -/***************************************************************************** - * chroma_sys_t: chroma method descriptor - ***************************************************************************** +/** Number of entries in RGB palette/colormap */ +#define CMAP_RGB2_SIZE 256 + +/** + * filter_sys_t: chroma method descriptor + * This structure is part of the chroma transformation descriptor, it * describes the yuv2rgb specific properties. - *****************************************************************************/ -struct chroma_sys_t + */ +struct filter_sys_t { - u8 *p_buffer; + uint8_t *p_buffer; int *p_offset; #ifdef MODULE_NAME_IS_i420_rgb - /* Pre-calculated conversion tables */ - void *p_base; /* base for all conversion tables */ - u8 *p_rgb8; /* RGB 8 bits table */ - u16 *p_rgb16; /* RGB 16 bits table */ - u32 *p_rgb32; /* RGB 32 bits table */ + /**< Pre-calculated conversion tables */ + void *p_base; /**< base for all conversion tables */ + uint8_t *p_rgb8; /**< RGB 8 bits table */ + uint16_t *p_rgb16; /**< RGB 16 bits table */ + uint32_t *p_rgb32; /**< RGB 32 bits table */ + + /**< To get RGB value for palette entry i, use (p_rgb_r[i], p_rgb_g[i], + p_rgb_b[i]). Note these are 16 bits per pixel. For 8bpp entries, + shift right 8 bits. + */ + uint16_t p_rgb_r[CMAP_RGB2_SIZE]; /**< Red values of palette */ + uint16_t p_rgb_g[CMAP_RGB2_SIZE]; /**< Green values of palette */ + uint16_t p_rgb_b[CMAP_RGB2_SIZE]; /**< Blue values of palette */ #endif }; @@ -45,11 +56,18 @@ struct chroma_sys_t * Prototypes *****************************************************************************/ #ifdef MODULE_NAME_IS_i420_rgb -void E_(I420_RGB8) ( vout_thread_t *, picture_t *, picture_t * ); -void E_(I420_RGB16_dither) ( vout_thread_t *, picture_t *, picture_t * ); +void I420_RGB8 ( filter_t *, picture_t *, picture_t * ); +void I420_RGB16_dither ( filter_t *, picture_t *, picture_t * ); +void I420_RGB16 ( filter_t *, picture_t *, picture_t * ); +void I420_RGB32 ( filter_t *, picture_t *, picture_t * ); +#else // if defined(MODULE_NAME_IS_i420_rgb_mmx) +void I420_R5G5B5 ( filter_t *, picture_t *, picture_t * ); +void I420_R5G6B5 ( filter_t *, picture_t *, picture_t * ); +void I420_A8R8G8B8 ( filter_t *, picture_t *, picture_t * ); +void I420_R8G8B8A8 ( filter_t *, picture_t *, picture_t * ); +void I420_B8G8R8A8 ( filter_t *, picture_t *, picture_t * ); +void I420_A8B8G8R8 ( filter_t *, picture_t *, picture_t * ); #endif -void E_(I420_RGB16) ( vout_thread_t *, picture_t *, picture_t * ); -void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); /***************************************************************************** * CONVERT_*_PIXEL: pixel conversion macros @@ -152,7 +170,7 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); * Rewind buffer and offset, then copy and scale line */ \ p_buffer = p_buffer_start; \ p_offset = p_offset_start; \ - for( i_x = p_vout->output.i_width / 16; i_x--; ) \ + for( i_x = p_filter->fmt_out.video.i_width / 16; i_x--; ) \ { \ *p_pic++ = *p_buffer; p_buffer += *p_offset++; \ *p_pic++ = *p_buffer; p_buffer += *p_offset++; \ @@ -171,17 +189,17 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); *p_pic++ = *p_buffer; p_buffer += *p_offset++; \ *p_pic++ = *p_buffer; p_buffer += *p_offset++; \ } \ - for( i_x = p_vout->output.i_width & 15; i_x--; ) \ + for( i_x = p_filter->fmt_out.video.i_width & 15; i_x--; ) \ { \ *p_pic++ = *p_buffer; p_buffer += *p_offset++; \ } \ - (u8*)p_pic += i_right_margin; \ + p_pic = (void*)((uint8_t*)p_pic + i_right_margin ); \ } \ else \ { \ /* No scaling, conversion has been done directly in picture memory. \ * Increment of picture pointer to end of line is still needed */ \ - (u8*)p_pic += p_dest->p->i_pitch; \ + p_pic = (void*)((uint8_t*)p_pic + p_dest->p->i_pitch ); \ } \ /***************************************************************************** @@ -194,7 +212,7 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); { \ /* Horizontal scaling - we can't use a buffer due to dithering */ \ p_offset = p_offset_start; \ - for( i_x = p_vout->output.i_width / 16; i_x--; ) \ + for( i_x = p_filter->fmt_out.video.i_width / 16; i_x--; ) \ { \ CONVERT_4YUV_PIXEL_SCALE( CHROMA ) \ CONVERT_4YUV_PIXEL_SCALE( CHROMA ) \ @@ -204,7 +222,7 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); } \ else \ { \ - for( i_x = p_vout->render.i_width / 16; i_x--; ) \ + for( i_x = p_filter->fmt_in.video.i_width / 16; i_x--; ) \ { \ CONVERT_4YUV_PIXEL( CHROMA ) \ CONVERT_4YUV_PIXEL( CHROMA ) \ @@ -213,7 +231,7 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); } \ } \ /* Increment of picture pointer to end of line is still needed */ \ - (u8*)p_pic += i_right_margin; \ + p_pic = (void*)((uint8_t*)p_pic + i_right_margin ); \ \ /* Increment the Y coordinate in the matrix, modulo 4 */ \ i_real_y = (i_real_y + 1) & 0x3; \ @@ -240,10 +258,10 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); switch( i_vscale ) \ { \ case -1: /* vertical scaling factor is < 1 */ \ - while( (i_scale_count -= p_vout->output.i_height) > 0 ) \ + while( (i_scale_count -= p_filter->fmt_out.video.i_height) > 0 ) \ { \ /* Height reduction: skip next source line */ \ - p_y += p_vout->render.i_width; \ + p_y += p_filter->fmt_in.video.i_width; \ i_y++; \ if( (CHROMA == 420) || (CHROMA == 422) ) \ { \ @@ -255,21 +273,20 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); } \ else if( CHROMA == 444 ) \ { \ - p_u += p_vout->render.i_width; \ - p_v += p_vout->render.i_width; \ + p_u += p_filter->fmt_in.video.i_width; \ + p_v += p_filter->fmt_in.video.i_width; \ } \ } \ - i_scale_count += p_vout->render.i_height; \ + i_scale_count += p_filter->fmt_in.video.i_height; \ break; \ case 1: /* vertical scaling factor is > 1 */ \ - while( (i_scale_count -= p_vout->render.i_height) > 0 ) \ + while( (i_scale_count -= p_filter->fmt_in.video.i_height) > 0 ) \ { \ /* Height increment: copy previous picture line */ \ - p_vout->p_vlc->pf_memcpy( p_pic, p_pic_start, \ - p_vout->output.i_width * BPP ); \ - (u8*)p_pic += p_dest->p->i_pitch; \ + vlc_memcpy( p_pic, p_pic_start, p_filter->fmt_out.video.i_width * BPP ); \ + p_pic = (void*)((uint8_t*)p_pic + p_dest->p->i_pitch ); \ } \ - i_scale_count += p_vout->output.i_height; \ + i_scale_count += p_filter->fmt_out.video.i_height; \ break; \ } \ @@ -296,10 +313,10 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); switch( i_vscale ) \ { \ case -1: /* vertical scaling factor is < 1 */ \ - while( (i_scale_count -= p_vout->output.i_height) > 0 ) \ + while( (i_scale_count -= p_filter->fmt_out.video.i_height) > 0 ) \ { \ /* Height reduction: skip next source line */ \ - p_y += p_vout->render.i_width; \ + p_y += p_filter->fmt_in.video.i_width; \ i_y++; \ if( (CHROMA == 420) || (CHROMA == 422) ) \ { \ @@ -311,21 +328,21 @@ void E_(I420_RGB32) ( vout_thread_t *, picture_t *, picture_t * ); } \ else if( CHROMA == 444 ) \ { \ - p_u += p_vout->render.i_width; \ - p_v += p_vout->render.i_width; \ + p_u += p_filter->fmt_in.video.i_width; \ + p_v += p_filter->fmt_in.video.i_width; \ } \ } \ - i_scale_count += p_vout->render.i_height; \ + i_scale_count += p_filter->fmt_in.video.i_height; \ break; \ case 1: /* vertical scaling factor is > 1 */ \ - while( (i_scale_count -= p_vout->render.i_height) > 0 ) \ + while( (i_scale_count -= p_filter->fmt_in.video.i_height) > 0 ) \ { \ - p_y -= p_vout->render.i_width; \ + p_y -= p_filter->fmt_in.video.i_width; \ p_u -= i_chroma_width; \ p_v -= i_chroma_width; \ SCALE_WIDTH_DITHER( CHROMA ); \ } \ - i_scale_count += p_vout->output.i_height; \ + i_scale_count += p_filter->fmt_out.video.i_height; \ break; \ } \