|
|
|
@ -925,9 +925,10 @@ int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx) |
|
|
|
|
* Decode a block. |
|
|
|
|
* @return <0 if an error occurred |
|
|
|
|
*/ |
|
|
|
|
static inline int mpeg4_decode_block(MpegEncContext *s, int16_t *block, |
|
|
|
|
static inline int mpeg4_decode_block(Mpeg4DecContext *ctx, int16_t *block, |
|
|
|
|
int n, int coded, int intra, int rvlc) |
|
|
|
|
{ |
|
|
|
|
MpegEncContext *s = &ctx->m; |
|
|
|
|
int level, i, last, run, qmul, qadd, dc_pred_dir; |
|
|
|
|
RLTable *rl; |
|
|
|
|
RL_VLC_ELEM *rl_vlc; |
|
|
|
@ -936,7 +937,7 @@ static inline int mpeg4_decode_block(MpegEncContext *s, int16_t *block, |
|
|
|
|
// Note intra & rvlc should be optimized away if this is inlined
|
|
|
|
|
|
|
|
|
|
if (intra) { |
|
|
|
|
if (s->use_intra_dc_vlc) { |
|
|
|
|
if (ctx->use_intra_dc_vlc) { |
|
|
|
|
/* DC coef */ |
|
|
|
|
if (s->partitioned_frame) { |
|
|
|
|
level = s->dc_val[0][s->block_index[n]]; |
|
|
|
@ -1151,7 +1152,7 @@ static inline int mpeg4_decode_block(MpegEncContext *s, int16_t *block, |
|
|
|
|
|
|
|
|
|
not_coded: |
|
|
|
|
if (intra) { |
|
|
|
|
if (!s->use_intra_dc_vlc) { |
|
|
|
|
if (!ctx->use_intra_dc_vlc) { |
|
|
|
|
block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); |
|
|
|
|
|
|
|
|
|
i -= i >> 31; // if (i == -1) i = 0;
|
|
|
|
@ -1178,7 +1179,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, int16_t block[6][64]) |
|
|
|
|
mb_type = s->current_picture.mb_type[xy]; |
|
|
|
|
cbp = s->cbp_table[xy]; |
|
|
|
|
|
|
|
|
|
s->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; |
|
|
|
|
ctx->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; |
|
|
|
|
|
|
|
|
|
if (s->current_picture.qscale_table[xy] != s->qscale) |
|
|
|
|
ff_set_qscale(s, s->current_picture.qscale_table[xy]); |
|
|
|
@ -1228,7 +1229,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, int16_t block[6][64]) |
|
|
|
|
s->dsp.clear_blocks(s->block[0]); |
|
|
|
|
/* decode each block */ |
|
|
|
|
for (i = 0; i < 6; i++) { |
|
|
|
|
if (mpeg4_decode_block(s, block[i], i, cbp & 32, s->mb_intra, ctx->rvlc) < 0) { |
|
|
|
|
if (mpeg4_decode_block(ctx, block[i], i, cbp & 32, s->mb_intra, ctx->rvlc) < 0) { |
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, |
|
|
|
|
"texture corrupted at %d %d %d\n", |
|
|
|
|
s->mb_x, s->mb_y, s->mb_intra); |
|
|
|
@ -1576,7 +1577,7 @@ intra: |
|
|
|
|
} |
|
|
|
|
cbp = (cbpc & 3) | (cbpy << 2); |
|
|
|
|
|
|
|
|
|
s->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; |
|
|
|
|
ctx->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; |
|
|
|
|
|
|
|
|
|
if (dquant) |
|
|
|
|
ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
|
|
|
@ -1587,7 +1588,7 @@ intra: |
|
|
|
|
s->dsp.clear_blocks(s->block[0]); |
|
|
|
|
/* decode each block */ |
|
|
|
|
for (i = 0; i < 6; i++) { |
|
|
|
|
if (mpeg4_decode_block(s, block[i], i, cbp & 32, 1, 0) < 0) |
|
|
|
|
if (mpeg4_decode_block(ctx, block[i], i, cbp & 32, 1, 0) < 0) |
|
|
|
|
return -1; |
|
|
|
|
cbp += cbp; |
|
|
|
|
} |
|
|
|
@ -1596,7 +1597,7 @@ intra: |
|
|
|
|
|
|
|
|
|
/* decode each block */ |
|
|
|
|
for (i = 0; i < 6; i++) { |
|
|
|
|
if (mpeg4_decode_block(s, block[i], i, cbp & 32, 0, 0) < 0) |
|
|
|
|
if (mpeg4_decode_block(ctx, block[i], i, cbp & 32, 0, 0) < 0) |
|
|
|
|
return -1; |
|
|
|
|
cbp += cbp; |
|
|
|
|
} |
|
|
|
|