diff mbox series

[FFmpeg-devel,3/3] avformat/mov: parse clap boxes that reference heif items

Message ID 20240930211237.10761-1-jamrial@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/2] avformat/mov: factorize getting the current item | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 fail Make failed
andriy/make_x86 fail Make failed

Commit Message

James Almer Sept. 30, 2024, 9:12 p.m. UTC
Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/mov.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 33158ac4dd..fdf2238d47 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -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,