From 3aba176c7a0e2d0be46ae483c5f7af890b908538 Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 8 Jul 2024 20:50:18 -0300 Subject: [PATCH] avformat/mov: export cropping values from clap boxes Addresses part of ticket #7437. Signed-off-by: James Almer Signed-off-by: Paul B Mahol --- libavformat/mov.c | 74 +++++++++++++++++++++++++ tests/ref/fate/aic | 32 +++++------ tests/ref/fate/prores-transparency | 4 +- tests/ref/fate/prores-transparency_skip | 4 +- 4 files changed, 94 insertions(+), 20 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 676dd54ed6..92fee34ca8 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