aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2024-07-08 20:50:18 -0300
committerJames Almer <jamrial@gmail.com>2024-07-11 10:22:47 -0300
commit93be6b425ebeb6cf96faf502281a4f7a1ed5138c (patch)
tree7e0771c4e361da50605f4bf12ba1f594312fa4a2
parent0b6c5e9df43f82ebe8161ddfb8e8d612387a53a1 (diff)
downloadffmpeg-93be6b425ebeb6cf96faf502281a4f7a1ed5138c.tar.gz
avformat/mov: export cropping values from clap boxes
Addresses part of ticket #7437. Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r--libavformat/mov.c74
-rw-r--r--tests/ref/fate/aic32
-rw-r--r--tests/ref/fate/prores-transparency4
-rw-r--r--tests/ref/fate/prores-transparency_skip4
4 files changed, 94 insertions, 20 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index d862434d25..ced4b2e6b3 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1208,6 +1208,79 @@ static int mov_read_wfex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return ret;
}
+static int mov_read_clap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+ AVStream *st;
+ AVPacketSideData *sd;
+ AVRational aperture_width, aperture_height, horiz_off, vert_off;
+ AVRational pc_x, pc_y;
+ uint64_t top, bottom, left, right;
+
+ if (c->fc->nb_streams < 1)
+ return 0;
+ st = c->fc->streams[c->fc->nb_streams-1];
+
+ aperture_width.num = avio_rb32(pb);
+ aperture_width.den = avio_rb32(pb);
+ aperture_height.num = avio_rb32(pb);
+ aperture_height.den = avio_rb32(pb);
+
+ horiz_off.num = avio_rb32(pb);
+ horiz_off.den = avio_rb32(pb);
+ vert_off.num = avio_rb32(pb);
+ vert_off.den = avio_rb32(pb);
+
+ if (aperture_width.num < 0 || aperture_width.den < 0 ||
+ aperture_height.num < 0 || aperture_height.den < 0 ||
+ horiz_off.den < 0 || vert_off.den < 0)
+ return AVERROR_INVALIDDATA;
+
+ av_log(c->fc, AV_LOG_TRACE, "clap: apertureWidth %d/%d, apertureHeight %d/%d "
+ "horizOff %d/%d vertOff %d/%d\n",
+ aperture_width.num, aperture_width.den, aperture_height.num, aperture_height.den,
+ horiz_off.num, horiz_off.den, vert_off.num, vert_off.den);
+
+ pc_x = av_mul_q((AVRational) { st->codecpar->width - 1, 1 }, (AVRational) { 1, 2 });
+ pc_x = av_add_q(pc_x, horiz_off);
+ pc_y = av_mul_q((AVRational) { st->codecpar->height - 1, 1 }, (AVRational) { 1, 2 });
+ pc_y = av_add_q(pc_y, vert_off);
+
+ aperture_width = av_sub_q(aperture_width, (AVRational) { 1, 1 });
+ aperture_width = av_mul_q(aperture_width, (AVRational) { 1, 2 });
+ aperture_height = av_sub_q(aperture_height, (AVRational) { 1, 1 });
+ aperture_height = av_mul_q(aperture_height, (AVRational) { 1, 2 });
+
+ left = av_q2d(av_sub_q(pc_x, aperture_width));
+ right = av_q2d(av_add_q(pc_x, aperture_width));
+ top = av_q2d(av_sub_q(pc_y, aperture_height));
+ bottom = av_q2d(av_add_q(pc_y, aperture_height));
+
+ if (bottom > (st->codecpar->height - 1) ||
+ right > (st->codecpar->width - 1))
+ return AVERROR_INVALIDDATA;
+
+ bottom = st->codecpar->height - 1 - bottom;
+ right = st->codecpar->width - 1 - right;
+
+ if ((left + right) >= st->codecpar->width ||
+ (top + bottom) >= st->codecpar->height)
+ return AVERROR_INVALIDDATA;
+
+ sd = av_packet_side_data_new(&st->codecpar->coded_side_data,
+ &st->codecpar->nb_coded_side_data,
+ AV_PKT_DATA_FRAME_CROPPING,
+ sizeof(uint32_t) * 4, 0);
+ if (!sd)
+ return AVERROR(ENOMEM);
+
+ AV_WL32(sd->data, top);
+ AV_WL32(sd->data + 4, bottom);
+ AV_WL32(sd->data + 8, left);
+ AV_WL32(sd->data + 12, right);
+
+ return 0;
+}
+
/* This atom overrides any previously set aspect ratio */
static int mov_read_pasp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
@@ -8922,6 +8995,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ MKTAG('a','l','a','c'), mov_read_alac }, /* alac specific atom */
{ MKTAG('a','v','c','C'), mov_read_glbl },
{ MKTAG('p','a','s','p'), mov_read_pasp },
+{ MKTAG('c','l','a','p'), mov_read_clap },
{ MKTAG('s','i','d','x'), mov_read_sidx },
{ MKTAG('s','t','b','l'), mov_read_default },
{ MKTAG('s','t','c','o'), mov_read_stco },
diff --git a/tests/ref/fate/aic b/tests/ref/fate/aic
index 244ea25967..30197129f7 100644
--- a/tests/ref/fate/aic
+++ b/tests/ref/fate/aic
@@ -1,20 +1,20 @@
#tb 0: 100/2997
#media_type 0: video
#codec_id 0: rawvideo
-#dimensions 0: 1440x1080
+#dimensions 0: 1416x1062
#sar 0: 4/3
-0, 0, 0, 1, 2332800, 0xc22b8485
-0, 1, 1, 1, 2332800, 0xc22b8485
-0, 2, 2, 1, 2332800, 0xe0c21bd8
-0, 3, 3, 1, 2332800, 0x3e1a8fa0
-0, 4, 4, 1, 2332800, 0xbcb3f235
-0, 5, 5, 1, 2332800, 0x1a7cabd6
-0, 6, 6, 1, 2332800, 0xc0136ba8
-0, 7, 7, 1, 2332800, 0x295e59a6
-0, 8, 8, 1, 2332800, 0xf9c09288
-0, 9, 9, 1, 2332800, 0x0518cc8f
-0, 10, 10, 1, 2332800, 0x9ad3068e
-0, 11, 11, 1, 2332800, 0x5a8b7af1
-0, 12, 12, 1, 2332800, 0x7b35a8fa
-0, 13, 13, 1, 2332800, 0xbe5801eb
-0, 14, 14, 1, 2332800, 0x31ca019f
+0, 0, 0, 1, 2255688, 0x48f3973d
+0, 1, 1, 1, 2255688, 0x48f3973d
+0, 2, 2, 1, 2255688, 0x8c9f3c83
+0, 3, 3, 1, 2255688, 0xb89c02e3
+0, 4, 4, 1, 2255688, 0x185b1a84
+0, 5, 5, 1, 2255688, 0x82167715
+0, 6, 6, 1, 2255688, 0xe675971e
+0, 7, 7, 1, 2255688, 0x623759db
+0, 8, 8, 1, 2255688, 0x910274ad
+0, 9, 9, 1, 2255688, 0x0eafce15
+0, 10, 10, 1, 2255688, 0x4457b006
+0, 11, 11, 1, 2255688, 0x48f70e0b
+0, 12, 12, 1, 2255688, 0xfd269c3d
+0, 13, 13, 1, 2255688, 0x4c6258ad
+0, 14, 14, 1, 2255688, 0xb131c4af
diff --git a/tests/ref/fate/prores-transparency b/tests/ref/fate/prores-transparency
index 246e0b26aa..a4452e7333 100644
--- a/tests/ref/fate/prores-transparency
+++ b/tests/ref/fate/prores-transparency
@@ -1,13 +1,13 @@
#tb 0: 1/25
#media_type 0: video
#codec_id 0: rawvideo
-#dimensions 0: 1920x1080
+#dimensions 0: 1888x1062
#sar 0: 1/1
#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, 16588800, 0xcfb3d806
+0, 0, 0, 1, 16040448, 0x74480f47
1, 0, 0, 1024, 4096, 0x00000000
1, 1024, 1024, 896, 3584, 0x00000000
diff --git a/tests/ref/fate/prores-transparency_skip b/tests/ref/fate/prores-transparency_skip
index 3f5fa0a13f..3e99a3de94 100644
--- a/tests/ref/fate/prores-transparency_skip
+++ b/tests/ref/fate/prores-transparency_skip
@@ -1,13 +1,13 @@
#tb 0: 1/25
#media_type 0: video
#codec_id 0: rawvideo
-#dimensions 0: 1920x1080
+#dimensions 0: 1888x1062
#sar 0: 1/1
#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, 12441600, 0x74f53304
+0, 0, 0, 1, 12030336, 0x088e6a36
1, 0, 0, 1024, 4096, 0x00000000
1, 1024, 1024, 896, 3584, 0x00000000