move dequantization into its own inline function
Originally committed as revision 9518 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
ce7088b9a8
commit
218b3ae970
@ -499,14 +499,9 @@ static inline int get_ue_code(GetBitContext *gb, int order) {
|
|||||||
static int decode_residual_block(AVSContext *h, GetBitContext *gb,
|
static int decode_residual_block(AVSContext *h, GetBitContext *gb,
|
||||||
const dec_2dvlc_t *r, int esc_golomb_order,
|
const dec_2dvlc_t *r, int esc_golomb_order,
|
||||||
int qp, uint8_t *dst, int stride) {
|
int qp, uint8_t *dst, int stride) {
|
||||||
int i,pos = -1;
|
int i, level_code, esc_code, level, run, mask;
|
||||||
int level_code, esc_code, level, run, mask;
|
DCTELEM level_buf[64];
|
||||||
int level_buf[64];
|
uint8_t run_buf[64];
|
||||||
int run_buf[64];
|
|
||||||
int dqm = dequant_mul[qp];
|
|
||||||
int dqs = dequant_shift[qp];
|
|
||||||
int dqa = 1 << (dqs - 1);
|
|
||||||
const uint8_t *scantab = h->scantable.permutated;
|
|
||||||
DCTELEM *block = h->block;
|
DCTELEM *block = h->block;
|
||||||
|
|
||||||
for(i=0;i<65;i++) {
|
for(i=0;i<65;i++) {
|
||||||
@ -529,17 +524,9 @@ static int decode_residual_block(AVSContext *h, GetBitContext *gb,
|
|||||||
level_buf[i] = level;
|
level_buf[i] = level;
|
||||||
run_buf[i] = run;
|
run_buf[i] = run;
|
||||||
}
|
}
|
||||||
/* inverse scan and dequantization */
|
if(dequant(h,level_buf, run_buf, block, dequant_mul[qp],
|
||||||
while(--i >= 0){
|
dequant_shift[qp], i))
|
||||||
pos += run_buf[i];
|
return -1;
|
||||||
if(pos > 63) {
|
|
||||||
av_log(h->s.avctx, AV_LOG_ERROR,
|
|
||||||
"position out of block bounds at pic %d MB(%d,%d)\n",
|
|
||||||
h->picture.poc, h->mbx, h->mby);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
block[scantab[pos]] = (level_buf[i]*dqm + dqa) >> dqs;
|
|
||||||
}
|
|
||||||
h->s.dsp.cavs_idct8_add(dst,block,stride);
|
h->s.dsp.cavs_idct8_add(dst,block,stride);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -441,4 +441,24 @@ static inline int next_mb(AVSContext *h) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int dequant(AVSContext *h, DCTELEM *level_buf, uint8_t *run_buf,
|
||||||
|
DCTELEM *dst, int mul, int shift, int coeff_num) {
|
||||||
|
int round = 1 << (shift - 1);
|
||||||
|
int pos = -1;
|
||||||
|
const uint8_t *scantab = h->scantable.permutated;
|
||||||
|
|
||||||
|
/* inverse scan and dequantization */
|
||||||
|
while(--coeff_num >= 0){
|
||||||
|
pos += run_buf[coeff_num];
|
||||||
|
if(pos > 63) {
|
||||||
|
av_log(h->s.avctx, AV_LOG_ERROR,
|
||||||
|
"position out of block bounds at pic %d MB(%d,%d)\n",
|
||||||
|
h->picture.poc, h->mbx, h->mby);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
dst[scantab[pos]] = (level_buf[coeff_num]*mul + round) >> shift;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CAVS_H */
|
#endif /* CAVS_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user