summaryrefslogtreecommitdiff
path: root/libavformat/avformat.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-05-07 07:34:54 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-05-10 07:46:56 +0200
commite00d0ef46d7c4f9763c0482e635b483ff7954104 (patch)
tree3a3077077b39ba067881ae5b177f1e7021a3764b /libavformat/avformat.c
parent1c0912c26eb96c270e2cec08650d3d487b28ea49 (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.c36
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).
*