51 |
|
|
52 |
#include <stdio.h> |
#include <stdio.h> |
53 |
#include <stdlib.h> |
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
|
54 |
#include "../portab.h" |
#include "../portab.h" |
55 |
#include "../global.h" |
#include "../global.h" |
56 |
#include "bitstream.h" |
#include "bitstream.h" |
498 |
{ |
{ |
499 |
if ((level = qcoeff[zigzag[i++]]) != 0) |
if ((level = qcoeff[zigzag[i++]]) != 0) |
500 |
{ |
{ |
501 |
abs_level = abs(prev_level); |
abs_level = ABS(prev_level); |
502 |
abs_level = abs_level < 64 ? abs_level : 0; |
abs_level = abs_level < 64 ? abs_level : 0; |
503 |
code = coeff_VLC[1][0][abs_level][prev_run].code; |
code = coeff_VLC[1][0][abs_level][prev_run].code; |
504 |
len = coeff_VLC[1][0][abs_level][prev_run].len; |
len = coeff_VLC[1][0][abs_level][prev_run].len; |
518 |
run++; |
run++; |
519 |
} |
} |
520 |
|
|
521 |
abs_level = abs(prev_level); |
abs_level = ABS(prev_level); |
522 |
abs_level = abs_level < 64 ? abs_level : 0; |
abs_level = abs_level < 64 ? abs_level : 0; |
523 |
code = coeff_VLC[1][1][abs_level][prev_run].code; |
code = coeff_VLC[1][1][abs_level][prev_run].code; |
524 |
len = coeff_VLC[1][1][abs_level][prev_run].len; |
len = coeff_VLC[1][1][abs_level][prev_run].len; |
559 |
{ |
{ |
560 |
if ((level = qcoeff[zigzag[i++]]) != 0) |
if ((level = qcoeff[zigzag[i++]]) != 0) |
561 |
{ |
{ |
562 |
abs_level = abs(prev_level); |
abs_level = ABS(prev_level); |
563 |
abs_level = abs_level < 64 ? abs_level : 0; |
abs_level = abs_level < 64 ? abs_level : 0; |
564 |
len = coeff_VLC[1][0][abs_level][prev_run].len; |
len = coeff_VLC[1][0][abs_level][prev_run].len; |
565 |
bits += len!=128 ? len : 30; |
bits += len!=128 ? len : 30; |
572 |
run++; |
run++; |
573 |
} |
} |
574 |
|
|
575 |
abs_level = abs(prev_level); |
abs_level = ABS(prev_level); |
576 |
abs_level = abs_level < 64 ? abs_level : 0; |
abs_level = abs_level < 64 ? abs_level : 0; |
577 |
len = coeff_VLC[1][1][abs_level][prev_run].len; |
len = coeff_VLC[1][1][abs_level][prev_run].len; |
578 |
bits += len!=128 ? len : 30; |
bits += len!=128 ? len : 30; |
627 |
|
|
628 |
#endif |
#endif |
629 |
|
|
|
|
|
|
static int iDQtab[5] = { |
|
|
1, 0, -1 /* no change */, 2, 3 |
|
|
}; |
|
|
#define DQ_VALUE2INDEX(value) iDQtab[(value)+2] |
|
|
|
|
|
|
|
630 |
static __inline void |
static __inline void |
631 |
CodeBlockIntra(const FRAMEINFO * const frame, |
CodeBlockIntra(const FRAMEINFO * const frame, |
632 |
const MACROBLOCK * pMB, |
const MACROBLOCK * pMB, |
661 |
|
|
662 |
// write dquant |
// write dquant |
663 |
if (pMB->mode == MODE_INTRA_Q) |
if (pMB->mode == MODE_INTRA_Q) |
664 |
BitstreamPutBits(bs, DQ_VALUE2INDEX(pMB->dquant), 2); |
BitstreamPutBits(bs, pMB->dquant, 2); |
665 |
|
|
666 |
// write interlacing |
// write interlacing |
667 |
if (frame->vol_flags & XVID_VOL_INTERLACING) { |
if (frame->global_flags & XVID_INTERLACING) { |
668 |
BitstreamPutBit(bs, pMB->field_dct); |
BitstreamPutBit(bs, pMB->field_dct); |
669 |
} |
} |
670 |
// code block coeffs |
// code block coeffs |
678 |
|
|
679 |
if (pMB->cbp & (1 << (5 - i))) { |
if (pMB->cbp & (1 << (5 - i))) { |
680 |
const uint16_t *scan_table = |
const uint16_t *scan_table = |
681 |
frame->vop_flags & XVID_VOP_ALTERNATESCAN ? |
frame->global_flags & XVID_ALTERNATESCAN ? |
682 |
scan_tables[2] : scan_tables[pMB->acpred_directions[i]]; |
scan_tables[2] : scan_tables[pMB->acpred_directions[i]]; |
683 |
|
|
684 |
bits = BitstreamPos(bs); |
bits = BitstreamPos(bs); |
723 |
|
|
724 |
// write dquant |
// write dquant |
725 |
if (pMB->mode == MODE_INTER_Q) |
if (pMB->mode == MODE_INTER_Q) |
726 |
BitstreamPutBits(bs, DQ_VALUE2INDEX(pMB->dquant), 2); |
BitstreamPutBits(bs, pMB->dquant, 2); |
727 |
|
|
728 |
// interlacing |
// interlacing |
729 |
if (frame->vol_flags & XVID_VOL_INTERLACING) { |
if (frame->global_flags & XVID_INTERLACING) { |
730 |
if (pMB->cbp) { |
if (pMB->cbp) { |
731 |
BitstreamPutBit(bs, pMB->field_dct); |
BitstreamPutBit(bs, pMB->field_dct); |
732 |
DPRINTF(XVID_DEBUG_MB,"codep: field_dct: %i", pMB->field_dct); |
DPRINTF(DPRINTF_MB,"codep: field_dct: %i", pMB->field_dct); |
733 |
} |
} |
734 |
|
|
735 |
// if inter block, write field ME flag |
// if inter block, write field ME flag |
736 |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
737 |
BitstreamPutBit(bs, pMB->field_pred); |
BitstreamPutBit(bs, pMB->field_pred); |
738 |
DPRINTF(XVID_DEBUG_MB,"codep: field_pred: %i", pMB->field_pred); |
DPRINTF(DPRINTF_MB,"codep: field_pred: %i", pMB->field_pred); |
739 |
|
|
740 |
// write field prediction references |
// write field prediction references |
741 |
if (pMB->field_pred) { |
if (pMB->field_pred) { |
758 |
if (pMB->cbp & (1 << (5 - i))) |
if (pMB->cbp & (1 << (5 - i))) |
759 |
{ |
{ |
760 |
const uint16_t *scan_table = |
const uint16_t *scan_table = |
761 |
frame->vop_flags & XVID_VOP_ALTERNATESCAN ? |
frame->global_flags & XVID_ALTERNATESCAN ? |
762 |
scan_tables[2] : scan_tables[0]; |
scan_tables[2] : scan_tables[0]; |
763 |
|
|
764 |
#ifdef BIGLUT |
#ifdef BIGLUT |
1052 |
return data; |
return data; |
1053 |
|
|
1054 |
res = BitstreamGetBits(bs, fcode - 1); |
res = BitstreamGetBits(bs, fcode - 1); |
1055 |
mv = ((abs(data) - 1) * scale_fac) + res + 1; |
mv = ((ABS(data) - 1) * scale_fac) + res + 1; |
1056 |
|
|
1057 |
return data < 0 ? -mv : mv; |
return data < 0 ? -mv : mv; |
1058 |
|
|
1153 |
level = BitstreamGetBits(bs, 8); |
level = BitstreamGetBits(bs, 8); |
1154 |
|
|
1155 |
if (level == 0 || level == 128) |
if (level == 0 || level == 128) |
1156 |
DPRINTF(XVID_DEBUG_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level); |
DPRINTF(DPRINTF_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level); |
1157 |
|
|
1158 |
return (level << 24) >> 24; |
return (level << 24) >> 24; |
1159 |
} |
} |
1209 |
do { |
do { |
1210 |
level = get_coeff(bs, &run, &last, 1, 0); |
level = get_coeff(bs, &run, &last, 1, 0); |
1211 |
if (run == -1) { |
if (run == -1) { |
1212 |
DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run"); |
DPRINTF(DPRINTF_ERROR,"fatal: invalid run"); |
1213 |
break; |
break; |
1214 |
} |
} |
1215 |
coeff += run; |
coeff += run; |
1216 |
block[scan[coeff]] = level; |
block[scan[coeff]] = level; |
1217 |
|
|
1218 |
DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i", scan[coeff], level); |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level); |
1219 |
//DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); |
//DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); |
1220 |
|
|
1221 |
if (level < -2047 || level > 2047) { |
if (level < -2047 || level > 2047) { |
1222 |
DPRINTF(XVID_DEBUG_ERROR,"warning: intra_overflow %i", level); |
DPRINTF(DPRINTF_ERROR,"warning: intra_overflow %i", level); |
1223 |
} |
} |
1224 |
coeff++; |
coeff++; |
1225 |
} while (!last); |
} while (!last); |
1242 |
do { |
do { |
1243 |
level = get_coeff(bs, &run, &last, 0, 0); |
level = get_coeff(bs, &run, &last, 0, 0); |
1244 |
if (run == -1) { |
if (run == -1) { |
1245 |
DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run"); |
DPRINTF(DPRINTF_ERROR,"fatal: invalid run"); |
1246 |
break; |
break; |
1247 |
} |
} |
1248 |
p += run; |
p += run; |
1249 |
|
|
1250 |
block[scan[p]] = level; |
block[scan[p]] = level; |
1251 |
|
|
1252 |
DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i", scan[p], level); |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level); |
1253 |
// DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32)); |
// DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32)); |
1254 |
|
|
1255 |
if (level < -2047 || level > 2047) { |
if (level < -2047 || level > 2047) { |
1256 |
DPRINTF(XVID_DEBUG_ERROR,"warning: inter overflow %i", level); |
DPRINTF(DPRINTF_ERROR,"warning: inter overflow %i", level); |
1257 |
} |
} |
1258 |
p++; |
p++; |
1259 |
} while (!last); |
} while (!last); |
1260 |
|
|
1261 |
} |
} |
1262 |
|
|
|
|
|
1263 |
/***************************************************************************** |
/***************************************************************************** |
1264 |
* VLC tables and other constant arrays |
* VLC tables and other constant arrays |
1265 |
****************************************************************************/ |
****************************************************************************/ |