From patchwork Fri Jan 21 19:01:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33744 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp743191iog; Fri, 21 Jan 2022 11:01:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJyPiHi5cwB2wSYuNsjPlVe1BHnvFCLpgFAftnofswPBMZhyGU9KSrZF8peysjBwUElSNEoa X-Received: by 2002:a17:907:62a3:: with SMTP id nd35mr2614299ejc.431.1642791705948; Fri, 21 Jan 2022 11:01:45 -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 c18si4346054edj.541.2022.01.21.11.01.45; Fri, 21 Jan 2022 11:01:45 -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="s/hybOML"; 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 EBCC268B18A; Fri, 21 Jan 2022 21:01:40 +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-am6eur05olkn2023.outbound.protection.outlook.com [40.92.91.23]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E8BDF68B0F0 for ; Fri, 21 Jan 2022 21:01:34 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Pm6zt9yD+B3hYlfLysUoMx3foASgf374wwunjE1pbkgqL5PeVX2vQNkWroenwMQkjwHs1TVaYfqp1VYoNYRqGvLZqWaPfgWV5Fr1DilteUp4NLI+R/Kty5G1Ruv3COIDgocA2dxYsEdMJhKiAW0ha7arIVwKOjgrTfBB/O7bObtkYqidnL2uogPgwMzaT5qCbNjbPteS2lubFzxrQd2FcVXgjhWLtxCE0l8KmOEVuZ465hMp+y4PsloE/776JD00axJ4H+0stHciRSOASz8SqL8JfOE4tOTBI9iCKufvApWEwZSuksw3avQTuQ40dnSyXPH67na/IZXt5td/d9CNiQ== 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=eW4E0Xsx2KWYoFkttSaQ4OadArhNvT96qwUvydgd0Hs=; b=joHbA1RGyFWFl9+Pfej8m3+oC4DumWl7DgrBy2tYUgBgjenJjXEh/7irmyaYrJwbv0NzArCCW7HJM6QIuxVne6U7SC3ceRPjtJsAuE2H1UQW0z3OLJtPs+wtH40q4YHH/cAODHUEif4sh4UH+3jdqsPQ/BjDjq3Kn42Axs/7/DWp2IewGvw6Abp8vTeRDAeXEnJHKhqT+fh0K48wOMgWSavvMqQWr80J8cSNSalsKcgfQdMygbWao345oL7uRAeP9vbS1JcM2DDXA2Z5zuxqdZpgiffZDh/9iXXdwqW0QKprjXpUnQwoUu1MynVM/RtpFGz4QcfEE2HhR8my6WGrRg== 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=eW4E0Xsx2KWYoFkttSaQ4OadArhNvT96qwUvydgd0Hs=; b=s/hybOMLp6jTUQgbgmvpj9BXjQ3Q2NShdn9zcD8rGVKOWxn4ZMOUEsXlaYOA+TzmExKodcKj4qViBJF61S3cbUKJWgJ6BdzLmtjz8QgRsQelpbLm8G5cKi8AXQGETZEc9TUN6+4Z5Swg0NDYd8l5h5vcqnlYWlzu1Iy4TFoKLprEAye41tSYIueylKfBOl7ouXPZe+WXVhC31xxHO9MpeZWznNvXj5ePM3FrMyuw0DskVd2KjX2g6Iz/zEGydKq7GlNuPfzRzwa85OkqFw0/SyvQFO+FGXxwTYzEQZoUkB/g4YnO41UXLz0yK53vYweJ9WVsYT0qGdUYZJkoPxz1Vw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM5PR03MB2996.eurprd03.prod.outlook.com (2603:10a6:206:18::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.10; Fri, 21 Jan 2022 19:01:32 +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.4909.008; Fri, 21 Jan 2022 19:01:31 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 21 Jan 2022 20:01:24 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 X-TMN: [uZJZpRQZcCbrScT8yePsGqZlUcDeUJzB] X-ClientProxiedBy: AM5PR1001CA0025.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:206:2::38) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220121190124.1590647-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4433d683-55e5-4fb2-86db-08d9dd106f79 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNWW/OkO5f2UCvA1VeLg3S0nSi07UDL5d8eBQC96mdW7VAGbJ3mnWb0YLcsyIcydlBjFc6jJzNux0GLdc34656QWJF3UzChcXTaaqMWv8E/qM/pKJLvDMrrRTl65Zk7YtucTFDIsVYe/5z1gdy8KVaVFgzc5LLcYn7T/RFqa+voYPGwJ0Iewwlvdl/CWdsWJYbtdLR5yor13xdeZsuwPTW80L68RnTux97OSUbGl2egkcAOgjmKxg1/96/El0rrKnmQ/HSOrr3lQ9YFpA2s+MwPJJTK6WdMie1Ci4mCSDMG0jTq5UtYVfAzhzdzTgUIfQqu+YF6vZm+ZqsQjUCtKPw1YaiLA2VlNzSLnWTLyslXxDmR60WrFuZw7LmFkK6m9d+K0yTdAyQbdI5GijW4ZyjL4a6ISUcMKWaJoH46QFaX6MdL9AwwsQSqkNOKKmf6OIVR8GDXv76w7zN5gVAB4PFN/tmWa80tmtuxFkFmv4RcMxZ5T6VkOdcIJDDJsm6hmP1whkNrruP3uKjuL+WkZqg9RHiGNMGJFzOquYiwLUq2U2fUJO7fa1b3lIA4DyvAZDxwc1NTNVZx5ZgA7K+h4ofKKK05+ErwIlVECJf4+knTKjTBRL7HM7N5AeAPxYSyh04ATfOkelz/c+0hFdGMsnZ0OSJ9EWLlJGbAUfmJP57ML4KsgF+S3rhv3pbH5iCQ+j4kw8e910oPrzac1kHNhBc0VO1Z1tEZCFcY= X-MS-TrafficTypeDiagnostic: AM5PR03MB2996:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Edn8YWC2YY7h5r/pWSnBpOg4SplulgvUYbQvgTCtEAP51I/fN38yKdAK9ZKzjax47H8cJg3x491NcoUUfZvR+rNulZOhPH/dfD7HmNezh95V9/+Y2tLj74Pkb+LbYMw9OPapuV278BvRGOoP679e/ZxsaP3pusgqAk4WdIA28Q4j/MgZ/ss8RDtphA4HTVxK0CEUzN1R7dwG1+a0xNBH+GsezRlrfbu2AoLVhj4MiINdb7WemniJ5Jto11UoyPy19oaxlABw7M/Hxxmh8yiAFhEtmVbc/dHBvXNkbTuhaoYXrkrfXAkzKevo9So9ASMlK88iUFR8VpifZnNs37rnbBMLnqCCMDKVPAoLsAiHU4SumumzYxmNY7bMGvMnBQwIW4duXyJ+1dk0Y8O/1r6wMd7b3G8UzGk43AyP7n61rWa2PTSspA70DkTmohcSPAFhPTScNMpr0xbptQcX3/CDkAS7tFfXe+LOvo0QAtV0R7jCA9xI7RfUnU+n2byq+5EwqO8Egqmrw4xlMhyotqoXObxkrJTZ28SBCg1T1wjyjVkAW736zp8SL1KJpONpeVJyKmfMvxsekWMacS3sG7DTLQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 7vZvSQE7nKA7+41V1ulfLCgajKyi3n7vh0EqJ8djh+N7gL/6hX8OqhPdgurGPLBQ43nnqCuhWXUx9T+tZR9nBShzfj5mNUg/l+cFwrBg0xfPDUaGig0jqQXvoplvIpBW1dnNfUYhkm6IqOXyA+Efws4idmyucT51QxpUieU4hxudQPH+s1JzDm96UEmvi4GS1hra+E2kL1Z7lOyLFXNnF8PehwmnudmIWOcz9emdFLQLgoMPA+5tknTTA5KycxFRtpnEZgrNoUmHlHizm5l6ZCHHfKkzIOk2SXoJn8fFzgd1wNLsUl+WhEdPUuE3YrRNxBSTV+cc5pSxKudRJaY72xlnkxzJIgOF1YY/48s2w45vapGFmvreYJ/RSKeSR8RxO0VzhwtqAYRtWKLJbZTm2aR7Qjubq5ktDwxUKMjgsQt38fX36Rzll9SncSIJ7b8ikAN0tqkMZRNIBeAQiSxm4ygaH6mCZxkz1JoMyM3YNqnxIptkcBgoav3EA7m9R3WbdIWLxXqije9LlHiVV6OkmblYEHjpewbjcIVyQzoWpjOhaMR2A6WUfbkvwF3cgN82y7Egy+AlMUQ3YnANQGmM63/+oUlM7fTVqlZiJdikncJxPuVdyinabcXs16TLnAbTgZ/A2UDQQ8R55WEKP9u4CQ1DLMMQwTMft/mh/aMcigIec67gzPk7KWm4IOdfM1s7JOWgI9d22PTBn7GPhXAvDUAbUpqwj/BtHwSgvzu6kxWWasmsH8VxYoCUAJEcSRxe+PpiAZYt5oV4RqkL7F1twWi2YfToP8fPYce86CpCG/rZDpnqaPElB775fd/jGebbaGojJ8zClOLXSYQRrQh9G/eY+QRz7iT9A3aUbCUyrsHRYIulPDqcpmrSQgMsDZvRslDTy4RgYESHgEY4Pwx6h1zcmm+15NH4NPMpt3ScIFv8GI/HAjtADF4iBS0c7c3QPV0/74v44YOsqObh6DWyvg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4433d683-55e5-4fb2-86db-08d9dd106f79 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jan 2022 19:01:31.8616 (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: AM5PR03MB2996 Subject: [FFmpeg-devel] [PATCH] avformat/matroskadec: Export rectangular projection as displaymatrix 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: vrD9qZ0/UQyT This is the officially supported way to express rotations and flips in Matroska. Signed-off-by: Andreas Rheinhardt --- No muxing support and tests for now; for the former, I first have to write a proper function that actually checks for whether a given display matrix is a rotation (even if not a proper rotation). The latter will be added together with muxing support. libavformat/matroskadec.c | 44 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 594543748d..d165f6ab90 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -37,6 +37,7 @@ #include "libavutil/base64.h" #include "libavutil/bprint.h" #include "libavutil/dict.h" +#include "libavutil/display.h" #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" #include "libavutil/lzo.h" @@ -2231,6 +2232,44 @@ static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) { return 0; } +static int mkv_create_display_matrix(AVStream *st, + const MatroskaTrackVideoProjection *proj, + void *logctx) +{ + double pitch = proj->pitch, yaw = proj->yaw, roll = proj->roll; + int32_t *matrix; + int hflip; + + if (pitch == 0.0 && yaw == 0.0 && roll == 0.0) + return 0; + + /* Note: The following constants are exactly representable + * as floating-point numbers. */ + if (pitch != 0.0 || (yaw != 0.0 && yaw != 180.0 && yaw != -180.0) || + isnan(roll)) { + av_log(logctx, AV_LOG_WARNING, "Ignoring non-2D rectangular " + "projection in stream %u (yaw %f, pitch %f, roll %f)\n", + st->index, yaw, pitch, roll); + return 0; + } + matrix = (int32_t*)av_stream_new_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, + 9 * sizeof(*matrix)); + if (!matrix) + return AVERROR(ENOMEM); + + hflip = yaw != 0.0; + /* ProjectionPoseRoll is in the counter-clockwise direction + * whereas av_display_rotation_set() expects its argument + * to be oriented clockwise, so we need to negate roll. + * Furthermore, if hflip is set, we need to negate it again + * to account for the fact that the Matroska specifications + * require the yaw rotation to be applied first. */ + av_display_rotation_set(matrix, roll * (2 * hflip - 1)); + av_display_matrix_flip(matrix, hflip, 0); + + return 0; +} + static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, void *logctx) { @@ -2249,6 +2288,8 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, } switch (track->video.projection.type) { + case MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR: + return mkv_create_display_matrix(st, mkv_projection, logctx); case MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR: if (track->video.projection.private.size == 20) { t = AV_RB32(priv_data + 4); @@ -2291,9 +2332,6 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, return AVERROR_INVALIDDATA; } break; - case MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR: - /* No Spherical metadata */ - return 0; default: av_log(logctx, AV_LOG_WARNING, "Unknown spherical metadata type %"PRIu64"\n",