From 2f06b56382ddd4ae1bbe09fd07f6e7658bfece08 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Sat, 21 Apr 2012 22:31:11 +0200 Subject: [PATCH] Support broken v210 files with 64 byte padding. Fixes ticket #743. Reviewed-by: Paul B Mahol --- libavcodec/v210dec.c | 17 ++++++++++++----- libavcodec/v210dec.h | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libavcodec/v210dec.c b/libavcodec/v210dec.c index 6ff1cd7ee8..453390322d 100644 --- a/libavcodec/v210dec.c +++ b/libavcodec/v210dec.c @@ -86,6 +86,18 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, stride = aligned_width * 8 / 3; } + if (avpkt->size < stride * avctx->height) { + if ((((avctx->width + 23) / 24) * 24 * 8) / 3 * avctx->height == avpkt->size) { + stride = avpkt->size / avctx->height; + if (!s->stride_warning_shown) + av_log(avctx, AV_LOG_WARNING, "Broken v210 with too small padding (64 byte) detected\n"); + s->stride_warning_shown = 1; + } else { + av_log(avctx, AV_LOG_ERROR, "packet too small\n"); + return -1; + } + } + aligned_input = !((uintptr_t)psrc & 0xf) && !(stride & 0xf); if (aligned_input != s->aligned_input) { s->aligned_input = aligned_input; @@ -96,11 +108,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, if (pic->data[0]) avctx->release_buffer(avctx, pic); - if (avpkt->size < stride * avctx->height) { - av_log(avctx, AV_LOG_ERROR, "packet too small\n"); - return -1; - } - pic->reference = 0; if (avctx->get_buffer(avctx, pic) < 0) return -1; diff --git a/libavcodec/v210dec.h b/libavcodec/v210dec.h index 48be729a5f..1f06f9eac9 100644 --- a/libavcodec/v210dec.h +++ b/libavcodec/v210dec.h @@ -26,6 +26,7 @@ typedef struct { AVClass *av_class; int custom_stride; int aligned_input; + int stride_warning_shown; void (*unpack_frame)(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width); } V210DecContext;