Message ID | 20170427165216.12410-1-bobobo@google.com |
---|---|
State | Superseded |
Headers | show |
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@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 > >
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");