diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2022-05-07 07:34:54 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2022-05-10 07:46:56 +0200 |
commit | e00d0ef46d7c4f9763c0482e635b483ff7954104 (patch) | |
tree | 3a3077077b39ba067881ae5b177f1e7021a3764b /libavformat/avformat.c | |
parent | 1c0912c26eb96c270e2cec08650d3d487b28ea49 (diff) |
avformat/utils: Move av_find_default_stream_index to avformat.c
While it is clearly written with demuxers in mind,
it is not forbidden to call it with muxers, hence avformat.c
and not demux_utils.c.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavformat/avformat.c')
-rw-r--r-- | libavformat/avformat.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libavformat/avformat.c b/libavformat/avformat.c index e3dad1f9a5..2b012a903f 100644 --- a/libavformat/avformat.c +++ b/libavformat/avformat.c @@ -276,6 +276,42 @@ AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int return NULL; } +int av_find_default_stream_index(AVFormatContext *s) +{ + int best_stream = 0; + int best_score = INT_MIN; + + if (s->nb_streams <= 0) + return -1; + for (unsigned i = 0; i < s->nb_streams; i++) { + const AVStream *const st = s->streams[i]; + const FFStream *const sti = cffstream(st); + int score = 0; + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) + score -= 400; + if (st->codecpar->width && st->codecpar->height) + score += 50; + score+= 25; + } + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + if (st->codecpar->sample_rate) + score += 50; + } + if (sti->codec_info_nb_frames) + score += 12; + + if (st->discard != AVDISCARD_ALL) + score += 200; + + if (score > best_score) { + best_score = score; + best_stream = i; + } + } + return best_stream; +} + /** * Matches a stream specifier (but ignores requested index). * |