diff mbox

[FFmpeg-devel] avformat/movenc: don't ignore errors when writing codec specific boxes in a VisualSampleEntry

Message ID 20190727175815.670-1-jamrial@gmail.com
State New
Headers show

Commit Message

James Almer July 27, 2019, 5:58 p.m. UTC
Prevents muxing ultimately broken and spec non-compliant files.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/movenc.c | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)
diff mbox

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index a96139077b..6ffaff6910 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1180,46 +1180,50 @@  static int mov_write_d263_tag(AVIOContext *pb)
 static int mov_write_av1c_tag(AVIOContext *pb, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
+    int ret;
 
     avio_wb32(pb, 0);
     ffio_wfourcc(pb, "av1C");
-    ff_isom_write_av1c(pb, track->vos_data, track->vos_len);
-    return update_size(pb, pos);
+    ret = ff_isom_write_av1c(pb, track->vos_data, track->vos_len);
+    return ret < 0 ? ret : update_size(pb, pos);
 }
 
 static int mov_write_avcc_tag(AVIOContext *pb, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
+    int ret;
 
     avio_wb32(pb, 0);
     ffio_wfourcc(pb, "avcC");
-    ff_isom_write_avcc(pb, track->vos_data, track->vos_len);
-    return update_size(pb, pos);
+    ret = ff_isom_write_avcc(pb, track->vos_data, track->vos_len);
+    return ret < 0 ? ret : update_size(pb, pos);
 }
 
 static int mov_write_vpcc_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
+    int ret;
 
     avio_wb32(pb, 0);
     ffio_wfourcc(pb, "vpcC");
     avio_w8(pb, 1); /* version */
     avio_wb24(pb, 0); /* flags */
-    ff_isom_write_vpcc(s, pb, track->par);
-    return update_size(pb, pos);
+    ret = ff_isom_write_vpcc(s, pb, track->par);
+    return ret < 0 ? ret : update_size(pb, pos);
 }
 
 static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
+    int ret;
 
     avio_wb32(pb, 0);
     ffio_wfourcc(pb, "hvcC");
     if (track->tag == MKTAG('h','v','c','1'))
-        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
+        ret = ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
     else
-        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
-    return update_size(pb, pos);
+        ret = ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
+    return ret < 0 ? ret : update_size(pb, pos);
 }
 
 /* also used by all avid codecs (dv, imx, meridien) and their variants */
@@ -1943,7 +1947,7 @@  static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
 {
     int64_t pos = avio_tell(pb);
     char compressor_name[32] = { 0 };
-    int avid = 0;
+    int ret = 0, avid = 0;
 
     int uncompressed_ycbcr = ((track->par->codec_id == AV_CODEC_ID_RAWVIDEO && track->par->format == AV_PIX_FMT_UYVY422)
                            || (track->par->codec_id == AV_CODEC_ID_RAWVIDEO && track->par->format == AV_PIX_FMT_YUYV422)
@@ -2035,17 +2039,17 @@  static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
         mov_write_avid_tag(pb, track);
         avid = 1;
     } else if (track->par->codec_id == AV_CODEC_ID_HEVC)
-        mov_write_hvcc_tag(pb, track);
+        ret = mov_write_hvcc_tag(pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_H264 && !TAG_IS_AVCI(track->tag)) {
-        mov_write_avcc_tag(pb, track);
+        ret = mov_write_avcc_tag(pb, track);
         if (track->mode == MODE_IPOD)
             mov_write_uuid_tag_ipod(pb);
     } else if (track->par->codec_id == AV_CODEC_ID_VP9) {
-        mov_write_vpcc_tag(mov->fc, pb, track);
+        ret = mov_write_vpcc_tag(mov->fc, pb, track);
     } else if (track->par->codec_id == AV_CODEC_ID_AV1) {
-        mov_write_av1c_tag(pb, track);
+        ret = mov_write_av1c_tag(pb, track);
     } else if (track->par->codec_id == AV_CODEC_ID_VC1 && track->vos_len > 0)
-        mov_write_dvc1_tag(pb, track);
+        ret = mov_write_dvc1_tag(pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_VP6F ||
              track->par->codec_id == AV_CODEC_ID_VP6A) {
         /* Don't write any potential extradata here - the cropping
@@ -2056,6 +2060,9 @@  static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
     } else if (track->vos_len > 0)
         mov_write_glbl_tag(pb, track);
 
+    if (ret < 0)
+        return ret;
+
     if (track->par->codec_id != AV_CODEC_ID_H264 &&
         track->par->codec_id != AV_CODEC_ID_MPEG4 &&
         track->par->codec_id != AV_CODEC_ID_DNXHD) {