mirror of
https://github.com/librempeg/librempeg
synced 2024-11-22 00:51:37 +00:00
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:
parent
8642ea3599
commit
3aba176c7a
@ -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…
Reference in New Issue
Block a user