[FFmpeg-cvslog] avformat/movenc: Explicitly address potential division by zero.
Lucas Cooper
git at videolan.org
Sat Apr 29 04:55:21 EEST 2017
ffmpeg | branch: master | Lucas Cooper <bobobo-at-google.com at ffmpeg.org> | Thu Apr 27 15:08:29 2017 -0700| [77bc507f6f001b9f5fa75c664106261bd8f2c971] | committer: Michael Niedermayer
avformat/movenc: Explicitly address potential division by zero.
find_fps attempts to infer framerate from AVCodec's timebase. When this
results in a frame rate that isn't explicitly marked as supported in
av_timecode_check_frame_rate, find_fps returns the AVStream's
avg_frame_rate, which, per avformat.h, _may_ be set (or not).
mov_get_mpeg2_xdcam_codec_tag, mov_get_h264_codec_tag and
find_compressor attempt to call av_q2d on the return value of find_fps,
which in the above case, may result in division by zero and therefore,
an undefined frame rate when NaN is converted to int.
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=77bc507f6f001b9f5fa75c664106261bd8f2c971
---
libavformat/movenc.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index e6e2313c53..d20d272f89 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1321,12 +1321,21 @@ static AVRational find_fps(AVFormatContext *s, AVStream *st)
return rate;
}
+static int defined_frame_rate(AVFormatContext *s, AVStream *st)
+{
+ AVRational rational_framerate = find_fps(s, st);
+ int rate = 0;
+ if (rational_framerate.den != 0)
+ rate = av_q2d(rational_framerate);
+ return rate;
+}
+
static int mov_get_mpeg2_xdcam_codec_tag(AVFormatContext *s, MOVTrack *track)
{
int tag = track->par->codec_tag;
int interlaced = track->par->field_order > AV_FIELD_PROGRESSIVE;
AVStream *st = track->st;
- int rate = av_q2d(find_fps(s, st));
+ int rate = defined_frame_rate(s, st);
if (!tag)
tag = MKTAG('m', '2', 'v', '1'); //fallback tag
@@ -1388,7 +1397,7 @@ static int mov_get_h264_codec_tag(AVFormatContext *s, MOVTrack *track)
int tag = track->par->codec_tag;
int interlaced = track->par->field_order > AV_FIELD_PROGRESSIVE;
AVStream *st = track->st;
- int rate = av_q2d(find_fps(s, st));
+ int rate = defined_frame_rate(s, st);
if (!tag)
tag = MKTAG('a', 'v', 'c', 'i'); //fallback tag
@@ -1850,7 +1859,7 @@ static void find_compressor(char * compressor_name, int len, MOVTrack *track)
} else if (track->par->codec_id == AV_CODEC_ID_MPEG2VIDEO && xdcam_res) {
int interlaced = track->par->field_order > AV_FIELD_PROGRESSIVE;
AVStream *st = track->st;
- int rate = av_q2d(find_fps(NULL, st));
+ int rate = defined_frame_rate(NULL, st);
av_strlcatf(compressor_name, len, "XDCAM");
if (track->par->format == AV_PIX_FMT_YUV422P) {
av_strlcatf(compressor_name, len, " HD422");
More information about the ffmpeg-cvslog
mailing list