Select scan tables for 8x4 and 4x8 blocks only once.
Patch by Christophe GISQUET ([christophe][gisquet] <whirlpool sign> free <spot> fr) Thread [PATCH] Determine once and for all zz scan tables to use in VC-1 VLD Originally committed as revision 11525 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
526e037b95
commit
750e37eb83
@ -777,10 +777,14 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
|
|||||||
|
|
||||||
if (v->profile == PROFILE_ADVANCED)
|
if (v->profile == PROFILE_ADVANCED)
|
||||||
{
|
{
|
||||||
|
v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz;
|
||||||
|
v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz;
|
||||||
return decode_sequence_header_adv(v, gb);
|
return decode_sequence_header_adv(v, gb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
v->zz_8x4 = ff_vc1_simple_progressive_8x4_zz;
|
||||||
|
v->zz_4x8 = ff_vc1_simple_progressive_4x8_zz;
|
||||||
v->res_sm = get_bits(gb, 2); //reserved
|
v->res_sm = get_bits(gb, 2); //reserved
|
||||||
if (v->res_sm)
|
if (v->res_sm)
|
||||||
{
|
{
|
||||||
@ -2961,13 +2965,10 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan
|
|||||||
i += skip;
|
i += skip;
|
||||||
if(i > 31)
|
if(i > 31)
|
||||||
break;
|
break;
|
||||||
if(v->profile < PROFILE_ADVANCED)
|
idx = v->zz_8x4[i++]+off;
|
||||||
idx = ff_vc1_simple_progressive_8x4_zz[i++];
|
block[idx] = value * scale;
|
||||||
else
|
|
||||||
idx = ff_vc1_adv_progressive_8x4_zz[i++];
|
|
||||||
block[idx + off] = value * scale;
|
|
||||||
if(!v->pquantizer)
|
if(!v->pquantizer)
|
||||||
block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
|
block[idx] += (block[idx] < 0) ? -mquant : mquant;
|
||||||
}
|
}
|
||||||
if(!(subblkpat & (1 << (1 - j))) && !skip_block)
|
if(!(subblkpat & (1 << (1 - j))) && !skip_block)
|
||||||
s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
|
s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
|
||||||
@ -2983,13 +2984,10 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan
|
|||||||
i += skip;
|
i += skip;
|
||||||
if(i > 31)
|
if(i > 31)
|
||||||
break;
|
break;
|
||||||
if(v->profile < PROFILE_ADVANCED)
|
idx = v->zz_4x8[i++]+off;
|
||||||
idx = ff_vc1_simple_progressive_4x8_zz[i++];
|
block[idx] = value * scale;
|
||||||
else
|
|
||||||
idx = ff_vc1_adv_progressive_4x8_zz[i++];
|
|
||||||
block[idx + off] = value * scale;
|
|
||||||
if(!v->pquantizer)
|
if(!v->pquantizer)
|
||||||
block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
|
block[idx] += (block[idx] < 0) ? -mquant : mquant;
|
||||||
}
|
}
|
||||||
if(!(subblkpat & (1 << (1 - j))) && !skip_block)
|
if(!(subblkpat & (1 << (1 - j))) && !skip_block)
|
||||||
s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
|
s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
|
||||||
|
@ -216,6 +216,8 @@ typedef struct VC1Context{
|
|||||||
int k_y; ///< Number of bits for MVs (depends on MV range)
|
int k_y; ///< Number of bits for MVs (depends on MV range)
|
||||||
int range_x, range_y; ///< MV range
|
int range_x, range_y; ///< MV range
|
||||||
uint8_t pq, altpq; ///< Current/alternate frame quantizer scale
|
uint8_t pq, altpq; ///< Current/alternate frame quantizer scale
|
||||||
|
const uint8_t* zz_8x4;///< Zigzag scan table for TT_8x4 coding mode
|
||||||
|
const uint8_t* zz_4x8;///< Zigzag scan table for TT_4x8 coding mode
|
||||||
/** pquant parameters */
|
/** pquant parameters */
|
||||||
//@{
|
//@{
|
||||||
uint8_t dquantfrm;
|
uint8_t dquantfrm;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user