mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-04-11 03:32:39 +00:00
avcodec/dnxhddec: add support for very big resolutions
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
27ebdcf079
commit
25e491b6f9
@ -43,7 +43,7 @@ static int dnxhd_get_hr_frame_size(int cid, int w, int h)
|
|||||||
if (i < 0)
|
if (i < 0)
|
||||||
return i;
|
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;
|
result = (result + 2048) / 4096 * 4096;
|
||||||
|
|
||||||
return FFMAX(result, 8192);
|
return FFMAX(result, 8192);
|
||||||
|
@ -58,7 +58,7 @@ typedef struct DNXHDContext {
|
|||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
enum AVPixelFormat pix_fmt;
|
enum AVPixelFormat pix_fmt;
|
||||||
unsigned int mb_width, mb_height;
|
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 data_offset; // End of mb_scan_index, where macroblocks start
|
||||||
int cur_field; ///< current interlaced field
|
int cur_field; ///< current interlaced field
|
||||||
VLC ac_vlc, dc_vlc, run_vlc;
|
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_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)
|
if ((ctx->height + 15) >> 4 == ctx->mb_height && frame->interlaced_frame)
|
||||||
ctx->height <<= 1;
|
ctx->height <<= 1;
|
||||||
@ -313,7 +313,11 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame,
|
|||||||
return AVERROR_INVALIDDATA;
|
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++) {
|
for (i = 0; i < ctx->mb_height; i++) {
|
||||||
ctx->mb_scan_index[i] = AV_RB32(buf + 0x170 + (i << 2));
|
ctx->mb_scan_index[i] = AV_RB32(buf + 0x170 + (i << 2));
|
||||||
|
Loading…
Reference in New Issue
Block a user