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 91A5D46CF3 for ; Wed, 9 Aug 2023 09:25:10 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E02C368C6E2; Wed, 9 Aug 2023 12:25:06 +0300 (EEST) Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02olkn2058.outbound.protection.outlook.com [40.92.49.58]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4521E68C5F9 for ; Wed, 9 Aug 2023 12:25:00 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KQf8rzZ4BHk2wNdntzF7zNk2J1u0APVGppDGWI6jLbclrzf2E/vmMtBMHSojDUpUwyE1YOwDcQuTlgN8U8hU6hZCRiFDO9rJpgi7dT+ZGkNYFjzVZpW+gOcP4MBlMZJKqzaSQQrmN/qCqA+qlO/z9brIaT33JjGOXL4T6nYH3TDR/ZyNU7TS55e+28MnGmXJfcrn6Q4dyrVeTULRuWhWWHhaX7cEBUOvbJVDmHFCwwRBZ9sIHcwRtK/1rrsab2ChwE/GOzNwbP0d01RvsRVKpMd4ih1c3T3idciBWqXPPb6JNA1B50FckUotfHkIIJtmvGlYm7CJPOYfUDweMvfs2g== 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=C2eW7twczrdbNtslWHFkYmJhTqNaOcxc4lORLjbv+ZE=; b=IGDOIbc3q+kWvaJRZA1siljh2Nw1gs+rJykr2BOE/q+RSDC4SNgyCQD1SY6OIW7Nl4RuKzd7cE6/AHv9Mz20RzDMfzwv0V5PwuUblLzFKEUh1P+FbvUIVpto2L8s/u5AhCbggE30WU5dqvepaylCVBFobuOwZGSX2RnPialsal4/p/fgbvrH0db1XOWgKNYqHcgo4zofptQoYSwi3BmfZXAMNQ6DJMkc5st7jqNpQgUo5VROpKIprTWFynosejwCgHymPBKeQUDjHMvlsI8eqrUUWAuy6PoWAIIKbukPApnkXcEmyB+eZZPGitUS1OZpjyoR0Q24y89LLfUM5LW6+Q== 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=C2eW7twczrdbNtslWHFkYmJhTqNaOcxc4lORLjbv+ZE=; b=jzG0pi7FsqvEc1bJEHm6AqSeWe5T3Jj6pfB26L40ezCLmurQo3gJFPAOuL4+ksbTLDpk7YEu8z2NFkShqjDXfognrSQCxhMROywjK7ptUqsf902qQIzVmr4JJS/4rdf4KCAya/yoSpdix9LXLfi25/7qvliwzaLH1Oe54kPOrGkU4snMNVuA/e7Q7/ZGAg4USY+ClUJzVuTPdDHyzfluQEaEhlocPh2W79qbccSfEIhp36dSNmSr9Wr7vI1SK9Clo9KUT5TEeIucB7ZnF+EPZKr+tNoo1vFMPQei30kFPXX2ErtKZ+cCEK4j9yTWjb7sb6+LFYAgfs542Nzt8gbtiw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU2P250MB0176.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:275::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.28; Wed, 9 Aug 2023 09:24:58 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6652.021; Wed, 9 Aug 2023 09:24:58 +0000 Message-ID: Date: Wed, 9 Aug 2023 11:26:11 +0200 To: ffmpeg-devel@ffmpeg.org References: Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: X-TMN: [cxT1kT66H9Aupo5tGyFQpJsluvRoywI8SrZQymXQ9b8=] X-ClientProxiedBy: FR3P281CA0180.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a0::13) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <01b1f283-a4e8-cbaa-bc36-67e3583823e7@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DU2P250MB0176:EE_ X-MS-Office365-Filtering-Correlation-Id: 2e5497dd-8d8f-4ee0-763f-08db98ba801a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yceXXPJbgAEJs3XH8/2hXYp+Q70Hk5H20b2UvYHjoE/iaRhRZ8dY4dgW8VKIVugCPNwG5Xi3a1KJD1DxIIVIIbGjjEkN88to+FYZCHxsseyPl/RLESS0wQYaxopNZXHKrjeDzqZOP6q5ZVYordHvM3f5uQswZMMeJq8DJjg8usZaZx4XevMPLYvgV9MIdnMrgYh1C4cOOJHZR8navJnnpWyKEwaP3y9Wx0/m9G1k53XQLV/6QFBXKoPjLgFEg/dWa1N3psFtHqly8XfjgJ4l9qEmVexaZLNsjDVJvWqN8srUjSmQrr9ig3fw5HSV/2N1+yMSfaIIllYfkKzOxFEshx7Dxx9Pxt0G643MGZei2nsFSkloXGtfnYumGb2YTTDNIYWWJ8YJy6h71S08F8aqOwdYFOUMJi9+dLZ5v1dGQnjaTb+4q3E7DfctjwXJ7atVbHoFCif2QIQEq2ymRiF+mHRqUYq5qZEtEbD8E+BOnO232ZbAWeJhs3AeQc3C/tV36EIM+pRnfdmK0ftIL3KLK2zZnsAdBhbsawu1Laa4R0qmvtUsCVo/u7+lwzpJcDTO X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UWlqRDFaWWNxSzFQRFhTMkdPYldNWUdBODhRKzhqWXQ2cDBtVnhQSEM5Y3Bp?= =?utf-8?B?UlFVN0Y4VzVpOXVVa0RDU2V0V0NjcEhIV2J0YlgyT3RUUysvdXJKK2ZEOWtq?= =?utf-8?B?aVZEL3UwN0JzNG9LVG1BV3p6MDV5d0pSK2tDUytXVWluMEtJQSszY0g1aHBK?= =?utf-8?B?d0NhcXdKREpMT1NCTHRpZ3RscDBsTldlQWVHZ29wdHFBUjBoU0dqbVdDakVx?= =?utf-8?B?RldhRGQ1b2NjalVsdWxVUDNPQWZqNzJ6SzkzMFVsN1RQQUZNWjRjcnJMcy9L?= =?utf-8?B?SnVEdmF5UGIvSzZyNTRra0xjRThhVHlTc0VIRVVkd1Noa1k4b2tHbm5XcFB5?= =?utf-8?B?b202cUJIUnYza012cGRQUEJlVlJoMWhXeXNFVU1rYjJFdURGYnJ5MWU1MVBY?= =?utf-8?B?a24zakJuTWp0Uk5ua1grUVRHZ0c5d2k4WEVCK1hEbHAvTnlFT0h2aE1JbHVp?= =?utf-8?B?dGN2TG9OQVlvS25rd3ZiNlhyVjVCcWRzK2NsSStJZTZDNkZXOFpQMnptdGZ6?= =?utf-8?B?OFUxdXArWitKcmVEMG5wTnE0QVdHSDJ2S29yS0ZNKy85aEFzc2JtbnBtRTlR?= =?utf-8?B?K3Q5UWM1QU8yZVllWmFZdUh1UWIyMS82M2cwVUZvZjN2Z2lMS09UNHpxZldE?= =?utf-8?B?aDFhdWMyMnMwWDQzZmxDZHFiNTJZeFhTWlBlQWRZQlN6SHM3YjRQczlab0lt?= =?utf-8?B?MVkyT3R5R25JZWoxNkhzYVJBOWpuUzlJbDR0ZEFia0x4S2YyMDNlbFNGT216?= =?utf-8?B?Q1ZxbU9wWGNiUzFMZ0lKdTQwK1Q0Tmo1dXEvNURjSEFPWE1ld0ovZi9FV0NJ?= =?utf-8?B?TWk4MGdWNFAyN3FBdWs5RWJ4NWJnTzBYdGMvcGFZYU9sWjhFWXNrekJOUlJI?= =?utf-8?B?Z1dZVC81SXQ1TFkzRndQUVBtRDBUYUZMZVlOVjJlblRZdEVqNkhqdEU3MG5q?= =?utf-8?B?RkdQck9SOXBPMEgrRFRUVlNpOEh2c1ZaeVMwemRsLzVmNUhwenN2a3ZnWHQw?= =?utf-8?B?Zm5Da01RMUM4Slh3S05uYnZzQjVsOGNPZGtpSHlDTWI2eEIrUzZlMmhDdm85?= =?utf-8?B?WlphQ0pKaTlhY2RKUTBBR2J5MVlhTFg0QTMyaVB4K0tOMTZCcmpTbzB0ZEdj?= =?utf-8?B?L2xNckdlMFBzRllaeUdxMHE2OUZyRUR6YU5UVm0yMXpLdHpVdHgvWHErSVV6?= =?utf-8?B?cFRuN3g2TTNhaHloY0VvZnVpY2YrQ3JaNmFVTHVjNVU5SGFOem9KY1graWow?= =?utf-8?B?QjdodnNJbHNpNUdNSnZJemkxSjNVZmpuT0U0ZnJOMEpxYUtLSGNUUXk1eGp2?= =?utf-8?B?MEVvZEREWGlIMitocElwSm12UnBLUlRQak44aXBpZFBiTVU3RGZYTkt3VGtz?= =?utf-8?B?b1dHZFR4RGhEbjZkTWI2dGUyUTRYRWpyK3pROG5YQ2IxTm9EckhLSFZTRlRy?= =?utf-8?B?emd6TTB6U1FkY25kM21oNGQzY0RUdllDWFlrMnovSHZ5akZsYjZMK3c0RTgx?= =?utf-8?B?bHI1Q3ltckhhUyt0bk5ZYmhjQ0plSnZpa2diM2gydWZBdDVpdjZTN1N6Rkg0?= =?utf-8?B?L1lyRytBYWkwOFhZQlQrZmlJOTdjSUh3bE8zUnVLSmI1bmg1dy9xcmVhRU0z?= =?utf-8?B?b0tDM0R4VjFBZHRzYjhFSktGaUg3d2xkTlNDblZ0dUJ1VTNkYkRzV3FITWJB?= =?utf-8?Q?o0AEbWK+xyxFVEfo8pMs?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2e5497dd-8d8f-4ee0-763f-08db98ba801a X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2023 09:24:58.5993 (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: DU2P250MB0176 Subject: Re: [FFmpeg-devel] [PATCH 1/5] avformat/matroskaenc: Support rotations 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 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: Andreas Rheinhardt: > Matroska supports orthogonal transformations (both pure rotations > as well as reflections) via its 3D-projection elements, namely > ProjectionPoseYaw (for a horizontal reflection) as well as > ProjectionPoseRoll (for rotations). This commit adds support > for this. > > Support for this in the demuxer has been added in > 937bb6bbc1e8654633737e69e403e95a37113058 and > the sample used in the matroska-dovi-write-config8 FATE-test > includes a displaymatrix indicating a rotation which is now > properly written and read, thereby providing coverage for > the relevant code in the muxer as well as the demuxer. > > Signed-off-by: Andreas Rheinhardt > --- > Honestly, I am not really sure how to handle the floating-point > inaccuracies here (in atan2). > > libavformat/matroskaenc.c | 100 +++++++++++++++++---- > tests/ref/fate/matroska-dovi-write-config8 | 13 ++- > 2 files changed, 94 insertions(+), 19 deletions(-) > > diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c > index 41e13b273d..c1f40b26e6 100644 > --- a/libavformat/matroskaenc.c > +++ b/libavformat/matroskaenc.c > @@ -1403,25 +1403,75 @@ static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st, > } > > #define MAX_VIDEO_PROJECTION_ELEMS 6 > -static void mkv_write_video_projection(AVFormatContext *s, EbmlWriter *writer, > - const AVStream *st, uint8_t private[]) > +static void mkv_handle_rotation(void *logctx, const AVStream *st, > + double *yaw, double *roll) > +{ > + const int32_t *matrix = > + (const int32_t*)av_stream_get_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, NULL); > + > + if (!matrix) > + return; > + > + /* Check whether this is an affine transformation */ > + if (matrix[2] || matrix[5]) > + goto ignore; > + > + /* This together with the checks below test whether > + * the upper-left 2x2 matrix is nonsingular. */ > + if (!matrix[0] && !matrix[1]) > + goto ignore; > + > + /* We ignore the translation part of the matrix (matrix[6] and matrix[7]) > + * as well as any scaling, i.e. we only look at the upper left 2x2 matrix. > + * We only accept matrices that are an exact multiple of an orthogonal one. > + * Apart from the multiple, every such matrix can be obtained by > + * potentially flipping in the x-direction (corresponding to yaw = 180) > + * followed by a rotation of (say) an angle phi in the counterclockwise > + * direction. The upper-left 2x2 matrix then looks like this: > + * | (+/-)cos(phi) (-/+)sin(phi) | > + * scale * | | > + * | sin(phi) cos(phi) | > + * The first set of signs in the first row apply in case of no flipping, > + * the second set applies in case of flipping. */ > + > + /* The casts to int64_t are needed because -INT32_MIN doesn't fit > + * in an int32_t. */ > + if (matrix[0] == matrix[4] && -(int64_t)matrix[1] == matrix[3]) { > + /* No flipping case */ > + *yaw = 0; > + } else if (-(int64_t)matrix[0] == matrix[4] && matrix[1] == matrix[3]) { > + /* Horizontal flip */ > + *yaw = 180; > + } else { > +ignore: > + av_log(logctx, AV_LOG_INFO, "Ignoring display matrix indicating " > + "non-orthogonal transformation.\n"); > + return; > + } > + *roll = 180 / M_PI * atan2(matrix[3], matrix[4]); > + > + /* We do not write a ProjectionType element indicating "rectangular", > + * because this is the default value. */ > +} > + > +static int mkv_handle_spherical(void *logctx, EbmlWriter *writer, > + const AVStream *st, uint8_t private[], > + double *yaw, double *pitch, double *roll) > { > const AVSphericalMapping *spherical = > (const AVSphericalMapping *)av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL, > NULL); > > if (!spherical) > - return; > + return 0; > > if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR && > spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE && > spherical->projection != AV_SPHERICAL_CUBEMAP) { > - av_log(s, AV_LOG_WARNING, "Unknown projection type\n"); > - return; > + av_log(logctx, AV_LOG_WARNING, "Unknown projection type\n"); > + return 0; > } > > - ebml_writer_open_master(writer, MATROSKA_ID_VIDEOPROJECTION); > - > switch (spherical->projection) { > case AV_SPHERICAL_EQUIRECTANGULAR: > case AV_SPHERICAL_EQUIRECTANGULAR_TILE: > @@ -1455,17 +1505,33 @@ static void mkv_write_video_projection(AVFormatContext *s, EbmlWriter *writer, > av_assert0(0); > } > > - if (spherical->yaw) > - ebml_writer_add_float(writer, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, > - (double) spherical->yaw / (1 << 16)); > - if (spherical->pitch) > - ebml_writer_add_float(writer, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, > - (double) spherical->pitch / (1 << 16)); > - if (spherical->roll) > - ebml_writer_add_float(writer, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, > - (double) spherical->roll / (1 << 16)); > + *yaw = (double) spherical->yaw / (1 << 16); > + *pitch = (double) spherical->pitch / (1 << 16); > + *roll = (double) spherical->roll / (1 << 16); > > - ebml_writer_close_master(writer); > + return 1; /* Projection included */ > +} > + > +static void mkv_write_video_projection(void *logctx, EbmlWriter *wr, > + const AVStream *st, uint8_t private[]) > +{ > + double yaw = 0, pitch = 0, roll = 0; > + int ret; > + > + ebml_writer_open_master(wr, MATROSKA_ID_VIDEOPROJECTION); > + > + ret = mkv_handle_spherical(logctx, wr, st, private, &yaw, &pitch, &roll); > + if (!ret) > + mkv_handle_rotation(logctx, st, &yaw, &roll); > + > + if (yaw) > + ebml_writer_add_float(wr, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, yaw); > + if (pitch) > + ebml_writer_add_float(wr, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, pitch); > + if (roll) > + ebml_writer_add_float(wr, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, roll); > + > + ebml_writer_close_or_discard_master(wr); > } > > #define MAX_FIELD_ORDER_ELEMS 2 > diff --git a/tests/ref/fate/matroska-dovi-write-config8 b/tests/ref/fate/matroska-dovi-write-config8 > index bb22563eee..58eb454865 100644 > --- a/tests/ref/fate/matroska-dovi-write-config8 > +++ b/tests/ref/fate/matroska-dovi-write-config8 > @@ -1,5 +1,5 @@ > -09ff3c0a038eec0cdf4773929b24f41a *tests/data/fate/matroska-dovi-write-config8.matroska > -3600606 tests/data/fate/matroska-dovi-write-config8.matroska > +80d2b23a6f27ab28b02a907b37b9649c *tests/data/fate/matroska-dovi-write-config8.matroska > +3600620 tests/data/fate/matroska-dovi-write-config8.matroska > #extradata 0: 551, 0xa18acf66 > #extradata 1: 2, 0x00340022 > #tb 0: 1/1000 > @@ -46,6 +46,15 @@ > 1, 395, 395, 23, 439, 0x7d85e4c9 > [STREAM] > [SIDE_DATA] > +side_data_type=Display Matrix > +displaymatrix= > +00000000: 0 65536 0 > +00000001: -65536 0 0 > +00000002: 0 0 1073741824 > + > +rotation=-90 > +[/SIDE_DATA] > +[SIDE_DATA] > side_data_type=DOVI configuration record > dv_version_major=1 > dv_version_minor=0 Will apply patches 1-5 of this patchset tomorrow unless there are objections. Notice that I slightly modified the test added in 3/5 to now also set a creation_time metadata to test a previously untested codepath. - Andreas _______________________________________________ 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".