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 4C0F94B52E for ; Tue, 9 Jul 2024 01:57:12 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CD06668DA64; Tue, 9 Jul 2024 04:57:04 +0300 (EEST) Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5AAB168DA4C for ; Tue, 9 Jul 2024 04:56:56 +0300 (EEST) Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1fb3cf78fbdso22949095ad.1 for ; Mon, 08 Jul 2024 18:56:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720490213; x=1721095013; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=hSZpLBoeNPfeddiqEpImZf7tpNLmfrP4bGVhDKvGPLY=; b=OeZ4GHTPk9qlhexqZRlbRjFyan0qviwmrNhcxZKK1dktym0DBBjETKfzG1Pti1MGXH 2n49ZLayG5GCN9tQ2cVl2LnzhVkb1jR5jqSD8lCQO/dT5C3EKSXmBkBCylU8zdBLbkT5 x4a6k0nybSaAwa+5If9cmOX6gs3QbuHFYt7gotNz9FU5q/qBMZhGHHeG/YfksM29oc9w Kw8uFyIV+5E3H7cfRZ0jMMUi+CCY0wM0gtusYHjjdXOPeLLhY6FfKr6uEZRDYu2dSWkZ N9DuVjPdlvv9GpZPR5PLm0Z35AytTX4XGDSMjCQlzGV+x9hSfTKW7wIuPZ7uZCL0XXNg zsdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720490213; x=1721095013; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hSZpLBoeNPfeddiqEpImZf7tpNLmfrP4bGVhDKvGPLY=; b=fqnn/NsxCRz+FF141KJFwM7MeidF5UKLmlV3+uyVCGvmjqzlQrywiKPm1gJBmzPyIY P03hD0gKZxYDcPM2mUlJKSNF4dBmWPMI//KzQijbo0XjeTV3G/mGNWR+H2/swYt6yqml VHTFCUtAiZhhEmyHOvS+SarYwQzIA0KYwpPG0nYiN/XxRX+2nmRETlLWnxgiE3bLadss XnpCauP44w652mfBFKBS2LrLo1l8yqCyMxy5xsmYwOTG73Zxfvx9woFv8DGscIjdA88Q py4ajlPteSOj8qqm/sYeK02tdFl5xO6Bz0ynHVxN6Bq4vYx6sTX1P7LIDey+KbgpLZBE WAoA== X-Gm-Message-State: AOJu0Yw3C3TXAL3hHiHNi6z/6ZfXnMVbelIXfCmNMBP3RwLzsH7tAy2+ TfkXTnE8D/BogTnmsZBdCmYj8L3JCFyrX3sG62OfGd7CSzxfhKNiVnKrXQ== X-Google-Smtp-Source: AGHT+IEP+wEfKOa/WQkYPEVgQRvOFUj/zP3ffLLR/77iulVag6Q0Q6aSvxPEOeDQ2m/ZLwgK9VW3rQ== X-Received: by 2002:a17:903:2448:b0:1fb:1faa:96b7 with SMTP id d9443c01a7336-1fbb6cd18d4mr10785275ad.9.1720490213387; Mon, 08 Jul 2024 18:56:53 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fbb6a2f055sm5022935ad.110.2024.07.08.18.56.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Jul 2024 18:56:52 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Jul 2024 22:55:20 -0300 Message-ID: <20240709015521.10083-2-jamrial@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240709015521.10083-1-jamrial@gmail.com> References: <20240709015521.10083-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/movenc: support writing cropping values 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: Finishes implementing ticket #7437. Signed-off-by: James Almer --- libavformat/movenc.c | 56 +++++++++++++++++++++++++++---------- tests/ref/fate/copy-trac236 | 16 +++++------ 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index b5c02d2198..2bea55e33d 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2351,18 +2351,31 @@ static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDe return 32; /* 8 + 24 */ } -static int mov_write_clap_tag(AVIOContext *pb, MOVTrack *track) -{ +static int mov_write_clap_tag(AVIOContext *pb, MOVTrack *track, + uint32_t top, uint32_t bottom, + uint32_t left, uint32_t right) +{ + uint32_t cropped_width = track->par->width - left - right; + uint32_t cropped_height = track->height - top - bottom; + AVRational horizOff = + av_sub_q((AVRational) { track->par->width - cropped_width, 2 }, + (AVRational) { left, 1 }); + AVRational vertOff = + av_sub_q((AVRational) { track->height - cropped_height, 2 }, + (AVRational) { top, 1 }); + avio_wb32(pb, 40); ffio_wfourcc(pb, "clap"); - avio_wb32(pb, track->par->width); /* apertureWidth_N */ - avio_wb32(pb, 1); /* apertureWidth_D (= 1) */ - avio_wb32(pb, track->height); /* apertureHeight_N */ - avio_wb32(pb, 1); /* apertureHeight_D (= 1) */ - avio_wb32(pb, 0); /* horizOff_N (= 0) */ - avio_wb32(pb, 1); /* horizOff_D (= 1) */ - avio_wb32(pb, 0); /* vertOff_N (= 0) */ - avio_wb32(pb, 1); /* vertOff_D (= 1) */ + avio_wb32(pb, cropped_width); /* apertureWidthN */ + avio_wb32(pb, 1); /* apertureWidthD */ + avio_wb32(pb, cropped_height); /* apertureHeightN */ + avio_wb32(pb, 1); /* apertureHeightD */ + + avio_wb32(pb, -horizOff.num); + avio_wb32(pb, horizOff.den); + avio_wb32(pb, -vertOff.num); + avio_wb32(pb, vertOff.den); + return 40; } @@ -2590,6 +2603,7 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex { int ret = AVERROR_BUG; int64_t pos = avio_tell(pb); + const AVPacketSideData *sd; char compressor_name[32] = { 0 }; int avid = 0; @@ -2763,7 +2777,6 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex if (track->mode == MODE_MOV || (track->mode == MODE_MP4 && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) { - const AVPacketSideData *sd; const AVStereo3D *stereo3d = NULL; const AVSphericalMapping *spherical_mapping = NULL; @@ -2800,9 +2813,24 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex mov_write_pasp_tag(pb, track); } - if (uncompressed_ycbcr){ - mov_write_clap_tag(pb, track); - } + sd = av_packet_side_data_get(track->st->codecpar->coded_side_data, + track->st->codecpar->nb_coded_side_data, + AV_PKT_DATA_FRAME_CROPPING); + if (sd && sd->size >= sizeof(uint32_t) * 4) { + uint64_t top = AV_RL32(sd->data + 0); + uint64_t bottom = AV_RL32(sd->data + 4); + uint64_t left = AV_RL32(sd->data + 8); + uint64_t right = AV_RL32(sd->data + 12); + + if ((left + right) >= track->par->width || + (top + bottom) >= track->height) { + av_log(s, AV_LOG_ERROR, "Invalid cropping dimensions in stream side data\n"); + return AVERROR(EINVAL); + } + if (top || bottom || left || right) + mov_write_clap_tag(pb, track, top, bottom, left, right); + } else if (uncompressed_ycbcr) + mov_write_clap_tag(pb, track, 0, 0, 0, 0); if (mov->encryption_scheme != MOV_ENC_NONE) { ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid); diff --git a/tests/ref/fate/copy-trac236 b/tests/ref/fate/copy-trac236 index 5a9e08ad0c..c89649e953 100644 --- a/tests/ref/fate/copy-trac236 +++ b/tests/ref/fate/copy-trac236 @@ -1,24 +1,24 @@ -34b0ad38518b0eb8464aff04e6d0e143 *tests/data/fate/copy-trac236.mov -630878 tests/data/fate/copy-trac236.mov +ca4068319c6586de757c1f6a592b31e5 *tests/data/fate/copy-trac236.mov +630918 tests/data/fate/copy-trac236.mov #tb 0: 100/2997 #media_type 0: video #codec_id 0: rawvideo -#dimensions 0: 720x480 +#dimensions 0: 704x480 #sar 0: 10/11 #tb 1: 1/48000 #media_type 1: audio #codec_id 1: pcm_s16le #sample_rate 1: 48000 #channel_layout_name 1: stereo -0, 0, 0, 1, 518400, 0x81ab2140 +0, 0, 0, 1, 506880, 0xc4d654e3 1, 0, 0, 1024, 4096, 0x67dc99a3 1, 1024, 1024, 1024, 4096, 0xf115a681 -0, 1, 1, 1, 518400, 0x81ab2140 +0, 1, 1, 1, 506880, 0xc4d654e3 1, 2048, 2048, 1024, 4096, 0xf455b597 1, 3072, 3072, 1024, 4096, 0x67dc99a3 -0, 2, 2, 1, 518400, 0x81ab2140 +0, 2, 2, 1, 506880, 0xc4d654e3 1, 4096, 4096, 1024, 4096, 0xf115a681 -0, 3, 3, 1, 518400, 0x81ab2140 +0, 3, 3, 1, 506880, 0xc4d654e3 1, 5120, 5120, 1024, 4096, 0xf455b597 1, 6144, 6144, 759, 3036, 0xa291a36d -0, 4, 4, 1, 518400, 0x81ab2140 +0, 4, 4, 1, 506880, 0xc4d654e3 -- 2.45.2 _______________________________________________ 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".