From patchwork Sat May 7 11:27:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 35641 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a885:b0:7f:4be2:bd17 with SMTP id ca5csp2121117pzb; Sat, 7 May 2022 04:29:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy+p8FV7GE7C0Uaajf8vFObgNOQFh9m86rxfo2cZkDOd2wtQDS9h2cGFQx4cK6GbUgOiN9T X-Received: by 2002:a17:906:fccc:b0:6f3:7569:77fd with SMTP id qx12-20020a170906fccc00b006f3756977fdmr6980910ejb.266.1651922986135; Sat, 07 May 2022 04:29:46 -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 i24-20020aa7dd18000000b0042397a44b6bsi6738122edv.183.2022.05.07.04.29.45; Sat, 07 May 2022 04:29:46 -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=k95RL49W; 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 98B5468B3E7; Sat, 7 May 2022 14:29:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2020.outbound.protection.outlook.com [40.92.91.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AFED568B3D7 for ; Sat, 7 May 2022 14:29:12 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LeuU/dPF3zeT2xdu3q/3971UCbkZHOpBfVJih/ShdiaqRlGLldAj/NRXCKiIngX6+vOIdW9fjjpv9MCN6xIy4N8oLpbvbY+x4hb/lWrxoUVfVzkk1rhhxz+c86h4pmT4macEP37LBnp9FlP8v8/aq+Pi7w1zngdpDkpVKp2QFuHUCm00CbEfHxhYLSRIrJ5JEWX+J1A5fhGeSb5rcuehN8WfYu3x5nd1ZjgrRCPiOgx9NXkkjnN7TeDV8pRRdqlg4HMD9vVWXwdWDzGyyVDfBsgllQbCNrRtgu8aNExspuBjlxTJ0FfxeDYAQAOnQkxMqCdRpx8bvWRFXuKpicN9Pw== 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=zNhS4UeZS4AVtj7d4t+SzdFfhdHWplfh5GLZ+IdB4+g=; b=SjpETPHPBqEXCMjp741PO2L+cnk436/alfTmAQu8vAlcybIKv17DDv6IfU7v9KxpCAe7Xf3PH3t1USMzA19uiqjv57VH9NDCle0noCuw/Q1VOGitGJmiihgEkBLDjaZvwhJL/9ibDe+mbJlm/HIiUjDKZxjN/vBK0N+PGWoKwa75ZbEK9Gbxyz1SHpgbGd6D53+f0RPIuM9Cgf/1yIuVn+l9YtOkRidY6AVacnWnrjELx3+6ejGiG3MwWaIALj8eFFqnfM0v5ymwNH4HbsLZuBGsbyZg8dQaigNuNdkCndG6pryG3EHbxDbeCYX7vRqi08ug+38h+sFoJSuFQ4NJ9g== 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=zNhS4UeZS4AVtj7d4t+SzdFfhdHWplfh5GLZ+IdB4+g=; b=k95RL49WfT2To8PP0DOXIwVcZbTxAoss2n3AhgO0tuc86blixwd4/y+NO5xuyKTdtCS3jA1ZitL33Htbt75F/kt5nDQ9ItQtikOHblvTTccNO+jEdwP7YKVqN2KjwJmuM3uXwpph0G/JhCcwbGvuGfhro0tG22C4x8E2hyHpyp4PBv3sU9B0uIRSUeLLU0Uo+nL+2iTo8/7wZoX0YnKzcRFHXgnTUaQQxlwVnDMdDkyu1ENDdlhcUmA30hFVrevU/g+0jD1Zd477DbcaTFkOngYp+bUw9Yu7C7lGxg+AnMlhTNDlmCnpFU0sTbiqjzicLH3vaPZDgxEpPz7QLgl9hQ== Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) by DB6PR0102MB2663.eurprd01.prod.exchangelabs.com (2603:10a6:6:e::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5227.21; Sat, 7 May 2022 11:29:00 +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:28:59 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 7 May 2022 13:27:53 +0200 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [sNxlti4oOjleuF+aHNrbjTiod/tA8fFH] 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-6-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9cb9b73a-7b01-4278-619b-08da301cc7d9 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNVZjuqTokTVdg9S7+crVfX8HS0nz+EXHexgC05tUIQQ0B2BfHZnJiOjod30zUVBT1PZUxKM5qvSeSoL9jOM9nWyfGt3cAeJZOgXLzGl1JKnSUt8wkSUXBJ9yiKRI5wfWf4RvKqZxeEcz4d3+OOia/H7g4+TJryZ7chNbNXReYar7yO7ACPAIh+uSlEwLpeGsZdqfTnrpMuTu5byBlLYQ9/HIlAQDpoFY4NPm0nBrDwBBblbBnYALnVcn454nFKu267T5vJ5wvISrXhY/EVyAOTYhLms77W5wWP7R+jcTI54MmEggrpJlc9p0JsMYZGlxUbFBa/eVWZ/jYRUeIJNrMsQkEyXWdIzREQG6pbYGOGyCkNauOqFtmYcUDWF7oQQtDHWCfTvhMDnALAIqzLywRu24KnTrzdSsyR62WY5PfMIYxuGAF2qNHV/mqCuctHKNfxI3bS2CHKJpl9zZHUs550op78hihV4Pm7DdPL4O6rtRom3mAGFHDXAkyk2i8FJ0M0KRIkQOCI7586GrP1pVR4npTVcDXplW7WtGB9+o2NJoamn530J1uok+R7dzKJ2w1/TdjHKqciYUlb1N2ON+VkhF3FfUqYF9aYl/KdkzVT5EqfRw7PW+eMR3trBtKwsXeaeA0cnONUrLuLZl0NE5I/tIBWMtnzmXVmOG2qsQeSgrFkbWZUJnyrbwXV7cM1Jzj5PiOr6uUTIObtrYnKLjcrIyVMMHaKQeXs= X-MS-TrafficTypeDiagnostic: DB6PR0102MB2663:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4yij/t28DLDLj6ZBrw67nJZjmJaqtCGzLeC7qyBIBDrzGvr2N/5b+0luUlWp26fGzvvb09LTCjm6yjNozRkm2zSkIxXg69w5SDXUE6Irl8xwCW2OD6tghquRH+HekYnALXWKVK7wuQrxeIWYMxc5XKBtXTe6cuncANon3oCmIk6HsJe/En/iP7dAdb0rUlqkqF9QrLBmpwGNxO4i8lTaUa+1pD0AlY0OjyTh7vJtIj2j7M52NVfefPCtk2Myg92ysG8dKTm78aqjO1zRinjyyS8G2RMqcniFXD/HLq6tDTVwi0rJvR5GeEorqmjlnOW22IltjePtUtH31YbTVGJHmDVzO9fn5xeRESMlVgTIBnZdn3Xhmbv5LF2AMT5Zq+3n8YcuaEIG4xglGqPhj5xNP8X5ghoYNe3XsGf3hW6OiVtTbPHO7iYH3CldLFmwGx/RrALjAbCmxROzQqA6yjZ8qj3KT7HHhwI+FQY9VEr5y/DKnnj25YtjYdafLOaPD+EWjdV3nxDxIB1eNbLEYSws1ybdp0I96wzt1iEDIEMNoVSDoVWIq3tsWWJD9UloSvyj5+9bYAa+EpYyzFCXOVixa7kQ6s4oRmOcH6O0UsAUIWu9PVEXdk3PQaiQK88i3Mp6AQLHej2jX/1lQXzNDqEimw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: UM+JbhCnSsylNYoP1dcKjp/tL6t7RuFLvt0U6qylSvtLuvbxGt+bfwvSQThbCYM9Bn/EBktK+fwgb9EAOuw8CPBMW2WbU593czkpT492e0eqvlvER4N5et0COCCBPeszxjAOu2tpU19zTd8l1WX+vv/M8vdUIwsqDi4NHh9soFV3r0uLLl+zdVIL986OUX7YAGTOwSsfBWKl3rhZenx3Lpk2l1zincTVpE+Tdb3/xJ8uizPlAxc7NSi8cPGHf4sVVrCaOKGSbs6xZndXUIbQpbs8pQVZZq2aD4HFF+jxwA6s+hDfVBubbKr7qxw7C9qGBxopRIf3f1iunkO+ze1sGPHDIdQ2kytGcqHWnky3QqQIed9r/sR5GgrrkJh3VvZ8U9OU98mnXH3ik0pGr+znE4qXEFRHwyxSKV2pjbkDWZ3SpqSxoFsYYbK4cJ8EC2wI2KciNGWAWvOU/fZp+ZLkYeBRqU2cQPn1y7AZYZRkFC3Jll2s3ts7mAe/Jc3Hv6C4xQHth9UhnS9nI1meZhcwgOfTOGX2JvmzkT51HdJ4LfsVdlNQQn/g0DxtGJqIVDP8KNhDtbc8ZuDqaKXELAbOPYtMzm11OrF7LRNpNP6iyfMxRw0RYc/hv+/sFlzrfCn9798V08KhX/Bx/d0WOUzaTw6scXMJeVPL0mKdsJOtNfU8/YogtluFnyYijaAVe+Xwy/A0j3hK3zWsGBbkKGGDogUpya1tWb92/h/TrGBDQUi7o5flZvgKUyiu90c8u85PAQzWLlCb+v8GTV3jidt3eQkYE0RSLgv+F/k24LM6mG/AhPtm1NkC6qVRcasbGsIzvFP25D+m2DyDnbqaTup1v/hKa/L4PJTj32Kj3iUZ71bHUA0sRpQw3zrVWZGOj7etxb02qRV9iEviVa6/8Qx2paGmH7cKLRRKQF6mK5QLu2VSOvoEYdfD2+Ueixk0xV3Yy1qYS6oPOO5owSL0PkXtNOf4O7TqRxKXmS3cCSW6Y9rekVIiti7045eb5ce5zwTZuPEFtZFW2Curd73JMXiUbyy0R2Tj0Dx+Kzavo0B8e9xp28Rqxq8QdA046DGtZ7JCWg/0Pgxx6OY9nm28Zql29rrcEiYmTwKGrfNfVLGlC7O45KNX/PHTlmzwZIh/tFym82gUAaYV0yka3/dKVts50M9AeFmXsT+/acte1g93aeOXdRfqxVG6R0cZWhU0kkVCzJuHsAp40D0ogFAAv2v8h0MAzSq57PC2mGP3SjbxVwFo3GhGhprtzmD282AltPzceWFEg5M4ZjXL9gWzwyUi69yk0jWtcb9QrAjKVutbFkGUMu0BOAab+KbOoFT4AA2em9NwvHn1MnJXulwMEQEjJ6RFz1wFVaOjzo7KV4mujsLQPJTjHj7aot9iS56j2EwuyIX66eBgpnmo90Z9IGhZ9SM8gBlby/3s7H0F3Ndd9MYPhwmBQexLU58IfM5Tc5mFnweYSfymVlK3Z8TZOZ5x3w== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9cb9b73a-7b01-4278-619b-08da301cc7d9 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:28:59.9290 (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: DB6PR0102MB2663 Subject: [FFmpeg-devel] [PATCH 07/44] avformat/utils: Move stream_options, avformat_new_stream to options.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: VUSKITu5fumV This is the appropriate place given that AVStream is about to become an AVOpt-enabled struct. Also move av_disposition_(to|from)_string, as these are tied to the disposition stream option. Signed-off-by: Andreas Rheinhardt --- libavformat/avidec.c | 2 +- libavformat/internal.h | 12 +++- libavformat/options.c | 151 ++++++++++++++++++++++++++++++++++++++ libavformat/rmdec.c | 2 +- libavformat/utils.c | 159 ++--------------------------------------- 5 files changed, 169 insertions(+), 157 deletions(-) diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 3c749aec14..21fc2b87ff 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -621,7 +621,7 @@ static int avi_read_header(AVFormatContext *s) ast = s->streams[0]->priv_data; st->priv_data = NULL; - ff_free_stream(s, st); + ff_remove_stream(s, st); avi->dv_demux = avpriv_dv_init_demux(s); if (!avi->dv_demux) { diff --git a/libavformat/internal.h b/libavformat/internal.h index a40a29c5c0..a3fdab03af 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -742,7 +742,17 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt); int ff_add_attached_pic(AVFormatContext *s, AVStream *st, AVIOContext *pb, AVBufferRef **buf, int size); -void ff_free_stream(AVFormatContext *s, AVStream *st); +/** + * Frees a stream without modifying the corresponding AVFormatContext. + * Must only be called if the latter doesn't matter or if the stream + * is not yet attached to an AVFormatContext. + */ +void ff_free_stream(AVStream **st); +/** + * Remove a stream from its AVFormatContext and free it. + * The stream must be the last stream of the AVFormatContext. + */ +void ff_remove_stream(AVFormatContext *s, AVStream *st); unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id); diff --git a/libavformat/options.c b/libavformat/options.c index 2d55d3ad6e..14ae55e3fd 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -21,8 +21,12 @@ #include "avio_internal.h" #include "internal.h" +#include "libavcodec/avcodec.h" +#include "libavcodec/codec_par.h" + #include "libavutil/avassert.h" #include "libavutil/internal.h" +#include "libavutil/intmath.h" #include "libavutil/opt.h" /** @@ -188,3 +192,150 @@ const AVClass *avformat_get_class(void) { return &av_format_context_class; } + +static const AVOption stream_options[] = { + { "disposition", NULL, offsetof(AVStream, disposition), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, + .flags = AV_OPT_FLAG_ENCODING_PARAM, .unit = "disposition" }, + { "default", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEFAULT }, .unit = "disposition" }, + { "dub", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DUB }, .unit = "disposition" }, + { "original", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_ORIGINAL }, .unit = "disposition" }, + { "comment", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_COMMENT }, .unit = "disposition" }, + { "lyrics", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_LYRICS }, .unit = "disposition" }, + { "karaoke", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_KARAOKE }, .unit = "disposition" }, + { "forced", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_FORCED }, .unit = "disposition" }, + { "hearing_impaired", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_HEARING_IMPAIRED }, .unit = "disposition" }, + { "visual_impaired", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_VISUAL_IMPAIRED }, .unit = "disposition" }, + { "clean_effects", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CLEAN_EFFECTS }, .unit = "disposition" }, + { "attached_pic", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_ATTACHED_PIC }, .unit = "disposition" }, + { "timed_thumbnails", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_TIMED_THUMBNAILS }, .unit = "disposition" }, + { "captions", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS }, .unit = "disposition" }, + { "descriptions", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, .unit = "disposition" }, + { "metadata", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA }, .unit = "disposition" }, + { "dependent", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEPENDENT }, .unit = "disposition" }, + { "still_image", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_STILL_IMAGE }, .unit = "disposition" }, + { NULL } +}; + +static const AVClass stream_class = { + .class_name = "AVStream", + .item_name = av_default_item_name, + .version = LIBAVUTIL_VERSION_INT, + .option = stream_options, +}; + +const AVClass *av_stream_get_class(void) +{ + return &stream_class; +} + +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) +{ + FFFormatContext *const si = ffformatcontext(s); + FFStream *sti; + AVStream *st; + AVStream **streams; + + if (s->nb_streams >= s->max_streams) { + av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter" + " (%d), see the documentation if you wish to increase it\n", + s->max_streams); + return NULL; + } + streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams)); + if (!streams) + return NULL; + s->streams = streams; + + sti = av_mallocz(sizeof(*sti)); + if (!sti) + return NULL; + st = &sti->pub; + +#if FF_API_AVSTREAM_CLASS + st->av_class = &stream_class; +#endif + + st->codecpar = avcodec_parameters_alloc(); + if (!st->codecpar) + goto fail; + + sti->avctx = avcodec_alloc_context3(NULL); + if (!sti->avctx) + goto fail; + + if (s->iformat) { + sti->info = av_mallocz(sizeof(*sti->info)); + if (!sti->info) + goto fail; + +#if FF_API_R_FRAME_RATE + sti->info->last_dts = AV_NOPTS_VALUE; +#endif + sti->info->fps_first_dts = AV_NOPTS_VALUE; + sti->info->fps_last_dts = AV_NOPTS_VALUE; + + /* default pts setting is MPEG-like */ + avpriv_set_pts_info(st, 33, 1, 90000); + /* we set the current DTS to 0 so that formats without any timestamps + * but durations get some timestamps, formats with some unknown + * timestamps have their first few packets buffered and the + * timestamps corrected before they are returned to the user */ + sti->cur_dts = RELATIVE_TS_BASE; + } else { + sti->cur_dts = AV_NOPTS_VALUE; + } + + st->index = s->nb_streams; + st->start_time = AV_NOPTS_VALUE; + st->duration = AV_NOPTS_VALUE; + sti->first_dts = AV_NOPTS_VALUE; + sti->probe_packets = s->max_probe_packets; + sti->pts_wrap_reference = AV_NOPTS_VALUE; + sti->pts_wrap_behavior = AV_PTS_WRAP_IGNORE; + + sti->last_IP_pts = AV_NOPTS_VALUE; + sti->last_dts_for_order_check = AV_NOPTS_VALUE; + for (int i = 0; i < MAX_REORDER_DELAY + 1; i++) + sti->pts_buffer[i] = AV_NOPTS_VALUE; + + st->sample_aspect_ratio = (AVRational) { 0, 1 }; + + sti->inject_global_side_data = si->inject_global_side_data; + + sti->need_context_update = 1; + + s->streams[s->nb_streams++] = st; + return st; +fail: + ff_free_stream(&st); + return NULL; +} + +static int option_is_disposition(const AVOption *opt) +{ + return opt->type == AV_OPT_TYPE_CONST && + opt->unit && !strcmp(opt->unit, "disposition"); +} + +int av_disposition_from_string(const char *disp) +{ + for (const AVOption *opt = stream_options; opt->name; opt++) + if (option_is_disposition(opt) && !strcmp(disp, opt->name)) + return opt->default_val.i64; + return AVERROR(EINVAL); +} + +const char *av_disposition_to_string(int disposition) +{ + int val; + + if (disposition <= 0) + return NULL; + + val = 1 << ff_ctz(disposition); + for (const AVOption *opt = stream_options; opt->name; opt++) + if (option_is_disposition(opt) && opt->default_val.i64 == val) + return opt->name; + + return NULL; +} diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index b6b72e6ead..cb0ca31f40 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -349,7 +349,7 @@ int ff_rm_read_mdpr_codecdata(AVFormatContext *s, AVIOContext *pb, st->codecpar->codec_tag); } else if(mime && !strcmp(mime, "logical-fileinfo")){ int stream_count, rule_count, property_count, i; - ff_free_stream(s, st); + ff_remove_stream(s, st); if (avio_rb16(pb) != 0) { av_log(s, AV_LOG_WARNING, "Unsupported version\n"); goto skip; diff --git a/libavformat/utils.c b/libavformat/utils.c index fcee417c4e..f31dda9b44 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -28,7 +28,6 @@ #include "libavutil/bprint.h" #include "libavutil/dict.h" #include "libavutil/internal.h" -#include "libavutil/intmath.h" #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "libavutil/pixfmt.h" @@ -258,7 +257,7 @@ int ff_add_attached_pic(AVFormatContext *s, AVStream *st0, AVIOContext *pb, return 0; fail: if (!st0) - ff_free_stream(s, st); + ff_remove_stream(s, st); return ret; } @@ -621,7 +620,7 @@ int ff_stream_side_data_copy(AVStream *dst, const AVStream *src) return 0; } -static void free_stream(AVStream **pst) +void ff_free_stream(AVStream **pst) { AVStream *st = *pst; FFStream *const sti = ffstream(st); @@ -657,12 +656,12 @@ static void free_stream(AVStream **pst) av_freep(pst); } -void ff_free_stream(AVFormatContext *s, AVStream *st) +void ff_remove_stream(AVFormatContext *s, AVStream *st) { av_assert0(s->nb_streams>0); av_assert0(s->streams[ s->nb_streams - 1 ] == st); - free_stream(&s->streams[ --s->nb_streams ]); + ff_free_stream(&s->streams[ --s->nb_streams ]); } void avformat_free_context(AVFormatContext *s) @@ -683,7 +682,7 @@ void avformat_free_context(AVFormatContext *s) av_opt_free(s->priv_data); for (unsigned i = 0; i < s->nb_streams; i++) - free_stream(&s->streams[i]); + ff_free_stream(&s->streams[i]); s->nb_streams = 0; for (unsigned i = 0; i < s->nb_programs; i++) { @@ -710,125 +709,6 @@ void avformat_free_context(AVFormatContext *s) av_free(s); } -static const AVOption stream_options[] = { - { "disposition", NULL, offsetof(AVStream, disposition), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, - .flags = AV_OPT_FLAG_ENCODING_PARAM, .unit = "disposition" }, - { "default", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEFAULT }, .unit = "disposition" }, - { "dub", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DUB }, .unit = "disposition" }, - { "original", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_ORIGINAL }, .unit = "disposition" }, - { "comment", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_COMMENT }, .unit = "disposition" }, - { "lyrics", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_LYRICS }, .unit = "disposition" }, - { "karaoke", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_KARAOKE }, .unit = "disposition" }, - { "forced", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_FORCED }, .unit = "disposition" }, - { "hearing_impaired", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_HEARING_IMPAIRED }, .unit = "disposition" }, - { "visual_impaired", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_VISUAL_IMPAIRED }, .unit = "disposition" }, - { "clean_effects", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CLEAN_EFFECTS }, .unit = "disposition" }, - { "attached_pic", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_ATTACHED_PIC }, .unit = "disposition" }, - { "timed_thumbnails", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_TIMED_THUMBNAILS }, .unit = "disposition" }, - { "captions", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS }, .unit = "disposition" }, - { "descriptions", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, .unit = "disposition" }, - { "metadata", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA }, .unit = "disposition" }, - { "dependent", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEPENDENT }, .unit = "disposition" }, - { "still_image", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_STILL_IMAGE }, .unit = "disposition" }, - { NULL } -}; - -static const AVClass stream_class = { - .class_name = "AVStream", - .item_name = av_default_item_name, - .version = LIBAVUTIL_VERSION_INT, - .option = stream_options, -}; - -const AVClass *av_stream_get_class(void) -{ - return &stream_class; -} - -AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) -{ - FFFormatContext *const si = ffformatcontext(s); - FFStream *sti; - AVStream *st; - AVStream **streams; - - if (s->nb_streams >= s->max_streams) { - av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter" - " (%d), see the documentation if you wish to increase it\n", - s->max_streams); - return NULL; - } - streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams)); - if (!streams) - return NULL; - s->streams = streams; - - - sti = av_mallocz(sizeof(*sti)); - if (!sti) - return NULL; - st = &sti->pub; - -#if FF_API_AVSTREAM_CLASS - st->av_class = &stream_class; -#endif - - st->codecpar = avcodec_parameters_alloc(); - if (!st->codecpar) - goto fail; - - sti->avctx = avcodec_alloc_context3(NULL); - if (!sti->avctx) - goto fail; - - if (s->iformat) { - sti->info = av_mallocz(sizeof(*sti->info)); - if (!sti->info) - goto fail; - -#if FF_API_R_FRAME_RATE - sti->info->last_dts = AV_NOPTS_VALUE; -#endif - sti->info->fps_first_dts = AV_NOPTS_VALUE; - sti->info->fps_last_dts = AV_NOPTS_VALUE; - - /* default pts setting is MPEG-like */ - avpriv_set_pts_info(st, 33, 1, 90000); - /* we set the current DTS to 0 so that formats without any timestamps - * but durations get some timestamps, formats with some unknown - * timestamps have their first few packets buffered and the - * timestamps corrected before they are returned to the user */ - sti->cur_dts = RELATIVE_TS_BASE; - } else { - sti->cur_dts = AV_NOPTS_VALUE; - } - - st->index = s->nb_streams; - st->start_time = AV_NOPTS_VALUE; - st->duration = AV_NOPTS_VALUE; - sti->first_dts = AV_NOPTS_VALUE; - sti->probe_packets = s->max_probe_packets; - sti->pts_wrap_reference = AV_NOPTS_VALUE; - sti->pts_wrap_behavior = AV_PTS_WRAP_IGNORE; - - sti->last_IP_pts = AV_NOPTS_VALUE; - sti->last_dts_for_order_check = AV_NOPTS_VALUE; - for (int i = 0; i < MAX_REORDER_DELAY + 1; i++) - sti->pts_buffer[i] = AV_NOPTS_VALUE; - - st->sample_aspect_ratio = (AVRational) { 0, 1 }; - - sti->inject_global_side_data = si->inject_global_side_data; - - sti->need_context_update = 1; - - s->streams[s->nb_streams++] = st; - return st; -fail: - free_stream(&st); - return NULL; -} - AVProgram *av_new_program(AVFormatContext *ac, int id) { AVProgram *program = NULL; @@ -1953,35 +1833,6 @@ void ff_format_set_url(AVFormatContext *s, char *url) s->url = url; } -static int option_is_disposition(const AVOption *opt) -{ - return opt->type == AV_OPT_TYPE_CONST && - opt->unit && !strcmp(opt->unit, "disposition"); -} - -int av_disposition_from_string(const char *disp) -{ - for (const AVOption *opt = stream_options; opt->name; opt++) - if (option_is_disposition(opt) && !strcmp(disp, opt->name)) - return opt->default_val.i64; - return AVERROR(EINVAL); -} - -const char *av_disposition_to_string(int disposition) -{ - int val; - - if (disposition <= 0) - return NULL; - - val = 1 << ff_ctz(disposition); - for (const AVOption *opt = stream_options; opt->name; opt++) - if (option_is_disposition(opt) && opt->default_val.i64 == val) - return opt->name; - - return NULL; -} - int ff_format_shift_data(AVFormatContext *s, int64_t read_start, int shift_size) { int ret;