Signed-off-by: Michael Niedermayer <michae...@gmx.at> --- libavformat/avformat.h | 5 +++++ libavformat/mpegts.c | 3 +++ libavformat/utils.c | 10 ++++++++++ 3 files changed, 18 insertions(+)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 3007f81..3dbbaca 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1111,6 +1111,11 @@ typedef struct AVStream { * - decoding: Set by libavformat to calculate sample_aspect_ratio internally */ AVRational display_aspect_ratio; + + /** + * Internal data for optimizig finding AVPrograms + */ + int program_index; } AVStream; AVRational av_stream_get_r_frame_rate(const AVStream *s); diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index afda648..0d7eb65 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -263,6 +263,9 @@ static void clear_avprogram(MpegTSContext *ts, unsigned int programid) } if (!prg) return; + for (i = 0; i<prg->nb_stream_indexes; i++) { + ts->stream->streams[prg->stream_index[i]]->program_index = INT_MAX; + } prg->nb_stream_indexes = 0; } diff --git a/libavformat/utils.c b/libavformat/utils.c index 917f8ce..fb79ecd 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3455,6 +3455,12 @@ AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int { int i, j; + i = ic->streams[s]->program_index; + if (i<INT_MAX && !last) { + av_assert0(i<ic->nb_programs); + return ic->programs[i]; + } + for (i = 0; i < ic->nb_programs; i++) { if (ic->programs[i] == last) { last = NULL; @@ -3707,6 +3713,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) st->info->fps_last_dts = AV_NOPTS_VALUE; st->inject_global_side_data = s->internal->inject_global_side_data; + st->program_index = INT_MAX; s->streams[s->nb_streams++] = st; return st; @@ -3774,6 +3781,7 @@ void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx) { int i, j; AVProgram *program = NULL; + AVStream *st = ac->streams[idx]; void *tmp; if (idx >= ac->nb_streams) { @@ -3794,6 +3802,8 @@ void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx) return; program->stream_index = tmp; program->stream_index[program->nb_stream_indexes++] = idx; + st->program_index = FFMIN(st->program_index, i); + return; } } -- 1.7.9.5 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel