[FFmpeg-cvslog] avformat/util: change av_find_default_stream_index() to use a score based system

Michael Niedermayer git at videolan.org
Mon Aug 4 18:23:11 CEST 2014


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Fri Aug  1 22:17:52 2014 +0200| [4e855c11b50b2f5b29cfd570d7cf7efeaff558d5] | committer: Michael Niedermayer

avformat/util: change av_find_default_stream_index() to use a score based system

Disfavor video streams with unknown resolution and no packets
Fixes seeking in audio-only-speex.flv

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=4e855c11b50b2f5b29cfd570d7cf7efeaff558d5
---

 libavformat/utils.c |   25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 4cfebf2..6ebbe6c 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1531,23 +1531,36 @@ static void flush_packet_queue(AVFormatContext *s)
 
 int av_find_default_stream_index(AVFormatContext *s)
 {
-    int first_audio_index = -1;
     int i;
     AVStream *st;
+    int best_stream = 0;
+    int best_score = -1;
 
     if (s->nb_streams <= 0)
         return -1;
     for (i = 0; i < s->nb_streams; i++) {
+        int score = 0;
         st = s->streams[i];
         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
             !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
-            return i;
+            if (!st->codec->width && !st->codec->height && !st->codec_info_nb_frames)
+                score += 25;
+            else
+                score += 100;
+        }
+        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
+            if (!st->codec->sample_rate && !st->codec_info_nb_frames)
+                score += 12;
+            else
+                score += 50;
+        }
+
+        if (score > best_score) {
+            best_score = score;
+            best_stream = i;
         }
-        if (first_audio_index < 0 &&
-            st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
-            first_audio_index = i;
     }
-    return first_audio_index >= 0 ? first_audio_index : 0;
+    return best_stream;
 }
 
 /** Flush the frame reader. */



More information about the ffmpeg-cvslog mailing list