| 1 |
pcg |
1.1 |
void RTjpeg_quant_init(void) |
| 2 |
|
|
{ |
| 3 |
|
|
int i; |
| 4 |
|
|
s16 *qtbl; |
| 5 |
|
|
|
| 6 |
|
|
qtbl=(s16 *)RTjpeg_lqt; |
| 7 |
|
|
for(i=0; i<64; i++)qtbl[i]=(s16)RTjpeg_lqt[i]; |
| 8 |
|
|
|
| 9 |
|
|
qtbl=(s16 *)RTjpeg_cqt; |
| 10 |
|
|
for(i=0; i<64; i++)qtbl[i]=(s16)RTjpeg_cqt[i]; |
| 11 |
|
|
} |
| 12 |
|
|
|
| 13 |
|
|
static mmx_t RTjpeg_ones=(mmx_t)(long long)0x0001000100010001LL; |
| 14 |
|
|
static mmx_t RTjpeg_half=(mmx_t)(long long)0x7fff7fff7fff7fffLL; |
| 15 |
|
|
|
| 16 |
|
|
void RTjpeg_quant(s16 *block, s32 *qtbl) |
| 17 |
|
|
{ |
| 18 |
|
|
int i; |
| 19 |
|
|
mmx_t *bl, *ql; |
| 20 |
|
|
|
| 21 |
|
|
ql=(mmx_t *)qtbl; |
| 22 |
|
|
bl=(mmx_t *)block; |
| 23 |
|
|
|
| 24 |
|
|
movq_m2r(RTjpeg_ones, mm6); |
| 25 |
|
|
movq_m2r(RTjpeg_half, mm7); |
| 26 |
|
|
|
| 27 |
|
|
for(i=0; i<16; i++) |
| 28 |
|
|
{ |
| 29 |
|
|
movq_m2r(*ql, mm0); /* quant vals (4) */ |
| 30 |
|
|
movq_m2r(*bl, mm2); /* block vals (4) */ |
| 31 |
|
|
movq_r2r(mm0, mm1); |
| 32 |
|
|
movq_r2r(mm2, mm3); |
| 33 |
|
|
|
| 34 |
|
|
punpcklwd_r2r(mm6, mm0); /* 1 qb 1 qa */ |
| 35 |
|
|
punpckhwd_r2r(mm6, mm1); /* 1 qd 1 qc */ |
| 36 |
|
|
|
| 37 |
|
|
punpcklwd_r2r(mm7, mm2); /* 32767 bb 32767 ba */ |
| 38 |
|
|
punpckhwd_r2r(mm7, mm3); /* 32767 bd 32767 bc */ |
| 39 |
|
|
|
| 40 |
|
|
pmaddwd_r2r(mm2, mm0); /* 32767+bb*qb 32767+ba*qa */ |
| 41 |
|
|
pmaddwd_r2r(mm3, mm1); /* 32767+bd*qd 32767+bc*qc */ |
| 42 |
|
|
|
| 43 |
|
|
psrad_i2r((mmx_t)(long long)16, mm0); |
| 44 |
|
|
psrad_i2r((mmx_t)(long long)16, mm1); |
| 45 |
|
|
|
| 46 |
|
|
packssdw_r2r(mm1, mm0); |
| 47 |
|
|
|
| 48 |
|
|
movq_r2m(mm0, *bl); |
| 49 |
|
|
|
| 50 |
|
|
bl++; |
| 51 |
|
|
ql++; |
| 52 |
|
|
} |
| 53 |
|
|
} |