From patchwork Sat Jul 2 22:21:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36596 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp1884114pzh; Sat, 2 Jul 2022 15:23:49 -0700 (PDT) X-Google-Smtp-Source: AGRyM1votluVqm54X0erHl3GSm+EcrAxBRI84OFZBDBmh2lb/Wh75KrjkARE4d/sZDtXZS0V3red X-Received: by 2002:a05:6402:d5c:b0:435:6e2f:245b with SMTP id ec28-20020a0564020d5c00b004356e2f245bmr28063848edb.145.1656800629757; Sat, 02 Jul 2022 15:23:49 -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 s15-20020a170906bc4f00b00722f0145649si28422440ejv.646.2022.07.02.15.23.48; Sat, 02 Jul 2022 15:23:49 -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=Svb63n1x; 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 87A5368B99A; Sun, 3 Jul 2022 01:22:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073040.outbound.protection.outlook.com [40.92.73.40]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 67D4768B95F for ; Sun, 3 Jul 2022 01:22:38 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LLcXL6XGoXWIFt8+b5V+luB7bXimBNM1gj78IlxwT19caWt2pHMTqTuO5qnA3zigsHYHLMoDj1K4sllt+v9HcGhhnNiQLikImc00rF9LsG1hGCxgpkFLWZJ605WAUTROm9iHRy3bo4pm5A+voNaUMIw3FShiDNq+oFO/i8p9bOFPGjSqxprZaZXTC9jjHZrjPT2ld7zwdgioagCqp7LiapLP44Q24Q1Uvggis/vYTz25dfIx2eKG99AGGkuc6lWjswk1Q6xPrJUIbH727EEBNqmD/yH33nYzehIQCWlQAibgZ6gNOE5HH6poqVjoZ/5C12KuZxvpEojddN+te7JeXw== 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=yQeNt5ijZMx/uXiOOyhrmePUdJBPitnP/QeE3pfMJ5E=; b=T2Uk6PXpMO4Ccv6USx8wkyTtAMLAXSrdh7Ah2oWECTMG3fTocVxu+EAyMwa1Ih/jNi9YJYEULsoGkFF2LxMrrrr4gTmZvjJxQFs8p6DYnTN7j4t2UfnHZltxoSPywpJp7Oqxw9/mEuksSW4x/p6141gpqZa6PGTp7uHncv7adXJ1fdqnUJHYzLcDGdPc66e32Eb04VaGtN/uLDq6qehzMRnXddLyQzMuAu71aO+Uapzm4VZlNEiVtYTYM0akTbcblXn1Z0m0kLzqLv3kCmBJ7qQjgQm1fFI6KEP9Ij9VUFOvBWWdoabEbylswsgSEEGaCXUKC6Qa+vh9m5njmUv4YQ== 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=yQeNt5ijZMx/uXiOOyhrmePUdJBPitnP/QeE3pfMJ5E=; b=Svb63n1x86gD2hiBMNk96GqVhAZpLBFf1f+ZevWsafhLNcahDOD1e/ywoAkIhx8M63CvRKHVXw0Or7S11YHWijx2gZJD1SjR6ERv35tT9cAdEEO0CWCkKeJ8CyL/3DkXIuEcsBioBMQjg9DjOhXRQEM7I3nN6KUYhV2lGmpBd/OdgD4RTdNYqLftmJYPQhHlolS18XVe6Oy2pPOnRdbW7z6PThks9bMHtOJwC/VSf4P3c7xVXwoGfStMLgorTMn8TU7NZIR/klolOpDGQGfD6nHGo5+uRLleD95q44ur9us02Ng+T4xDregTpmwOW4uiCco6iyO20pSYPefpdut6kg== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by VI1PR01MB4240.eurprd01.prod.exchangelabs.com (2603:10a6:803:6e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.14; Sat, 2 Jul 2022 22:22:32 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5395.018; Sat, 2 Jul 2022 22:22:32 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 Jul 2022 00:21:52 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [PICWujEvHzdyeoX674uT0pjIc6XhnsYp] X-ClientProxiedBy: FR3P281CA0089.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::18) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220702222200.169681-11-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2d8bc59b-41b9-46e2-10dd-08da5c795b79 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNXwBRntoGkOsgo00FNZK4OlaxYTvC7Pn2Zy2rM069wV1SEgCic3Imda5/D/GAbUpw/YJ15oWbC9B3bThPg2Y5g1DNxopQ5N6hcmm8bCODjdDCnG1FYYoKxpyloBz6QCDwmWsi8V9c4uay2B7pzRdu5xYmLDPyZtC6r4ggpRsiZPxpBq2gkk4ItEQAd+Uok+vEWwgBQiov4tOcRNBbpqdcPtFZjjArRD8hoa4TClXldZ9WxKYsJ6B3iB+rTob08WpFHZHpQ2K5lXiKSUWmQYOuWpc1sJNZPHQMcXpbSeAS1oRbBIZ37ZyXEr/xpzZkX2+JFEIF6pdB096KJELRGGTfPyB+o6iaSdj8+YDOB3ZRbLiDfkrsQmPtK4E3EKaivLdhbI8VI6Y14LdxK0bbYRIl1IhE3IYOuBfT4q9hSglwNjjUf/G/2EoxziPQxYZT3Ge9T1RJO3tBpbRSAY4iubiAX7a+EehCO+EPv2a2G/ZwdKqTG9DptV95QRCEJ3Wi7youzFYM8NY69yt9Xcr1pEYr7sGoKIHU71AfVpe1cx9//atKItiZLRgB44wiI4sJ9t4wb7yD+FKhuuI4vQrBbNAOOgfTc5vW9xmpX2Ot30MawIEVX2gHfCG78nTLSovtkfR5emi5xOt+oUrBDqvqzJ7qEMabyBVQ00xm6vGhXBkI53EUnVXZa3E00T0z5noefk2UvPQuehr2OseXrKWKlOrK1VJTR3C0w2ze8= X-MS-TrafficTypeDiagnostic: VI1PR01MB4240:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /60iWiiN7tkkE1RZGraguFRRdA7H6BBI6323vMt3Tk7McpACxtSh8Rz0Amx+9T/P5KCyBnrl91wflMF3EdRWAHsacXkrYGz+rIAsYyr/IVlNKhXsdfku4w1va7reUM3s40mt4K1zR7DDpZ9GdhFIF+2O0JR/YiDwP3Gp94hPv9Fu8IoEU0GJW5QngVWUuMm5UN3iS9lBzaV+4W/i8dxMutXbmmDLgxnXLLdfuBQM75pgDb4ZtDZEREbjcfaUsCd5VvI+m3t8lFsuhZqPv3ltbcYfgohaebooIj7YLVvHoPWanycla6WyOYyeBhcv1Jo5SPu1dvB0ybxFSSqf0QO/MDFpzdzHiVdQCyFAnF8dnmTkJ+b0sS+FTDVcyqckdnuizUXN5N3AP/s1oZY0ZSjnUp1ZfIUSwn7wKIB2nGmpmuQTBajAUAn7AmN5Jw4SGZrKqcKrTjHszdYn+Zf8uXQMxwft5ysd3gbru1nwQf8GPjgPrfegtGjLM9dNx9Y/+YHltRoerH+FViPMI7qOH3fZQXsMB8Dys3Nv4c37PSJ55i5oIX8ZoJb2KTD9D364Tb4t/LZqLUVNFfck2NByBl/0JJQprcRpTQIf7iVPm4eyQVHKjN25nQ22sdc4u2hxhvANfArjNZ6wdy8JVr30+hNOVA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cfbdB8zU4ATjA9R3rzfE/fWpph3IAxZcFsu9WKT3QLXbJ7TxsXuAon7rJOLFx820gldUHxToK0qgfFmk3CXdLzg1Ysciw/aWoKcs+M3tYgXM5rmHBcOUN/yXAERRoocARYXXQ6r4WnG615Aitn+DCgC/iWMv2HVcbsfW8/b/44fbqzInmpoNJtudpuuV4ObZ1WUIKJLoD7HopTCUhU3Qkn0v04yXu2Q2cw9hOdER+5RM6B3qvxQuvJEPn822SvllZr5+Lwq1BfVbrTMC0ULk2NfSR6p3IyWhT3q5Vhm0tXxEVzQXkM8yu2qvYkXB86rf7NVjzYwhwBVJCCHFPCDXgWj5LmW6LXEcs00WCJc730S7oS/IXbMiKynOvsc0Ubue3nTzWxdgjwxUlvB5GB7KcC0wbFi/BIYkZKrT9Ucd0TkbdNyiEjDAkoKFzJhgNtz57PB+FPJ3i2YBh4F599lqDQdBWmUtq8GPeJwA3PF99JLPj/i1FVwDHlfLaprkBH1OzKkMvY1I/BjSEMm6EbVuP0uFtAOi0T6BQeMh3cRUiXctqR9v7jgZU1C4D5ACPb03q9m4clepeY1KMYzPAXbU0E84d+Jy2esoKy3B4JHsqsyD2ICnaBcNg18qwfYnZrzuhFW6GAzUbvzoQKfY6EmlsiyUvSbmEfwU7jcAgOqTZsnlhYqwSKNAlugNnqGqg/4Y+BisxQ11PalO7ETt4OJaaugww/57JnHRvx71xX5Ja1Jr83UzKUOV9E+lpAXt4Ntxd3P8eSl0a9aPGXXDEPDjp6V1IZoHG33jKc7RT04Mbnx2Ja9uJil0ZAhNZxAhz7bDvMCssoB8PwZLgr/eDMZsn8BDJ8pYPYp0mS+GWhxrCkfVe62/RCjRi8WrMsc8uvQAws8hlPFsAGUHvx/Cte2PTnKwGii83E2gub1jJjyHOR0QMrTDkQ7lD89oxxvVgE45EwIkpMdt9Aigd1Jfeq76DRMd5LlY1t0qCVifgyK9FMD8Zo1xGL1alFO+apluUjQssu4OQe5P1fvtOtkmt7ny0bpi+ZVVs8k+fkydYrPzuDWBh+7pA4CAvuYnV373uKJSnLrB+/731f+iHpZJLovxJE//YIWpLOJ8Fw9Y+qmJ+GHUpjiwRiG+RAb3/MJ/vrs4rVcu4qAkgLJqqUBPenWiNbOaFiC62hMPoZFZLo8RUQ8r13RNf6WNxB/5gIhMqE1ur56TWhcqKkPy0FBlXxDMzr1Cl797EeR2cbArcZV0TX9KzJA6/iW4gk7cAXijhvHAnwyxaPXQLJy5G1GeapQo6LMFsF7CviidrCzKj88YLnQ= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2d8bc59b-41b9-46e2-10dd-08da5c795b79 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jul 2022 22:22:32.4654 (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: VI1PR01MB4240 Subject: [FFmpeg-devel] [PATCH 12/20] avcodec/h2645_sei: Attach AVStereo3D side data generically 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: 3C+KWY9erWyb There are only slight differences between H.264 and HEVC for this side data, so it makes sense to share the code. Signed-off-by: Andreas Rheinhardt --- libavcodec/h2645_sei.c | 64 +++++++++++++++++++++++++++++++++++++++++ libavcodec/h264_slice.c | 47 ------------------------------ libavcodec/hevcdec.c | 36 ----------------------- 3 files changed, 64 insertions(+), 83 deletions(-) diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c index 6c7a6ea291..3575846f9a 100644 --- a/libavcodec/h2645_sei.c +++ b/libavcodec/h2645_sei.c @@ -28,6 +28,7 @@ #include "libavutil/display.h" #include "libavutil/film_grain_params.h" #include "libavutil/pixdesc.h" +#include "libavutil/stereo3d.h" #include "atsc_a53.h" #include "avcodec.h" @@ -419,10 +420,73 @@ int ff_h2645_sei_ctx_replace(H2645SEI *dst, const H2645SEI *src) return 0; } +static int is_frame_packing_type_valid(SEIFpaType type, enum AVCodecID codec_id) +{ + if (IS_H264(codec_id)) + return type <= SEI_FPA_H264_TYPE_2D && + type >= SEI_FPA_H264_TYPE_CHECKERBOARD; + else + return type <= SEI_FPA_TYPE_INTERLEAVE_TEMPORAL && + type >= SEI_FPA_TYPE_SIDE_BY_SIDE; +} + int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx) { + H2645SEIFramePacking *fp = &sei->frame_packing; + + if (fp->present && + is_frame_packing_type_valid(fp->arrangement_type, codec_id) && + fp->content_interpretation_type > 0 && + fp->content_interpretation_type < 3) { + AVStereo3D *stereo = av_stereo3d_create_side_data(frame); + + if (!stereo) + return AVERROR(ENOMEM); + + switch (fp->arrangement_type) { +#if CONFIG_H264_SEI + case SEI_FPA_H264_TYPE_CHECKERBOARD: + stereo->type = AV_STEREO3D_CHECKERBOARD; + break; + case SEI_FPA_H264_TYPE_INTERLEAVE_COLUMN: + stereo->type = AV_STEREO3D_COLUMNS; + break; + case SEI_FPA_H264_TYPE_INTERLEAVE_ROW: + stereo->type = AV_STEREO3D_LINES; + break; +#endif + case SEI_FPA_TYPE_SIDE_BY_SIDE: + if (fp->quincunx_sampling_flag) + stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX; + else + stereo->type = AV_STEREO3D_SIDEBYSIDE; + break; + case SEI_FPA_TYPE_TOP_BOTTOM: + stereo->type = AV_STEREO3D_TOPBOTTOM; + break; + case SEI_FPA_TYPE_INTERLEAVE_TEMPORAL: + stereo->type = AV_STEREO3D_FRAMESEQUENCE; + break; +#if CONFIG_H264_SEI + case SEI_FPA_H264_TYPE_2D: + stereo->type = AV_STEREO3D_2D; + break; +#endif + } + + if (fp->content_interpretation_type == 2) + stereo->flags = AV_STEREO3D_FLAG_INVERT; + + if (fp->arrangement_type == SEI_FPA_TYPE_INTERLEAVE_TEMPORAL) { + if (fp->current_frame_is_frame0_flag) + stereo->view = AV_STEREO3D_VIEW_LEFT; + else + stereo->view = AV_STEREO3D_VIEW_RIGHT; + } + } + if (sei->display_orientation.present && (sei->display_orientation.anticlockwise_rotation || sei->display_orientation.hflip || diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index cd9f9bfa27..cc8bec8d9b 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -31,7 +31,6 @@ #include "libavutil/display.h" #include "libavutil/film_grain_params.h" #include "libavutil/pixdesc.h" -#include "libavutil/stereo3d.h" #include "libavutil/timecode.h" #include "internal.h" #include "cabac.h" @@ -1226,52 +1225,6 @@ static int h264_export_frame_props(H264Context *h) } } - if (h->sei.common.frame_packing.present && - h->sei.common.frame_packing.arrangement_type <= 6 && - h->sei.common.frame_packing.content_interpretation_type > 0 && - h->sei.common.frame_packing.content_interpretation_type < 3) { - H2645SEIFramePacking *fp = &h->sei.common.frame_packing; - AVStereo3D *stereo = av_stereo3d_create_side_data(out); - if (stereo) { - switch (fp->arrangement_type) { - case SEI_FPA_H264_TYPE_CHECKERBOARD: - stereo->type = AV_STEREO3D_CHECKERBOARD; - break; - case SEI_FPA_H264_TYPE_INTERLEAVE_COLUMN: - stereo->type = AV_STEREO3D_COLUMNS; - break; - case SEI_FPA_H264_TYPE_INTERLEAVE_ROW: - stereo->type = AV_STEREO3D_LINES; - break; - case SEI_FPA_TYPE_SIDE_BY_SIDE: - if (fp->quincunx_sampling_flag) - stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX; - else - stereo->type = AV_STEREO3D_SIDEBYSIDE; - break; - case SEI_FPA_TYPE_TOP_BOTTOM: - stereo->type = AV_STEREO3D_TOPBOTTOM; - break; - case SEI_FPA_TYPE_INTERLEAVE_TEMPORAL: - stereo->type = AV_STEREO3D_FRAMESEQUENCE; - break; - case SEI_FPA_H264_TYPE_2D: - stereo->type = AV_STEREO3D_2D; - break; - } - - if (fp->content_interpretation_type == 2) - stereo->flags = AV_STEREO3D_FLAG_INVERT; - - if (fp->arrangement_type == SEI_FPA_TYPE_INTERLEAVE_TEMPORAL) { - if (fp->current_frame_is_frame0_flag) - stereo->view = AV_STEREO3D_VIEW_LEFT; - else - stereo->view = AV_STEREO3D_VIEW_RIGHT; - } - } - } - if (h->sei.common.afd.present) { AVFrameSideData *sd = av_frame_new_side_data(out, AV_FRAME_DATA_AFD, sizeof(uint8_t)); diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 465015069c..fdb8de5b15 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -34,7 +34,6 @@ #include "libavutil/md5.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" -#include "libavutil/stereo3d.h" #include "libavutil/timecode.h" #include "bswapdsp.h" @@ -2731,41 +2730,6 @@ static int set_side_data(HEVCContext *s) AVFrame *out = s->ref->frame; int ret; - if (s->sei.common.frame_packing.present && - s->sei.common.frame_packing.arrangement_type >= 3 && - s->sei.common.frame_packing.arrangement_type <= 5 && - s->sei.common.frame_packing.content_interpretation_type > 0 && - s->sei.common.frame_packing.content_interpretation_type < 3) { - AVStereo3D *stereo = av_stereo3d_create_side_data(out); - if (!stereo) - return AVERROR(ENOMEM); - - switch (s->sei.common.frame_packing.arrangement_type) { - case 3: - if (s->sei.common.frame_packing.quincunx_sampling_flag) - stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX; - else - stereo->type = AV_STEREO3D_SIDEBYSIDE; - break; - case 4: - stereo->type = AV_STEREO3D_TOPBOTTOM; - break; - case 5: - stereo->type = AV_STEREO3D_FRAMESEQUENCE; - break; - } - - if (s->sei.common.frame_packing.content_interpretation_type == 2) - stereo->flags = AV_STEREO3D_FLAG_INVERT; - - if (s->sei.common.frame_packing.arrangement_type == 5) { - if (s->sei.common.frame_packing.current_frame_is_frame0_flag) - stereo->view = AV_STEREO3D_VIEW_LEFT; - else - stereo->view = AV_STEREO3D_VIEW_RIGHT; - } - } - // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1 // so the side data persists for the entire coded video sequence. if (s->sei.mastering_display.present > 0 &&