Support broken v210 files with 64 byte padding.
Fixes ticket #743. Reviewed-by: Paul B Mahol
This commit is contained in:
parent
6c0027bb39
commit
2f06b56382
@ -86,6 +86,18 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
|||||||
stride = aligned_width * 8 / 3;
|
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);
|
aligned_input = !((uintptr_t)psrc & 0xf) && !(stride & 0xf);
|
||||||
if (aligned_input != s->aligned_input) {
|
if (aligned_input != s->aligned_input) {
|
||||||
s->aligned_input = 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])
|
if (pic->data[0])
|
||||||
avctx->release_buffer(avctx, pic);
|
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;
|
pic->reference = 0;
|
||||||
if (avctx->get_buffer(avctx, pic) < 0)
|
if (avctx->get_buffer(avctx, pic) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -26,6 +26,7 @@ typedef struct {
|
|||||||
AVClass *av_class;
|
AVClass *av_class;
|
||||||
int custom_stride;
|
int custom_stride;
|
||||||
int aligned_input;
|
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);
|
void (*unpack_frame)(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
|
||||||
} V210DecContext;
|
} V210DecContext;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user