From patchwork Sat May 7 11:28:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 35669 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a885:b0:7f:4be2:bd17 with SMTP id ca5csp2122999pzb; Sat, 7 May 2022 04:34:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyhlHBrCZjLcxxcCwsuhRdJhz5FjKqwC3t4stkJFrf6Z/bghc++FP2UlMz0uF5PcYEclrIn X-Received: by 2002:a17:907:1623:b0:6f6:e9ce:9926 with SMTP id hb35-20020a170907162300b006f6e9ce9926mr3927081ejc.360.1651923298596; Sat, 07 May 2022 04:34:58 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id fd18-20020a1709072a1200b006f39eda7db9si6006510ejc.761.2022.05.07.04.34.58; Sat, 07 May 2022 04:34:58 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=PEimdWDj; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A201D68B405; Sat, 7 May 2022 14:31:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2054.outbound.protection.outlook.com [40.92.89.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 15E7468B4C1 for ; Sat, 7 May 2022 14:30:58 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bl/VbciZjJ914IXMjnalalMoU69oNUd97IdKynENxYVa20jL+zAWaPbGLIYy5P5y6Z9bDT9f0PavOm2yoVnzXSv1/MUkaggTG7acFXpWaOvkeFxvZ3oUgmydnTYiXC+if5idVpFxTaN1FalYmpNpns/fGa7Wt3IkuSQkG49ksvw9hL5Et3ZFSutiUhjzvWKFcNhjna0j4oR7imrHhIsEUJYVfFcCnKa+U79Eb3h6G5NljmJV2ZUSkTrC3BpggeaFmNERdRmf7ykaPLirvSqUmFMSSrm5mzi6ioeNmfTAcK07sBwGvQXIShLiGAM+epOEK2E6QYWlfpWRpB7fbeD9aA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lrt5pZwRycKo5A+2koeO+WsntvpbpL5wVC3DjHngcug=; b=Km+Ta0JsKmWYA3hXDQhMYm3VGpocQJWOqn96kG/9KkHyPyS5/Cd2jTa1z9YHEcRhjip0oVRdyexWpPNcVf4nMGl01m28IS66Uckr57zbo52DTV1oFUkpFiTIymNZGsOLit2GSWmNbBf9oZd3kX0g9WSRp8DC4mjvZkBYP/2+vMeXYffaf8477Nmq5gaQFdGQimfhqrveeeq+5KytjptpgLr/1R6QY+rZqldu4Una2RyHYjHNTLrc26TGWdMIB0RaNshmcj+QlbyHAh+OVhE2iXUZl8z0FFscUK+5wSSRQDd5+6JnbYi5a9UAKY82Z2HI5snUjyrhfBXgUx+Tr0v4uA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lrt5pZwRycKo5A+2koeO+WsntvpbpL5wVC3DjHngcug=; b=PEimdWDjyPzPwx7u4mOv2Re6vlmFGcTzj8lim9JqCJzdhjBSyGLyaBB9QhpsLb2iz4QwV1w/qm/5lDlnPHttCcDVSf7SYEKg3Wj433ENmd53SUPBwr0/hKVHgPdTaR8BeKMXwoBcRD3ZgrxlD9tf0FIN/LPPrNnIGJpFEgd9aedV7YmzE9bZ0In8UGXt4ZnjvWw8M3ifH3jKuYdyrRd+JiKRH576SWgcYOfAG9MPKkRwfPzuNRyjXRtwLy6yRHJ0t6aPh5Gj69R3XaOdCPTsBvgRIKw7SbREazdlmQljge71swXKeWS3Iw+Lt87XWm4D0MRUZ3M7By4TaU0Cj7JHQw== Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) by AM6PR0102MB3128.eurprd01.prod.exchangelabs.com (2603:10a6:209:c::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.24; Sat, 7 May 2022 11:30:57 +0000 Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::1854:2c30:7ba1:c431]) by AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::1854:2c30:7ba1:c431%6]) with mapi id 15.20.5206.024; Sat, 7 May 2022 11:30:57 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 7 May 2022 13:28:22 +0200 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [HoTAydRbGtYrOGD/rE+gzO7z/gM0p1eg] X-ClientProxiedBy: ZRAP278CA0004.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:10::14) To AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) X-Microsoft-Original-Message-ID: <20220507112830.406162-35-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4fe9371a-b5eb-4233-c248-08da301d0b37 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiRIovyFjHwHllp74iOQFItwK1ZQTqdVaaEL6YW0KwBVOKEwMYFmeOJkdlAdExyqyqte1SXRBUDLUC9AcPI1TocfoK92oKkQeX/6PRm3k072hpd6ik6aLMDt/IcFkbcO24Lxmy1MGKPzVTKfioWHAur8uicaYwevwjJvgsvi7z1MG5b3JeAkgtnjRB/hcnbAyhbiqw2wsE+MKlJRvqC//HszZBh/SuWmPar5wlsjzLIZtVlSWq4SmrAFgFKGYEOjG/5xpgIKOd1J4T0wL4NW1cM5FKtmj3265o698+ZTlfIcyCjKKEVUKZHTVi7tCR85hQKGdoURCOIa/h+o1Sya2UBLA7QklKHM+Kbf3b5HxxWxBZO2dbBrLaj6y/lIgEMhJesmzQPnPThtBdUgQou/Qsr70EPVWiUSYbiEeuGmavIseDA8DjV6bYrefvYhTNOdgCcwk2hXINWk5V3Kx7DgEBhOd+Km4nm5lRAYtCWjr7QSzeRINsiQCG9dxN0hHhy+2y3RMLCqMyn/UJ0DiQ2AxiXKEuzzH4GV5jxwQq8LvSfAwTWmwyRAi9xWepVC/lhbd+5VIWKR+vc+7WgsdaSEpSincy1DrVsF2blAZxKbC+DkVCT/im/r4TAgPr/szpKXMn85VDBfYB42/Npj6TqeDxH+idbgpaufM9aITG8q0p+TJUPr7SqzHeI1Jbck2rbQOGh1sTzeFLbHRdjDyAyCFE9QCwACgIA1Ya9KDTK24dW7sAg3fVFC4W/EKhLD5Tirt3M= X-MS-TrafficTypeDiagnostic: AM6PR0102MB3128:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FfIMkYxZss9QaVPSI6wUrQQlFzfiPXAQZftzUJ6k7ky4vajLxUtLLB4xHKLjJiGPwUQicpEPQrAnzeCppyWXEk1akrGcPLw/WZ3+FtS44kyJctnZNBOPcIaNLXRR404rEPsBsodRFfX8qWOh59/nY/RjUAMPZJFwAFCjcLwb9wiMNSmBnK4Su2vwSdhBLzqf6903lA+SRU3SZATmOqK+Qc5vFNcQqeCteOR9bmNJenDQq1kmvOuwNXH+vr/ISM8xqJhDDLAxzrSuCbxsb0V4mFQbzG00G8jlVQmfKPjquiPy1nYxAo0HELq90mvZmxqVUFMG0pKYBuVZUnK+XAr0kAlobsLNPbwbdrY+MWR8ffAoShhILkNPqWRAeMfJZ1ojC02cdKaz16OUmKhXACgbx54vHpmx2ss4CWAsFEOz1g0ZWAUfacVW6I9cAdBJ2E7vilPK5X3RwAjGm3wvKRjEPRWlAEMPq6W1HJr4Z+NCvSx0i1giFqmYpnQhOqh2zNjYtrqk0fUXuxwnUlHKb70EGIDZFiaD+BpE6IrPWSliiuWEyAA3vcCx1A4kj95S3tsx9ELhmQ0QX8KJIVhe424E2n9s+jPSwxJd4FKuS4/D/zymOJZo7LXWXy2D8IjfhLnH X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: UDd9qFddl98/Eg6jUUUxAOiM3m4TIhGOZaJdePFiMAhVeYUScVqgwCfNnHhfIonPdsqptf7JbyVoDmgBbPfSwldCya6vwCZ7cteJyai0yQ/UKZVVlBYELZQX+WQp8XrPs8yDIWPpCnU9pyh1VbBgZzhtpghPyMXYd2jP2uCo0MFNwDNrdrWnmb11+zB2H1k2iDFY6bLlowaIpONXLBVJI7fvTsL0UcLRgpeNjg4mI3CrJk/+YOLyysmg64I58ZOz9acYQC43ub+P7Kb51bIxMuSfulfboE7lKTtwhm+dMSKkDz7Tue5IAUOCpoovzIIe7Pr/Aj3FDIloFK0WWM3nGebOT1tTrv3KjcxHhbw4r86RMSSEHoSz1L/KNH5AS3PJCiyLirYfTHqUjkdO264/f3PXU/PhlEpKUXAnQNa3+4i9lAQBkxe9JXfpCGbX/HtfoYo3E3AowfQCImbNHjPhQWQD94JNXGWQjHHljyBxD3t1LbENY+ieuQFFNMM3EuIWC7FXzo8AbB6AaKHic9h24ehN5wphW8GhflRi63j7ZO9OLaDeNW3U/I2LdjXP92JGRN5Z0iMPIWBL4lYQlfPBWJ02Dg5nG9KeBGbkFV6JHL1Q6ZO1A2tUuExUeta8Aowg5uYNYmc6JpeUvLv+s9Zvuwk+njys8Q9NZScC4TkfSDTsh8RPqAe+bmWJx3JBphgfqlYlxK5LZCL/4fKkxTUU4Dew4E0W9KA1Chi9Th0icCAPM0tqGP3nFkprjzpsO9+OfpejNT0EqwPjsQAdtK23Ub/Zachijli7rpaPesOiVTDaFV7pE+abT5/6c/VQIKVy1GL2BckVgmjuMZjL/e4J7MllBNQ+fnL1ZH7CyM6gHc/IIn/GS5DP0mYwii50cWU5z8Gh/QiOJey1i4AoVu4NIaiINfAcWThGAcoV73n+dOP7vK/WjMkWuePgje2Ux6a5t0zGS6gtji0LsNusHICJ3HOWze0D1iUtu4o+fDCnrdnvyIBSYc8cRNs+nLSBIS4yoI1yrlUSZpXf38nB670Qq5WMgKm1tKWz7gAlKH0WIjVKtLiN+7Hu8lp7op7RI8KEeVRhGlLihIxlvvcF0aM/RGeuPlAWenjaykZJ2dq/AwcdatmMvs47CMey0IfFbYFFfpz9d86kEm3zkIOp962BrogO4RdZjbK9pWOefLyG5nQIYriItuPowZ1Sg7iGYg3HahzQmLOHc+WJ6RvGLkuW+S+98dK6MS6cRbwv+5jQ7khO++uANUooB331rvu1G73mw4kEsV+J2+Bcrd0ja12hNbwfwrgJlb4PJ3f5loHF4x0dB5KPU7yATe7VrHXuaLliU3lHRJHSlU7P8EmXq2ZLE7ncQIC5Eq7ECNsEzrbABTqTspiMfhMVzlblf5xpW0vedHqHm6HpfbCfrd9+mQmVHemZmX96UidbNkRQQkAFWc5wNh6SrFb7c6hLGIIiondk X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4fe9371a-b5eb-4233-c248-08da301d0b37 X-MS-Exchange-CrossTenant-AuthSource: AS8PR01MB7944.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 May 2022 11:30:52.8453 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR0102MB3128 Subject: [FFmpeg-devel] [PATCH 36/44] avformat/utils: Move av_find_best_stream to avformat.c X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: OLbHAy4ajx1d 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 --- 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)