--- mbcoding.c 2002/06/14 13:24:58 1.18 +++ mbcoding.c 2002/09/26 01:54:54 1.25.2.2 @@ -41,6 +41,7 @@ * * * Revision history: * * * + * 28.06.2002 added check_resync_marker() * * 14.04.2002 bframe encoding * * 08.03.2002 initial version; isibaar * * * @@ -279,7 +280,7 @@ } -static void +static __inline void CodeBlockIntra(const FRAMEINFO * frame, const MACROBLOCK * pMB, int16_t qcoeff[6 * 64], @@ -329,10 +330,13 @@ dcc_tab[qcoeff[i * 64 + 0] + 255].len); if (pMB->cbp & (1 << (5 - i))) { + const uint16_t *scan_table = + frame->global_flags & XVID_ALTERNATESCAN ? + scan_tables[2] : scan_tables[pMB->acpred_directions[i]]; + bits = BitstreamPos(bs); - CodeCoeff(bs, &qcoeff[i * 64], intra_table, - scan_tables[pMB->acpred_directions[i]], 1); + CodeCoeff(bs, &qcoeff[i * 64], intra_table, scan_table, 1); bits = BitstreamPos(bs) - bits; pStat->iTextBits += bits; @@ -369,8 +373,10 @@ // interlacing if (frame->global_flags & XVID_INTERLACING) { - BitstreamPutBit(bs, pMB->field_dct); - DEBUG1("codep: field_dct: ", pMB->field_dct); + if (pMB->cbp) { + BitstreamPutBit(bs, pMB->field_dct); + DEBUG1("codep: field_dct: ", pMB->field_dct); + } // if inter block, write field ME flag if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) { @@ -395,7 +401,13 @@ // code block coeffs for (i = 0; i < 6; i++) if (pMB->cbp & (1 << (5 - i))) - CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0); + { + const uint16_t *scan_table = + frame->global_flags & XVID_ALTERNATESCAN ? + scan_tables[2] : scan_tables[0]; + + CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_table, 0); + } bits = BitstreamPos(bs) - bits; pStat->iTextBits += bits; @@ -411,24 +423,26 @@ Statistics * pStat) { - int intra = (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q); - if (frame->coding_type == P_VOP) { - if (pMB->cbp == 0 && pMB->mode == MODE_INTER && pMB->mvs[0].x == 0 && - pMB->mvs[0].y == 0) { - BitstreamPutBit(bs, 1); // not_coded - return; - } else BitstreamPutBit(bs, 0); // coded } - if (intra) + if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q) CodeBlockIntra(frame, pMB, qcoeff, bs, pStat); else CodeBlockInter(frame, pMB, qcoeff, bs, pStat); } +/* +// moved to mbcoding.h so that in can be 'static __inline' +void +MBSkip(Bitstream * bs) +{ + BitstreamPutBit(bs, 1); // not coded +} +*/ + /*************************************************************** * bframe encoding start ***************************************************************/ @@ -441,37 +455,22 @@ 3 0001b forward mc+q dbquant, mvdf */ -void +static __inline 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! - + case MODE_FORWARD: + BitstreamPutBit(bs, 0); + case MODE_BACKWARD: + BitstreamPutBit(bs, 0); + case MODE_INTERPOLATE: + BitstreamPutBit(bs, 0); + case MODE_DIRECT: + BitstreamPutBit(bs, 1); + default: + break; } - } /* @@ -481,7 +480,7 @@ +2 11b */ -void +static __inline void put_bvop_dbquant(Bitstream * bs, int value) { @@ -512,16 +511,18 @@ const int32_t fcode, const int32_t bcode, Bitstream * bs, - Statistics * pStat) + Statistics * pStat, + int direction) { - int i; + int vcode = fcode; + unsigned int i; /* ------------------------------------------------------------------ - when a block is skipped it is decoded DIRECT(0,) - hence are interpolated from forward & backward frames + when a block is skipped it is decoded DIRECT(0,0) + hence is interpolated from forward & backward frames ------------------------------------------------------------------ */ - if (mb->mode == 5) { + if (mb->mode == MODE_DIRECT_NONE_MV) { BitstreamPutBit(bs, 1); // skipped return; } @@ -544,23 +545,25 @@ 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) { - // TODO: direct + switch (mb->mode) { + case MODE_INTERPOLATE: + CodeVector(bs, mb->pmvs[1].x, vcode, pStat); //forward vector of interpolate mode + CodeVector(bs, mb->pmvs[1].y, vcode, pStat); + case MODE_BACKWARD: + vcode = bcode; + case MODE_FORWARD: + CodeVector(bs, mb->pmvs[0].x, vcode, pStat); + CodeVector(bs, mb->pmvs[0].y, vcode, pStat); + break; + case MODE_DIRECT: + CodeVector(bs, mb->pmvs[3].x, 1, pStat); // fcode is always 1 for delta vector + CodeVector(bs, mb->pmvs[3].y, 1, pStat); // prediction is always (0,0) + default: break; } for (i = 0; i < 6; i++) { if (mb->cbp & (1 << (5 - i))) { - CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0); + CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[direction], 0); } } } @@ -571,15 +574,38 @@ * decoding stuff starts here * ***************************************************************/ + +// for IVOP addbits == 0 +// for PVOP addbits == fcode - 1 +// for BVOP addbits == max(fcode,bcode) - 1 +// returns true or false +int +check_resync_marker(Bitstream * bs, int addbits) +{ + uint32_t nbits; + uint32_t code; + uint32_t nbitsresyncmarker = NUMBITS_VP_RESYNC_MARKER + addbits; + + nbits = BitstreamNumBitsToByteAlign(bs); + code = BitstreamShowBits(bs, nbits); + + if (code == (((uint32_t)1 << (nbits - 1)) - 1)) + { + return BitstreamShowBitsFromByteAlign(bs, nbitsresyncmarker) == RESYNC_MARKER; + } + + return 0; +} + + + int get_mcbpc_intra(Bitstream * bs) { uint32_t index; - while ((index = BitstreamShowBits(bs, 9)) == 1) - BitstreamSkip(bs, 9); - + index = BitstreamShowBits(bs, 9); index >>= 3; BitstreamSkip(bs, mcbpc_intra_table[index].len); @@ -593,9 +619,8 @@ { uint32_t index; - - while ((index = CLIP(BitstreamShowBits(bs, 9), 256)) == 1) - BitstreamSkip(bs, 9); + + index = CLIP(BitstreamShowBits(bs, 9), 256); BitstreamSkip(bs, mcbpc_inter_table[index].len); @@ -621,7 +646,7 @@ } -int +static __inline int get_mv_data(Bitstream * bs) { @@ -738,9 +763,7 @@ { const uint16_t *scan = scan_tables[direction]; - int level; - int run; - int last; + int level, run, last; do { level = get_coeff(bs, &run, &last, 1, 0); @@ -750,6 +773,10 @@ } coeff += run; block[scan[coeff]] = level; + + DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level); + //DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32)); + if (level < -127 || level > 127) { DEBUG1("warning: intra_overflow", level); } @@ -760,10 +787,11 @@ void get_inter_block(Bitstream * bs, - int16_t * block) + int16_t * block, + int direction) { - const uint16_t *scan = scan_tables[0]; + const uint16_t *scan = scan_tables[direction]; int p; int level; int run; @@ -779,6 +807,10 @@ p += run; block[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)); + if (level < -127 || level > 127) { DEBUG1("warning: inter_overflow", level); }