diff options
author | Paul B Mahol <onemda@gmail.com> | 2017-04-11 00:08:39 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-04-11 00:08:39 +0200 |
commit | 25e491b6f9dba26bd4a10c256150debfb13252db (patch) | |
tree | d78009055fda48e0e8f1761d6cf942c880afadcb /libavcodec | |
parent | 27ebdcf079ed54d294db010e9f50700f75ed5e3d (diff) | |
download | ffmpeg-25e491b6f9dba26bd4a10c256150debfb13252db.tar.gz |
avcodec/dnxhddec: add support for very big resolutions
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/dnxhd_parser.c | 2 | ||||
-rw-r--r-- | libavcodec/dnxhddec.c | 10 |
2 files changed, 8 insertions, 4 deletions
diff --git a/libavcodec/dnxhd_parser.c b/libavcodec/dnxhd_parser.c index 4f9bbceeeb..d5844dffda 100644 --- a/libavcodec/dnxhd_parser.c +++ b/libavcodec/dnxhd_parser.c @@ -43,7 +43,7 @@ static int dnxhd_get_hr_frame_size(int cid, int w, int h) if (i < 0) return i; - result = ((h + 15) / 16) * ((w + 15) / 16) * ff_dnxhd_cid_table[i].packet_scale.num / ff_dnxhd_cid_table[i].packet_scale.den; + result = ((h + 15) / 16) * ((w + 15) / 16) * (int64_t)ff_dnxhd_cid_table[i].packet_scale.num / ff_dnxhd_cid_table[i].packet_scale.den; result = (result + 2048) / 4096 * 4096; return FFMAX(result, 8192); diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index 383e64ca9e..cc24ebd58a 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -58,7 +58,7 @@ typedef struct DNXHDContext { unsigned int width, height; enum AVPixelFormat pix_fmt; unsigned int mb_width, mb_height; - uint32_t mb_scan_index[256]; + uint32_t mb_scan_index[512]; int data_offset; // End of mb_scan_index, where macroblocks start int cur_field; ///< current interlaced field VLC ac_vlc, dc_vlc, run_vlc; @@ -285,7 +285,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, } ctx->mb_width = (ctx->width + 15)>> 4; - ctx->mb_height = buf[0x16d]; + ctx->mb_height = AV_RB16(buf + 0x16c); if ((ctx->height + 15) >> 4 == ctx->mb_height && frame->interlaced_frame) ctx->height <<= 1; @@ -313,7 +313,11 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, return AVERROR_INVALIDDATA; } - av_assert0((unsigned)ctx->mb_height <= FF_ARRAY_ELEMS(ctx->mb_scan_index)); + if (ctx->mb_height > FF_ARRAY_ELEMS(ctx->mb_scan_index)) { + av_log(ctx->avctx, AV_LOG_ERROR, + "mb_height too big (%d > %"PRIu64").\n", ctx->mb_height, FF_ARRAY_ELEMS(ctx->mb_scan_index)); + return AVERROR_INVALIDDATA; + } for (i = 0; i < ctx->mb_height; i++) { ctx->mb_scan_index[i] = AV_RB32(buf + 0x170 + (i << 2)); |