[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