X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fv210dec.c;h=453390322d8e2df4c69cdc1cb5ea0a4fba9a5802;hb=c0b47d1914a19abacdf1edf081cbf07485952920;hp=6ff1cd7ee876705afbeeada068b96cbb02558230;hpb=15141f939dc725451644869f4d413adb46927677;p=ffmpeg diff --git a/libavcodec/v210dec.c b/libavcodec/v210dec.c index 6ff1cd7ee87..453390322d8 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;