@@ -1234,14 +1234,26 @@ static int mov_read_wfex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_clap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVStream *st;
+ HEIFItem *item;
AVPacketSideData *sd;
+ int width, height;
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)
+ item = heif_cur_item(c);
+ st = get_curr_st(c);
+ if (!st)
return 0;
- st = c->fc->streams[c->fc->nb_streams-1];
+
+ width = st->codecpar->width;
+ height = st->codecpar->height;
+ if ((!width || !height) && item) {
+ width = item->width;
+ height = item->height;
+ }
+ if (!width || !height)
+ return AVERROR_INVALIDDATA;
aperture_width.num = avio_rb32(pb);
aperture_width.den = avio_rb32(pb);
@@ -1263,9 +1275,9 @@ static int mov_read_clap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
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_mul_q((AVRational) { 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_mul_q((AVRational) { 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 });
@@ -1278,18 +1290,18 @@ static int mov_read_clap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
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))
+ if (bottom > (height - 1) ||
+ right > (width - 1))
return AVERROR_INVALIDDATA;
- bottom = st->codecpar->height - 1 - bottom;
- right = st->codecpar->width - 1 - right;
+ bottom = height - 1 - bottom;
+ right = width - 1 - right;
if (!(left | right | top | bottom))
return 0;
- if ((left + right) >= st->codecpar->width ||
- (top + bottom) >= st->codecpar->height)
+ if ((left + right) >= width ||
+ (top + bottom) >= height)
return AVERROR_INVALIDDATA;
sd = av_packet_side_data_new(&st->codecpar->coded_side_data,
Signed-off-by: James Almer <jamrial@gmail.com> --- libavformat/mov.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)