X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Futils.c;h=cc52d0ebf88ad7e6bf10d383c2bae6fa83a9a739;hb=e3212bfd1493be2c04e78b3a2e998d90c49e3935;hp=4cfebf23f9b0c1d47ae40bd1166f52b14e09c188;hpb=2aeeb3ba1f4fa54d0cd4cca672bc56dea07af133;p=ffmpeg diff --git a/libavformat/utils.c b/libavformat/utils.c index 4cfebf23f9b..cc52d0ebf88 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -278,11 +278,11 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, if (!strcmp(fmt->name, fmt_id_type[i].name)) { st->codec->codec_id = fmt_id_type[i].id; st->codec->codec_type = fmt_id_type[i].type; - break; + return score; } } } - return score; + return 0; } /************************************************************/ @@ -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. */ @@ -3262,7 +3275,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample) { uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt); - if (avpriv_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt) + if (avpriv_find_pix_fmt(avpriv_get_raw_pix_fmt_tags(), tag) == st->codec->pix_fmt) st->codec->codec_tag= tag; }