[FFmpeg-devel] [PATCH] libavcodec/vp9: fix ref-frame size judging method

Li, Zhong zhong.li at intel.com
Tue Apr 30 10:15:59 EEST 2019


> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Yan Cen
> Sent: Tuesday, April 30, 2019 9:46 AM
> To: ffmpeg-devel at ffmpeg.org
> Cc: Yan, CenX <cenx.yan at intel.com>
> Subject: [FFmpeg-devel] [PATCH] libavcodec/vp9: fix ref-frame size judging
> method
> 
> From: Yan Cen <cenx.yan at 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.yan at 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?


More information about the ffmpeg-devel mailing list