From patchwork Fri Jan 7 10:53:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33155 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp279370iog; Fri, 7 Jan 2022 02:54:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJx0mTCIm8N8hw/uxu2YQQGNpNgt3gp1FLrULMPBX4en3+HwpL2rViOAn4+YT8/0XLssJeUb X-Received: by 2002:a05:6402:2709:: with SMTP id y9mr60421072edd.346.1641552863398; Fri, 07 Jan 2022 02:54:23 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hz3si2628934ejc.129.2022.01.07.02.54.23; Fri, 07 Jan 2022 02:54:23 -0800 (PST) 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=obgHtybU; 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 102B068AC14; Fri, 7 Jan 2022 12:54:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2043.outbound.protection.outlook.com [40.92.91.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5B39068AA6A for ; Fri, 7 Jan 2022 12:54:00 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gC5rrlV3RG5fXbEAdZsneZYUrPCn+VnkG3Dl1s2lhBONs1dMSSYBXBIK8LQmxe7JN9XowKYI65orLwpuoohVHfbgXaSJMKqxjAw3rmP+rjoKOAdOuoMImW+rh2Wulpf6/Uc0D2ApVDlNIdBqG9ikIAyqmd/BmvRU7UrzS3y6eOvivYqsUGR4h7jSaYNZ+sfZeUIUBd/0JuwOx8h7GnmriIq0jxeHKKL6uOie9FCeGGfZI6tU7EUyoVDDMXZvOeOY80NCOMi9zZYdedzU//+VH5K9hBG8JRBsmUC/HqbyvsspSu9ARXiBUStLWo17Iryv6FDshGTKM0xOg6w5rOm9+Q== 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=0s8OwcUgESYnkZfrLx1DVeY/Xx74yt/mvImsnRLwQn8=; b=KAadnqWnS138vUA0Z7/j8EhCF3ejWPuuv9asfOl+AfPV+gEN8Oay+swk+6INb8mFimgIxOtiMHgilp8GuzFp/NowlcI1KEbSnjW72m39YUhm0LhOKyd16GFI78aX4JZjjV/r20vTdkvSMS72AHrQIP99VlXE2sNsyZv9ojmLcbT0x996wGcHpiLgCz6mJ3gF1U8GBToDA6JDEWbTi9pn5cBGzaihyzlZZy/q3dCTR0aTCTfSDizQCI5yFqwQLpYkaHQlPHv9VaZEUXeovM7BChtmy/ACbMk7D9GbeWCDf2zinZCAVQ/Tk5ezW4+cq3vdTu0JbWpppAmQHu4d3UfRxQ== 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=0s8OwcUgESYnkZfrLx1DVeY/Xx74yt/mvImsnRLwQn8=; b=obgHtybU314gDgEH1+UMzWGtANnttvQ/8ZXtvFluM+r4LF/0nkPJIwgjedBb86NjfxNErs9p50MCoKhxkBijba01PtAsT9r/4yNbC8PjPJ/E4XxmFfQ6BFkzea9bVZstfT/ftQM3Mw/74TGXJJI0dpT3N9am39+TRA4ZyeQjqNaen15454Y+LE/N+6aCwmEMGCvEHTUMipQqDrmNVfbTsQ+JpDu9zNOl5zC+olD5c7/cMWyCh8766wprrx85RnzRSXte9OUvVqwHniiv8/BjUjYBtmpwxlohZ9kRbEqTRj72ADyMsHIs1kq9fuVixjNuGMkG7NmC93kSf0bJIS6fNQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR0302MB3239.eurprd03.prod.outlook.com (2603:10a6:209:1c::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4867.11; Fri, 7 Jan 2022 10:53:55 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5%9]) with mapi id 15.20.4867.011; Fri, 7 Jan 2022 10:53:55 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jan 2022 11:53:42 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [9E5Cxl+0lN5LDAs1E96jHfPQi6gBV3nE] X-ClientProxiedBy: AM8P190CA0025.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:219::30) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220107105342.3241608-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3c95d8fc-0ffa-4ee1-5709-08d9d1cbfffa X-MS-Exchange-SLBlob-MailProps: ZTmCor6bjd+hW4gLxOsJl5joX02ZNnAyztcJlAt63R+ysbcAzuPYqXVKumXKrs1cRQlKAiRW6xNV6CQh51XsucsmYlxgwrkylwjLRgx7yelW1mTnAbtlhOMf+7+Z/Vaf3FbOqBUJSRbhLbMgZo3L0sjT9KwD4mhuMspingnB0Rk7cVI/qG3v94eLFxbzACY6CsqMn+kCymkOis83yagXLULI/m8gRDb7o0Yy7DiYNY1/3xJ6BbDBZixrchkKKF/88OgQIcw79PIWM8v9ZvQegXm8mcKk7yypAoL5WIPyqlFP+TBfXSPYBbUxmaCNaw8V+EvSqWDSzTqMR2l385DVET5/eB2RQa78bA7GOUGDkjfqkRscSHL78L6QTgzLIq+kD6jQp6C34fFqJZQSyq96yLKyUPhtOkphsgV1J8+kK2y5YbG5w1qPuTZwx/e8npFrli5xpoPIx7SfKYvegeuAVJ97UzGoCofoRT1fGE+xCRN3o9DUs2MEAQ4zwlZukPN6heU0Z1uEYlXxCseXIf7g1rVhUVJz2ihWC5/9ATDqRXSWn6VmHxejz2wrJgg8Jy5VVyNOTXFQsZKnx5mzR85lJQWRGfi3vLXt90EZ0pEC56lEurVZUVOdEUEluE95gjHQIXk91rEVQdDJf8fKvTO20v0y8TxmoPvVwpOdgjOrFksQkqjwjv9O9+oRSneqgmkmkMOBkLC+mXkvZ2+ogrFNOb6vZ05M7fpII3YfBwQI7F4m+/ycfoVO6caT42GGOYX36oRo6+q48Hlo/6Xt19YXCAj8emY0ZPPrqKYXqDSbDf+6W9DxWs1dtzZKVFBK8gxF X-MS-TrafficTypeDiagnostic: AM6PR0302MB3239:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: usV4EHDmoUN/vwz3MZX3jPBClZCr5tVhLddzcNx7XfIAqL3R3mh4N+sHHFFnmeEq8C9k+t24UJuqraopSYtkS+lJR6gkNTMzHRlQwUuJWnvGbmUe38GlHwsPngkT04AigHiA7ytCSV3Gzo+XdMS8NSx9DjptHOKG5SIG3KCIPbKSlBSeestrJAjjg8r9szKDDeF2su2iPyAljnktS6r4yT1CsZovUdWZci2W1s7CkfYECWoZC9LJ8OE00hLC5LbItL07mLFNiImDXCAoSciBn14IyLGkaEoWRaF+EdMEi70LgggAfM9K6FJx425z4C1RjdrzZ8snMLdU3Ex9Zt6enLGZHrnbSpae3Xf+vX1PzXEWOT0+7K7KZPzDvvzIuw8eLN50F12eZnwez6Zl8iVsTYAgoDmETn4nbECpFaCYeMV98Pod3gAap3ra4OvSrfYyi5PWuArsKMtGPGnUPCLwO+dtmsUkCkXwBQw4RKjJnlu7TD6EOSOv4MV/qCccQpfDu4daE7Eve5+oTLLCoYv6khktCdxq1pmMzBIIXHjomC5LCYYdnKV+LEGiHuvnaJ2vN+0Av6U+Bw1hPvMM8octLbPeNlSRQ4yNvD5okj7hsfKIJ56+RYUYfShRns90Vlgf X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: D7XgU7uqTFpO/QT1yedBHXGP7FV9EBE2/EjoAufmAUrHEFEYhn75NQMbonRyOCzd51B1GYgPrPUDJmrBRNwGHeIZSJ4u28+8Uv+xktSatvJDWXHX4iRmzFoioApj189bUHL8nOYZcSYo5biSHP6DdEqB1HjJRsz9F//edDx+OlGIyGWU3+ULkjxtAxdNQDVh1pw1iPGDf0JbdASjClEPAif8etxuUfUELLmyUVJSu0xgQt6344TshXFMsj6H99XFoc7nctRECUyTEBtGkgAKJAjbLq4t+haiRF6tlakjodsKw2Fly2Sq4EQvLnFovqY/XNEOpRuOU92epi/RzkJX+j6xzLitxUswYV3qH8vVRelAV6yrwbG6aMgI/sRflnPAwvT2VAqVIZRPuffDolL5wO8PBFmEAgUXnPAjLa7rUuuF5JlguUqDulK0O8SlV5GTTJqBbrz4mu6YDyoFIOnPtCoBL/US7ovgH1We/HAhBk6x6uFbcIZqOELSZdAh0HNdXaYHMeirj2pt2g0X2PO3Dct7qtx95a7Nv0trVCGCYz66ceq23jfTjYzsBtJXQ2fhbnc+JjvvjbGeQ3RjrZTqIdJg9DU5eTGFcln9FD6D6IQXotJNMENEcTizxLI9pYJMqtloIys1rY1OWNK5EaUUJ0b7fVsRe0bSW5CFwenxCWfdvyX7uBCjYfEbGXf9qD/8QmNPZjAdUXKBfC2yL6lwpBIrr6MZKF/2sjkC7jsZVlJedZeN0lxLsKPXfJ5USq+GVVg6O29OLYU5SHgtnzFX+7hMupsftWpUFT40t1CyIme515jcJOGo5hiWWZRjgxBR3ajHaV47lfSrNjyO015qlxK6nAacmC5UhhZJTatflsWBsxdGYlledQesfXGZ9LqnPEITFeEjuAEGZjSz+YW6JHT8SY3JVCn5ZrHN017ZGQcuBVsvkzCD9J8Z/hBDZU1MlQJwiIREFcgKBGxVftLjzg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3c95d8fc-0ffa-4ee1-5709-08d9d1cbfffa X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2022 10:53:55.5923 (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: AM6PR0302MB3239 Subject: [FFmpeg-devel] [PATCH 18/18] avformat/matroskaenc: Disable MKV-only code if MKV muxer is disabled 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: V29HocaGXR2h The Matroska muxer has quite a lot of dependencies and lots of them are unnecessary for WebM. By disabling the Matroska-only code at compile time one can get rid of them. Signed-off-by: Andreas Rheinhardt --- configure | 1 - libavformat/Makefile | 4 +- libavformat/matroskaenc.c | 97 ++++++++++++++++++++++++--------------- 3 files changed, 60 insertions(+), 42 deletions(-) diff --git a/configure b/configure index 11342d5cec..a9e9d31bc8 100755 --- a/configure +++ b/configure @@ -3478,7 +3478,6 @@ w64_muxer_select="wav_muxer" wav_demuxer_select="riffdec" wav_muxer_select="riffenc" webm_chunk_muxer_select="webm_muxer" -webm_muxer_select="mpeg4audio riffenc" webm_dash_manifest_demuxer_select="matroska_demuxer" wtv_demuxer_select="mpegts_demuxer riffdec" wtv_muxer_select="mpegts_muxer riffenc" diff --git a/libavformat/Makefile b/libavformat/Makefile index 300a32bae1..c5b09b6a51 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -585,9 +585,7 @@ OBJS-$(CONFIG_WAV_DEMUXER) += wavdec.o pcm.o OBJS-$(CONFIG_WAV_MUXER) += wavenc.o OBJS-$(CONFIG_WC3_DEMUXER) += wc3movie.o OBJS-$(CONFIG_WEBM_MUXER) += matroskaenc.o matroska.o \ - av1.o avc.o hevc.o isom_tags.o \ - flacenc_header.o avlanguage.o \ - wv.o vorbiscomment.o + av1.o avlanguage.o OBJS-$(CONFIG_WEBM_DASH_MANIFEST_MUXER) += webmdashenc.o OBJS-$(CONFIG_WEBM_CHUNK_MUXER) += webm_chunk.o OBJS-$(CONFIG_WEBP_MUXER) += webpenc.o diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 303aa1ce50..152312102a 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -21,6 +21,8 @@ #include +#include "config.h" + #include "av1.h" #include "avc.h" #include "hevc.h" @@ -59,6 +61,11 @@ * Info, Tracks, Chapters, Attachments, Tags (potentially twice) and Cues */ #define MAX_SEEKHEAD_ENTRIES 7 +#define MODE_MATROSKAv2 0x01 +#define MODE_WEBM 0x02 + +#define IS_WEBM(mkv) (CONFIG_WEBM_MUXER && CONFIG_MATROSKA_MUXER ? \ + ((mkv)->mode == MODE_WEBM) : CONFIG_WEBM_MUXER) #define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \ !(mkv)->is_live) @@ -118,9 +125,6 @@ typedef struct mkv_track { int64_t ts_offset; } mkv_track; -#define MODE_MATROSKAv2 0x01 -#define MODE_WEBM 0x02 - typedef struct MatroskaMuxContext { const AVClass *class; int mode; @@ -640,6 +644,7 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, return 0; } +#if CONFIG_MATROSKA_MUXER static int put_wv_codecpriv(AVIOContext *pb, const AVCodecParameters *par) { if (par->extradata && par->extradata_size == 2) @@ -717,6 +722,7 @@ static int get_aac_sample_rates(AVFormatContext *s, MatroskaMuxContext *mkv, } return 0; } +#endif static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, const AVCodecParameters *par, @@ -726,6 +732,14 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, case AV_CODEC_ID_VORBIS: case AV_CODEC_ID_THEORA: return put_xiph_codecpriv(s, dyn_cp, par); + case AV_CODEC_ID_AV1: + if (par->extradata_size) + return ff_isom_write_av1c(dyn_cp, par->extradata, + par->extradata_size); + else + put_ebml_void(pb, 4 + 3); + break; +#if CONFIG_MATROSKA_MUXER case AV_CODEC_ID_FLAC: return put_flac_codecpriv(s, dyn_cp, par); case AV_CODEC_ID_WAVPACK: @@ -736,13 +750,6 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, case AV_CODEC_ID_HEVC: return ff_isom_write_hvcc(dyn_cp, par->extradata, par->extradata_size, 0); - case AV_CODEC_ID_AV1: - if (par->extradata_size) - return ff_isom_write_av1c(dyn_cp, par->extradata, - par->extradata_size); - else - put_ebml_void(pb, 4 + 3); - break; case AV_CODEC_ID_ALAC: if (par->extradata_size < 36) { av_log(s, AV_LOG_ERROR, @@ -759,8 +766,9 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, else put_ebml_void(pb, MAX_PCE_SIZE + 2 + 4); break; +#endif default: - if (par->codec_id == AV_CODEC_ID_PRORES && + if (CONFIG_MATROSKA_MUXER && par->codec_id == AV_CODEC_ID_PRORES && ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == AV_CODEC_ID_PRORES) { avio_wl32(dyn_cp, par->codec_tag); } else if (par->extradata_size && par->codec_id != AV_CODEC_ID_TTA) @@ -774,8 +782,8 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int native_id, int qt_id) { + MatroskaMuxContext av_unused *const mkv = s->priv_data; AVIOContext *dyn_cp; - MatroskaMuxContext *mkv = s->priv_data; uint8_t *codecpriv; int ret, codecpriv_size; @@ -785,6 +793,7 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, if (native_id) { ret = mkv_write_native_codecprivate(s, pb, par, dyn_cp); +#if CONFIG_MATROSKA_MUXER } else if (par->codec_type == AVMEDIA_TYPE_VIDEO) { if (qt_id) { if (!par->codec_tag) @@ -826,6 +835,7 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, par->codec_tag = tag; ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX); +#endif } if (ret >= 0) { @@ -991,7 +1001,7 @@ static void mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, end_ebml_master(pb, projection); } -static void mkv_write_field_order(AVIOContext *pb, int mode, +static void mkv_write_field_order(AVIOContext *pb, int is_webm, enum AVFieldOrder field_order) { switch (field_order) { @@ -1007,7 +1017,7 @@ static void mkv_write_field_order(AVIOContext *pb, int mode, case AV_FIELD_BT: put_ebml_uint(pb, MATROSKA_ID_VIDEOFLAGINTERLACED, MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED); - if (mode != MODE_WEBM) { + if (!is_webm) { switch (field_order) { case AV_FIELD_TT: put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER, @@ -1031,7 +1041,8 @@ static void mkv_write_field_order(AVIOContext *pb, int mode, } static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, - AVStream *st, int mode, int *h_width, int *h_height) + AVStream *st, int is_webm, + int *h_width, int *h_height) { const AVDictionaryEntry *tag; MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB; @@ -1106,7 +1117,7 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, return 0; // if webm, do not write unsupported modes - if ((mode == MODE_WEBM && + if ((is_webm && format > MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM && format != MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT) || format >= MATROSKA_VIDEO_STEREOMODE_TYPE_NB) { @@ -1192,7 +1203,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, if (st->disposition & AV_DISPOSITION_FORCED) put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1); - if (mkv->mode == MODE_WEBM) { + if (IS_WEBM(mkv)) { const char *codec_id; if (par->codec_type != AVMEDIA_TYPE_SUBTITLE) { for (j = 0; ff_webm_codec_tags[j].id != AV_CODEC_ID_NONE; j++) { @@ -1271,7 +1282,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, && av_cmp_q(av_inv_q(st->r_frame_rate), st->time_base) > 0) put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->r_frame_rate.den / st->r_frame_rate.num); - if (!native_id && + if (CONFIG_MATROSKA_MUXER && !native_id && ff_codec_get_tag(ff_codec_movvideo_tags, par->codec_id) && ((!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id) && par->codec_id != AV_CODEC_ID_RAWVIDEO) || par->codec_id == AV_CODEC_ID_SVQ1 || @@ -1293,11 +1304,11 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , par->width); put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, par->height); - mkv_write_field_order(pb, mkv->mode, par->field_order); + mkv_write_field_order(pb, IS_WEBM(mkv), par->field_order); // check both side data and metadata for stereo information, // write the result to the bitstream if any is found - ret = mkv_write_stereo_mode(s, pb, st, mkv->mode, + ret = mkv_write_stereo_mode(s, pb, st, IS_WEBM(mkv), &display_width_div, &display_height_div); if (ret < 0) @@ -1318,7 +1329,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, return AVERROR(EINVAL); } if (d_width != par->width || display_width_div != 1 || display_height_div != 1) { - if (mkv->mode == MODE_WEBM || display_width_div != 1 || display_height_div != 1) { + if (IS_WEBM(mkv) || display_width_div != 1 || display_height_div != 1) { put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width / display_width_div); put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, par->height / display_height_div); } else { @@ -1335,7 +1346,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } else if (display_width_div != 1 || display_height_div != 1) { put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , par->width / display_width_div); put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, par->height / display_height_div); - } else if (mkv->mode != MODE_WEBM) + } else if (!IS_WEBM(mkv)) put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN); if (par->codec_id == AV_CODEC_ID_RAWVIDEO) { @@ -1347,9 +1358,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, end_ebml_master(pb, subinfo); - if (mkv->mode != MODE_WEBM) { + if (!IS_WEBM(mkv)) mkv_write_dovi(s, pb, st); - } break; @@ -1370,12 +1380,14 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } if (par->codec_id == AV_CODEC_ID_OPUS) put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL); +#if CONFIG_MATROSKA_MUXER else if (par->codec_id == AV_CODEC_ID_AAC) { ret = get_aac_sample_rates(s, mkv, par->extradata, par->extradata_size, &sample_rate, &output_sample_rate); if (ret < 0) return ret; } +#endif put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); @@ -1410,10 +1422,10 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, av_log(s, AV_LOG_ERROR, "Subtitle codec %d is not supported.\n", par->codec_id); return AVERROR(ENOSYS); } - if (mkv->mode != MODE_WEBM && st->disposition & AV_DISPOSITION_DESCRIPTIONS) + if (!IS_WEBM(mkv) && st->disposition & AV_DISPOSITION_DESCRIPTIONS) put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS, 1); - if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) + if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) native_id = MATROSKA_TRACK_TYPE_SUBTITLE; put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, native_id); @@ -1423,7 +1435,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, return AVERROR(EINVAL); } - if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { + if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) { track->codecpriv_offset = avio_tell(pb); ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id); if (ret < 0) @@ -1642,7 +1654,7 @@ static int mkv_write_tags(AVFormatContext *s) } } - if (mkv->nb_attachments && mkv->mode != MODE_WEBM) { + if (mkv->nb_attachments && !IS_WEBM(mkv)) { for (i = 0; i < s->nb_streams; i++) { const mkv_track *track = &mkv->tracks[i]; const AVStream *st = s->streams[i]; @@ -1695,7 +1707,7 @@ static int mkv_write_chapters(AVFormatContext *s) return ret; editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0); - if (mkv->mode != MODE_WEBM) { + if (!IS_WEBM(mkv)) { put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); /* If mkv_write_tags() has already been called, then any tags * corresponding to chapters will be put into a new Tags element. */ @@ -1855,7 +1867,7 @@ static int mkv_write_header(AVFormatContext *s) int ret, i, version = 2; int64_t creation_time; - if (mkv->mode != MODE_WEBM || + if (!IS_WEBM(mkv) || av_dict_get(s->metadata, "stereo_mode", NULL, 0) || av_dict_get(s->metadata, "alpha_mode", NULL, 0)) version = 4; @@ -1900,7 +1912,7 @@ static int mkv_write_header(AVFormatContext *s) else put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); - if (mkv->mode != MODE_WEBM) + if (!IS_WEBM(mkv)) put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 16); } else { const char *ident = "Lavf"; @@ -1948,7 +1960,7 @@ static int mkv_write_header(AVFormatContext *s) if (ret < 0) return ret; - if (mkv->mode != MODE_WEBM) { + if (!IS_WEBM(mkv)) { ret = mkv_write_attachments(s); if (ret < 0) return ret; @@ -2010,6 +2022,7 @@ static int mkv_blockgroup_size(int pkt_size, int track_num_size) return size; } +#if CONFIG_MATROSKA_MUXER static int mkv_strip_wavpack(const uint8_t *src, uint8_t **pdst, int *size) { uint8_t *dst; @@ -2062,6 +2075,7 @@ fail: av_freep(&dst); return ret; } +#endif static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, uint32_t blockid, const AVPacket *pkt, int keyframe) @@ -2089,6 +2103,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, pkt->size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb), mkv->cluster_pos, track_number, keyframe != 0); +#if CONFIG_MATROSKA_MUXER if (par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 0 && (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) { err = ff_avc_parse_nal_units_buf(pkt->data, &data, &size); @@ -2096,11 +2111,13 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) { /* extradata is Annex B, assume the bitstream is too and convert it */ err = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL); - } else if (par->codec_id == AV_CODEC_ID_AV1) { - err = ff_av1_filter_obus_buf(pkt->data, &data, &size, &offset); } else if (par->codec_id == AV_CODEC_ID_WAVPACK) { err = mkv_strip_wavpack(pkt->data, &data, &size); } else +#endif + if (par->codec_id == AV_CODEC_ID_AV1) { + err = ff_av1_filter_obus_buf(pkt->data, &data, &size, &offset); + } else data = pkt->data; if (err < 0) { @@ -2109,7 +2126,8 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, return err; } - if (par->codec_id == AV_CODEC_ID_PRORES && size >= 8) { + if (CONFIG_MATROSKA_MUXER && + par->codec_id == AV_CODEC_ID_PRORES && size >= 8) { /* Matroska specification requires to remove the first QuickTime atom */ size -= 8; @@ -2261,6 +2279,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) &side_data_size); switch (par->codec_id) { +#if CONFIG_MATROSKA_MUXER case AV_CODEC_ID_AAC: if (side_data_size && mkv->track.bc) { int filler, output_sample_rate = 0; @@ -2302,6 +2321,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) par->extradata = old_extradata; } break; +#endif // FIXME: Remove the following once libaom starts propagating extradata during init() // See https://bugs.chromium.org/p/aomedia/issues/detail?id=2012 case AV_CODEC_ID_AV1: @@ -2721,7 +2741,8 @@ static int mkv_init(struct AVFormatContext *s) si->avoid_negative_ts_use_pts = 1; } - if (!strcmp(s->oformat->name, "webm")) { + if (!CONFIG_MATROSKA_MUXER || + (CONFIG_WEBM_MUXER && !strcmp(s->oformat->name, "webm"))) { mkv->mode = MODE_WEBM; mkv->write_crc = 0; } else @@ -2755,7 +2776,7 @@ static int mkv_init(struct AVFormatContext *s) avpriv_set_pts_info(st, 64, 1, 1000); if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) { - if (mkv->mode == MODE_WEBM) { + if (IS_WEBM(mkv)) { av_log(s, AV_LOG_WARNING, "Stream %d will be ignored " "as WebM doesn't support attachments.\n", i); } else if (!get_mimetype(st)) { @@ -2783,7 +2804,7 @@ static int mkv_check_bitstream(AVFormatContext *s, AVStream *st, { int ret = 1; - if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { + if (CONFIG_MATROSKA_MUXER && st->codecpar->codec_id == AV_CODEC_ID_AAC) { if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL); } else if (st->codecpar->codec_id == AV_CODEC_ID_VP9) {