> From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf > Of Yan Cen > Sent: Tuesday, April 30, 2019 9:46 AM > To: ffmpeg-devel@ffmpeg.org > Cc: Yan, CenX <cenx....@intel.com> > Subject: [FFmpeg-devel] [PATCH] libavcodec/vp9: fix ref-frame size judging > method > > From: Yan Cen <cenx....@intel.com> > > There is no need all reference frame demension is valid in libvpx. > > So this change contains three part: > 1. Change each judgement's loglevel from "ERROR" to "WARNING" > 2. Make sure at least one of frames that this frame references has valid > dimension. > 3. All judgements fail would report "ERROR". > > Signed-off-by: Yan Cen<cenx....@intel.com> > --- > libavcodec/vp9.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index acf3ffc..8dd14e0 > 100644 > --- a/libavcodec/vp9.c > +++ b/libavcodec/vp9.c > @@ -790,6 +790,7 @@ static int decode_frame_header(AVCodecContext > *avctx, > > /* check reference frames */ > if (!s->s.h.keyframe && !s->s.h.intraonly) { > + int has_valid_ref_frame = 0; > for (i = 0; i < 3; i++) { > AVFrame *ref = s->s.refs[s->s.h.refidx[i]].f; > int refw = ref->width, refh = ref->height; @@ -802,12 > +803,14 @@ static int decode_frame_header(AVCodecContext *avctx, > return AVERROR_INVALIDDATA; > } else if (refw == w && refh == h) { > s->mvscale[i][0] = s->mvscale[i][1] = 0; > + has_valid_ref_frame = 1; > } else { > - if (w * 2 < refw || h * 2 < refh || w > 16 * refw || h > 16 > * refh) { > - av_log(avctx, AV_LOG_ERROR, > + int is_ref_frame_invalid = (w * 2 < refw || h * 2 < refh > || w > 16 * refw || h > 16 * refh); > + has_valid_ref_frame |= !is_ref_frame_invalid; > + if (is_ref_frame_invalid) { > + av_log(avctx, AV_LOG_WARNING, > "Invalid ref frame dimensions %dx%d for > frame size %dx%d\n", > refw, refh, w, h); > - return AVERROR_INVALIDDATA; > }
Would be higher efficient and easier to read if change as blew? if (is_ref_frame_invalid) warning_log; else has_valid_ref_frame = 1; > s->mvscale[i][0] = (refw << 14) / w; > s->mvscale[i][1] = (refh << 14) / h; @@ -815,6 +818,11 > @@ static int decode_frame_header(AVCodecContext *avctx, > s->mvstep[i][1] = 16 * s->mvscale[i][1] >> 14; > } > } > + if (!has_valid_ref_frame) { > + av_log(avctx, AV_LOG_ERROR, > + "Referenced frame has invalid size\n"); > + return AVERROR_INVALIDDATA; > + } > } > > if (s->s.h.keyframe || s->s.h.errorres || (s->s.h.intraonly && > s->s.h.resetctx == 3)) { > -- > 2.7.4 Patch makes sense, but I wonder is there any clip to reproduce the issue you want to fix? _______________________________________________ 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".