avformat/mov: export cropping values from clap boxes

Addresses part of ticket #7437.

Signed-off-by: James Almer <jamrial@gmail.com>
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
James Almer 2024-07-08 20:50:18 -03:00 committed by Paul B Mahol
parent 8642ea3599
commit 3aba176c7a
4 changed files with 94 additions and 20 deletions

View File

@ -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 },

View File

@ -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

View File

@ -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

View File

@ -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