improve the accuracy of getting duration from bit rate. Signed-off-by: Ping Kai <pingkai...@gmail.com> --- libavformat/utils.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/libavformat/utils.c b/libavformat/utils.c index baa7177..3a06a85 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2775,7 +2775,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) int64_t old_offset = avio_tell(ic->pb); int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those int flush_codecs = ic->probesize > 0; + int64_t *pSampleBitRateSum = (int64_t *)av_malloc(ic->nb_streams * sizeof(int64_t)); + int *pSampleCount = (int *)av_malloc(ic->nb_streams * sizeof(int)); + if (pSampleBitRateSum == NULL || pSampleCount == NULL) + return AVERROR_INVALIDDATA; if(ic->pb) av_log(ic, AV_LOG_DEBUG, "File position before avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb)); @@ -2839,6 +2843,8 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) count = 0; read_size = 0; + memset(pSampleBitRateSum ,0 ,ic->nb_streams * sizeof(int64_t)); + memset(pSampleCount,0 ,ic->nb_streams * sizeof(int)); for(;;) { if (ff_check_interrupt(&ic->interrupt_callback)){ ret= AVERROR_EXIT; @@ -2909,7 +2915,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) /* EOF or error*/ break; } - + if (pkt1.stream_index < orig_nb_streams + &&ic->streams[pkt1.stream_index]->codec->bit_rate > 0){ + pSampleBitRateSum += ic->streams[pkt1.stream_index]->codec->bit_rate; + pSampleCount ++; + } if (ic->flags & AVFMT_FLAG_NOBUFFER) { pkt = &pkt1; } else { @@ -3029,7 +3039,10 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) st->codec_info_nb_frames++; count++; } - + for(i=0;i<orig_nb_streams;i++){ + if (pSampleCount > 0) + ic->streams[i]->codec->bit_rate = (int)(pSampleBitRateSum[i] / pSampleCount[i]); + } if (flush_codecs) { AVPacket empty_pkt = { 0 }; int err = 0; @@ -3185,6 +3198,8 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) av_freep(&st->info->duration_error); av_freep(&ic->streams[i]->info); } + av_free(pSampleBitRateSum); + av_free(pSampleCount); if(ic->pb) av_log(ic, AV_LOG_DEBUG, "File position after avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb)); return ret; -- 1.7.10.4 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel