Commit 52d7937c authored by Sam Hocevar's avatar Sam Hocevar

. rajout de l'option -Winline

 . fix de certaines fonctions qui devraient �tre inlin�es
 . gain de place dans la YUVMMX
parent e13aed00
[]
0.1.99f :
* plugin detection now works
* "gvlc", "fbvlc", "ggivlc" aliases now work
* fixed functions that weren't properly inlined
* removed bloat from the MMX YUV plugin
Thu Jul 20 15:14:06 CEST 2000 Thu Jul 20 15:14:06 CEST 2000
0.1.99e : 0.1.99e :
......
...@@ -8,6 +8,11 @@ A typical way to configure the vlc is : ...@@ -8,6 +8,11 @@ A typical way to configure the vlc is :
./configure --prefix=/usr --enable-mmx --enable-gnome ./configure --prefix=/usr --enable-mmx --enable-gnome
For a full compilation, you may try :
./configure --prefix=/usr --enable-mmx --enable-gnome --enable-fb \
--enable-glide --enable-ggi --enable-mga --enable-esd
See `./configure --help' for more information. See `./configure --help' for more information.
Then, run `make', and `make install' to install it. Then, run `make', and `make install' to install it.
......
...@@ -79,12 +79,14 @@ endif ...@@ -79,12 +79,14 @@ endif
# C compiler flags: compilation # C compiler flags: compilation
# #
CCFLAGS += $(DEFINE) $(INCLUDE) CCFLAGS += $(DEFINE) $(INCLUDE)
CCFLAGS += -Wall CCFLAGS += -Wall -Winline
CCFLAGS += -D_REENTRANT CCFLAGS += -D_REENTRANT
CCFLAGS += -D_GNU_SOURCE CCFLAGS += -D_GNU_SOURCE
# flags needed for clean beos compilation # flags needed for clean beos compilation
ifeq ($(SYS),beos)
CCFLAGS += -Wno-multichar -Wno-ctor-dtor-privacy -Woverloaded-virtual CCFLAGS += -Wno-multichar -Wno-ctor-dtor-privacy -Woverloaded-virtual
endif
# Optimizations : don't compile debug versions with them # Optimizations : don't compile debug versions with them
ifeq ($(DEBUG),0) ifeq ($(DEBUG),0)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH VLC 1 "March 13, 2000" .TH VLC 1 "July 30, 2000"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
...@@ -36,7 +36,7 @@ A summary of options is included below. ...@@ -36,7 +36,7 @@ A summary of options is included below.
Disable audio output. Disable audio output.
.TP .TP
.B \-\-aout <plugin> .B \-\-aout <plugin>
Specify an audio output plugin. Specify an audio output plugin: "dsp", "esd", for instance.
.TP .TP
.B \-\-stereo, \-\-mono .B \-\-stereo, \-\-mono
Choose stereo or mono audio output Choose stereo or mono audio output
...@@ -45,7 +45,10 @@ Choose stereo or mono audio output ...@@ -45,7 +45,10 @@ Choose stereo or mono audio output
Disable video output. Disable video output.
.TP .TP
.B \-\-vout <plugin> .B \-\-vout <plugin>
Specify a video output plugin. Specify a video output plugin: "gnome", "fb", "glide", for instance.
.TP
.B \-\-yuv <plugin>
Specify a YUV plugin: "mmx", "nommx", for instance.
.TP .TP
.B \-\-display <display> .B \-\-display <display>
Specify the display name. Specify the display name.
......
...@@ -90,13 +90,13 @@ typedef struct picture_s ...@@ -90,13 +90,13 @@ typedef struct picture_s
#define YUV_444_PICTURE 102 /* 4:4:4 YUV picture */ #define YUV_444_PICTURE 102 /* 4:4:4 YUV picture */
/* Pictures status */ /* Pictures status */
#define FREE_PICTURE 0 /* picture is free and not allocated */ #define FREE_PICTURE 0 /* free and not allocated */
#define RESERVED_PICTURE 1 /* picture is allocated and reserved */ #define RESERVED_PICTURE 1 /* allocated and reserved */
#define RESERVED_DATED_PICTURE 2 /* picture is waiting for DisplayPicture */ #define RESERVED_DATED_PICTURE 2 /* waiting for DisplayPicture */
#define RESERVED_DISP_PICTURE 3 /* picture is waiting for a DatePixture */ #define RESERVED_DISP_PICTURE 3 /* waiting for a DatePicture */
#define READY_PICTURE 4 /* picture is ready for display */ #define READY_PICTURE 4 /* ready for display */
#define DISPLAYED_PICTURE 5/* picture has been displayed but is linked */ #define DISPLAYED_PICTURE 5 /* been displayed but is linked */
#define DESTROYED_PICTURE 6 /* picture is allocated but no more used */ #define DESTROYED_PICTURE 6 /* allocated but no more used */
/* Aspect ratios (ISO/IEC 13818-2 section 6.3.3, table 6-3) */ /* Aspect ratios (ISO/IEC 13818-2 section 6.3.3, table 6-3) */
#define AR_SQUARE_PICTURE 1 /* square pixels */ #define AR_SQUARE_PICTURE 1 /* square pixels */
...@@ -105,9 +105,9 @@ typedef struct picture_s ...@@ -105,9 +105,9 @@ typedef struct picture_s
#define AR_221_1_PICTURE 4 /* 2.21:1 picture (movie) */ #define AR_221_1_PICTURE 4 /* 2.21:1 picture (movie) */
/***************************************************************************** /*****************************************************************************
* subpicture_t: video sub picture unit * subpicture_t: video subtitle
***************************************************************************** *****************************************************************************
* Any sub picture unit destined to be displayed by a video output thread should * Any subtitle destined to be displayed by a video output thread should
* be stored in this structure from it's creation to it's effective display. * be stored in this structure from it's creation to it's effective display.
* Subtitle type and flags should only be modified by the output thread. Note * Subtitle type and flags should only be modified by the output thread. Note
* that an empty subtitle MUST have its flags set to 0. * that an empty subtitle MUST have its flags set to 0.
...@@ -118,7 +118,7 @@ typedef struct subpicture_s ...@@ -118,7 +118,7 @@ typedef struct subpicture_s
int i_type; /* type */ int i_type; /* type */
int i_status; /* flags */ int i_status; /* flags */
int i_size; /* data size */ int i_size; /* data size */
struct subpicture_s * p_next; /* next SPU to be displayed */ struct subpicture_s * p_next; /* next subtitle to be displayed */
/* Other properties */ /* Other properties */
mtime_t begin_date; /* beginning of display date */ mtime_t begin_date; /* beginning of display date */
...@@ -126,7 +126,7 @@ typedef struct subpicture_s ...@@ -126,7 +126,7 @@ typedef struct subpicture_s
/* Display properties - these properties are only indicative and may be /* Display properties - these properties are only indicative and may be
* changed by the video output thread, or simply ignored depending of the * changed by the video output thread, or simply ignored depending of the
* subpicture type. */ * subtitle type. */
int i_x; /* offset from alignment position */ int i_x; /* offset from alignment position */
int i_y; /* offset from alignment position */ int i_y; /* offset from alignment position */
int i_width; /* picture width */ int i_width; /* picture width */
...@@ -165,10 +165,10 @@ typedef struct subpicture_s ...@@ -165,10 +165,10 @@ typedef struct subpicture_s
#define TEXT_SUBPICTURE 200 /* single line text */ #define TEXT_SUBPICTURE 200 /* single line text */
/* Subpicture status */ /* Subpicture status */
#define FREE_SUBPICTURE 0 /* subpicture is free and not allocated */ #define FREE_SUBPICTURE 0 /* free and not allocated */
#define RESERVED_SUBPICTURE 1 /* subpicture is allocated and reserved */ #define RESERVED_SUBPICTURE 1 /* allocated and reserved */
#define READY_SUBPICTURE 2 /* subpicture is ready for display */ #define READY_SUBPICTURE 2 /* ready for display */
#define DESTROYED_SUBPICTURE 3/* subpicture is allocated but no more used */ #define DESTROYED_SUBPICTURE 3 /* allocated but not used anymore */
/* Alignment types */ /* Alignment types */
#define RIGHT_ALIGN 10 /* x is absolute for right */ #define RIGHT_ALIGN 10 /* x is absolute for right */
...@@ -177,7 +177,7 @@ typedef struct subpicture_s ...@@ -177,7 +177,7 @@ typedef struct subpicture_s
#define LEFT_RALIGN 13 /* x is relative for left from left */ #define LEFT_RALIGN 13 /* x is relative for left from left */
#define CENTER_ALIGN 20 /* x, y are absolute for center */ #define CENTER_ALIGN 20 /* x, y are absolute for center */
#define CENTER_RALIGN 21 /* x, y are relative for center from center */ #define CENTER_RALIGN 21 /* x,y are relative for center from center */
#define BOTTOM_ALIGN 30 /* y is absolute for bottom */ #define BOTTOM_ALIGN 30 /* y is absolute for bottom */
#define TOP_ALIGN 31 /* y is absolute for top */ #define TOP_ALIGN 31 /* y is absolute for top */
......
...@@ -24,10 +24,10 @@ ...@@ -24,10 +24,10 @@
*****************************************************************************/ *****************************************************************************/
/***************************************************************************** /*****************************************************************************
* vout_yuv_convert_t: YUV convertion function * vout_yuv_convert_t: YUV conversion function
***************************************************************************** *****************************************************************************
* This is the prototype common to all convertion functions. The type of p_pic * This is the prototype common to all conversion functions. The type of p_pic
* will change depending of the screen depth treated. * will change depending on the processed screen depth.
* Parameters: * Parameters:
* p_vout video output thread * p_vout video output thread
* p_pic picture address * p_pic picture address
...@@ -45,13 +45,13 @@ typedef void (vout_yuv_convert_t)( p_vout_thread_t p_vout, void *p_pic, ...@@ -45,13 +45,13 @@ typedef void (vout_yuv_convert_t)( p_vout_thread_t p_vout, void *p_pic,
int i_matrix_coefficients ); int i_matrix_coefficients );
/***************************************************************************** /*****************************************************************************
* vout_yuv_t: pre-calculated YUV convertion tables * vout_yuv_t: pre-calculated YUV conversion tables
***************************************************************************** *****************************************************************************
* These tables are used by convertion and scaling functions. * These tables are used by conversion and scaling functions.
*****************************************************************************/ *****************************************************************************/
typedef struct vout_yuv_s typedef struct vout_yuv_s
{ {
/* Convertion functions */ /* conversion functions */
vout_yuv_convert_t * p_Convert420; /* YUV 4:2:0 converter */ vout_yuv_convert_t * p_Convert420; /* YUV 4:2:0 converter */
vout_yuv_convert_t * p_Convert422; /* YUV 4:2:2 converter */ vout_yuv_convert_t * p_Convert422; /* YUV 4:2:2 converter */
vout_yuv_convert_t * p_Convert444; /* YUV 4:4:4 converter */ vout_yuv_convert_t * p_Convert444; /* YUV 4:4:4 converter */
...@@ -69,21 +69,21 @@ typedef struct vout_yuv_s ...@@ -69,21 +69,21 @@ typedef struct vout_yuv_s
} yuv; } yuv;
/* Temporary conversion buffer and offset array */ /* Temporary conversion buffer and offset array */
void * p_buffer; /* convertion buffer */ void * p_buffer; /* conversion buffer */
int * p_offset; /* offset array */ int * p_offset; /* offset array */
} vout_yuv_t; } vout_yuv_t;
/***************************************************************************** /*****************************************************************************
* vout_buffer_t: rendering buffer * vout_buffer_t: rendering buffer
***************************************************************************** *****************************************************************************
* This structure store informations about a buffer. Buffers are not completely * This structure stores information about a buffer. Buffers are not completely
* cleared between displays, and modified areas need to be stored. * cleared between displays, and modified areas need to be stored.
*****************************************************************************/ *****************************************************************************/
typedef struct vout_buffer_s typedef struct vout_buffer_s
{ {
/* Picture area */ /* Picture area */
int i_pic_x, i_pic_y; /* picture position */ int i_pic_x, i_pic_y; /* picture position */
int i_pic_width, i_pic_height; /* picture extension */ int i_pic_width, i_pic_height; /* picture size */
/* Other areas - only vertical extensions of areas are stored */ /* Other areas - only vertical extensions of areas are stored */
int i_areas; /* number of areas */ int i_areas; /* number of areas */
...@@ -172,7 +172,7 @@ typedef struct vout_thread_s ...@@ -172,7 +172,7 @@ typedef struct vout_thread_s
/* Pictures and rendering properties */ /* Pictures and rendering properties */
boolean_t b_grayscale; /* color or grayscale display */ boolean_t b_grayscale; /* color or grayscale display */
boolean_t b_info; /* print additionnal informations */ boolean_t b_info; /* print additional information */
boolean_t b_interface; /* render interface */ boolean_t b_interface; /* render interface */
boolean_t b_scale; /* allow picture scaling */ boolean_t b_scale; /* allow picture scaling */
...@@ -192,7 +192,7 @@ typedef struct vout_thread_s ...@@ -192,7 +192,7 @@ typedef struct vout_thread_s
int i_buffer_index; /* buffer index */ int i_buffer_index; /* buffer index */
vout_buffer_t p_buffer[2]; /* buffers properties */ vout_buffer_t p_buffer[2]; /* buffers properties */
/* Videos heap and translation tables */ /* Video heap and translation tables */
picture_t p_picture[VOUT_MAX_PICTURES]; /* pictures */ picture_t p_picture[VOUT_MAX_PICTURES]; /* pictures */
subpicture_t p_subpicture[VOUT_MAX_PICTURES]; /* subpictures */ subpicture_t p_subpicture[VOUT_MAX_PICTURES]; /* subpictures */
int i_pictures; /* current heap size */ int i_pictures; /* current heap size */
...@@ -202,7 +202,7 @@ typedef struct vout_thread_s ...@@ -202,7 +202,7 @@ typedef struct vout_thread_s
p_vout_font_t p_default_font; /* default font */ p_vout_font_t p_default_font; /* default font */
p_vout_font_t p_large_font; /* large font */ p_vout_font_t p_large_font; /* large font */
/* Synchronisation informations - synchro level is updated by the vout /* Synchronization informations - synchro level is updated by the vout
* thread and read by decoder threads */ * thread and read by decoder threads */
int i_synchro_level; /* trashing level */ int i_synchro_level; /* trashing level */
} vout_thread_t; } vout_thread_t;
......
...@@ -73,7 +73,6 @@ int aout_EsdOpen( aout_thread_t *p_aout ) ...@@ -73,7 +73,6 @@ int aout_EsdOpen( aout_thread_t *p_aout )
int i_mode = ESD_STREAM; int i_mode = ESD_STREAM;
int i_func = ESD_PLAY; int i_func = ESD_PLAY;
fprintf(stderr, "aout-esd !!\n");
/* Allocate structure */ /* Allocate structure */
p_aout->p_sys = malloc( sizeof( aout_sys_t ) ); p_aout->p_sys = malloc( sizeof( aout_sys_t ) );
if( p_aout->p_sys == NULL ) if( p_aout->p_sys == NULL )
......
/***************************************************************************** /*****************************************************************************
* video_yuv.c: YUV transformation functions * video_yuv.c: MMX YUV transformation functions
* Provides functions to perform the YUV conversion. The functions provided here * Provides functions to perform the YUV conversion. The functions provided here
* are a complete and portable C implementation, and may be replaced in certain * are a complete and portable C implementation, and may be replaced in certain
* case by optimized functions. * case by optimized functions.
...@@ -55,24 +55,11 @@ int yuv_MMXInit( vout_thread_t *p_vout ) ...@@ -55,24 +55,11 @@ int yuv_MMXInit( vout_thread_t *p_vout )
{ {
size_t tables_size; /* tables size, in bytes */ size_t tables_size; /* tables size, in bytes */
/* Computes tables size - 3 Bpp use 32 bits pixel entries in tables */ /* Computes tables size for 8bbp only */
switch( p_vout->i_bytes_per_pixel ) if( p_vout->i_bytes_per_pixel == 1 )
{ {
case 1:
tables_size = sizeof( u8 ) tables_size = sizeof( u8 )
* (p_vout->b_grayscale ? GRAY_TABLE_SIZE : PALETTE_TABLE_SIZE); * (p_vout->b_grayscale ? GRAY_TABLE_SIZE : PALETTE_TABLE_SIZE);
break;
case 2:
tables_size = sizeof( u16 )
* (p_vout->b_grayscale ? GRAY_TABLE_SIZE : RGB_TABLE_SIZE);
break;
case 3:
case 4:
default:
tables_size = sizeof( u32 )
* (p_vout->b_grayscale ? GRAY_TABLE_SIZE : RGB_TABLE_SIZE);
break;
}
/* Allocate memory */ /* Allocate memory */
p_vout->yuv.p_base = malloc( tables_size ); p_vout->yuv.p_base = malloc( tables_size );
...@@ -81,6 +68,11 @@ int yuv_MMXInit( vout_thread_t *p_vout ) ...@@ -81,6 +68,11 @@ int yuv_MMXInit( vout_thread_t *p_vout )
intf_ErrMsg("error: %s\n", strerror(ENOMEM)); intf_ErrMsg("error: %s\n", strerror(ENOMEM));
return( 1 ); return( 1 );
} }
}
else
{
p_vout->yuv.p_base = NULL;
}
/* Allocate memory for conversion buffer and offset array */ /* Allocate memory for conversion buffer and offset array */
p_vout->yuv.p_buffer = malloc( VOUT_MAX_WIDTH * p_vout->i_bytes_per_pixel ); p_vout->yuv.p_buffer = malloc( VOUT_MAX_WIDTH * p_vout->i_bytes_per_pixel );
...@@ -111,7 +103,11 @@ int yuv_MMXInit( vout_thread_t *p_vout ) ...@@ -111,7 +103,11 @@ int yuv_MMXInit( vout_thread_t *p_vout )
*****************************************************************************/ *****************************************************************************/
void yuv_MMXEnd( vout_thread_t *p_vout ) void yuv_MMXEnd( vout_thread_t *p_vout )
{ {
if( p_vout->i_bytes_per_pixel == 1 )
{
free( p_vout->yuv.p_base ); free( p_vout->yuv.p_base );
}
free( p_vout->yuv.p_buffer ); free( p_vout->yuv.p_buffer );
free( p_vout->yuv.p_offset ); free( p_vout->yuv.p_offset );
} }
...@@ -130,25 +126,6 @@ int yuv_MMXReset( vout_thread_t *p_vout ) ...@@ -130,25 +126,6 @@ int yuv_MMXReset( vout_thread_t *p_vout )
/* following functions are local */ /* following functions are local */
/*****************************************************************************
* SetGammaTable: return intensity table transformed by gamma curve.
*****************************************************************************
* pi_table is a table of 256 entries from 0 to 255.
*****************************************************************************/
void SetGammaTable( int *pi_table, double f_gamma )
{
int i_y; /* base intensity */
/* Use exp(gamma) instead of gamma */
f_gamma = exp( f_gamma );
/* Build gamma table */
for( i_y = 0; i_y < 256; i_y++ )
{
pi_table[ i_y ] = pow( (double)i_y / 256, f_gamma ) * 256;
}
}
/***************************************************************************** /*****************************************************************************
* SetYUV: compute tables and set function pointers * SetYUV: compute tables and set function pointers
+ *****************************************************************************/ + *****************************************************************************/
...@@ -166,21 +143,12 @@ void SetYUV( vout_thread_t *p_vout ) ...@@ -166,21 +143,12 @@ void SetYUV( vout_thread_t *p_vout )
if( p_vout->b_grayscale ) if( p_vout->b_grayscale )
{ {
/* Grayscale: build gray table */ /* Grayscale: build gray table */
switch( p_vout->i_bytes_per_pixel ) if( p_vout->i_bytes_per_pixel == 1 )
{
case 1:
{ {
u16 bright[256], transp[256]; u16 bright[256], transp[256];
p_vout->yuv.yuv.p_gray8 = (u8 *)p_vout->yuv.p_base + GRAY_MARGIN;
for( i_index = 0; i_index < GRAY_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_gray8[ -i_index ] = RGB2PIXEL( p_vout, pi_gamma[0], pi_gamma[0], pi_gamma[0] );
p_vout->yuv.yuv.p_gray8[ 256 + i_index ] = RGB2PIXEL( p_vout, pi_gamma[255], pi_gamma[255], pi_gamma[255] );
}
for( i_index = 0; i_index < 256; i_index++) for( i_index = 0; i_index < 256; i_index++)
{ {
p_vout->yuv.yuv.p_gray8[ i_index ] = pi_gamma[ i_index ];
bright[ i_index ] = i_index << 8; bright[ i_index ] = i_index << 8;
transp[ i_index ] = 0; transp[ i_index ] = 0;
} }
...@@ -190,46 +158,21 @@ void SetYUV( vout_thread_t *p_vout ) ...@@ -190,46 +158,21 @@ void SetYUV( vout_thread_t *p_vout )
p_vout->i_black_pixel = 0x00; p_vout->i_black_pixel = 0x00;
p_vout->i_gray_pixel = 0x44; p_vout->i_gray_pixel = 0x44;
p_vout->i_blue_pixel = 0x3b; p_vout->i_blue_pixel = 0x3b;
break;
}
case 2:
p_vout->yuv.yuv.p_gray16 = (u16 *)p_vout->yuv.p_base + GRAY_MARGIN;
for( i_index = 0; i_index < GRAY_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_gray16[ -i_index ] = RGB2PIXEL( p_vout, pi_gamma[0], pi_gamma[0], pi_gamma[0] );
p_vout->yuv.yuv.p_gray16[ 256 + i_index ] = RGB2PIXEL( p_vout, pi_gamma[255], pi_gamma[255], pi_gamma[255] );
}
for( i_index = 0; i_index < 256; i_index++)
{
p_vout->yuv.yuv.p_gray16[ i_index ] = RGB2PIXEL( p_vout, pi_gamma[i_index], pi_gamma[i_index], pi_gamma[i_index] );
}
break;
case 3:
case 4:
p_vout->yuv.yuv.p_gray32 = (u32 *)p_vout->yuv.p_base + GRAY_MARGIN;
for( i_index = 0; i_index < GRAY_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_gray32[ -i_index ] = RGB2PIXEL( p_vout, pi_gamma[0], pi_gamma[0], pi_gamma[0] );
p_vout->yuv.yuv.p_gray32[ 256 + i_index ] = RGB2PIXEL( p_vout, pi_gamma[255], pi_gamma[255], pi_gamma[255] );
}
for( i_index = 0; i_index < 256; i_index++)
{
p_vout->yuv.yuv.p_gray32[ i_index ] = RGB2PIXEL( p_vout, pi_gamma[i_index], pi_gamma[i_index], pi_gamma[i_index] );
}
break;
} }
} }
else else
{ {
/* Color: build red, green and blue tables */ /* Color: build red, green and blue tables */
switch( p_vout->i_bytes_per_pixel ) if( p_vout->i_bytes_per_pixel == 1 )
{
case 1:
{ {
#define RGB_MIN 0 #define RGB_MIN 0
#define RGB_MAX 255 #define RGB_MAX 255
#define CLIP( x ) ( ((x < 0) ? 0 : (x > 255) ? 255 : x) << 8 ) #define CLIP( x ) ( ((x < 0) ? 0 : (x > 255) ? 255 : x) << 8 )
#define SHIFT 20
#define U_GREEN_COEF ((int)(-0.391 * (1<<SHIFT) / 1.164))
#define U_BLUE_COEF ((int)(2.018 * (1<<SHIFT) / 1.164))
#define V_RED_COEF ((int)(1.596 * (1<<SHIFT) / 1.164))
#define V_GREEN_COEF ((int)(-0.813 * (1<<SHIFT) / 1.164))
int y,u,v; int y,u,v;
int r,g,b; int r,g,b;
...@@ -296,6 +239,7 @@ void SetYUV( vout_thread_t *p_vout ) ...@@ -296,6 +239,7 @@ void SetYUV( vout_thread_t *p_vout )
for ( y = 0; y <= 256; y += 16 ) for ( y = 0; y <= 256; y += 16 )
{ {
for ( u = 0; u <= 256; u += 32 ) for ( u = 0; u <= 256; u += 32 )
{
for ( v = 0; v <= 256; v += 32 ) for ( v = 0; v <= 256; v += 32 )
{ {
int u2, v2; int u2, v2;
...@@ -331,60 +275,9 @@ void SetYUV( vout_thread_t *p_vout ) ...@@ -331,60 +275,9 @@ void SetYUV( vout_thread_t *p_vout )
} }
i++; i++;
} }
i += 128-81;
}
break;
} }
case 2: i += 128-81;
p_vout->yuv.yuv.p_rgb16 = (u16 *)p_vout->yuv.p_base;
for( i_index = 0; i_index < RED_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_rgb16[RED_OFFSET - RED_MARGIN + i_index] = RGB2PIXEL( p_vout, pi_gamma[0], 0, 0 );
p_vout->yuv.yuv.p_rgb16[RED_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, pi_gamma[255], 0, 0 );
}
for( i_index = 0; i_index < GREEN_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_rgb16[GREEN_OFFSET - GREEN_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[0], 0 );
p_vout->yuv.yuv.p_rgb16[GREEN_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[255], 0 );
}
for( i_index = 0; i_index < BLUE_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_rgb16[BLUE_OFFSET - BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[0] );
p_vout->yuv.yuv.p_rgb16[BLUE_OFFSET + BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[255] );
}
for( i_index = 0; i_index < 256; i_index++ )
{
p_vout->yuv.yuv.p_rgb16[RED_OFFSET + i_index] = RGB2PIXEL( p_vout, pi_gamma[ i_index ], 0, 0 );
p_vout->yuv.yuv.p_rgb16[GREEN_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[ i_index ], 0 );
p_vout->yuv.yuv.p_rgb16[BLUE_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[ i_index ] );
}
break;
case 3:
case 4:
p_vout->yuv.yuv.p_rgb32 = (u32 *)p_vout->yuv.p_base;
for( i_index = 0; i_index < RED_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_rgb32[RED_OFFSET - RED_MARGIN + i_index] = RGB2PIXEL( p_vout, pi_gamma[0], 0, 0 );
p_vout->yuv.yuv.p_rgb32[RED_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, pi_gamma[255], 0, 0 );
}
for( i_index = 0; i_index < GREEN_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_rgb32[GREEN_OFFSET - GREEN_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[0], 0 );
p_vout->yuv.yuv.p_rgb32[GREEN_OFFSET + 256 + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[255], 0 );
}
for( i_index = 0; i_index < BLUE_MARGIN; i_index++ )
{
p_vout->yuv.yuv.p_rgb32[BLUE_OFFSET - BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[0] );
p_vout->yuv.yuv.p_rgb32[BLUE_OFFSET + BLUE_MARGIN + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[255] );
}
for( i_index = 0; i_index < 256; i_index++ )
{
p_vout->yuv.yuv.p_rgb32[RED_OFFSET + i_index] = RGB2PIXEL( p_vout, pi_gamma[ i_index ], 0, 0 );
p_vout->yuv.yuv.p_rgb32[GREEN_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, pi_gamma[ i_index ], 0 );
p_vout->yuv.yuv.p_rgb32[BLUE_OFFSET + i_index] = RGB2PIXEL( p_vout, 0, 0, pi_gamma[ i_index ] );
} }
break;
} }
} }
......
/***************************************************************************** /*****************************************************************************
* video_yuv.h: YUV transformation functions * video_yuv.h: MMX YUV transformation functions
* Provides functions to perform the YUV conversion. The functions provided here * Provides functions to perform the YUV conversion. The functions provided here
* are a complete and portable C implementation, and may be replaced in certain * are a complete and portable C implementation, and may be replaced in certain
* case by optimized functions. * case by optimized functions.
...@@ -28,30 +28,11 @@ ...@@ -28,30 +28,11 @@
* Constants * Constants
*****************************************************************************/ *****************************************************************************/
/* Margins and offsets in conversion tables - Margins are used in case a RGB
* RGB conversion would give a value outside the 0-255 range. Offsets have been
* calculated to avoid using the same cache line for 2 tables. conversion tables
* are 2*MARGIN + 256 long and stores pixels.*/
#define RED_MARGIN 178
#define GREEN_MARGIN 135
#define BLUE_MARGIN 224
#define RED_OFFSET 1501 /* 1323 to 1935 */
#define GREEN_OFFSET 135 /* 0 to 526 */
#define BLUE_OFFSET 818 /* 594 to 1298 */
#define RGB_TABLE_SIZE 1935 /* total table size */
#define GRAY_MARGIN 384 #define GRAY_MARGIN 384
#define GRAY_TABLE_SIZE 1024 /* total table size */ #define GRAY_TABLE_SIZE 1024 /* total table size */
#define PALETTE_TABLE_SIZE 2176 /* YUV -> 8bpp palette lookup table */ #define PALETTE_TABLE_SIZE 2176 /* YUV -> 8bpp palette lookup table */
/* macros used for YUV pixel conversions */
#define SHIFT 20
#define U_GREEN_COEF ((int)(-0.391 * (1<<SHIFT) / 1.164))
#define U_BLUE_COEF ((int)(2.018 * (1<<SHIFT) / 1.164))
#define V_RED_COEF ((int)(1.596 * (1<<SHIFT) / 1.164))
#define V_GREEN_COEF ((int)(-0.813 * (1<<SHIFT) / 1.164))
/* argument lists for YUV functions */ /* argument lists for YUV functions */
#define YUV_ARGS_8BPP p_vout_thread_t p_vout, u8 *p_pic, yuv_data_t *p_y, \ #define YUV_ARGS_8BPP p_vout_thread_t p_vout, u8 *p_pic, yuv_data_t *p_y, \
yuv_data_t *p_u, yuv_data_t *p_v, int i_width, int i_height, int i_pic_width, \ yuv_data_t *p_u, yuv_data_t *p_v, int i_width, int i_height, int i_pic_width, \
......
...@@ -99,7 +99,10 @@ void ConvertYUV420RGB16( YUV_ARGS_16BPP ) ...@@ -99,7 +99,10 @@ void ConvertYUV420RGB16( YUV_ARGS_16BPP )
__asm__( MMX_INIT_16 __asm__( MMX_INIT_16
: : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) ); : : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) );
__asm__( ".align 8" MMX_YUV_MUL MMX_YUV_ADD MMX_UNPACK_16 __asm__( ".align 8"
MMX_YUV_MUL
MMX_YUV_ADD
MMX_UNPACK_16
: : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) ); : : "r" (p_y), "r" (p_u), "r" (p_v), "r" (p_buffer) );
p_y += 8; p_y += 8;
......
/***************************************************************************** /*****************************************************************************
* video_yuv24.c: YUV transformation functions for 24 bpp * video_yuv24.c: MMX YUV transformation functions for 24 bpp
* Provides functions to perform the YUV conversion. The functions provided here * Provides functions to perform the YUV conversion. The functions provided here
* are a complete and portable C implementation, and may be replaced in certain * are a complete and portable C implementation, and may be replaced in certain
* case by optimized functions. * case by optimized functions.
......
/***************************************************************************** /*****************************************************************************
* video_yuv32.c: YUV transformation functions for 32 bpp * video_yuv32.c: MMX YUV transformation functions for 32 bpp
* Provides functions to perform the YUV conversion. The functions provided here * Provides functions to perform the YUV conversion. The functions provided here
* are a complete and portable C implementation, and may be replaced in certain * are a complete and portable C implementation, and may be replaced in certain
* case by optimized functions. * case by optimized functions.
......
/***************************************************************************** /*****************************************************************************
* video_yuv8.c: YUV transformation functions for 8bpp * video_yuv8.c: MMX YUV transformation functions for 8bpp
* Provides functions to perform the YUV conversion. The functions provided here * Provides functions to perform the YUV conversion. The functions provided here
* are a complete and portable C implementation, and may be replaced in certain * are a complete and portable C implementation, and may be replaced in certain
* case by optimized functions. * case by optimized functions.
......
/***************************************************************************** /*****************************************************************************
* video_yuv_asm.h: YUV transformation assembly * video_yuv_asm.h: MMX YUV transformation assembly
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* *
...@@ -82,7 +82,7 @@ movq %%mm1, %%mm3 # Copy 4 Cr 00 v3 00 v2 00 v1 00 v0 \n\ ...@@ -82,7 +82,7 @@ movq %%mm1, %%mm3 # Copy 4 Cr 00 v3 00 v2 00 v1 00 v0 \n\
pmulhw mmx_U_green, %%mm2 # Mul Cb with green coeff -> Cb green \n\ pmulhw mmx_U_green, %%mm2 # Mul Cb with green coeff -> Cb green \n\
pmulhw mmx_V_green, %%mm3 # Mul Cr with green coeff -> Cr green \n\ pmulhw mmx_V_green, %%mm3 # Mul Cr with green coeff -> Cr green \n\
pmulhw mmx_U_blue, %%mm0 # Mul Cb -> Cblue 00 b3 00 b2 00 b1 00 b0 \n\ pmulhw mmx_U_blue, %%mm0 # Mul Cb -> Cblue 00 b3 00 b2 00 b1 00 b0 \n\
pmulhw mmx_V_red, %%mm1 # Mul Cr -> Cred 00 r3 00 r2 00 r1 00 \n\ pmulhw mmx_V_red, %%mm1 # Mul Cr -> Cred 00 r3 00 r2 00 r1 00 r0 \n\
paddsw %%mm3, %%mm2 # Cb green + Cr green -> Cgreen \n\ paddsw %%mm3, %%mm2 # Cb green + Cr green -> Cgreen \n\
\n\ \n\
# convert the luma part \n\ # convert the luma part \n\
......
/***************************************************************************** /*****************************************************************************
* video_yuv_macros.h: YUV transformation macros * video_yuv_macros.h: MMX YUV transformation macros
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* *
......
...@@ -74,6 +74,25 @@ void aout_Thread_U16_Stereo ( aout_thread_t * p_aout ); ...@@ -74,6 +74,25 @@ void aout_Thread_U16_Stereo ( aout_thread_t * p_aout );
static __inline__ void InitializeIncrement( aout_increment_t * p_increment, long l_numerator, long l_denominator ); static __inline__ void InitializeIncrement( aout_increment_t * p_increment, long l_numerator, long l_denominator );
static __inline__ int NextFrame( aout_thread_t * p_aout, aout_fifo_t * p_fifo, mtime_t aout_date ); static __inline__ int NextFrame( aout_thread_t * p_aout, aout_fifo_t * p_fifo, mtime_t aout_date );
/*****************************************************************************
* InitializeIncrement
*****************************************************************************/
static __inline__ void InitializeIncrement( aout_increment_t * p_increment, long l_numerator, long l_denominator )
{
p_increment->l_remainder = -l_denominator;
p_increment->l_euclidean_integer = 0;
while ( l_numerator >= l_denominator )
{
p_increment->l_euclidean_integer++;
l_numerator -= l_denominator;
}
p_increment->l_euclidean_remainder = l_numerator;
p_increment->l_euclidean_denominator = l_denominator;
}
/***************************************************************************** /*****************************************************************************
* aout_CreateThread: initialize audio thread * aout_CreateThread: initialize audio thread
*****************************************************************************/ *****************************************************************************/
...@@ -467,25 +486,6 @@ void aout_DestroyFifo( aout_fifo_t * p_fifo ) ...@@ -467,25 +486,6 @@ void aout_DestroyFifo( aout_fifo_t * p_fifo )
/* Following functions are local */ /* Following functions are local */
/*****************************************************************************
* InitializeIncrement
*****************************************************************************/
static __inline__ void InitializeIncrement( aout_increment_t * p_increment, long l_numerator, long l_denominator )
{
p_increment->l_remainder = -l_denominator;
p_increment->l_euclidean_integer = 0;
while ( l_numerator >= l_denominator )
{
p_increment->l_euclidean_integer++;
l_numerator -= l_denominator;
}
p_increment->l_euclidean_remainder = l_numerator;
p_increment->l_euclidean_denominator = l_denominator;
}
/***************************************************************************** /*****************************************************************************
* NextFrame * NextFrame
*****************************************************************************/ *****************************************************************************/
......
This diff is collapsed.
This diff is collapsed.
...@@ -22,11 +22,11 @@ ...@@ -22,11 +22,11 @@
/* Text styles - these are primary text styles, used by the vout_Print function. /* Text styles - these are primary text styles, used by the vout_Print function.
* They may be ignored or interpreted by higher level functions */ * They may be ignored or interpreted by higher level functions */
#define WIDE_TEXT 1 /* interspacing is doubled */ #define WIDE_TEXT 1<<0 /* interspacing is doubled */
#define ITALIC_TEXT 2 /* italic */ #define ITALIC_TEXT 1<<1 /* italic */
#define OPAQUE_TEXT 4 /* text with background */ #define OPAQUE_TEXT 1<<2 /* text with background */
#define OUTLINED_TEXT 8 /* border around letters */ #define OUTLINED_TEXT 1<<3 /* border around letters */
#define VOID_TEXT 16 /* no foreground */ #define VOID_TEXT 1<<4 /* no foreground */
/***************************************************************************** /*****************************************************************************
......
...@@ -46,10 +46,10 @@ ...@@ -46,10 +46,10 @@
#include "main.h" #include "main.h"
/***************************************************************************** /*****************************************************************************
* vout_InitYUV: allocate and initialize translations tables * vout_InitYUV: allocate and initialize translation tables
***************************************************************************** *****************************************************************************
* This function will allocate memory to store translation tables, depending * This function will allocate memory to store translation tables, depending
* of the screen depth. * on the screen depth.
*****************************************************************************/ *****************************************************************************/
int vout_InitYUV( vout_thread_t *p_vout ) int vout_InitYUV( vout_thread_t *p_vout )
{ {
...@@ -76,7 +76,7 @@ int vout_InitYUV( vout_thread_t *p_vout ) ...@@ -76,7 +76,7 @@ int vout_InitYUV( vout_thread_t *p_vout )
} }
/***************************************************************************** /*****************************************************************************
* vout_ResetYUV: re-initialize translations tables * vout_ResetYUV: re-initialize translation tables
***************************************************************************** *****************************************************************************
* This function will initialize the tables allocated by vout_InitYUV and * This function will initialize the tables allocated by vout_InitYUV and
* set functions pointers. * set functions pointers.
...@@ -88,7 +88,7 @@ int vout_ResetYUV( vout_thread_t *p_vout ) ...@@ -88,7 +88,7 @@ int vout_ResetYUV( vout_thread_t *p_vout )
} }
/***************************************************************************** /*****************************************************************************
* vout_EndYUV: destroy translations tables * vout_EndYUV: destroy translation tables
***************************************************************************** *****************************************************************************
* Free memory allocated by vout_InitYUV * Free memory allocated by vout_InitYUV
*****************************************************************************/ *****************************************************************************/
......
...@@ -159,7 +159,7 @@ void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar, ...@@ -159,7 +159,7 @@ void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar,
#if 1 #if 1
if( p_vpar->synchro.b_all_I ) if( p_vpar->synchro.b_all_I )
intf_ErrMsg( "I: 1/1 " ); intf_ErrMsg( " I: 1/1 " );
if( p_vpar->synchro.b_all_P ) if( p_vpar->synchro.b_all_P )
intf_ErrMsg( "P: %i/%i ", p_vpar->synchro.i_P_seen, intf_ErrMsg( "P: %i/%i ", p_vpar->synchro.i_P_seen,
p_vpar->synchro.i_P_seen ); p_vpar->synchro.i_P_seen );
...@@ -172,7 +172,7 @@ void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar, ...@@ -172,7 +172,7 @@ void vpar_SynchroUpdateStructures( vpar_thread_t * p_vpar,
else if( p_vpar->synchro.displayable_b > 0 ) else if( p_vpar->synchro.displayable_b > 0 )
intf_ErrMsg( "B: %.2f/%i", p_vpar->synchro.displayable_b, intf_ErrMsg( "B: %.2f/%i", p_vpar->synchro.displayable_b,
p_vpar->synchro.i_B_seen ); p_vpar->synchro.i_B_seen );
intf_ErrMsg( "\n" ); intf_ErrMsg( " " );
#endif #endif
p_vpar->synchro.i_P_seen = 0; p_vpar->synchro.i_P_seen = 0;
p_vpar->synchro.i_B_seen = 0; p_vpar->synchro.i_B_seen = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment