From patchwork Sat Jun 22 20:11:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 50088 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp1220713vqz; Sat, 22 Jun 2024 13:11:50 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWPuXRgVUIpGLqCP5+hpMi/sQtSy6nxzPBPSG2WBuOjSEdPNrxpuRzOEJ5umdZtcnqtgVmJ1ZXNGxTeD7dL9qiPaUz4hO9xuz9C2A== X-Google-Smtp-Source: AGHT+IHvlvhgLF/23yqK/Wbum/rQ7HZqz7ogw65FH2a40uyj1JmERR1znIcGs76bf+UAikIkBYc6 X-Received: by 2002:a05:6000:4028:b0:366:e66b:7d12 with SMTP id ffacd0b85a97d-366e66b7f48mr1338522f8f.4.1719087109851; Sat, 22 Jun 2024 13:11:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1719087109; cv=none; d=google.com; s=arc-20160816; b=Mb1pGO5YUQDZPacR/yIz3fuB5dS+NjUj/ZHmQBo47eDUuDxOTLMcNtcixBlYE5TSXu izDGcJzsG/ePM8+YcOATlYXG2GBJ9dc+83XRNchDNQJuEnUtRWeQYK66HIGdgjMkd52G Asm9NTdUE3WhvjqYOHFh+e30OUX1Py0pbkTOTIRKN4N6pfjLu5kArKhsrFg0ikZKn/o1 /9aJC9+cTUwK1JB0kyerZv7aCJKmXCNyBbd+WHOCri/KfShfSTbRjN1KRDVT9a/QZiPE avgtfaXUGHF5kIVBgwf7lW07C2SjzEiDm4VbmYanddd30NpLT61ljk0jDncsNK8ABmDB 0U6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to :delivered-to; bh=Y/x/WcbXK4ATZdPJXmemiiepq3lI/OYDXTlrLL+FdUA=; fh=nenT92/WZoU6unXd3J6UhGUdod4piddKfVtctNBOh6k=; b=xuvV3sRkRJZ1S3M1yah6+L18m4zULzP80UPVBiem7qLqSPpmaNfsq+i/njBZMjfaAO 1RCqOLoLQlxvkpyRH9gpkQr/Yd+JO5G4tFJLnyOHa2UP1TEZcPMSuA0jsoz5+3ck/K1U iwfPLqg31WtRajsdxpkglE9wfxMaqsnmMzFSU7y7p4Qntb1c7QAJYY7Wwin3ml4LHg6G Aeo8h+1NZRq+Cqy9aJ2vh9TPkaU6lgC2KXvGXruxFpqIEbIrd1F2u4A9wwHhlJGP2uWC dyeoIk1JYIhOjtuwmcIvSrJf2di5qbYs0YoXT30HTA3QzWWufT9NuJV6zldAvSabzTbs qSDQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a7244466dd2si31091566b.1018.2024.06.22.13.11.49; Sat, 22 Jun 2024 13:11: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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 66DB268CE20; Sat, 22 Jun 2024 23:11:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vidala.lynne.ee (vidala.pars.ee [116.203.72.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9391168D128 for ; Sat, 22 Jun 2024 23:11:39 +0300 (EEST) To: ffmpeg-devel@ffmpeg.org Date: Sat, 22 Jun 2024 22:11:05 +0200 Message-ID: <20240622201116.403924-1-dev@lynne.ee> X-Mailer: git-send-email 2.45.1.288.g0e0cd299f1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavu/stereo3d: change baseline and horizontal FOV to rationals 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: , X-Patchwork-Original-From: Lynne via ffmpeg-devel From: Lynne Reply-To: FFmpeg development discussions and patches Cc: Lynne Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 97G91Wg/OmDj This avoids hardcoding any implementation-specific limitiations as part of the API, and allows for future expandability. This also allows API users to more conveniently convert the values into floats without hardcoding specific conversion constants. The draft implementation of this mechanism for the draft of AVTransport uses rationals for these particular fields. The API was committed 2 days ago, so changing these fields now is within the realms of acceptable. --- fftools/ffprobe.c | 4 ++-- libavformat/dump.c | 9 +++++---- libavformat/mov.c | 9 ++++++--- libavutil/stereo3d.h | 8 ++++---- tests/ref/fate/matroska-spherical-mono | 4 ++-- tests/ref/fate/matroska-spherical-mono-remux | 8 ++++---- tests/ref/fate/matroska-stereo_mode | 16 ++++++++-------- tests/ref/fate/matroska-vp8-alpha-remux | 4 ++-- tests/ref/fate/mov-spherical-mono | 4 ++-- 9 files changed, 35 insertions(+), 31 deletions(-) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index d7ba980ff9..2da928b7c3 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -2546,9 +2546,9 @@ static void print_pkt_side_data(WriterContext *w, print_int("inverted", !!(stereo->flags & AV_STEREO3D_FLAG_INVERT)); print_str("view", av_stereo3d_view_name(stereo->view)); print_str("primary_eye", av_stereo3d_primary_eye_name(stereo->primary_eye)); - print_int("baseline", stereo->baseline); + print_q("baseline", stereo->baseline, '/'); print_q("horizontal_disparity_adjustment", stereo->horizontal_disparity_adjustment, '/'); - print_int("horizontal_field_of_view", stereo->horizontal_field_of_view); + print_q("horizontal_field_of_view", stereo->horizontal_field_of_view, '/'); } else if (sd->type == AV_PKT_DATA_SPHERICAL) { const AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data; print_str("projection", av_spherical_projection_name(spherical->projection)); diff --git a/libavformat/dump.c b/libavformat/dump.c index 61a2c6a29f..ac7d3038ab 100644 --- a/libavformat/dump.c +++ b/libavformat/dump.c @@ -262,13 +262,14 @@ static void dump_stereo3d(void *ctx, const AVPacketSideData *sd, int log_level) av_log(ctx, log_level, "%s, view: %s, primary eye: %s", av_stereo3d_type_name(stereo->type), av_stereo3d_view_name(stereo->view), av_stereo3d_primary_eye_name(stereo->primary_eye)); - if (stereo->baseline) - av_log(ctx, log_level, ", baseline: %"PRIu32"", stereo->baseline); + if (stereo->baseline.num && stereo->baseline.den) + av_log(ctx, log_level, ", baseline: %d/%d", stereo->baseline.num, stereo->baseline.den); if (stereo->horizontal_disparity_adjustment.num && stereo->horizontal_disparity_adjustment.den) av_log(ctx, log_level, ", horizontal_disparity_adjustment: %d/%d", stereo->horizontal_disparity_adjustment.num, stereo->horizontal_disparity_adjustment.den); - if (stereo->horizontal_field_of_view) - av_log(ctx, log_level, ", horizontal_field_of_view: %"PRIu32"", stereo->horizontal_field_of_view); + if (stereo->horizontal_field_of_view.num && stereo->horizontal_field_of_view.den) + av_log(ctx, log_level, ", horizontal_field_of_view: %d/%d", stereo->horizontal_field_of_view.num, + stereo->horizontal_field_of_view.den); if (stereo->flags & AV_STEREO3D_FLAG_INVERT) av_log(ctx, log_level, " (inverted)"); diff --git a/libavformat/mov.c b/libavformat/mov.c index f08fec3fb6..64cd17e770 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -6545,7 +6545,8 @@ static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom) MOVStreamContext *sc; int size, flags = 0; int64_t remaining; - uint32_t tag, baseline = 0; + uint32_t tag; + AVRational baseline = av_make_q(0, 0); enum AVStereo3DView view = AV_STEREO3D_VIEW_PACKED; enum AVStereo3DPrimaryEye primary_eye = AV_PRIMARY_EYE_NONE; AVRational horizontal_disparity_adjustment = { 0, 1 }; @@ -6642,7 +6643,8 @@ static int mov_read_eyes(MOVContext *c, AVIOContext *pb, MOVAtom atom) avio_skip(pb, 1); // version avio_skip(pb, 3); // flags - baseline = avio_rb32(pb); + baseline.num = avio_rb32(pb); + baseline.den = 1000000; // micrometers break; } @@ -6782,7 +6784,8 @@ static int mov_read_hfov(MOVContext *c, AVIOContext *pb, MOVAtom atom) return AVERROR(ENOMEM); } - sc->stereo3d->horizontal_field_of_view = avio_rb32(pb); + sc->stereo3d->horizontal_field_of_view.num = avio_rb32(pb); + sc->stereo3d->horizontal_field_of_view.den = 1000; // thousands of a degree return 0; } diff --git a/libavutil/stereo3d.h b/libavutil/stereo3d.h index 00a5c3900e..097f6c9455 100644 --- a/libavutil/stereo3d.h +++ b/libavutil/stereo3d.h @@ -213,9 +213,9 @@ typedef struct AVStereo3D { /** * The distance between the centres of the lenses of the camera system, - * in micrometers. Zero if unset. + * in meters. Zero if unset. */ - uint32_t baseline; + AVRational baseline; /** * Relative shift of the left and right images, which changes the zero parallax plane. @@ -224,9 +224,9 @@ typedef struct AVStereo3D { AVRational horizontal_disparity_adjustment; /** - * Horizontal field of view in thousanths of a degree. Zero if unset. + * Horizontal field of view, in degrees. Zero if unset. */ - uint32_t horizontal_field_of_view; + AVRational horizontal_field_of_view; } AVStereo3D; /** diff --git a/tests/ref/fate/matroska-spherical-mono b/tests/ref/fate/matroska-spherical-mono index b108596350..87f10cd879 100644 --- a/tests/ref/fate/matroska-spherical-mono +++ b/tests/ref/fate/matroska-spherical-mono @@ -5,9 +5,9 @@ type=2D inverted=0 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping diff --git a/tests/ref/fate/matroska-spherical-mono-remux b/tests/ref/fate/matroska-spherical-mono-remux index eec41b77f3..1239013185 100644 --- a/tests/ref/fate/matroska-spherical-mono-remux +++ b/tests/ref/fate/matroska-spherical-mono-remux @@ -29,9 +29,9 @@ type=2D inverted=0 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping @@ -58,9 +58,9 @@ type=2D inverted=0 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping diff --git a/tests/ref/fate/matroska-stereo_mode b/tests/ref/fate/matroska-stereo_mode index 26c325b20e..46e8563f13 100644 --- a/tests/ref/fate/matroska-stereo_mode +++ b/tests/ref/fate/matroska-stereo_mode @@ -134,9 +134,9 @@ type=side by side inverted=0 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [/STREAM] [STREAM] @@ -154,9 +154,9 @@ type=top and bottom inverted=1 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [/STREAM] [STREAM] @@ -172,9 +172,9 @@ type=interleaved lines inverted=1 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [/STREAM] [STREAM] @@ -191,9 +191,9 @@ type=interleaved columns inverted=1 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [/STREAM] [STREAM] diff --git a/tests/ref/fate/matroska-vp8-alpha-remux b/tests/ref/fate/matroska-vp8-alpha-remux index 06bcc4b4ba..ec1ad884b0 100644 --- a/tests/ref/fate/matroska-vp8-alpha-remux +++ b/tests/ref/fate/matroska-vp8-alpha-remux @@ -37,8 +37,8 @@ type=2D inverted=0 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [/STREAM] diff --git a/tests/ref/fate/mov-spherical-mono b/tests/ref/fate/mov-spherical-mono index b108596350..87f10cd879 100644 --- a/tests/ref/fate/mov-spherical-mono +++ b/tests/ref/fate/mov-spherical-mono @@ -5,9 +5,9 @@ type=2D inverted=0 view=packed primary_eye=none -baseline=0 +baseline=0/0 horizontal_disparity_adjustment=0/1 -horizontal_field_of_view=0 +horizontal_field_of_view=0/0 [/SIDE_DATA] [SIDE_DATA] side_data_type=Spherical Mapping