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".
next prev 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