From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id A643248B34 for ; Sat, 3 Feb 2024 11:28:31 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0566668D118; Sat, 3 Feb 2024 13:28:26 +0200 (EET) Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2015.outbound.protection.outlook.com [40.92.89.15]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AA14868CE0C for ; Sat, 3 Feb 2024 13:28:19 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bPCiJeWaFv60d6xvc0xSG1s5Ka4/7i31DZWOl1VQ7mrcM9+YKeYkintod6PiTEP1KDaODyfAYPoZRabzMlAHJ99xt2Zvto0Z64nxFfAq6tfOYOWPvu6XDx+VIaDZaxQ2iMC4/oOJoFxDL/CNyke0p5TRzc7ZnhMatACaehA4JWUCKWTJKtGVF3Ru68BUr1Z6/lcyMsQf3BoZGqZrYwwY5zggPU+UJtykdZNlk4w4v1NpXaMKp3kKmSoPE21J9Jh9aorX9FrlXYSGFOjDpHsiVpHWZcQI8SgKk63Ls/yQ8OtyFqyMnGKpARzqAGKfvqp6649wcpXvhKd7jqyGHfJDqQ== 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=UqZzDtbWlvoVtNQ7cgW1lMbCwJK7XKrbwXOCDeZsnt0=; b=Dnu6IqrYkd3Q9efThsk01O92nRipDN3iP4UCVm1xG4gwjEVzKVI6WH/S5Rso210Yw4OKPVQtjTuH48FAvvKKGf7hVZqSTJts8/YTf/mvseRXWGXCMVM3XU+qd48HowK1yWSJft8lj8e5gQN0W/VjmRtuz0sAu6l9m5FI194CH3BoK2bxxnjdSv3PVSuC8m5C1f1jBXOOWRhSWcX6AX0SBSeLS93ruO2M1S2b0f27FkzFY41OEnE7/8WgI0yIEO93Yp7DdyNB9GadCcQG/gyIotAM1t4RNRPuBe6HXbphVybUms+t2i+REeTcLQvQ61xlxxkDOEL7LueZbVCjZm8J+g== 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=UqZzDtbWlvoVtNQ7cgW1lMbCwJK7XKrbwXOCDeZsnt0=; b=b8T279uzlabsmp7WAbuMl9B6Bg7WqzMfqazOGVlJAnu7M0xtdKCQUAnV16P4Bng4H14NO8wlcnJX/DpIR38RYD4U5bo1ffFimrKAt32DQJ9MMBYHWZ18rzdCcW9rKC4Yy9p06HxS3m/zwKk11DjJn2cjIuoQOT23lOK4vHn3VqNLSJ1DHyr1c9P92AHmsxgI0z41jE7cZuJRJcXcCRDRPnBbj4kGk07lYN/MfbXVhKEK13BBX/SlWH+PmM7zSq4t4qd6eVR7/R4EFemC4xaZn2cYWmz/YlzwfbsHKRe03DMG/dPej/xserYb4xjpD47XUsrUcpwtStlcjCajzH9c+Q== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0018.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:3d9::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.31; Sat, 3 Feb 2024 11:28:13 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::65aa:deb0:a18e:d48d]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::65aa:deb0:a18e:d48d%5]) with mapi id 15.20.7202.031; Sat, 3 Feb 2024 11:28:13 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 3 Feb 2024 12:29:57 +0100 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [nHIzweeGkU0MAA7FpcuCqXolCcsAm4imSgaP+spSzWU=] X-ClientProxiedBy: ZR0P278CA0005.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:16::15) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20240203112957.1922148-2-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0018:EE_ X-MS-Office365-Filtering-Correlation-Id: d3872d8d-cb0f-469e-82c4-08dc24ab3580 X-MS-Exchange-SLBlob-MailProps: 9IecXKUgicB5exlFIk//zGC0cdAY69O3Htex1eHDhTBHJAW3fURVc3GDYSjRqVGerJllU0lqkHcP9vHHTOrHHO90/D0DqTWur2GQrGGfHINYp8rpG3xwPenE68PQ+6qG8PD2vlxY81rZM97TT8O+Mdk9UYPOnt5MCb/whkLvPFm4LzZEfRMVYnxDGYNYV3UX/wVilZ1NViRdOoEJ427qCKhhmKK2/lUiKxZncrTKZqW3x3cMa1Cwc0rjXtPa8M/EdKuuH2054Kl9bsLaanyKczKiAYkVzxpokj++PK2PQj2DAAte1s73FO5JN6e55qsg/bJOPd9hlzZhxpwbiFTRAJoFDbI1XKfgnWlH8QiU1GDVQr19l8I7zfKJ+byY4UPdqncruGpn5tljm5WNQYFB2SakQwIu7gb42ImNcOrr5EaNsla/Xd0HVUGp8JpUZIHfQcUa+m24cbBra6ars8691DzFvqIeKhGLKqfdFNevZ9gd/TpUEo15Qm/+AMpLHdzLjJDj5Ma1DQScXxJCOAtw0A3VKuxdORgvlJ4MA3tOqmJS2F1Y5eJ/5W8qdn2pAPOMdJBF/CdGvM630mRzSo6kW/Fhvr0jQTp7J1AP0SdSjmlFus+XOmfIWe8ECLa7x+MCWBGPy/tsycojtaKLqjVvFO4qvIi+d3As4dvCXUOiut7rnaBCgTnpqnGt4xP168pCc/ytU1xjIuSeOw9RiOmiXrbVonSPaQ+Qx76BQsCS8NQkzrsLos1Vpg== X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 7AERVXj3VJgF6IZzk3bJNNRTgivaibR0qon8uGCyLw7uHWPCluqy1tyiBuArB0YBWGFHswHN5vO7XVV7Yz34mvt5GZhZBjKoqQc/GbNAP7X6yiEoJL83cHjIfh0O8pprQGc5RFBAXx3vnHQxzSNrplUOH8dhPS5SBfh7ajYghF71htArzcYrSwwMO/c+bdgoaCVSEuZAxNJ9Ceb/mAEdHx4K57FbJ7RX5t73wFti30rCshKBWT0E+O3YgnnFiK8fkclNd4w8T1zjQd8f+kCCk3J2XSv9PFQUCHD/c6BxJPspJ7+XfOqKOX71QEuQu6rRXmVRIBHSKueEzu/DjoZYd8KISOg8PBOmUjQJ9rdt0gTzulGUqxqhMA5POmJ8Tj0qGZQ1yCs12RmPaQhqxqHkA8K3YhvzgJlwQB05W4ZO0IzaL/qdDqkJUpIuMrU3TFLybNYWuTKJ7CXotTBZ48oPC1uQVrPoYPp0fyWoXXgyrKdzZl8fiEEh8o5UMs0gM10CwyQmjsinQ1Kz1kewRI1Qz/5OGWrn0nn6oBCrgu6h4Ef7MIyfPQXFInhlBRZ6hQZwdp59AgWiNKMgld8qSSFlKxLOHxZi3aNLb8y1Kcq+NLzHponiBck8oUhg0b+CcVP1 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?5RPbX13w/xHyqrjMuenMTl/oiInGsmsePZlOJmgnZdM2HINNi5ehATbMQ+DW?= =?us-ascii?Q?qKpKA6KVlzf8C3SFnRG1kja+T7hosSwGJO3Tbei/FdQfc7puh6WMB/YcSacL?= =?us-ascii?Q?MJoXxQOQcAy7BNKSFnPhT0TBNSo1YQmQu/oiHwHwsqbdjjV+h1WFUmWC9+lQ?= =?us-ascii?Q?lnAsDSPXBPfFoQ11TAscsocLbd9nd34xIu69DKrZzbvkAgFzVf6y/A52nbVv?= =?us-ascii?Q?a0U3lNeR8X4uWK/s67HVV3cKy3sK3hXe6bTN+Q9CPTG1D7PKVyzplxyOwuEN?= =?us-ascii?Q?uUE0TMuqpL5wZigmJMfR6bRqz6KpHynMYvlEVwAC7aZjNW16pu4lFJ/y1DKZ?= =?us-ascii?Q?D6EwvfyDfQPzT0U6vWd7OagYiL91Zbr0meUCEiJisgykAvgKeVzKzIbuJ3Vy?= =?us-ascii?Q?JhX+NNZF/OaN2Bqy72rYW3OKjJdEmS9lTI2Ls3aman0GOit7547sfCya/+Uh?= =?us-ascii?Q?daOBNQ1At5M8I7+ec8SJLBF6FMgWYQSlgYWgrlWphhouhOwRrR8RV5cKsfJW?= =?us-ascii?Q?Kc8RtsH1drtfDqXQ42S+NIdLoEULgfmSkFUumy1+Gun2NQ8iVCF2EbD7YF2e?= =?us-ascii?Q?lkCNgfWT7U0qlHxIc4+XiZMoxzWLglwbl4Kw5+EwNP958UP3aTWZuQkRI108?= =?us-ascii?Q?4Dom3pwBRS1/nFDCp9YiBGP5Q0DUOrEgga4dupyKuIxN6jtN4msF8maE9PJL?= =?us-ascii?Q?Awa2gf3HVc7Di2UOMFDtISje/OL4Pu8trCNqcUcUQud4lzvKDx2lgPjXN/QY?= =?us-ascii?Q?eSAT0hPe78itEgqxXYbvPJXzI5q63HF1HBhRjRPit+ulX6BaoXQ11gcT8Ih+?= =?us-ascii?Q?2NvYGUXDSgyPqRomSEVt5NnCBfCKxbMc89u2RuVb9B7kinihYp3umiiM0+XT?= =?us-ascii?Q?uMGXYeX4We4hHw81MMQa+hflDFyrSkFrMnsuUVDeKd3UmVES8Q9pcVRInRjj?= =?us-ascii?Q?4rBh2/ZCs5IzGWo5m6FgovV9GVrT54jU6ZkR6gO1Tdp3ChrX4ZndAiUXKsb7?= =?us-ascii?Q?M2wjCmEJmX0Z9qK7Zk1Ynhg17roTsg6+2hiPhvesnZvOZK7haAAEIC6UFtOh?= =?us-ascii?Q?Giu4i+4vOLSFxK3g2BV1UtrMnRjg6TFEQfYSZmHpfI3/omfqqoS9rl+l89Vo?= =?us-ascii?Q?xlzp1fPumrkY72posCJ/Gr5X4Z86mtXwkC+fPaXWyWLDpzo3eB+P4gLKsyNJ?= =?us-ascii?Q?ImtYxXVCcbTmjBwDg/YgRrya1fcSQX3742tpqx94emkt2nlmdRfrmg/ZOhUD?= =?us-ascii?Q?mwlt8ksNYgkfOTTsiS1a?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d3872d8d-cb0f-469e-82c4-08dc24ab3580 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Feb 2024 11:28:13.6923 (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: AM8P250MB0018 Subject: [FFmpeg-devel] [PATCH 3/3] avformat/options: Only allocate AVCodecContext for demuxers 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: The muxer's AVCodecContext is currently used for exactly one thing: To store a time base in it that has been derived via heuristics in avformat_transfer_internal_stream_timing_info(); said time base can then be read back via av_stream_get_codec_timebase(). But one does not need a whole AVCodecContext for that, a simple AVRational is enough. Signed-off-by: Andreas Rheinhardt --- If it were not for lavd, I would add a ff_demux_add_stream() to be used internally for demuxers instead of avformat_new_stream(). libavformat/avformat.c | 59 +++++++++++++++++++++++------------------- libavformat/dump.c | 14 +++++----- libavformat/internal.h | 2 ++ libavformat/options.c | 8 +++--- 4 files changed, 47 insertions(+), 36 deletions(-) diff --git a/libavformat/avformat.c b/libavformat/avformat.c index 41b1c4e7d9..9cacaef87d 100644 --- a/libavformat/avformat.c +++ b/libavformat/avformat.c @@ -729,8 +729,6 @@ AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *f { AVRational fr = st->r_frame_rate; const AVCodecDescriptor *desc = cffstream(st)->codec_desc; - AVCodecContext *const avctx = ffstream(st)->avctx; - AVRational codec_fr = avctx->framerate; AVRational avg_fr = st->avg_frame_rate; if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 && @@ -739,6 +737,9 @@ AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *f } if (desc && (desc->props & AV_CODEC_PROP_FIELDS)) { + const AVCodecContext *const avctx = ffstream(st)->avctx; + AVRational codec_fr = avctx->framerate; + if ( codec_fr.num > 0 && codec_fr.den > 0 && (fr.num == 0 || av_q2d(codec_fr) < av_q2d(fr)*0.7 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)) fr = codec_fr; @@ -753,13 +754,19 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, { const AVCodecDescriptor *desc = cffstream(ist)->codec_desc; const AVCodecContext *const dec_ctx = cffstream(ist)->avctx; - AVCodecContext *const enc_ctx = ffstream(ost)->avctx; AVRational mul = (AVRational){ desc && (desc->props & AV_CODEC_PROP_FIELDS) ? 2 : 1, 1 }; - AVRational dec_ctx_tb = dec_ctx->framerate.num ? av_inv_q(av_mul_q(dec_ctx->framerate, mul)) + AVRational dec_ctx_framerate = dec_ctx ? dec_ctx->framerate : (AVRational){ 0, 0 }; + AVRational dec_ctx_tb = dec_ctx_framerate.num ? av_inv_q(av_mul_q(dec_ctx_framerate, mul)) : (ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ? (AVRational){0, 1} : ist->time_base); - enc_ctx->time_base = ist->time_base; + AVRational enc_tb = ist->time_base; +#if FF_API_TICKS_PER_FRAME +FF_DISABLE_DEPRECATION_WARNINGS + int ticks_per_frame = dec_ctx ? dec_ctx->ticks_per_frame : 1; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + /* * Avi is a special case here because it supports variable fps but * having the fps and timebase differe significantly adds quite some @@ -773,35 +780,31 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx_tb) && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx_tb) < 1.0/500 || copy_tb == AVFMT_TBCF_R_FRAMERATE) { - enc_ctx->time_base.num = ist->r_frame_rate.den; - enc_ctx->time_base.den = 2*ist->r_frame_rate.num; + enc_tb.num = ist->r_frame_rate.den; + enc_tb.den = 2*ist->r_frame_rate.num; } else #endif - if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->framerate.num && - av_q2d(av_inv_q(dec_ctx->framerate)) > 2*av_q2d(ist->time_base) + if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num && + av_q2d(av_inv_q(dec_ctx_framerate)) > 2*av_q2d(ist->time_base) && av_q2d(ist->time_base) < 1.0/500 || (copy_tb == AVFMT_TBCF_DECODER && - (dec_ctx->framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) { - enc_ctx->time_base = dec_ctx_tb; - enc_ctx->time_base.den *= 2; + (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) { + enc_tb = dec_ctx_tb; + enc_tb.den *= 2; #if FF_API_TICKS_PER_FRAME -FF_DISABLE_DEPRECATION_WARNINGS - enc_ctx->time_base.num *= dec_ctx->ticks_per_frame; -FF_ENABLE_DEPRECATION_WARNINGS + enc_tb.num *= ticks_per_frame; #endif } } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS) && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) { - if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx->framerate.num - && av_q2d(av_inv_q(dec_ctx->framerate)) > av_q2d(ist->time_base) + if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num + && av_q2d(av_inv_q(dec_ctx_framerate)) > av_q2d(ist->time_base) && av_q2d(ist->time_base) < 1.0/500 || (copy_tb == AVFMT_TBCF_DECODER && - (dec_ctx->framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) { - enc_ctx->time_base = dec_ctx_tb; + (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) { + enc_tb = dec_ctx_tb; #if FF_API_TICKS_PER_FRAME -FF_DISABLE_DEPRECATION_WARNINGS - enc_ctx->time_base.num *= dec_ctx->ticks_per_frame; -FF_ENABLE_DEPRECATION_WARNINGS + enc_tb.num *= ticks_per_frame; #endif } } @@ -810,18 +813,19 @@ FF_ENABLE_DEPRECATION_WARNINGS && dec_ctx_tb.num < dec_ctx_tb.den && dec_ctx_tb.num > 0 && 121LL*dec_ctx_tb.num > dec_ctx_tb.den) { - enc_ctx->time_base = dec_ctx_tb; + enc_tb = dec_ctx_tb; } - av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den, - enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX); + av_reduce(&ffstream(ost)->transferred_mux_tb.num, + &ffstream(ost)->transferred_mux_tb.den, + enc_tb.num, enc_tb.den, INT_MAX); return 0; } AVRational av_stream_get_codec_timebase(const AVStream *st) { - return cffstream(st)->avctx->time_base; + return cffstream(st)->avctx ? cffstream(st)->avctx->time_base : cffstream(st)->transferred_mux_tb; } void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, @@ -846,7 +850,8 @@ void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, return; } st->time_base = new_tb; - sti->avctx->pkt_timebase = new_tb; + if (sti->avctx) + sti->avctx->pkt_timebase = new_tb; st->pts_wrap_bits = pts_wrap_bits; } diff --git a/libavformat/dump.c b/libavformat/dump.c index aff51b43f6..01e2306479 100644 --- a/libavformat/dump.c +++ b/libavformat/dump.c @@ -550,12 +550,14 @@ static void dump_stream_format(const AVFormatContext *ic, int i, } // Fields which are missing from AVCodecParameters need to be taken from the AVCodecContext - avctx->properties = sti->avctx->properties; - avctx->codec = sti->avctx->codec; - avctx->qmin = sti->avctx->qmin; - avctx->qmax = sti->avctx->qmax; - avctx->coded_width = sti->avctx->coded_width; - avctx->coded_height = sti->avctx->coded_height; + if (sti->avctx) { + avctx->properties = sti->avctx->properties; + avctx->codec = sti->avctx->codec; + avctx->qmin = sti->avctx->qmin; + avctx->qmax = sti->avctx->qmax; + avctx->coded_width = sti->avctx->coded_width; + avctx->coded_height = sti->avctx->coded_height; + } if (separator) av_opt_set(avctx, "dump_separator", separator, 0); diff --git a/libavformat/internal.h b/libavformat/internal.h index f93832b3c4..520f1a5229 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -416,6 +416,8 @@ typedef struct FFStream { int64_t cur_dts; const struct AVCodecDescriptor *codec_desc; + + AVRational transferred_mux_tb; } FFStream; static av_always_inline FFStream *ffstream(AVStream *st) diff --git a/libavformat/options.c b/libavformat/options.c index 75ec86ce05..03e6a2a7ff 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -283,11 +283,12 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) goto fail; sti->fmtctx = s; - sti->avctx = avcodec_alloc_context3(NULL); - if (!sti->avctx) - goto fail; if (s->iformat) { + sti->avctx = avcodec_alloc_context3(NULL); + if (!sti->avctx) + goto fail; + sti->info = av_mallocz(sizeof(*sti->info)); if (!sti->info) goto fail; @@ -323,6 +324,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) sti->pts_buffer[i] = AV_NOPTS_VALUE; st->sample_aspect_ratio = (AVRational) { 0, 1 }; + sti->transferred_mux_tb = (AVRational) { 0, 1 };; #if FF_API_AVSTREAM_SIDE_DATA sti->inject_global_side_data = si->inject_global_side_data; -- 2.34.1 _______________________________________________ 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".