X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fgme.cpp;h=dcd213f73ebece167e5aad257bb6798e2f89542a;hb=88041dfe447b0239779f0af66e212e04a1d14da8;hp=de1c285d0f6c8a1bf230d2fbaed9f49810601f63;hpb=3561b9b28f58eb7a4183e158a8fd973800d31ceb;p=vlc diff --git a/modules/demux/gme.cpp b/modules/demux/gme.cpp index de1c285d0f..dcd213f73e 100644 --- a/modules/demux/gme.cpp +++ b/modules/demux/gme.cpp @@ -50,15 +50,15 @@ using namespace std; static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); -vlc_module_begin(); - set_shortname( "GME"); - set_description( N_("GME demuxer (Game_Music_Emu)" ) ); - set_capability( "demux", 10 ); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_DEMUX ); - set_callbacks( Open, Close ); - add_shortcut( "gme" ); -vlc_module_end(); +vlc_module_begin () + set_shortname( "GME") + set_description( N_("GME demuxer (Game_Music_Emu)" ) ) + set_capability( "demux", 10 ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_DEMUX ) + set_callbacks( Open, Close ) + add_shortcut( "gme" ) +vlc_module_end () /***************************************************************************** * Local prototypes @@ -115,13 +115,14 @@ static int Open( vlc_object_t *p_this ) demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; char *ext; - int i; + int i = 0; vlc_value_t val; /* We accept file based on extention match */ if( !p_demux->b_force ) { - if( ( ext = strrchr( p_demux->psz_path, '.' ) ) == NULL || + if( p_demux->psz_file == NULL + || ( ext = strrchr( p_demux->psz_file, '.' ) ) == NULL || stream_Size( p_demux->s ) == 0 ) return VLC_EGENERIC; ext++; /* skip . */ @@ -148,10 +149,17 @@ static int Open( vlc_object_t *p_this ) p_demux->pf_demux = Demux; p_demux->pf_control = Control; p_demux->p_sys = p_sys = (demux_sys_t *)malloc( sizeof( demux_sys_t ) ); + if( unlikely( !p_sys ) ) + return VLC_ENOMEM; msg_Dbg( p_demux, "loading complete file (could be long)" ); p_sys->i_data = stream_Size( p_demux->s ); p_sys->p_data = (uint8_t *)malloc( p_sys->i_data ); + if( unlikely( !p_sys->p_data ) ) + { + free( p_sys ); + return VLC_ENOMEM; + } p_sys->i_data = stream_Read( p_demux->s, p_sys->p_data, p_sys->i_data ); if( p_sys->i_data <= 0 ) { @@ -302,7 +310,7 @@ static int Open( vlc_object_t *p_this ) } /* init time */ - p_sys->i_time = 1; + p_sys->i_time = 0; p_sys->i_length = 314 * (int64_t)1000; msg_Dbg( p_demux, "GME loaded type=%s title=%s tracks=%i", type_str[p_sys->i_type], @@ -370,13 +378,13 @@ static int Demux( demux_t *p_demux ) for (int i = 0; ip_buffer[i] = ((uint8_t *)p_emubuf)[i]; /* Set PCR */ - es_out_Control( p_demux->out, ES_OUT_SET_PCR, (int64_t)p_sys->i_time ); + es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + p_sys->i_time ); + p_frame->i_dts = p_frame->i_pts = VLC_TS_0 + p_sys->i_time; /* We should use p_frame->i_buffer */ p_sys->i_time += (int64_t)1000000 * p_frame->i_buffer / i_bk / p_sys->fmt.audio.i_rate; /* Send data */ - p_frame->i_dts = p_frame->i_pts = p_sys->i_time; es_out_Send( p_demux->out, p_sys->es, p_frame ); return 1; @@ -419,8 +427,7 @@ switch( i_query ) if( i64 >= 0 && i64 <= p_sys->i_length ) { ModPlug_Seek( p_sys->f, i64 / 1000 ); - p_sys->i_time = i64 + 1; - es_out_Control( p_demux->out, ES_OUT_RESET_PCR ); + p_sys->i_time = i64; return VLC_SUCCESS; } @@ -442,8 +449,7 @@ switch( i_query ) if( i64 >= 0 && i64 <= p_sys->i_length ) { ModPlug_Seek( p_sys->f, i64 / 1000 ); - p_sys->i_time = i64 + 1; - es_out_Control( p_demux->out, ES_OUT_RESET_PCR ); + p_sys->i_time = i64; return VLC_SUCCESS; } @@ -456,7 +462,7 @@ switch( i_query ) int *pi_int = (int*)va_arg( args, int* ); *pi_int = p_sys->i_tracks; - *ppp_title = (input_title_t**)malloc( sizeof( input_title_t**) * p_sys->i_tracks ); + *ppp_title = (input_title_t**)xmalloc( sizeof( input_title_t**) * p_sys->i_tracks ); for( int i = 0; i < p_sys->i_tracks; i++ ) { @@ -500,7 +506,7 @@ static void inflate_gzbuf(uint8_t * p_buffer, size_t i_size, uint8_t ** pp_obuff memset(&z_str, 0, sizeof(z_str)); out_size = i_size * 2; - out_buffer = (uint8_t*)malloc(out_size); + out_buffer = (uint8_t*)xmalloc(out_size); z_str.next_in = (unsigned char*)p_buffer; z_str.avail_in = i_size; @@ -522,7 +528,7 @@ static void inflate_gzbuf(uint8_t * p_buffer, size_t i_size, uint8_t ** pp_obuff case Z_BUF_ERROR: offset = z_str.next_out - out_buffer; out_size *= 2; - out_buffer = (uint8_t *)realloc(out_buffer, out_size); + out_buffer = (uint8_t *)xrealloc(out_buffer, out_size); z_str.next_out = out_buffer + offset; z_str.avail_out = out_size - offset; break; @@ -537,7 +543,7 @@ static void inflate_gzbuf(uint8_t * p_buffer, size_t i_size, uint8_t ** pp_obuff inflateEnd(&z_str); - out_buffer = (uint8_t *)realloc(out_buffer, *pi_osize); + out_buffer = (uint8_t *)xrealloc(out_buffer, *pi_osize); (*pp_obuffer) = out_buffer; } #endif