From: Antoine Cellerier Date: Fri, 6 Apr 2007 21:13:10 +0000 (+0000) Subject: Make it possible to change the fake-image at runtime. X-Git-Tag: 0.9.0-test0~7797 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=13bccc2f071a6eef687545bba4cf0fb0843be6c4;p=vlc Make it possible to change the fake-image at runtime. Add option to specify the chroma used by fake. --- diff --git a/modules/codec/fake.c b/modules/codec/fake.c index fdbd6c2648..d3f37d69e4 100644 --- a/modules/codec/fake.c +++ b/modules/codec/fake.c @@ -38,6 +38,8 @@ static int OpenDecoder ( vlc_object_t * ); static void CloseDecoder ( vlc_object_t * ); static picture_t *DecodeBlock ( decoder_t *, block_t ** ); +static int FakeCallback( vlc_object_t *, char const *, + vlc_value_t, vlc_value_t, void * ); /***************************************************************************** * Module descriptor @@ -63,6 +65,9 @@ static picture_t *DecodeBlock ( decoder_t *, block_t ** ); #define DEINTERLACE_MODULE_TEXT N_("Deinterlace module") #define DEINTERLACE_MODULE_LONGTEXT N_( \ "Deinterlace module to use." ) +#define CHROMA_TEXT N_("Chroma used.") +#define CHROMA_LONGTEXT N_( \ + "Force use of a specific chroma for output. Default is I420." ) static const char *ppsz_deinterlace_type[] = { @@ -94,8 +99,16 @@ vlc_module_begin(); DEINTERLACE_MODULE_TEXT, DEINTERLACE_MODULE_LONGTEXT, VLC_FALSE ); change_string_list( ppsz_deinterlace_type, 0, 0 ); + add_string( "fake-chroma", "I420", NULL, CHROMA_TEXT, CHROMA_LONGTEXT, + VLC_TRUE ); vlc_module_end(); +struct decoder_sys_t +{ + picture_t *p_image; + vlc_mutex_t lock; +}; + /***************************************************************************** * OpenDecoder: probe the decoder and return score *****************************************************************************/ @@ -106,7 +119,7 @@ static int OpenDecoder( vlc_object_t *p_this ) image_handler_t *p_handler; video_format_t fmt_in, fmt_out; picture_t *p_image; - char *psz_file; + char *psz_file, *psz_chroma; vlc_bool_t b_keep_ar; int i_aspect = 0; @@ -115,19 +128,37 @@ static int OpenDecoder( vlc_object_t *p_this ) return VLC_EGENERIC; } - var_Create( p_dec, "fake-file", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); - var_Get( p_dec, "fake-file", &val ); - if( val.psz_string == NULL || !*val.psz_string ) + p_dec->p_sys = (decoder_sys_t *)malloc( sizeof( decoder_sys_t ) ); + if( !p_dec->p_sys ) + { + return VLC_ENOMEM; + } + + psz_file = var_CreateGetNonEmptyStringCommand( p_dec, "fake-file" ); + if( !psz_file ) { - if( val.psz_string ) free( val.psz_string ); msg_Err( p_dec, "specify a file with --fake-file=..." ); return VLC_EGENERIC; } - psz_file = val.psz_string; + var_AddCallback( p_dec, "fake-file", FakeCallback, p_dec ); memset( &fmt_in, 0, sizeof(fmt_in) ); memset( &fmt_out, 0, sizeof(fmt_out) ); - fmt_out.i_chroma = VLC_FOURCC('I','4','2','0'); + + psz_chroma = var_CreateGetString( p_dec, "fake-chroma" ); + if( strlen( psz_chroma ) != 4 ) + { + msg_Warn( p_dec, "Invalid chroma (%s). Using I420.", psz_chroma ); + fmt_out.i_chroma = VLC_FOURCC('I','4','2','0'); + } + else + { + fmt_out.i_chroma = VLC_FOURCC( psz_chroma[0], + psz_chroma[1], + psz_chroma[2], + psz_chroma[3] ); + } + free( psz_chroma ); var_Create( p_dec, "fake-keep-ar", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); var_Get( p_dec, "fake-keep-ar", &val ); @@ -265,12 +296,14 @@ static int OpenDecoder( vlc_object_t *p_this ) /* Set output properties */ p_dec->fmt_out.i_cat = VIDEO_ES; - p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0'); + p_dec->fmt_out.i_codec = fmt_out.i_chroma; p_dec->fmt_out.video = fmt_out; /* Set callbacks */ p_dec->pf_decode_video = DecodeBlock; - p_dec->p_sys = (decoder_sys_t *)p_image; + + p_dec->p_sys->p_image = p_image; + vlc_mutex_init( p_dec, &p_dec->p_sys->lock ); return VLC_SUCCESS; } @@ -280,7 +313,6 @@ static int OpenDecoder( vlc_object_t *p_this ) ****************************************************************************/ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) { - picture_t *p_image = (picture_t *)p_dec->p_sys; picture_t *p_pic; if( pp_block == NULL || !*pp_block ) return NULL; @@ -291,7 +323,10 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) goto error; } - vout_CopyPicture( p_dec, p_pic, p_image ); + vlc_mutex_lock( &p_dec->p_sys->lock ); + vout_CopyPicture( p_dec, p_pic, p_dec->p_sys->p_image ); + vlc_mutex_unlock( &p_dec->p_sys->lock ); + p_pic->date = (*pp_block)->i_pts; error: @@ -307,8 +342,60 @@ error: static void CloseDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; - picture_t *p_image = (picture_t *)p_dec->p_sys; + picture_t *p_image = p_dec->p_sys->p_image; if( p_image != NULL ) p_image->pf_release( p_image ); + + vlc_mutex_destroy( &p_dec->p_sys->lock ); + free( p_dec->p_sys ); +} + +/***************************************************************************** + * FakeCallback: Image source change callback. + *****************************************************************************/ +static int FakeCallback( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data ) +{ + decoder_t *p_dec = (decoder_t *)p_data; + + if( !strcmp( psz_var, "fake-file" ) ) + { + image_handler_t *p_handler; + picture_t *p_new_image; + video_format_t fmt_in, fmt_out; + char *psz_file = newval.psz_string; + picture_t *p_image; + + vlc_mutex_lock( &p_dec->p_sys->lock ); + p_image = p_dec->p_sys->p_image; + + if( !psz_file || !*psz_file ) + { + msg_Err( p_dec, "fake-file value must be non empty." ); + vlc_mutex_unlock( &p_dec->p_sys->lock ); + return VLC_EGENERIC; + } + msg_Dbg( p_dec, "Changing fake-file to %s.", psz_file ); + + memset( &fmt_in, 0, sizeof(fmt_in) ); + fmt_out = p_dec->fmt_out.video; + p_handler = image_HandlerCreate( p_dec ); + p_new_image = image_ReadUrl( p_handler, psz_file, &fmt_in, &fmt_out ); + image_HandlerDelete( p_handler ); + + if( !p_new_image ) + { + msg_Err( p_dec, "error while reading image (%s)", psz_file ); + vlc_mutex_unlock( &p_dec->p_sys->lock ); + return VLC_EGENERIC; + } + + p_dec->p_sys->p_image = p_new_image; + p_image->pf_release( p_image ); + vlc_mutex_unlock( &p_dec->p_sys->lock ); + } + + return VLC_SUCCESS; }