Prevents muxing ultimately broken and spec non-compliant files. Signed-off-by: James Almer <jamr...@gmail.com> --- libavformat/movenc.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-)
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) { -- 2.22.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".