Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 36/44] avformat/utils: Move av_find_best_stream to avformat.c
Date: Sat,  7 May 2022 13:28:22 +0200
Message-ID: <AS8PR01MB7944F9EF97C97238834DE2778FC49@AS8PR01MB7944.eurprd01.prod.exchangelabs.com> (raw)
In-Reply-To: <AS8PR01MB794467A492C922D9DA178B408FC59@AS8PR01MB7944.eurprd01.prod.exchangelabs.com>

It is not forbidden to call this with a muxer, so it is moved to
avformat.c and not demux_utils.c. ff_find_decoder(), which is used
by av_find_best_stream() is also moved as well, despite being even
more geared towards demuxers.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavformat/avformat.c | 84 ++++++++++++++++++++++++++++++++++++++++++
 libavformat/utils.c    | 84 ------------------------------------------
 2 files changed, 84 insertions(+), 84 deletions(-)

diff --git a/libavformat/avformat.c b/libavformat/avformat.c
index 2b012a903f..a828e6db55 100644
--- a/libavformat/avformat.c
+++ b/libavformat/avformat.c
@@ -312,6 +312,72 @@ int av_find_default_stream_index(AVFormatContext *s)
     return best_stream;
 }
 
+int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
+                        int wanted_stream_nb, int related_stream,
+                        const AVCodec **decoder_ret, int flags)
+{
+    int nb_streams = ic->nb_streams;
+    int ret = AVERROR_STREAM_NOT_FOUND;
+    int best_count = -1, best_multiframe = -1, best_disposition = -1;
+    int count, multiframe, disposition;
+    int64_t best_bitrate = -1;
+    int64_t bitrate;
+    unsigned *program = NULL;
+    const AVCodec *decoder = NULL, *best_decoder = NULL;
+
+    if (related_stream >= 0 && wanted_stream_nb < 0) {
+        AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
+        if (p) {
+            program    = p->stream_index;
+            nb_streams = p->nb_stream_indexes;
+        }
+    }
+    for (unsigned i = 0; i < nb_streams; i++) {
+        int real_stream_index = program ? program[i] : i;
+        AVStream *st          = ic->streams[real_stream_index];
+        AVCodecParameters *par = st->codecpar;
+        if (par->codec_type != type)
+            continue;
+        if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
+            continue;
+        if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
+            continue;
+        if (decoder_ret) {
+            decoder = ff_find_decoder(ic, st, par->codec_id);
+            if (!decoder) {
+                if (ret < 0)
+                    ret = AVERROR_DECODER_NOT_FOUND;
+                continue;
+            }
+        }
+        disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
+                      + !! (st->disposition & AV_DISPOSITION_DEFAULT);
+        count = ffstream(st)->codec_info_nb_frames;
+        bitrate = par->bit_rate;
+        multiframe = FFMIN(5, count);
+        if ((best_disposition >  disposition) ||
+            (best_disposition == disposition && best_multiframe >  multiframe) ||
+            (best_disposition == disposition && best_multiframe == multiframe && best_bitrate >  bitrate) ||
+            (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
+            continue;
+        best_disposition = disposition;
+        best_count   = count;
+        best_bitrate = bitrate;
+        best_multiframe = multiframe;
+        ret          = real_stream_index;
+        best_decoder = decoder;
+        if (program && i == nb_streams - 1 && ret < 0) {
+            program    = NULL;
+            nb_streams = ic->nb_streams;
+            /* no related stream found, try again with everything */
+            i = 0;
+        }
+    }
+    if (decoder_ret)
+        *decoder_ret = best_decoder;
+    return ret;
+}
+
 /**
  * Matches a stream specifier (but ignores requested index).
  *
@@ -595,3 +661,21 @@ AVRational av_stream_get_codec_timebase(const AVStream *st)
     // See avformat_transfer_internal_stream_timing_info() TODO.
     return cffstream(st)->avctx->time_base;
 }
+
+const AVCodec *ff_find_decoder(AVFormatContext *s, const AVStream *st,
+                               enum AVCodecID codec_id)
+{
+    switch (st->codecpar->codec_type) {
+    case AVMEDIA_TYPE_VIDEO:
+        if (s->video_codec)    return s->video_codec;
+        break;
+    case AVMEDIA_TYPE_AUDIO:
+        if (s->audio_codec)    return s->audio_codec;
+        break;
+    case AVMEDIA_TYPE_SUBTITLE:
+        if (s->subtitle_codec) return s->subtitle_codec;
+        break;
+    }
+
+    return avcodec_find_decoder(codec_id);
+}
diff --git a/libavformat/utils.c b/libavformat/utils.c
index b448f7b9cd..c8d975ddcc 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -76,24 +76,6 @@ int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
     return 0;
 }
 
-const AVCodec *ff_find_decoder(AVFormatContext *s, const AVStream *st,
-                               enum AVCodecID codec_id)
-{
-    switch (st->codecpar->codec_type) {
-    case AVMEDIA_TYPE_VIDEO:
-        if (s->video_codec)    return s->video_codec;
-        break;
-    case AVMEDIA_TYPE_AUDIO:
-        if (s->audio_codec)    return s->audio_codec;
-        break;
-    case AVMEDIA_TYPE_SUBTITLE:
-        if (s->subtitle_codec) return s->subtitle_codec;
-        break;
-    }
-
-    return avcodec_find_decoder(codec_id);
-}
-
 /* an arbitrarily chosen "sane" max packet size -- 50M */
 #define SANE_CHUNK_SIZE (50000000)
 
@@ -305,72 +287,6 @@ int ff_alloc_extradata(AVCodecParameters *par, int size)
     return 0;
 }
 
-int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type,
-                        int wanted_stream_nb, int related_stream,
-                        const AVCodec **decoder_ret, int flags)
-{
-    int nb_streams = ic->nb_streams;
-    int ret = AVERROR_STREAM_NOT_FOUND;
-    int best_count = -1, best_multiframe = -1, best_disposition = -1;
-    int count, multiframe, disposition;
-    int64_t best_bitrate = -1;
-    int64_t bitrate;
-    unsigned *program = NULL;
-    const AVCodec *decoder = NULL, *best_decoder = NULL;
-
-    if (related_stream >= 0 && wanted_stream_nb < 0) {
-        AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
-        if (p) {
-            program    = p->stream_index;
-            nb_streams = p->nb_stream_indexes;
-        }
-    }
-    for (unsigned i = 0; i < nb_streams; i++) {
-        int real_stream_index = program ? program[i] : i;
-        AVStream *st          = ic->streams[real_stream_index];
-        AVCodecParameters *par = st->codecpar;
-        if (par->codec_type != type)
-            continue;
-        if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
-            continue;
-        if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
-            continue;
-        if (decoder_ret) {
-            decoder = ff_find_decoder(ic, st, par->codec_id);
-            if (!decoder) {
-                if (ret < 0)
-                    ret = AVERROR_DECODER_NOT_FOUND;
-                continue;
-            }
-        }
-        disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
-                      + !! (st->disposition & AV_DISPOSITION_DEFAULT);
-        count = ffstream(st)->codec_info_nb_frames;
-        bitrate = par->bit_rate;
-        multiframe = FFMIN(5, count);
-        if ((best_disposition >  disposition) ||
-            (best_disposition == disposition && best_multiframe >  multiframe) ||
-            (best_disposition == disposition && best_multiframe == multiframe && best_bitrate >  bitrate) ||
-            (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
-            continue;
-        best_disposition = disposition;
-        best_count   = count;
-        best_bitrate = bitrate;
-        best_multiframe = multiframe;
-        ret          = real_stream_index;
-        best_decoder = decoder;
-        if (program && i == nb_streams - 1 && ret < 0) {
-            program    = NULL;
-            nb_streams = ic->nb_streams;
-            /* no related stream found, try again with everything */
-            i = 0;
-        }
-    }
-    if (decoder_ret)
-        *decoder_ret = best_decoder;
-    return ret;
-}
-
 /*******************************************************/
 
 int ff_stream_side_data_copy(AVStream *dst, const AVStream *src)
-- 
2.32.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2022-05-07 11:34 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-06 10:31 [FFmpeg-devel] [PATCH] lib*/version: Move library version functions into files of their own Andreas Rheinhardt
2022-05-06 11:09 ` Martin Storsjö
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 02/44] avformat/utils: Use av_realloc_array for reallocating array Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 03/44] avformat/internal: Move muxing-only functions to new mux.h header Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 04/44] avformat/mux: Move ff_choose_timebase to nutenc, its only user Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 05/44] avformat/mux: Move ff_choose_chroma_location to mxfenc, " Andreas Rheinhardt
2022-05-10  7:25   ` Tomas Härdin
2022-05-10  7:29     ` Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 06/44] avformat/utils: Move ff_stream_add_bitstream_filter to mux.c Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 07/44] avformat/utils: Move stream_options, avformat_new_stream to options.c Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 08/44] avformat/mux_utils: Move ff_format_shift_data to new file for mux utils Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 09/44] avformat/utils: Move ff_get_packet_palette() to rawutils.c Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 10/44] avformat/utils: Move creation-time functions to mux_utils Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 11/44] avformat/utils: Move ff_format_output_open() to mux_utils.c Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 12/44] avformat/utils: Move avformat_query_codec() " Andreas Rheinhardt
2022-05-07 11:27 ` [FFmpeg-devel] [PATCH 13/44] avformat/utils: Move av_stream_get_end_pts() " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 14/44] avformat/utils: Move ff_stream_encode_params_copy() " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 15/44] avformat/demux: Add new demux.h header Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 16/44] avformat/internal: Move definition of FFStream->info to demux.h Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 17/44] avformat/utils: Move parser functions to a new file, demux_utils.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 18/44] avdevice/v4l2*: Improve included headers Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 19/44] avformat/utils: Move avpriv_new_chapter to demux_utils.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 20/44] avformat/utils: Move av_format_inject_global_side_data " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 21/44] avformat/utils: Move avformat_queue_attached_pictures " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 22/44] avformat/utils: Move ff_add_attached_pic " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 23/44] avformat/utils: Move ff_add_param_change " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 24/44] avformat/utils: Move av_read_(play|pause) " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 25/44] avformat/utils: Move ff_generate_avci_extradata " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 26/44] avformat/internal: Make AVFormatContext* a logctx in ff_get_extradata Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 27/44] avformat/utils: Move ff_get_extradata to demux_utils.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 28/44] avformat/utils: Move freeing AVFormatContext to a new file avformat.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 29/44] avformat/utils: Move av_stream_*_side_data API to avformat.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 30/44] avformat/utils: Move adding AVProgram " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 31/44] avformat/utils: Move internal stream timebase stuff " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 32/44] avformat/utils: Move matching stream specificiers " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 33/44] avformat/utils: Move guessing frame rate/SAR " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 34/44] avformat/utils: Move av_find_program_from_stream " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 35/44] avformat/utils: Move av_find_default_stream_index " Andreas Rheinhardt
2022-05-07 11:28 ` Andreas Rheinhardt [this message]
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 37/44] avformat/asf: Move ASF GUIDs to a new file Andreas Rheinhardt
2022-05-07 11:59   ` [FFmpeg-devel] [PATCH v2 " Andreas Rheinhardt
2022-05-07 12:23     ` Soft Works
2022-05-07 12:28       ` Andreas Rheinhardt
2022-05-07 12:52         ` Soft Works
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 38/44] avformat/utils: Move ff_find_stream_index to demux_utils.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 39/44] avformat/utils: Move ff_is_intra_only to avformat.c Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 40/44] avformat/utils: Move ff_format_set_url " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 41/44] avformat/utils: Move ff_copy_whiteblacklists " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 42/44] avformat/utils: Move avpriv_set_pts_info() " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 43/44] avformat/utils: Move ff_stream_side_data_copy " Andreas Rheinhardt
2022-05-07 11:28 ` [FFmpeg-devel] [PATCH 44/44] avformat/utils: Move ff_format_io_close.* to options.c, avformat.c Andreas Rheinhardt
2022-05-09 19:14 ` [FFmpeg-devel] [PATCH] lib*/version: Move library version functions into files of their own Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AS8PR01MB7944F9EF97C97238834DE2778FC49@AS8PR01MB7944.eurprd01.prod.exchangelabs.com \
    --to=andreas.rheinhardt@outlook.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git