avformat/mov: export cropping values from clap boxes

Addresses part of ticket #7437.

Signed-off-by: James Almer <jamrial@gmail.com>
release/7.1
James Almer 7 months ago
parent 0b6c5e9df4
commit 93be6b425e
  1. 74
      libavformat/mov.c
  2. 32
      tests/ref/fate/aic
  3. 4
      tests/ref/fate/prores-transparency
  4. 4
      tests/ref/fate/prores-transparency_skip

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

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

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

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

Loading…
Cancel
Save