49 |
* Local data |
* Local data |
50 |
****************************************************************************/ |
****************************************************************************/ |
51 |
|
|
52 |
static VLC intra_table[524032]; |
/* msvc sp5+pp gets confused if they globals are made static */ |
53 |
static VLC inter_table[524032]; |
VLC intra_table[524032]; |
54 |
|
VLC inter_table[524032]; |
55 |
|
|
56 |
static VLC DCT3Dintra[4096]; |
static VLC DCT3Dintra[4096]; |
57 |
static VLC DCT3Dinter[4096]; |
static VLC DCT3Dinter[4096]; |
374 |
if (frame->global_flags & XVID_INTERLACING) { |
if (frame->global_flags & XVID_INTERLACING) { |
375 |
if (pMB->cbp) { |
if (pMB->cbp) { |
376 |
BitstreamPutBit(bs, pMB->field_dct); |
BitstreamPutBit(bs, pMB->field_dct); |
377 |
DEBUG1("codep: field_dct: ", pMB->field_dct); |
DPRINTF(DPRINTF_DEBUG, "codep: field_dct: %d", pMB->field_dct); |
378 |
} |
} |
379 |
|
|
380 |
// if inter block, write field ME flag |
// if inter block, write field ME flag |
381 |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { |
382 |
BitstreamPutBit(bs, pMB->field_pred); |
BitstreamPutBit(bs, pMB->field_pred); |
383 |
DEBUG1("codep: field_pred: ", pMB->field_pred); |
DPRINTF(DPRINTF_DEBUG, "codep: field_pred: %d", pMB->field_pred); |
384 |
|
|
385 |
// write field prediction references |
// write field prediction references |
386 |
if (pMB->field_pred) { |
if (pMB->field_pred) { |
438 |
return; |
return; |
439 |
} |
} |
440 |
|
|
|
#if 0 |
|
|
/*************************************************************** |
|
|
* bframe encoding start |
|
|
***************************************************************/ |
|
|
|
|
|
/* |
|
|
mbtype |
|
|
0 1b direct(h263) mvdb |
|
|
1 01b interpolate mc+q dbquant, mvdf, mvdb |
|
|
2 001b backward mc+q dbquant, mvdb |
|
|
3 0001b forward mc+q dbquant, mvdf |
|
|
*/ |
|
|
|
|
|
void |
|
|
put_bvop_mbtype(Bitstream * bs, |
|
|
int value) |
|
|
{ |
|
|
switch (value) { |
|
|
case 0: |
|
|
BitstreamPutBit(bs, 1); |
|
|
return; |
|
|
|
|
|
case 1: |
|
|
BitstreamPutBit(bs, 0); |
|
|
BitstreamPutBit(bs, 1); |
|
|
return; |
|
|
|
|
|
case 2: |
|
|
BitstreamPutBit(bs, 0); |
|
|
BitstreamPutBit(bs, 0); |
|
|
BitstreamPutBit(bs, 1); |
|
|
return; |
|
|
|
|
|
case 3: |
|
|
BitstreamPutBit(bs, 0); |
|
|
BitstreamPutBit(bs, 0); |
|
|
BitstreamPutBit(bs, 0); |
|
|
BitstreamPutBit(bs, 1); |
|
|
return; |
|
|
|
|
|
default:; // invalid! |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
/* |
|
|
dbquant |
|
|
-2 10b |
|
|
0 0b |
|
|
+2 11b |
|
|
*/ |
|
|
|
|
|
void |
|
|
put_bvop_dbquant(Bitstream * bs, |
|
|
int value) |
|
|
{ |
|
|
switch (value) { |
|
|
case 0: |
|
|
BitstreamPutBit(bs, 0); |
|
|
return; |
|
|
|
|
|
case -2: |
|
|
BitstreamPutBit(bs, 1); |
|
|
BitstreamPutBit(bs, 0); |
|
|
return; |
|
|
|
|
|
case 2: |
|
|
BitstreamPutBit(bs, 1); |
|
|
BitstreamPutBit(bs, 1); |
|
|
return; |
|
|
|
|
|
default:; // invalid |
|
|
} |
|
|
} |
|
|
|
|
|
void |
|
|
MBCodingBVOP(const MACROBLOCK * mb, |
|
|
const int16_t qcoeff[6 * 64], |
|
|
const int32_t fcode, |
|
|
const int32_t bcode, |
|
|
Bitstream * bs, |
|
|
Statistics * pStat) |
|
|
{ |
|
|
int i; |
|
|
|
|
|
/* ------------------------------------------------------------------ |
|
|
when a block is skipped it is decoded DIRECT(0,0) |
|
|
hence is interpolated from forward & backward frames |
|
|
------------------------------------------------------------------ */ |
|
|
|
|
|
if (mb->mode == MODE_DIRECT_NONE_MV) { |
|
|
BitstreamPutBit(bs, 1); // skipped |
|
|
return; |
|
|
} |
|
|
|
|
|
BitstreamPutBit(bs, 0); // not skipped |
|
|
|
|
|
if (mb->cbp == 0) { |
|
|
BitstreamPutBit(bs, 1); // cbp == 0 |
|
|
} else { |
|
|
BitstreamPutBit(bs, 0); // cbp == xxx |
|
|
} |
|
|
|
|
|
put_bvop_mbtype(bs, mb->mode); |
|
|
|
|
|
if (mb->cbp) { |
|
|
BitstreamPutBits(bs, mb->cbp, 6); |
|
|
} |
|
|
|
|
|
if (mb->mode != MODE_DIRECT && mb->cbp != 0) { |
|
|
put_bvop_dbquant(bs, 0); // todo: mb->dquant = 0 |
|
|
} |
|
|
|
|
|
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) { |
|
|
CodeVector(bs, mb->pmvs[0].x, fcode, pStat); |
|
|
CodeVector(bs, mb->pmvs[0].y, fcode, pStat); |
|
|
} |
|
|
|
|
|
if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_BACKWARD) { |
|
|
CodeVector(bs, mb->b_pmvs[0].x, bcode, pStat); |
|
|
CodeVector(bs, mb->b_pmvs[0].y, bcode, pStat); |
|
|
} |
|
|
|
|
|
if (mb->mode == MODE_DIRECT) { |
|
|
CodeVector(bs, mb->deltamv.x, 1, pStat); /* fcode is always 1 for delta vector */ |
|
|
CodeVector(bs, mb->deltamv.y, 1, pStat); /* prediction is always (0,0) */ |
|
|
} |
|
|
|
|
|
for (i = 0; i < 6; i++) { |
|
|
if (mb->cbp & (1 << (5 - i))) { |
|
|
CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0); |
|
|
} |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
441 |
/***************************************************************************** |
/***************************************************************************** |
442 |
* decoding stuff starts here |
* decoding stuff starts here |
443 |
****************************************************************************/ |
****************************************************************************/ |
671 |
level = BitstreamGetBits(bs, 8); |
level = BitstreamGetBits(bs, 8); |
672 |
|
|
673 |
if (level == 0 || level == 128) |
if (level == 0 || level == 128) |
674 |
DEBUG1("Illegal LEVEL for ESCAPE mode 4:", level); |
DPRINTF(DPRINTF_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level); |
675 |
|
|
676 |
return (level >= 128 ? -(256 - level) : level); |
return (level >= 128 ? -(256 - level) : level); |
677 |
} |
} |
739 |
do { |
do { |
740 |
level = get_coeff(bs, &run, &last, 1, 0); |
level = get_coeff(bs, &run, &last, 1, 0); |
741 |
if (run == -1) { |
if (run == -1) { |
742 |
DEBUG("fatal: invalid run"); |
DPRINTF(DPRINTF_DEBUG, "fatal: invalid run"); |
743 |
break; |
break; |
744 |
} |
} |
745 |
coeff += run; |
coeff += run; |
749 |
//DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); |
//DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); |
750 |
|
|
751 |
if (level < -127 || level > 127) { |
if (level < -127 || level > 127) { |
752 |
DEBUG1("warning: intra_overflow", level); |
DPRINTF(DPRINTF_DEBUG, "warning: intra_overflow: %d", level); |
753 |
} |
} |
754 |
coeff++; |
coeff++; |
755 |
} while (!last); |
} while (!last); |
771 |
do { |
do { |
772 |
level = get_coeff(bs, &run, &last, 0, 0); |
level = get_coeff(bs, &run, &last, 0, 0); |
773 |
if (run == -1) { |
if (run == -1) { |
774 |
DEBUG("fatal: invalid run"); |
DPRINTF(DPRINTF_ERROR, "fatal: invalid run"); |
775 |
break; |
break; |
776 |
} |
} |
777 |
p += run; |
p += run; |
779 |
block[scan[p]] = level; |
block[scan[p]] = level; |
780 |
|
|
781 |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level); |
DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level); |
|
// DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32)); |
|
782 |
|
|
783 |
if (level < -127 || level > 127) { |
if (level < -127 || level > 127) { |
784 |
DEBUG1("warning: inter_overflow", level); |
DPRINTF(DPRINTF_DEBUG, "warning: inter_overflow: %d", level); |
785 |
} |
} |
786 |
p++; |
p++; |
787 |
} while (!last); |
} while (!last); |