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

Submitted by Yan Cen on May 19, 2019, 10:41 p.m.

Details

Message ID 1558305698-18774-1-git-send-email-mryancen@gmail.com
State New
Headers show

Commit Message

Yan Cen May 19, 2019, 10:41 p.m.
From: yancen <cenx.yan@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: Xiang Haihao <haihao.xiang@intel.com>
Signed-off-by: Li Zhong <zhong.li@intel.com>
Signed-off-by: Yan Cen <cenx.yan@intel.com>
---
 libavcodec/vp9.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

Comments

Ronald S. Bultje May 20, 2019, 12:02 a.m.
Hi,

On Sun, May 19, 2019 at 7:05 PM Yan Cen <mryancen@gmail.com> wrote:

> From: yancen <cenx.yan@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".


Please refer to past comments here:
https://patchwork.ffmpeg.org/patch/12945/

If any of my comment was addressed, please indicate how.

Ronald

Patch hide | download patch | download mbox

diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
index acf3ffc..849c1a6 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,15 @@  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);
+                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;
+                } else {
+                    has_valid_ref_frame = 1;
                 }
                 s->mvscale[i][0] = (refw << 14) / w;
                 s->mvscale[i][1] = (refh << 14) / h;
@@ -815,6 +819,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)) {