[FFmpeg-devel] [PATCH] avformat/movenc: don't ignore errors when writing codec specific boxes in a VisualSampleEntry
James Almer
jamrial at gmail.com
Sat Jul 27 20:58:15 EEST 2019
Prevents muxing ultimately broken and spec non-compliant files.
Signed-off-by: James Almer <jamrial at 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
More information about the ffmpeg-devel
mailing list