From patchwork Sun Jan 16 23:03:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33619 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2272682iog; Sun, 16 Jan 2022 15:05:14 -0800 (PST) X-Google-Smtp-Source: ABdhPJwvzfBniPbdKMP0QlKqnPFwWWfF3PUHBzjCiSt0jQprtD34SaCgt5S1xlCGIJcT3RDedGVb X-Received: by 2002:a05:6402:254d:: with SMTP id l13mr175414edb.190.1642374314304; Sun, 16 Jan 2022 15:05:14 -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 v19si6362970edy.253.2022.01.16.15.05.13; Sun, 16 Jan 2022 15:05:14 -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=fUMfk92K; 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 1554B68AEE5; Mon, 17 Jan 2022 01:04:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073050.outbound.protection.outlook.com [40.92.73.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7495E68A637 for ; Mon, 17 Jan 2022 01:04:50 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GNbDMxtr1as+oTeJl3kLKkALSHVtluIOkcjPN638MjkPYfVxd5YW9LxPWfM0NCsr/pAWMfU6RAKzCs5DU7sg4l+W02b+RFZeXWmMH+TM3gkyBnkHC/TDD/oj9NQbPPzBPf6zMxznP12sgP4ZYcu+V2e6FN6jfymPXGBUi7ZtLn3IzQWVDHnpIYG6WZmMVp2Ee5COyU20FrD+CfS4G7Ym28rKjm16rNCME08rVfExGkvDOFxOaXlXINh9SrnWBarUhFXUe3CBnaxNztRLtaOTKCjxL5LGrYqdDs6DTwLCVee1xoepU2YvjcTv4MRWG8pTyWKh4XStl2zbVL1UNXWYSQ== 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=YgCxS4brnsrWXK2axiANFCOcqICwTrog3A/W8l5WKdw=; b=UloSG89Oln7SxvreHaRCk9ailLJpfJAYb+Zept4muph0D9y/wVWoouwYUY6PejYTf7BYMH6RZ/VEQLFTMX61QKyXW4KWjhnzQDsfbyKr1CyDY7cMojxMN6sIPogS/PBkeW3YvIDNwylYZkR40pDT68kVQmPNWVqESc444koFVGKUAMT0BbsMeMVW0X4vUR8/JYcQnyWbK/ydgke1FusAP+iQ0kQyOhfNr81RP2ioAV0cFgeUnXHCPWf8n4jNseZKb/A5JWVlCHUgHPTyjOqHaZmAcIndZXC6qLsTrtvAgkrjtPFPz97df8xaIqxlOZQmCWyBkJjRYKW5gYsXnLS97g== 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=YgCxS4brnsrWXK2axiANFCOcqICwTrog3A/W8l5WKdw=; b=fUMfk92KH2PtyzHi5BrTrskstqs3wiRC8HO6Y/nBN5g8pulW3oZglNx/VsH7fkfzfqDl9IoWt97pn1s431wchoK0I8tiv0shGE0Rkdn4JNz9VpjzxomW2CwxuD4MluxpY57aFyv+BvWfWfLMM77yKBeeId3d7j6PE0P0I0l2o9TLzVG/If+CYTqOdw/Rg7mrS1QOBesij7T9F3OPvGydFKCJTUeFf6vRiJsujTGXisqYPInXyFYevtmZeSiBiTQmDrSe+pSPu+ge3JWp34sr1+lbYxsegllSf+iFBnTEXxe6nJ6K1s0sBMy1NWPE27n7hcG+ZhvlrxcnV+UWRFv0Pg== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AS8PR03MB7704.eurprd03.prod.outlook.com (2603:10a6:20b:403::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4888.10; Sun, 16 Jan 2022 23:04:48 +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.4888.013; Sun, 16 Jan 2022 23:04:48 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jan 2022 00:03:47 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [6gOq9cnnZ1U+xP7kQGEe1aSktO7Y3NkE] X-ClientProxiedBy: AM0PR10CA0070.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:15::23) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220116230405.194506-6-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7bc89652-a8c1-49cf-d4e0-08d9d9449865 X-MS-Exchange-SLBlob-MailProps: +LiGfBxqLEuZvKHt/RRJ4O3wxWCrUcc4zPZLO170Iff30BvLy5N4zDzkkTeUaytBr+Km/usYTH8Rbh8oTpaQ3yjdgqPDIOxm8+j6Jn+MhHS7kxTpX2hqQc1gZFWjEqmELyyb4Yj+yhxWw5nkQbO89KkkJG+wSDJd3Xj2wNs5Ef1nLwwh1uH9eCCCEz9Pd6L3dto/pNYYRQfrRFVT7xvUnW2rV/IXQwBa5YnzbgW2vZi7JEHSYFVr71AWyfDVeNbp3uceWZ9q+nxDBwqNz0R8p+rDCiJ62SPeQF0cWqJjj1AHQxNfBZ691vplF9g0SLeZJc/Tm1cod2avi/7ZBuXkHaz4KTxgI3qhjrMzvEyHzY2p5w+87s8Owh2WbKpBLX22ZpS3yu/gCd6wfhKhINuvifvRFqPM9b9pE28B+LvmZ15qbYqTkyFkFt/WjSgK/0ZW7m0KMxKOsE0MwFSXSKvs4muBITebAXZVjPQeq1MwpqO4wxPraYE6JGjkS1nhcKe/BbD7DjD+cg6E2jnVOeD4Y+zyQ8Dc65NZE+uz7ZNZ5ctMgKmP46fGbt3nfurJfHly/7RZcuOjSeRYi2bm8zf1wXd4rq/ljbslyTocJfEyDpJgncq3J26SCS6HX8FwN+OIjCd88IxbzCsXyPP1LVCdLctczTyPE7q65qd5T3G15j5uxwxKeeYOb5JKUqmePC0HSPQKEVm5iS90dhm3Y6wCZW22i3plZWHa+NSHfKlBqoM1xvqNJRYyU3D+1iEZnob2CgXsI1KB7PLOK2TC1O89o9hhbVvjDfjV X-MS-TrafficTypeDiagnostic: AS8PR03MB7704:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FgN/t6b1kxQgc3sz1V14Q7O8Gh7gi0g9CXgLg975nPv872FQfQJDKI6aJWJ+kdb2kxxV5gWM3x4+TvCDlIDtxijNChNXX62yn1FOzuH6rH7tCKJ0FVDljTnTm/nUzJMOkiBi0ROP6ETzpzzAZyiJIIYWgz0sqgvIrN37pvefont/V23T1NMrWPk8g0ipDxG/n+w1a9encSWu+7l9IjBlrtddvd0zt7ElP94EKeSMg9W9i+d3+Tm7YYft5Pktd0u/p3pbG2Htn6yYZ7DNnTbrM7ofuUBq2yzepgVKGvXlGIFEHEwVB+alEsgtBWVKMB2Yd7PDSiLMMHqEPipGpP4NLyktoBSA/z/AQriyRu4VKztQ7sBbleCHMrqOvqwYv5ezkuNN6qtTtlMpBrzntk3Hr4BQjbCRJHyyUMUu88Kz1eH7c8Y8XMtGgdFJigbJ1C8QCYGf+gk+yoedSaDekxH2b6j7QYywPO9U6zoX1/1id5kuHFhexxTkL6uTFRmaQmsoRDjukfbl+QJks+hA7x9XVucx55u5DJCpsB7Ir1DCvO1P9XdoP+NnQVTx1ZkkRqxfwIHC3/bD58/slRnraHt5kw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RGU07d2miKLksVb7eE6kcSOTUpveXaK5T8pBTBUt1YlbqSsBQnGH1i/mecLt4wfNTkuNseyYOz18hOrVXjnr73PTpucAO8UByLc+5igR4K4nCTM0ef25C/aBcCKq+gUynUjlsNyPn+y6a/FltYcyc46AhitNhayIkWzxHdjlIS+ztMAqaljBTrmUEYpO+SpfFvFTO/uSSx7oFNLtA/b4+Wlx44q2E9p3TnP3b4XClXEtWQXp6/Zeox3iZK6d6rl/pyTcBA4yG2aySh9u2F3CWJSKhrp2BM71LsEM7Xy0yjc3ercmFw5ETp37u6NI0lVQ01q3HAKCOQyQytvxzv7Ytkicwe7pBpeXHqcQKFCLYrQCd1zqkZJyA4L/DyrGv8/mNxkTo0mXmzEtdogWOH37N99/wEFtb79QKJnKKbb03bkYB79kx5ef4NTWZqVJepa3+Lns+QK19chRncvhgK36vCZeDEgXKRh+9nB0mb3rc9ENazeNhFvF65V3dS2KMsCw1UEaxNpHW50wdfNBzg/ORFyLPlMrAp7Ivlmvj4FaC4HpTkOPwAgQ7jiCU2hNPtUsem6fCGm7PAY+bcAU/BeihwGlBBgUXeAAC63F9fPpyOIDk8qD36LFpamaLJ98XIn4NcURJm4yc1m3HtKQUsKGDrXJOjAxjHrKJAQ0V1e02F3b9imE/PjSvWHxT3PBg2S00J3u6zYZ0vTEUpmpkipvTotyQFS0gLVY/jmRQFsTAw8IMTxnalI0rmKaRrDzA4DQ9OLJbZIjvxZ1bitcZbJvoLJhrssEZOoIHS1j1iRCIZNiu45B5St5l3qmWfDT5X7DK4w6fAJAbL0tCgsyKO0gjBxTA928T8xaJlxQV0gDAeO4m+JiQThrL6DnXpuS2eAaTC1gTYngvw8ng4Yw2UpbR6HGK6PsxqFaBx7G816vWRCS9z3JMU6vk86L4aRNBaBhnU6YjdoHoMpvLeNwodiNnA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7bc89652-a8c1-49cf-d4e0-08d9d9449865 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2022 23:04:48.9168 (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: AS8PR03MB7704 Subject: [FFmpeg-devel] [PATCH 07/25] avformat/matroskaenc: Factor writing TrackVideo out 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: 7ZZfPjRduEVK It is already quite big. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 130 +++++++++++++++++++++----------------- 1 file changed, 72 insertions(+), 58 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 4d4d270db1..2f5f1cc56d 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1418,6 +1418,77 @@ static void mkv_write_dovi(AVFormatContext *s, AVIOContext *pb, AVStream *st) #endif } +static int mkv_write_track_video(AVFormatContext *s, MatroskaMuxContext *mkv, + AVStream *st, const AVCodecParameters *par, + AVIOContext *pb) +{ + const AVDictionaryEntry *tag; + int display_width_div = 1, display_height_div = 1; + ebml_master subinfo; + int ret; + + subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0); + + put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , par->width); + put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, par->height); + + 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, IS_WEBM(mkv), + &display_width_div, + &display_height_div); + if (ret < 0) + return ret; + + if (((tag = av_dict_get(st->metadata, "alpha_mode", NULL, 0)) && atoi(tag->value)) || + ((tag = av_dict_get( s->metadata, "alpha_mode", NULL, 0)) && atoi(tag->value)) || + (par->format == AV_PIX_FMT_YUVA420P)) { + put_ebml_uint(pb, MATROSKA_ID_VIDEOALPHAMODE, 1); + } + + // write DisplayWidth and DisplayHeight, they contain the size of + // a single source view and/or the display aspect ratio + if (st->sample_aspect_ratio.num) { + int64_t d_width = av_rescale(par->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den); + if (d_width > INT_MAX) { + av_log(s, AV_LOG_ERROR, "Overflow in display width\n"); + return AVERROR(EINVAL); + } + if (d_width != par->width || 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 { + AVRational display_aspect_ratio; + av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, + par->width * (int64_t)st->sample_aspect_ratio.num, + par->height * (int64_t)st->sample_aspect_ratio.den, + 1024 * 1024); + put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH, display_aspect_ratio.num); + put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, display_aspect_ratio.den); + put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_DAR); + } + } + } 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 (!IS_WEBM(mkv)) + put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN); + + if (par->codec_id == AV_CODEC_ID_RAWVIDEO) { + uint32_t color_space = av_le2ne32(par->codec_tag); + put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space)); + } + mkv_write_video_color(pb, st, par); + mkv_write_video_projection(s, pb, st); + + end_ebml_master(pb, subinfo); + + return 0; +} + static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, AVStream *st, mkv_track *track, AVIOContext *pb, int is_default) @@ -1429,8 +1500,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, int bit_depth; int sample_rate = par->sample_rate; int output_sample_rate = 0; - int display_width_div = 1; - int display_height_div = 1; int j, ret; const AVDictionaryEntry *tag; @@ -1552,65 +1621,10 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, ffformatcontext(s)->avoid_negative_ts_use_pts = 0; } - subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0); - - put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , par->width); - put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, par->height); - - 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, IS_WEBM(mkv), - &display_width_div, - &display_height_div); + ret = mkv_write_track_video(s, mkv, st, par, pb); if (ret < 0) return ret; - if (((tag = av_dict_get(st->metadata, "alpha_mode", NULL, 0)) && atoi(tag->value)) || - ((tag = av_dict_get( s->metadata, "alpha_mode", NULL, 0)) && atoi(tag->value)) || - (par->format == AV_PIX_FMT_YUVA420P)) { - put_ebml_uint(pb, MATROSKA_ID_VIDEOALPHAMODE, 1); - } - - // write DisplayWidth and DisplayHeight, they contain the size of - // a single source view and/or the display aspect ratio - if (st->sample_aspect_ratio.num) { - int64_t d_width = av_rescale(par->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den); - if (d_width > INT_MAX) { - av_log(s, AV_LOG_ERROR, "Overflow in display width\n"); - return AVERROR(EINVAL); - } - if (d_width != par->width || 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 { - AVRational display_aspect_ratio; - av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, - par->width * (int64_t)st->sample_aspect_ratio.num, - par->height * (int64_t)st->sample_aspect_ratio.den, - 1024 * 1024); - put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH, display_aspect_ratio.num); - put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, display_aspect_ratio.den); - put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_DAR); - } - } - } 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 (!IS_WEBM(mkv)) - put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN); - - if (par->codec_id == AV_CODEC_ID_RAWVIDEO) { - uint32_t color_space = av_le2ne32(par->codec_tag); - put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space)); - } - mkv_write_video_color(pb, st, par); - mkv_write_video_projection(s, pb, st); - - end_ebml_master(pb, subinfo); - if (!IS_WEBM(mkv)) mkv_write_dovi(s, pb, st);