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@gmx.at>
This commit is contained in:
		
							parent
							
								
									e8c003edd2
								
							
						
					
					
						commit
						4e855c11b5
					
				@ -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. */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user