--- trunk/xvidcore/src/bitstream/mbcoding.c 2002/03/15 09:20:03 28 +++ trunk/xvidcore/src/bitstream/mbcoding.c 2002/03/26 11:16:08 69 @@ -56,7 +56,8 @@ char *max_run_ptr = max_run[last + (intra << 1)]; for(l = 0; l < 64; l++) { // run - int32_t level = k, run = l; + int32_t level = k; + uint32_t run = l; if(abs(level) <= max_level_ptr[run] && run <= max_run_ptr[abs(level)]) { @@ -100,9 +101,8 @@ level += max_level_ptr[run]; else level -= max_level_ptr[run]; - DEBUG1("1) run:", run); + run -= max_run_ptr[abs(level)] + 1; - DEBUG1("2) run:", run); if(abs(level) <= max_level_ptr[run] && run <= max_run_ptr[abs(level)]) { @@ -127,8 +127,6 @@ else run++; - DEBUG1("3) run:", run); - vlc[intra]->code = (uint32_t) ((0x1e + last) << 20) | (l << 14) | (1 << 13) | ((k & 0xfff) << 1) | 1; @@ -293,6 +291,12 @@ if(pMB->mode == MODE_INTRA_Q) BitstreamPutBits(bs, pMB->dquant, 2); + // write interlacing + if (pParam->global_flags & XVID_INTERLACING) + { + BitstreamPutBit(bs, pMB->field_dct); + } + // code block coeffs for(i = 0; i < 6; i++) { @@ -335,6 +339,27 @@ if(pMB->mode == MODE_INTER_Q) BitstreamPutBits(bs, pMB->dquant, 2); + // interlacing + if (pParam->global_flags & XVID_INTERLACING) + { + 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) + { + BitstreamPutBit(bs, pMB->field_pred); + DEBUG1("codep: field_pred: ", pMB->field_pred); + + // write field prediction references + if (pMB->field_pred) + { + BitstreamPutBit(bs, pMB->field_for_top); + BitstreamPutBit(bs, pMB->field_for_bot); + } + } + } + // code motion vector(s) for(i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {