|
|
|
@ -62,22 +62,18 @@ typedef struct DNXHDContext { |
|
|
|
|
int mbaff; |
|
|
|
|
int act; |
|
|
|
|
void (*decode_dct_block)(const struct DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n); |
|
|
|
|
RowContext *row, int n); |
|
|
|
|
} DNXHDContext; |
|
|
|
|
|
|
|
|
|
#define DNXHD_VLC_BITS 9 |
|
|
|
|
#define DNXHD_DC_VLC_BITS 7 |
|
|
|
|
|
|
|
|
|
static void dnxhd_decode_dct_block_8(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n); |
|
|
|
|
RowContext *row, int n); |
|
|
|
|
static void dnxhd_decode_dct_block_10(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n); |
|
|
|
|
RowContext *row, int n); |
|
|
|
|
static void dnxhd_decode_dct_block_10_444(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n); |
|
|
|
|
RowContext *row, int n); |
|
|
|
|
|
|
|
|
|
static av_cold int dnxhd_decode_init(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
@ -271,7 +267,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, |
|
|
|
|
|
|
|
|
|
static av_always_inline void dnxhd_decode_dct_block(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, |
|
|
|
|
int16_t *block, int n, |
|
|
|
|
int n, |
|
|
|
|
int index_bits, |
|
|
|
|
int level_bias, |
|
|
|
|
int level_shift) |
|
|
|
@ -282,9 +278,12 @@ static av_always_inline void dnxhd_decode_dct_block(const DNXHDContext *ctx, |
|
|
|
|
const uint8_t *weight_matrix; |
|
|
|
|
const uint8_t *ac_level = ctx->cid_table->ac_level; |
|
|
|
|
const uint8_t *ac_flags = ctx->cid_table->ac_flags; |
|
|
|
|
int16_t *block = row->blocks[n]; |
|
|
|
|
const int eob_index = ctx->cid_table->eob_index; |
|
|
|
|
OPEN_READER(bs, &row->gb); |
|
|
|
|
|
|
|
|
|
ctx->bdsp.clear_block(block); |
|
|
|
|
|
|
|
|
|
if (!ctx->is_444) { |
|
|
|
|
if (n & 2) { |
|
|
|
|
component = 1 + (n & 1); |
|
|
|
@ -364,24 +363,21 @@ static av_always_inline void dnxhd_decode_dct_block(const DNXHDContext *ctx, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void dnxhd_decode_dct_block_8(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n) |
|
|
|
|
RowContext *row, int n) |
|
|
|
|
{ |
|
|
|
|
dnxhd_decode_dct_block(ctx, row, block, n, 4, 32, 6); |
|
|
|
|
dnxhd_decode_dct_block(ctx, row, n, 4, 32, 6); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void dnxhd_decode_dct_block_10(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n) |
|
|
|
|
RowContext *row, int n) |
|
|
|
|
{ |
|
|
|
|
dnxhd_decode_dct_block(ctx, row, block, n, 6, 8, 4); |
|
|
|
|
dnxhd_decode_dct_block(ctx, row, n, 6, 8, 4); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void dnxhd_decode_dct_block_10_444(const DNXHDContext *ctx, |
|
|
|
|
RowContext *row, int16_t *block, |
|
|
|
|
int n) |
|
|
|
|
RowContext *row, int n) |
|
|
|
|
{ |
|
|
|
|
dnxhd_decode_dct_block(ctx, row, block, n, 6, 32, 6); |
|
|
|
|
dnxhd_decode_dct_block(ctx, row, n, 6, 32, 6); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, |
|
|
|
@ -418,15 +414,8 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, |
|
|
|
|
row->last_qscale = qscale; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i < 8; i++) { |
|
|
|
|
ctx->bdsp.clear_block(row->blocks[i]); |
|
|
|
|
ctx->decode_dct_block(ctx, row, row->blocks[i], i); |
|
|
|
|
} |
|
|
|
|
if (ctx->is_444) { |
|
|
|
|
for (; i < 12; i++) { |
|
|
|
|
ctx->bdsp.clear_block(row->blocks[i]); |
|
|
|
|
ctx->decode_dct_block(ctx, row, row->blocks[i], i); |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < 8 + 4 * ctx->is_444; i++) { |
|
|
|
|
ctx->decode_dct_block(ctx, row, i); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (frame->interlaced_frame) { |
|
|
|
|