X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmod.c;h=b7817a4f87cef1d9a5f33988c723fae7fc2f5ad1;hb=82b3b8dd0c9a27b1ba3ecb3599ad66a675beb773;hp=6bf6390b380fcc5a35a803655aaf2ffcad20aba8;hpb=9d97dc438aebb3ab7cfa9990583fc111a66b26d1;p=vlc diff --git a/modules/demux/mod.c b/modules/demux/mod.c index 6bf6390b38..b7817a4f87 100644 --- a/modules/demux/mod.c +++ b/modules/demux/mod.c @@ -149,7 +149,9 @@ static int Open( vlc_object_t *p_this ) /* We accept file based on extension match */ if( !p_demux->b_force ) { - const char *psz_ext = strrchr( p_demux->psz_path, '.' ); + if( !p_demux->psz_file ) + return VLC_EGENERIC; + const char *psz_ext = strrchr( p_demux->psz_file, '.' ); int i; if( !psz_ext ) @@ -235,7 +237,7 @@ static int Open( vlc_object_t *p_this ) /* init time */ date_Init( &p_sys->pts, settings.mFrequency, 1 ); - date_Set( &p_sys->pts, 1 ); + date_Set( &p_sys->pts, 0 ); p_sys->i_length = ModPlug_GetLength( p_sys->f ) * INT64_C(1000); msg_Dbg( p_demux, "MOD loaded name=%s lenght=%"PRId64"ms", @@ -292,7 +294,7 @@ static int Demux( demux_t *p_demux ) } p_frame->i_buffer = i_read; p_frame->i_dts = - p_frame->i_pts = date_Increment( &p_sys->pts, p_frame->i_buffer / i_bk ); + p_frame->i_pts = VLC_TS_0 + date_Get( &p_sys->pts ); /* Set PCR */ es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_frame->i_pts ); @@ -300,6 +302,8 @@ static int Demux( demux_t *p_demux ) /* Send data */ es_out_Send( p_demux->out, p_sys->es, p_frame ); + date_Increment( &p_sys->pts, i_read / i_bk ); + return 1; } @@ -318,7 +322,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) pf = (double*) va_arg( args, double* ); if( p_sys->i_length > 0 ) { - *pf = (double)date_Get( &p_sys->pts ) / (double)p_sys->i_length; + double current = date_Get( &p_sys->pts ); + double length = p_sys->i_length; + *pf = current / length; return VLC_SUCCESS; } return VLC_EGENERIC; @@ -330,7 +336,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) if( i64 >= 0 && i64 <= p_sys->i_length ) { ModPlug_Seek( p_sys->f, i64 / 1000 ); - date_Set( &p_sys->pts, i64 + 1 ); + date_Set( &p_sys->pts, i64 ); return VLC_SUCCESS; } @@ -352,7 +358,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) if( i64 >= 0 && i64 <= p_sys->i_length ) { ModPlug_Seek( p_sys->f, i64 / 1000 ); - date_Set( &p_sys->pts, i64 + 1 ); + date_Set( &p_sys->pts, i64 ); return VLC_SUCCESS; } @@ -368,10 +374,11 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) { vlc_meta_t *p_meta = (vlc_meta_t *)va_arg( args, vlc_meta_t* ); unsigned i_num_samples = ModPlug_NumSamples( p_sys->f ), - i_num_instruments = ModPlug_NumInstruments( p_sys->f ); + i_num_instruments = ModPlug_NumInstruments( p_sys->f ); unsigned i_num_patterns = ModPlug_NumPatterns( p_sys->f ), - i_num_channels = ModPlug_NumChannels( p_sys->f ); -// unsigned modType = ModPlug_GetModuleType( p_sys->f ); + i_num_channels = ModPlug_NumChannels( p_sys->f ); + // unsigned modType = ModPlug_GetModuleType( p_sys->f ); + char psz_temp[2048]; /* 32 * 240 max, but only need start */ char *psz_module_info, *psz_instrument_info; unsigned i_temp_index = 0; @@ -379,19 +386,23 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) if( psz_name && *psz_name ) vlc_meta_SetTitle( p_meta, psz_name ); - /* Comment field from artist - not in every type of MOD */ - psz_name = ModPlug_GetMessage( p_sys->f ); - if (psz_name && *psz_name ) - vlc_meta_SetDescription( p_meta, psz_name ); + /* Comment field from artist - not in every type of MOD */ + psz_name = ModPlug_GetMessage( p_sys->f ); + if( psz_name && *psz_name ) + vlc_meta_SetDescription( p_meta, psz_name ); /* Instruments only in newer MODs - so don't show if 0 */ - if ( asprintf( &psz_instrument_info, ", %i Instruments", i_num_instruments ) ) - { - if ( asprintf( &psz_module_info, "%i Channels, %i Patterns\n" - "%i Samples%s\n", - i_num_channels, i_num_patterns, i_num_samples, ( i_num_instruments ? psz_instrument_info : "" ) )) + if( asprintf( &psz_instrument_info, ", %i Instruments", + i_num_instruments ) >= 0 ) + { + if( asprintf( &psz_module_info, + "%i Channels, %i Patterns\n" + "%i Samples%s\n", + i_num_channels, i_num_patterns, i_num_samples, + ( i_num_instruments ? psz_instrument_info : "" ) ) >= 0 ) { - vlc_meta_AddExtra( p_meta, "Module Information", psz_module_info ); + vlc_meta_AddExtra( p_meta, "Module Information", + psz_module_info ); free( psz_module_info ); } @@ -399,10 +410,10 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) } /* Make list of instruments (XM, IT, etc) */ - if ( i_num_instruments ) + if( i_num_instruments ) { i_temp_index = 0; - for ( int i = 0; i < i_num_instruments && i_temp_index < sizeof(psz_temp); i++ ) + for( unsigned i = 0; i < i_num_instruments && i_temp_index < sizeof(psz_temp); i++ ) { char lBuffer[33]; ModPlug_InstrumentName( p_sys->f, i, lBuffer ); @@ -414,12 +425,12 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) } /* Make list of samples */ - for ( int i = 0; i < i_num_samples && i_temp_index < sizeof(psz_temp); i++ ) + for( unsigned int i = 0; i < i_num_samples && i_temp_index < sizeof(psz_temp); i++ ) { - char lBuffer[33]; - ModPlug_SampleName( p_sys->f, i, lBuffer ); - if ( !lBuffer[0] ) continue; // don't add empty fields. - i_temp_index += snprintf( &psz_temp[i_temp_index], sizeof(psz_temp) - i_temp_index, "%s\n", lBuffer ); + char psz_buffer[33]; + ModPlug_SampleName( p_sys->f, i, psz_buffer ); + if ( !psz_buffer[0] ) continue; // don't add empty fields. + i_temp_index += snprintf( &psz_temp[i_temp_index], sizeof(psz_temp) - i_temp_index, "%s\n", psz_buffer ); } vlc_meta_AddExtra( p_meta, "Samples", psz_temp );