X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Ffake.c;h=77ee197708d60a0125d69560730adbcf5618518f;hb=b0586bcbfa09d16048bd7b734aae8e14efd5a562;hp=b65386006ed4a2cf624a7362fe64506791b09ba5;hpb=806cf5165824be921bf2402ecf11fd3ee6501f9c;p=vlc diff --git a/modules/access/fake.c b/modules/access/fake.c index b65386006e..77ee197708 100644 --- a/modules/access/fake.c +++ b/modules/access/fake.c @@ -25,9 +25,15 @@ * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include +#include /***************************************************************************** * Module descriptior @@ -49,29 +55,27 @@ static void Close( vlc_object_t * ); #define DURATION_TEXT N_("Duration in ms") #define DURATION_LONGTEXT N_( \ "Duration of the fake streaming before faking an " \ - "end-of-file (default is 0, meaning that the stream is unlimited).") + "end-of-file (default is -1 meaning that the stream is unlimited when " \ + "fake is forced, or lasts for 10 seconds otherwise. 0, means that the " \ + "stream is unlimited).") -vlc_module_begin(); - set_shortname( _("Fake") ); - set_description( _("Fake input") ); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_ACCESS ); +vlc_module_begin () + set_shortname( N_("Fake") ) + set_description( N_("Fake video input") ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_ACCESS ) add_integer( "fake-caching", DEFAULT_PTS_DELAY / 1000, NULL, - CACHING_TEXT, CACHING_LONGTEXT, VLC_TRUE ); - change_safe(); - add_float( "fake-fps", 25.0, NULL, FPS_TEXT, FPS_LONGTEXT, VLC_TRUE ); - change_safe(); - add_integer( "fake-id", 0, NULL, ID_TEXT, ID_LONGTEXT, VLC_TRUE ); - change_safe(); - add_integer( "fake-duration", 0, NULL, DURATION_TEXT, DURATION_LONGTEXT, - VLC_TRUE ); - change_safe(); - - add_shortcut( "fake" ); - set_capability( "access_demux", 0 ); - set_callbacks( Open, Close ); -vlc_module_end(); + CACHING_TEXT, CACHING_LONGTEXT, true ) + add_float( "fake-fps", 25.0, NULL, FPS_TEXT, FPS_LONGTEXT, true ) + add_integer( "fake-id", 0, NULL, ID_TEXT, ID_LONGTEXT, true ) + add_integer( "fake-duration", -1, NULL, DURATION_TEXT, DURATION_LONGTEXT, + true ) + + add_shortcut( "fake" ) + set_capability( "access_demux", 10 ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Access: local prototypes @@ -96,9 +100,37 @@ static int Open( vlc_object_t *p_this ) demux_sys_t *p_sys; es_format_t fmt; - /* Only when selected */ - if( *p_demux->psz_access == '\0' ) - return VLC_EGENERIC; + if( *p_demux->psz_access != '\0' ) + { + /* if an access is provided, then it has to be "fake" */ + if( strcmp( p_demux->psz_access, "fake" ) ) + return VLC_EGENERIC; + + msg_Dbg( p_demux, "fake:// access_demux detected" ); + } + else + { + /** + * access is not provided, + * then let's see if path could be an image + **/ + + if( !p_demux->psz_path || !*p_demux->psz_path ) + return VLC_EGENERIC; + + vlc_fourcc_t i_codec = image_Ext2Fourcc( p_demux->psz_path ); + if( !i_codec ) + return VLC_EGENERIC; + msg_Dbg( p_demux, "still image detected with codec format %4.4s", + (const char*)&i_codec ); + } + + if( p_demux->psz_path && *p_demux->psz_path ) + { + /* set up fake-file on the fly */ + var_Create( p_demux->p_parent, "fake-file", VLC_VAR_STRING ); + var_SetString( p_demux->p_parent, "fake-file", p_demux->psz_path ); + } /* Set up p_demux */ DEMUX_INIT_COMMON(); p_sys = p_demux->p_sys; @@ -108,6 +140,13 @@ static int Open( vlc_object_t *p_this ) p_sys->i_duration = (mtime_t)var_CreateGetInteger( p_demux, "fake-duration" ) * 1000; + if( p_sys->i_duration < 0 ) + { + if( !strcmp( p_demux->psz_access, "fake" ) ) + p_sys->i_duration = 0; + else + p_sys->i_duration = 10000*1000; + } p_sys->f_fps = var_CreateGetFloat( p_demux, "fake-fps" ); /* Declare the elementary stream */ @@ -138,7 +177,7 @@ static void Close( vlc_object_t *p_this ) static int Control( demux_t *p_demux, int i_query, va_list args ) { demux_sys_t *p_sys = p_demux->p_sys; - vlc_bool_t *pb, b; + bool *pb, b; int64_t *pi64, i64; double *pf, f; @@ -148,12 +187,12 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) case DEMUX_CAN_PAUSE: case DEMUX_CAN_SEEK: case DEMUX_CAN_CONTROL_PACE: - pb = (vlc_bool_t *)va_arg( args, vlc_bool_t * ); - *pb = VLC_TRUE; + pb = (bool *)va_arg( args, bool * ); + *pb = true; return VLC_SUCCESS; case DEMUX_SET_PAUSE_STATE: - b = (vlc_bool_t)va_arg( args, vlc_bool_t ); + b = (bool)va_arg( args, int ); if ( b ) { p_sys->i_pause_pts = mdate(); @@ -175,19 +214,16 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) return VLC_SUCCESS; case DEMUX_GET_POSITION: + if( p_sys->i_duration <= 0 ) + return VLC_EGENERIC; pf = (double*)va_arg( args, double* ); - if( p_sys->i_duration > 0 ) - { - *pf = (double)( p_sys->i_last_pts - p_sys->i_first_pts ) - / (double)(p_sys->i_duration); - } - else - { - *pf = 0; - } + *pf = (double)( p_sys->i_last_pts - p_sys->i_first_pts ) + / (double)(p_sys->i_duration); return VLC_SUCCESS; case DEMUX_SET_POSITION: + if( p_sys->i_duration <= 0 ) + return VLC_EGENERIC; f = (double)va_arg( args, double ); i64 = f * (double)p_sys->i_duration; p_sys->i_first_pts = p_sys->i_last_pts - i64; @@ -196,13 +232,12 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) case DEMUX_GET_TIME: pi64 = (int64_t *)va_arg( args, int64_t * ); - if ( p_sys->i_duration ) - *pi64 = p_sys->i_last_pts - p_sys->i_first_pts; - else - *pi64 = p_sys->i_last_pts; + *pi64 = p_sys->i_last_pts - p_sys->i_first_pts; return VLC_SUCCESS; case DEMUX_GET_LENGTH: + if( p_sys->i_duration <= 0 ) + return VLC_EGENERIC; pi64 = (int64_t*)va_arg( args, int64_t * ); *pi64 = p_sys->i_duration; return VLC_SUCCESS; @@ -227,7 +262,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; - block_t *p_block = block_New( p_demux, 1 ); if ( !p_sys->i_last_pts ) { @@ -243,6 +277,7 @@ static int Demux( demux_t *p_demux ) mwait( p_sys->i_last_pts ); } + block_t *p_block = block_New( p_demux, 1 ); p_block->i_flags |= BLOCK_FLAG_TYPE_I; p_block->i_dts = p_block->i_pts = p_sys->i_last_pts;