[FFmpeg-devel] [PATCH] avformat/movenc: Explicitly address potential division by zero.
Lucas Cooper
bobobo at google.com
Fri Apr 28 01:09:05 EEST 2017
I realized that I missed the indentation. I've fixed it in the latest
patch.
On 27 April 2017 at 09:52, Lucas Cooper <bobobo at google.com> wrote:
> 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.
> ---
> libavformat/movenc.c | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index e6e2313c53..a5c6ab88f1 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");
> --
> 2.13.0.rc0.306.g87b477812d-goog
>
>
More information about the ffmpeg-devel
mailing list