vlc | branch: master | Francois Cartegnie <[email protected]> | Mon Oct 30 22:03:33 2017 +0100| [6cb816a2556937e63f49d5e703b98e2a760419ec] | committer: Francois Cartegnie
demux: avformat: use struct for track info > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6cb816a2556937e63f49d5e703b98e2a760419ec --- modules/demux/avformat/demux.c | 82 ++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c index afaf7ad90e..03f5f16a01 100644 --- a/modules/demux/avformat/demux.c +++ b/modules/demux/avformat/demux.c @@ -52,6 +52,12 @@ # define HAVE_AVUTIL_CODEC_ATTACHMENT 1 +struct avformat_track_s +{ + es_out_id_t *p_es; + mtime_t i_pcr; +}; + /***************************************************************************** * demux_sys_t: demux descriptor *****************************************************************************/ @@ -60,9 +66,8 @@ struct demux_sys_t AVInputFormat *fmt; AVFormatContext *ic; - int i_tk; - es_out_id_t **tk; - int64_t *tk_pcr; + struct avformat_track_s *tracks; + int64_t i_pcr; unsigned i_ssa_order; @@ -268,9 +273,7 @@ int OpenDemux( vlc_object_t *p_this ) p_demux->p_sys = p_sys = xmalloc( sizeof( demux_sys_t ) ); p_sys->ic = 0; p_sys->fmt = fmt; - p_sys->i_tk = 0; - p_sys->tk = NULL; - p_sys->tk_pcr = NULL; + p_sys->tracks = NULL; p_sys->i_ssa_order = 0; TAB_INIT( p_sys->i_attachments, p_sys->attachments); p_sys->p_title = NULL; @@ -320,9 +323,16 @@ int OpenDemux( vlc_object_t *p_this ) free( psz_url ); char *psz_opts = var_InheritString( p_demux, "avformat-options" ); - AVDictionary *options[p_sys->ic->nb_streams ? p_sys->ic->nb_streams : 1]; + const unsigned int nb_streams = p_sys->ic->nb_streams; + p_sys->tracks = calloc( nb_streams, sizeof(*p_sys->tracks) ); + if( !p_sys->tracks ) + { + CloseDemux( p_this ); + return VLC_ENOMEM; + } + + AVDictionary *options[nb_streams ? nb_streams : 1]; options[0] = NULL; - unsigned int nb_streams = p_sys->ic->nb_streams; for (unsigned i = 1; i < nb_streams; i++) options[i] = NULL; if (psz_opts) { @@ -351,20 +361,17 @@ int OpenDemux( vlc_object_t *p_this ) vlc_strerror_c(AVUNERROR(error)) ); } - for( unsigned i = 0; i < p_sys->ic->nb_streams; i++ ) + for( unsigned i = 0; i < nb_streams; i++ ) { + struct avformat_track_s *p_track = &p_sys->tracks[i]; AVStream *s = p_sys->ic->streams[i]; const AVCodecParameters *cp = s->codecpar; - es_out_id_t *es = NULL; es_format_t es_fmt; const char *psz_type = "unknown"; /* Do not use the cover art as a stream */ if( s->disposition == AV_DISPOSITION_ATTACHED_PIC ) - { - TAB_APPEND( p_sys->i_tk, p_sys->tk, NULL ); continue; - } vlc_fourcc_t fcc = GetVlcFourcc( cp->codec_id ); switch( cp->codec_type ) @@ -618,17 +625,16 @@ int OpenDemux( vlc_object_t *p_this ) memcpy( es_fmt.p_extra, p_extra, i_extra ); } } - es = es_out_Add( p_demux->out, &es_fmt ); - if( s->disposition & AV_DISPOSITION_DEFAULT ) - es_out_Control( p_demux->out, ES_OUT_SET_ES_DEFAULT, es ); + + p_track->p_es = es_out_Add( p_demux->out, &es_fmt ); + if( p_track->p_es && (s->disposition & AV_DISPOSITION_DEFAULT) ) + es_out_Control( p_demux->out, ES_OUT_SET_ES_DEFAULT, p_track->p_es ); msg_Dbg( p_demux, "adding es: %s codec = %4.4s (%d)", psz_type, (char*)&fcc, cp->codec_id ); } es_format_Clean( &es_fmt ); - TAB_APPEND( p_sys->i_tk, p_sys->tk, es ); } - p_sys->tk_pcr = xcalloc( p_sys->i_tk, sizeof(*p_sys->tk_pcr) ); if( p_sys->ic->start_time != (int64_t)AV_NOPTS_VALUE ) i_start_time = p_sys->ic->start_time * 1000000 / AV_TIME_BASE; @@ -677,8 +683,7 @@ void CloseDemux( vlc_object_t *p_this ) demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; - free( p_sys->tk ); - free( p_sys->tk_pcr ); + free( p_sys->tracks ); if( p_sys->ic ) { @@ -720,11 +725,12 @@ static int Demux( demux_t *p_demux ) return 0; } - if( pkt.stream_index < 0 || pkt.stream_index >= p_sys->i_tk ) + if( pkt.stream_index < 0 || (unsigned) pkt.stream_index >= p_sys->ic->nb_streams ) { av_packet_unref( &pkt ); return 1; } + struct avformat_track_s *p_track = &p_sys->tracks[pkt.stream_index]; const AVStream *p_stream = p_sys->ic->streams[pkt.stream_index]; if( p_stream->time_base.den <= 0 ) { @@ -816,10 +822,10 @@ static int Demux( demux_t *p_demux ) if( p_stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && p_stream->codecpar->codec_id == AV_CODEC_ID_AAC ) { - if( p_sys->tk_pcr[pkt.stream_index] != VLC_TS_INVALID && - p_sys->tk_pcr[pkt.stream_index] + p_frame->i_length > p_frame->i_dts ) + if( p_track->i_pcr != VLC_TS_INVALID && + p_track->i_pcr + p_frame->i_length > p_frame->i_dts ) { - p_frame->i_dts = p_frame->i_pts = p_sys->tk_pcr[pkt.stream_index] + p_frame->i_length; + p_frame->i_dts = p_frame->i_pts = p_track->i_pcr + p_frame->i_length; } } } @@ -827,23 +833,23 @@ static int Demux( demux_t *p_demux ) msg_Dbg( p_demux, "tk[%d] dts=%"PRId64" pts=%"PRId64, pkt.stream_index, p_frame->i_dts, p_frame->i_pts ); #endif - if( p_frame->i_dts > VLC_TS_INVALID && p_sys->tk[pkt.stream_index] != NULL ) - p_sys->tk_pcr[pkt.stream_index] = p_frame->i_dts; + if( p_frame->i_dts > VLC_TS_INVALID && p_track->p_es != NULL ) + p_track->i_pcr = p_frame->i_dts; int64_t i_ts_max = INT64_MIN; - for( int i = 0; i < p_sys->i_tk; i++ ) + for( unsigned i = 0; i < p_sys->ic->nb_streams; i++ ) { - if( p_sys->tk[i] != NULL ) - i_ts_max = __MAX( i_ts_max, p_sys->tk_pcr[i] ); + if( p_sys->tracks[i].p_es != NULL ) + i_ts_max = __MAX( i_ts_max, p_sys->tracks[i].i_pcr ); } int64_t i_ts_min = INT64_MAX; - for( int i = 0; i < p_sys->i_tk; i++ ) + for( unsigned i = 0; i < p_sys->ic->nb_streams; i++ ) { - if( p_sys->tk[i] != NULL && - p_sys->tk_pcr[i] > VLC_TS_INVALID && - p_sys->tk_pcr[i] + 10 * CLOCK_FREQ >= i_ts_max ) - i_ts_min = __MIN( i_ts_min, p_sys->tk_pcr[i] ); + if( p_sys->tracks[i].p_es != NULL && + p_sys->tracks[i].i_pcr > VLC_TS_INVALID && + p_sys->tracks[i].i_pcr + 10 * CLOCK_FREQ >= i_ts_max ) + i_ts_min = __MIN( i_ts_min, p_sys->tracks[i].i_pcr ); } if( i_ts_min >= p_sys->i_pcr && likely(i_ts_min != INT64_MAX) ) { @@ -852,8 +858,8 @@ static int Demux( demux_t *p_demux ) UpdateSeekPoint( p_demux, p_sys->i_pcr ); } - if( p_sys->tk[pkt.stream_index] != NULL ) - es_out_Send( p_demux->out, p_sys->tk[pkt.stream_index], p_frame ); + if( p_track->p_es != NULL ) + es_out_Send( p_demux->out, p_track->p_es, p_frame ); else block_Release( p_frame ); @@ -893,8 +899,8 @@ static void ResetTime( demux_t *p_demux, int64_t i_time ) i_time = 1; p_sys->i_pcr = i_time; - for( int i = 0; i < p_sys->i_tk; i++ ) - p_sys->tk_pcr[i] = i_time; + for( unsigned i = 0; i < p_sys->ic->nb_streams; i++ ) + p_sys->tracks[i].i_pcr = i_time; if( i_time > VLC_TS_INVALID ) { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
