Commit 9c24f64d authored by Vincent Seguin's avatar Vincent Seguin

D�but du changement de chaine.

parent cf49edcd
...@@ -123,9 +123,6 @@ ...@@ -123,9 +123,6 @@
#define INTF_GAMMA_STEP .1 #define INTF_GAMMA_STEP .1
#define INTF_GAMMA_LIMIT 3 #define INTF_GAMMA_LIMIT 3
/* Scaling modifier limits */
#define INTF_SCALE_LIMIT 10
/* /*
* X11 settings * X11 settings
*/ */
...@@ -133,9 +130,6 @@ ...@@ -133,9 +130,6 @@
/* Title of the X11 window */ /* Title of the X11 window */
#define VOUT_TITLE "VideoLAN Client" #define VOUT_TITLE "VideoLAN Client"
/* Environment variable used in place of DISPLAY if available */
#define ENV_VLC_DISPLAY "vlc_DISPLAY"
/******************************************************************************* /*******************************************************************************
* Input thread configuration * Input thread configuration
*******************************************************************************/ *******************************************************************************/
...@@ -235,10 +229,15 @@ ...@@ -235,10 +229,15 @@
* Default settings for video output threads * Default settings for video output threads
*/ */
/* Default dimensions for display window - these dimensions are the standard /* Environment variable used in place of DISPLAY if available */
* width and height for broadcasted MPEG-2 */ #define VOUT_DISPLAY_VAR "vlc_DISPLAY"
#define VOUT_WIDTH 544
#define VOUT_HEIGHT 576 /* Default dimensions for display window - these dimensions are enough for the
* standard width and height broadcasted MPEG-2 streams */
#define VOUT_WIDTH_VAR "vlc_width"
#define VOUT_HEIGHT_VAR "vlc_height"
#define VOUT_WIDTH_DEFAULT 640
#define VOUT_HEIGHT_DEFAULT 480
/* Default video heap size - remember that a decompressed picture is big /* Default video heap size - remember that a decompressed picture is big
* (~1 Mbyte) before using huge values */ * (~1 Mbyte) before using huge values */
...@@ -248,10 +247,6 @@ ...@@ -248,10 +247,6 @@
#define VOUT_GRAYSCALE_VAR "vlc_grayscale" #define VOUT_GRAYSCALE_VAR "vlc_grayscale"
#define VOUT_GRAYSCALE_DEFAULT 0 #define VOUT_GRAYSCALE_DEFAULT 0
/* Environment variable for fullscreen output mode, and default value */
#define VOUT_FULLSCREEN_VAR "vlc_fullscreen"
#define VOUT_FULLSCREEN_DEFAULT 0
/* Default gamma */ /* Default gamma */
#define VOUT_GAMMA 0. #define VOUT_GAMMA 0.
...@@ -341,7 +336,7 @@ ...@@ -341,7 +336,7 @@
/* Define to enable messages queues - disabling messages queue can be usefull /* Define to enable messages queues - disabling messages queue can be usefull
* when debugging, since it allows messages which would not otherwise be printed, * when debugging, since it allows messages which would not otherwise be printed,
* due to a crash, to be printed anyway */ * due to a crash, to be printed anyway */
#define INTF_MSG_QUEUE //#define INTF_MSG_QUEUE
/* Format of the header for debug messages. The arguments following this header /* Format of the header for debug messages. The arguments following this header
* are the file (char *), the function (char *) and the line (int) in which the * are the file (char *), the function (char *) and the line (int) in which the
......
...@@ -46,6 +46,6 @@ intf_thread_t * intf_Create ( void ); ...@@ -46,6 +46,6 @@ intf_thread_t * intf_Create ( void );
void intf_Run ( intf_thread_t * p_intf ); void intf_Run ( intf_thread_t * p_intf );
void intf_Destroy ( intf_thread_t * p_intf ); void intf_Destroy ( intf_thread_t * p_intf );
int intf_SelectInput ( intf_thread_t * p_intf, p_input_cfg_t p_cfg ); int intf_SelectInput ( intf_thread_t * p_intf, int i_index );
int intf_ProcessKey ( intf_thread_t * p_intf, int i_key ); int intf_ProcessKey ( intf_thread_t * p_intf, int i_key );
...@@ -31,6 +31,41 @@ ...@@ -31,6 +31,41 @@
#include "intf_sys.h" #include "intf_sys.h"
/*******************************************************************************
* Constants
*******************************************************************************/
/* INTF_INPUT_CFG: pre-configured inputs */
#define INTF_MAX_INPUT_CFG 10
static const input_cfg_t INTF_INPUT_CFG[] =
{
/* properties method
* file host ip port vlan */
/* Local input (unicast) */
{ INPUT_CFG_METHOD | INPUT_CFG_IP, INPUT_METHOD_TS_UCAST,
NULL, NULL, "127.0.0.1", 0, 0 },
/* Broadcasts */
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 0 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 1 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 2 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 3 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 4 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 5 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 6 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 7 },
{ INPUT_CFG_METHOD | INPUT_CFG_VLAN, INPUT_METHOD_TS_VLAN_BCAST,
NULL, NULL, NULL, 0, 8 }
};
/******************************************************************************* /*******************************************************************************
* intf_Create: prepare interface before main loop * intf_Create: prepare interface before main loop
...@@ -135,10 +170,10 @@ void intf_Destroy( intf_thread_t *p_intf ) ...@@ -135,10 +170,10 @@ void intf_Destroy( intf_thread_t *p_intf )
/******************************************************************************* /*******************************************************************************
* intf_SelectInput: change input stream * intf_SelectInput: change input stream
******************************************************************************* *******************************************************************************
* Kill existing input, if any, and try to open a new one. If p_cfg is NULL, * Kill existing input, if any, and try to open a new one, using an input
* no new input will be openned. * configuration table.
*******************************************************************************/ *******************************************************************************/
int intf_SelectInput( intf_thread_t * p_intf, input_cfg_t *p_cfg ) int intf_SelectInput( intf_thread_t * p_intf, int i_index )
{ {
intf_DbgMsg("0x%x\n", p_intf ); intf_DbgMsg("0x%x\n", p_intf );
...@@ -146,16 +181,18 @@ int intf_SelectInput( intf_thread_t * p_intf, input_cfg_t *p_cfg ) ...@@ -146,16 +181,18 @@ int intf_SelectInput( intf_thread_t * p_intf, input_cfg_t *p_cfg )
if( p_intf->p_input != NULL ) if( p_intf->p_input != NULL )
{ {
input_DestroyThread( p_intf->p_input /*??, NULL*/ ); input_DestroyThread( p_intf->p_input /*??, NULL*/ );
p_intf->p_input = NULL;
} }
/* Open new one */ /* Check that input index is valid */
if( p_cfg != NULL ) if( (i_index < 0) || (INTF_MAX_INPUT_CFG < i_index) )
{ {
p_intf->p_input = input_CreateThread( p_cfg /*??, NULL*/ ); p_intf->p_input = NULL;
} return( 1 );
}
return( (p_cfg != NULL) && (p_intf->p_input == NULL) ); /* Open a new input */
p_intf->p_input = input_CreateThread( &INTF_INPUT_CFG[ i_index ] /*??, NULL*/ );
return( p_intf->p_input == NULL );
} }
/******************************************************************************* /*******************************************************************************
...@@ -183,7 +220,10 @@ int intf_ProcessKey( intf_thread_t *p_intf, int i_key ) ...@@ -183,7 +220,10 @@ int intf_ProcessKey( intf_thread_t *p_intf, int i_key )
case '7': case '7':
case '8': case '8':
case '9': case '9':
// ?? if( intf_SelectInput( p_intf, i_key - '0' ) )
{
intf_ErrMsg("error: can not open channel %d\n", i_key - '0');
}
break; break;
case '+': /* volume + */ case '+': /* volume + */
// ?? // ??
......
...@@ -524,11 +524,12 @@ static int SpawnInput( int i_argc, intf_arg_t *p_argv ) ...@@ -524,11 +524,12 @@ static int SpawnInput( int i_argc, intf_arg_t *p_argv )
cfg.p_aout = p_main->p_aout; cfg.p_aout = p_main->p_aout;
/* Create the input thread */ /* Create the input thread */
if( intf_SelectInput( p_main->p_intf, &cfg ) == -1) if( p_main->p_intf->p_input != NULL )
{ {
return( INTF_OTHER_ERROR ); input_DestroyThread( p_main->p_intf->p_input /*??, NULL*/ );
} }
p_main->p_intf->p_input = input_CreateThread( &cfg /*??,NULL*/ );
return( INTF_NO_ERROR ); return( INTF_NO_ERROR );
} }
......
...@@ -61,7 +61,6 @@ static const struct option longopts[] = ...@@ -61,7 +61,6 @@ static const struct option longopts[] =
{ "novideo", 0, 0, OPT_NOVIDEO }, { "novideo", 0, 0, OPT_NOVIDEO },
{ "grayscale", 0, 0, 'g' }, { "grayscale", 0, 0, 'g' },
{ "color", 0, 0, OPT_COLOR }, { "color", 0, 0, OPT_COLOR },
{ "fullscreen", 0, 0, 'f' },
/* VLAN management options */ /* VLAN management options */
{ "novlans", 0, 0, OPT_NOVLANS }, { "novlans", 0, 0, OPT_NOVLANS },
...@@ -70,7 +69,7 @@ static const struct option longopts[] = ...@@ -70,7 +69,7 @@ static const struct option longopts[] =
}; };
/* Short options */ /* Short options */
static const char *psz_shortopts = "hgf"; static const char *psz_shortopts = "hg";
/******************************************************************************* /*******************************************************************************
* Global variable program_data - this is the one and only, see main.h * Global variable program_data - this is the one and only, see main.h
...@@ -351,9 +350,6 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] ) ...@@ -351,9 +350,6 @@ static int GetConfiguration( int i_argc, char *ppsz_argv[], char *ppsz_env[] )
case OPT_COLOR: /* --color */ case OPT_COLOR: /* --color */
main_PutIntVariable( VOUT_GRAYSCALE_VAR, 0 ); main_PutIntVariable( VOUT_GRAYSCALE_VAR, 0 );
break; break;
case 'f': /* -f, --fullscreen */
main_PutIntVariable( VOUT_FULLSCREEN_VAR, 1 );
break;
/* VLAN management options */ /* VLAN management options */
case OPT_NOVLANS: /* --novlans */ case OPT_NOVLANS: /* --novlans */
...@@ -418,6 +414,9 @@ static void Usage( void ) ...@@ -418,6 +414,9 @@ static void Usage( void )
/* Video parameters */ /* Video parameters */
intf_Msg("Video parameters:\n" \ intf_Msg("Video parameters:\n" \
" " VOUT_DISPLAY_VAR "=<display name> display used\n"
" " VOUT_WIDTH_VAR "=<width> display width\n"
" " VOUT_HEIGHT_VAR "=<height> dislay height\n"
" " VOUT_FB_DEV_VAR "=<filename> framebuffer device path\n" \ " " VOUT_FB_DEV_VAR "=<filename> framebuffer device path\n" \
" " VOUT_GRAYSCALE_VAR "={1|0} grayscale or color output\n" \ " " VOUT_GRAYSCALE_VAR "={1|0} grayscale or color output\n" \
); );
...@@ -428,7 +427,7 @@ static void Usage( void ) ...@@ -428,7 +427,7 @@ static void Usage( void )
); );
/* Interfaces keys */ /* Interfaces keys */
intf_Msg("Interface keys: most interface accept the following commands:\n" \ intf_Msg("Interface keys: most interfaces accept the following commands:\n" \
" [esc], q quit\n" \ " [esc], q quit\n" \
" +, -, m change volume, mute\n" \ " +, -, m change volume, mute\n" \
" g, G, c change gamma, toggle grayscale\n" \ " g, G, c change gamma, toggle grayscale\n" \
......
...@@ -45,7 +45,7 @@ typedef struct vout_sys_s ...@@ -45,7 +45,7 @@ typedef struct vout_sys_s
/******************************************************************************* /*******************************************************************************
* Local prototypes * Local prototypes
*******************************************************************************/ *******************************************************************************/
static int GGIOpenDisplay ( vout_thread_t *p_vout ); static int GGIOpenDisplay ( vout_thread_t *p_vout, char *psz_display );
static void GGICloseDisplay ( vout_thread_t *p_vout ); static void GGICloseDisplay ( vout_thread_t *p_vout );
/******************************************************************************* /*******************************************************************************
...@@ -55,7 +55,7 @@ static void GGICloseDisplay ( vout_thread_t *p_vout ); ...@@ -55,7 +55,7 @@ static void GGICloseDisplay ( vout_thread_t *p_vout );
* vout properties to choose the correct mode, and change them according to the * vout properties to choose the correct mode, and change them according to the
* mode actually used. * mode actually used.
*******************************************************************************/ *******************************************************************************/
int vout_SysCreate( vout_thread_t *p_vout ) int vout_SysCreate( vout_thread_t *p_vout, char *psz_display, int i_root_window )
{ {
/* Allocate structure */ /* Allocate structure */
p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
...@@ -66,7 +66,7 @@ int vout_SysCreate( vout_thread_t *p_vout ) ...@@ -66,7 +66,7 @@ int vout_SysCreate( vout_thread_t *p_vout )
} }
/* Open and initialize device */ /* Open and initialize device */
if( GGIOpenDisplay( p_vout ) ) if( GGIOpenDisplay( p_vout, psz_display ) )
{ {
intf_ErrMsg("error: can't initialize GGI display\n"); intf_ErrMsg("error: can't initialize GGI display\n");
free( p_vout->p_sys ); free( p_vout->p_sys );
...@@ -220,7 +220,7 @@ ggi_visual_t vout_SysGetVisual( vout_thread_t *p_vout ) ...@@ -220,7 +220,7 @@ ggi_visual_t vout_SysGetVisual( vout_thread_t *p_vout )
* Open and initialize display according to preferences specified in the vout * Open and initialize display according to preferences specified in the vout
* thread fields. * thread fields.
*******************************************************************************/ *******************************************************************************/
static int GGIOpenDisplay( vout_thread_t *p_vout ) static int GGIOpenDisplay( vout_thread_t *p_vout, char *psz_display )
{ {
ggi_mode mode; /* mode descriptor */ ggi_mode mode; /* mode descriptor */
ggi_color col_fg; /* foreground color */ ggi_color col_fg; /* foreground color */
...@@ -235,7 +235,7 @@ static int GGIOpenDisplay( vout_thread_t *p_vout ) ...@@ -235,7 +235,7 @@ static int GGIOpenDisplay( vout_thread_t *p_vout )
} }
/* Open display */ /* Open display */
p_vout->p_sys->p_display = ggiOpen( NULL ); p_vout->p_sys->p_display = ggiOpen( psz_display, NULL );
if( p_vout->p_sys->p_display == NULL ) if( p_vout->p_sys->p_display == NULL )
{ {
intf_ErrMsg("error: can't open GGI default display\n"); intf_ErrMsg("error: can't open GGI default display\n");
...@@ -333,6 +333,16 @@ static int GGIOpenDisplay( vout_thread_t *p_vout ) ...@@ -333,6 +333,16 @@ static int GGIOpenDisplay( vout_thread_t *p_vout )
return( 1 ); return( 1 );
} }
/* Set clipping for text */
if( ggiSetGCClipping(p_vout->p_sys->p_display, 0, 0,
mode.visible.x, mode.visible.y ) )
{
intf_ErrMsg("error: can't set clipping\n");
ggiClose( p_vout->p_sys->p_display );
ggiExit();
return( 1 );
}
/* Set thread information */ /* Set thread information */
p_vout->i_width = mode.visible.x; p_vout->i_width = mode.visible.x;
p_vout->i_height = mode.visible.y; p_vout->i_height = mode.visible.y;
......
...@@ -268,11 +268,12 @@ void vout_DisplayPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -268,11 +268,12 @@ void vout_DisplayPicture( vout_thread_t *p_vout, picture_t *p_pic )
break; break;
#endif #endif
} }
vlc_mutex_unlock( &p_vout->picture_lock );
#ifdef DEBUG_VIDEO #ifdef DEBUG_VIDEO
intf_DbgMsg("picture %p\n", p_pic ); intf_DbgMsg("picture %p\n", p_pic );
#endif #endif
vlc_mutex_unlock( &p_vout->picture_lock );
} }
/******************************************************************************* /*******************************************************************************
...@@ -300,11 +301,12 @@ void vout_DatePicture( vout_thread_t *p_vout, picture_t *p_pic, mtime_t date ) ...@@ -300,11 +301,12 @@ void vout_DatePicture( vout_thread_t *p_vout, picture_t *p_pic, mtime_t date )
break; break;
#endif #endif
} }
vlc_mutex_unlock( &p_vout->picture_lock );
#ifdef DEBUG_VIDEO #ifdef DEBUG_VIDEO
intf_DbgMsg("picture %p\n", p_pic); intf_DbgMsg("picture %p\n", p_pic);
#endif #endif
vlc_mutex_unlock( &p_vout->picture_lock );
} }
/******************************************************************************* /*******************************************************************************
...@@ -490,11 +492,12 @@ void vout_LinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -490,11 +492,12 @@ void vout_LinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vlc_mutex_lock( &p_vout->picture_lock ); vlc_mutex_lock( &p_vout->picture_lock );
p_pic->i_refcount++; p_pic->i_refcount++;
vlc_mutex_unlock( &p_vout->picture_lock );
#ifdef DEBUG_VIDEO #ifdef DEBUG_VIDEO
intf_DbgMsg("picture %p\n", p_pic); intf_DbgMsg("picture %p refcount=%d\n", p_pic, p_pic->i_refcount );
#endif #endif
vlc_mutex_unlock( &p_vout->picture_lock );
} }
/******************************************************************************* /*******************************************************************************
...@@ -519,11 +522,12 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -519,11 +522,12 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
{ {
p_pic->i_status = DESTROYED_PICTURE; p_pic->i_status = DESTROYED_PICTURE;
} }
vlc_mutex_unlock( &p_vout->picture_lock );
#ifdef DEBUG_VIDEO #ifdef DEBUG_VIDEO
intf_DbgMsg("picture %p\n", p_pic); intf_DbgMsg("picture %p refcount=%d\n", p_pic, p_pic->i_refcount );
#endif #endif
vlc_mutex_unlock( &p_vout->picture_lock );
} }
/* following functions are local */ /* following functions are local */
...@@ -635,10 +639,10 @@ static void RunThread( vout_thread_t *p_vout) ...@@ -635,10 +639,10 @@ static void RunThread( vout_thread_t *p_vout)
* go to next picture */ * go to next picture */
vlc_mutex_lock( &p_vout->picture_lock ); vlc_mutex_lock( &p_vout->picture_lock );
p_pic->i_status = p_pic->i_refcount ? DISPLAYED_PICTURE : DESTROYED_PICTURE; p_pic->i_status = p_pic->i_refcount ? DISPLAYED_PICTURE : DESTROYED_PICTURE;
vlc_mutex_unlock( &p_vout->picture_lock );
#ifdef DEBUG_VIDEO #ifdef DEBUG_VIDEO
intf_DbgMsg( "warning: late picture %p skipped\n", p_pic ); intf_DbgMsg( "warning: late picture %p skipped refcount=%d\n", p_pic, p_pic->i_refcount );
#endif #endif
vlc_mutex_unlock( &p_vout->picture_lock );
p_pic = NULL; p_pic = NULL;
} }
else if( pic_date > current_date + VOUT_DISPLAY_DELAY ) else if( pic_date > current_date + VOUT_DISPLAY_DELAY )
...@@ -800,15 +804,15 @@ static void EndThread( vout_thread_t *p_vout ) ...@@ -800,15 +804,15 @@ static void EndThread( vout_thread_t *p_vout )
static void RenderBlank( vout_thread_t *p_vout ) static void RenderBlank( vout_thread_t *p_vout )
{ {
//?? toooooo slow //?? toooooo slow
int i_index; /* current 32 bits sample */ int i_index; /* current 64 bits sample */
int i_width; /* number of 32 bits samples */ int i_width; /* number of 64 bits samples */
u32 *p_pic; /* pointer to 32 bits samples */ u64 *p_pic; /* pointer to 64 bits samples */
/* Initialize variables */ /* Initialize variables */
p_pic = vout_SysGetPicture( p_vout ); p_pic = vout_SysGetPicture( p_vout );
i_width = p_vout->i_bytes_per_line * p_vout->i_height / 128; i_width = p_vout->i_bytes_per_line * p_vout->i_height / 256;
/* Clear beginning of screen by 128 bytes blocks */ /* Clear beginning of screen by 256 bytes blocks */
for( i_index = 0; i_index < i_width; i_index++ ) for( i_index = 0; i_index < i_width; i_index++ )
{ {
*p_pic++ = 0; *p_pic++ = 0; *p_pic++ = 0; *p_pic++ = 0;
......
...@@ -810,7 +810,7 @@ static void ConvertYUV444RGB32( p_vout_thread_t p_vout, u32 *p_pic, ...@@ -810,7 +810,7 @@ static void ConvertYUV444RGB32( p_vout_thread_t p_vout, u32 *p_pic,
CONVERT_YUV_RGB( 444 ) CONVERT_YUV_RGB( 444 )
} }
//-------------------- walken code follow -------------------------------- //-------------------- walken code follow ---------------------------------------
/* /*
* YUV to RGB routines. * YUV to RGB routines.
......
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