X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmpeg%2Fm4v.c;h=88bd4fd2dfac9e7fc448f60df6167b7f02cd5012;hb=806cf5165824be921bf2402ecf11fd3ee6501f9c;hp=c6d07992580bef1fe9aa0ccc1be62f7622e15f7c;hpb=2cb472dba008f7d877ffe6bae9c5575253365282;p=vlc diff --git a/modules/demux/mpeg/m4v.c b/modules/demux/mpeg/m4v.c index c6d0799258..88bd4fd2df 100644 --- a/modules/demux/mpeg/m4v.c +++ b/modules/demux/mpeg/m4v.c @@ -24,10 +24,9 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ #include -#include +#include #include "vlc_codec.h" /***************************************************************************** @@ -36,6 +35,10 @@ static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); +#define FPS_TEXT N_("Frames per Second") +#define FPS_LONGTEXT N_("This is the desired frame rate when " \ + "playing MPEG4 video elementary streams.") + vlc_module_begin(); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_DEMUX ); @@ -44,6 +47,8 @@ vlc_module_begin(); set_callbacks( Open, Close ); add_shortcut( "m4v" ); add_shortcut( "mp4v" ); + add_float( "m4v-fps", 25, NULL, FPS_TEXT, FPS_LONGTEXT, VLC_FALSE ); + change_safe(); vlc_module_end(); /***************************************************************************** @@ -53,6 +58,7 @@ struct demux_sys_t { mtime_t i_dts; es_out_id_t *p_es; + float f_fps; decoder_t *p_packetizer; }; @@ -69,33 +75,21 @@ static int Open( vlc_object_t * p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; - vlc_bool_t b_forced = VLC_FALSE; - - uint8_t *p_peek; + const uint8_t *p_peek; + vlc_value_t val; - es_format_t fmt; + if( stream_Peek( p_demux->s, &p_peek, 4 ) < 4 ) return VLC_EGENERIC; - if( stream_Peek( p_demux->s, &p_peek, 4 ) < 4 ) + if( p_peek[0] != 0x00 || p_peek[1] != 0x00 || p_peek[2] != 0x01 ) { - msg_Err( p_demux, "cannot peek" ); - return VLC_EGENERIC; - } - - if( !strncmp( p_demux->psz_demux, "mp4v", 4 ) || - !strncmp( p_demux->psz_demux, "m4v", 4 ) ) - { - b_forced = VLC_TRUE; - } - - if( p_peek[0] != 0x00 || p_peek[1] != 0x00 || p_peek[2] != 0x01 || p_peek[3] > 0x2f ) - { - if( !b_forced ) + if( !p_demux->b_force ) { msg_Warn( p_demux, "m4v module discarded (no startcode)" ); return VLC_EGENERIC; } - msg_Warn( p_demux, "this doesn't look like an MPEG-4 ES stream, continuing anyway" ); + msg_Warn( p_demux, "this doesn't look like an MPEG-4 ES stream, " + "continuing anyway" ); } p_demux->pf_demux = Demux; @@ -104,33 +98,18 @@ static int Open( vlc_object_t * p_this ) p_sys->p_es = NULL; p_sys->i_dts = 1; - /* - * Load the mpegvideo packetizer - */ - p_sys->p_packetizer = vlc_object_create( p_demux, VLC_OBJECT_PACKETIZER ); - p_sys->p_packetizer->pf_decode_audio = NULL; - p_sys->p_packetizer->pf_decode_video = NULL; - p_sys->p_packetizer->pf_decode_sub = NULL; - p_sys->p_packetizer->pf_packetize = NULL; - es_format_Init( &p_sys->p_packetizer->fmt_in, VIDEO_ES, - VLC_FOURCC( 'm', 'p', '4', 'v' ) ); + /* Load the mpeg4video packetizer */ + INIT_VPACKETIZER( p_sys->p_packetizer, 'm', 'p', '4', 'v' ); es_format_Init( &p_sys->p_packetizer->fmt_out, UNKNOWN_ES, 0 ); - p_sys->p_packetizer->p_module = - module_Need( p_sys->p_packetizer, "packetizer", NULL, 0 ); - if( p_sys->p_packetizer->p_module == NULL) - { - vlc_object_destroy( p_sys->p_packetizer ); - msg_Err( p_demux, "cannot find mp4v packetizer" ); - free( p_sys ); - return VLC_EGENERIC; - } + LOAD_PACKETIZER_OR_FAIL( p_sys->p_packetizer, "mpeg4 video" ); + + /* We need to wait until we get p_extra (VOL header) from the packetizer + * before we create the output */ - /* - * create the output - */ - es_format_Init( &fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', '4', 'v' ) ); - p_sys->p_es = es_out_Add( p_demux->out, &fmt ); + var_Create( p_demux, "m4v-fps", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); + var_Get( p_demux, "m4v-fps", &val ); + p_sys->f_fps = val.f_float; return VLC_SUCCESS; } @@ -143,8 +122,7 @@ static void Close( vlc_object_t * p_this ) demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; - module_Unneed( p_sys->p_packetizer, p_sys->p_packetizer->p_module ); - vlc_object_destroy( p_sys->p_packetizer ); + DESTROY_PACKETIZER( p_sys->p_packetizer) ; free( p_sys ); } @@ -198,7 +176,7 @@ static int Demux( demux_t *p_demux) p_block_out = p_next; /* FIXME FIXME FIXME FIXME */ - p_sys->i_dts += (mtime_t)1000000 / 25; + p_sys->i_dts += (mtime_t)1000000 / p_sys->f_fps; /* FIXME FIXME FIXME FIXME */ } }