19 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
20 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 |
* |
* |
22 |
* $Id: mbcoding.c,v 1.48 2004-08-22 13:16:12 edgomez Exp $ |
* $Id: mbcoding.c,v 1.50 2004-12-10 04:10:12 syskin Exp $ |
23 |
* |
* |
24 |
****************************************************************************/ |
****************************************************************************/ |
25 |
|
|
199 |
static __inline void |
static __inline void |
200 |
CodeVector(Bitstream * bs, |
CodeVector(Bitstream * bs, |
201 |
int32_t value, |
int32_t value, |
202 |
int32_t f_code, |
int32_t f_code) |
|
Statistics * pStat) |
|
203 |
{ |
{ |
204 |
|
|
205 |
const int scale_factor = 1 << (f_code - 1); |
const int scale_factor = 1 << (f_code - 1); |
211 |
if (value > (cmp - 1)) |
if (value > (cmp - 1)) |
212 |
value -= 64 * scale_factor; |
value -= 64 * scale_factor; |
213 |
|
|
|
pStat->iMvSum += value * value; |
|
|
pStat->iMvCount++; |
|
|
|
|
214 |
if (value == 0) { |
if (value == 0) { |
215 |
BitstreamPutBits(bs, mb_motion_table[32].code, |
BitstreamPutBits(bs, mb_motion_table[32].code, |
216 |
mb_motion_table[32].len); |
mb_motion_table[32].len); |
575 |
/* code motion vector(s) if motion is local */ |
/* code motion vector(s) if motion is local */ |
576 |
if (!pMB->mcsel) |
if (!pMB->mcsel) |
577 |
for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) { |
for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) { |
578 |
CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat); |
CodeVector(bs, pMB->pmvs[i].x, frame->fcode); |
579 |
CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat); |
CodeVector(bs, pMB->pmvs[i].y, frame->fcode); |
580 |
} |
} |
581 |
|
|
582 |
bits = BitstreamPos(bs); |
bits = BitstreamPos(bs); |
606 |
if (frame->coding_type != I_VOP) |
if (frame->coding_type != I_VOP) |
607 |
BitstreamPutBit(bs, 0); /* not_coded */ |
BitstreamPutBit(bs, 0); /* not_coded */ |
608 |
|
|
609 |
|
if (frame->vop_flags & XVID_VOP_GREYSCALE) { |
610 |
|
pMB->cbp &= 0x3C; /* keep only bits 5-2 */ |
611 |
|
qcoeff[4*64+0]=0; /* for INTRA DC value is saved */ |
612 |
|
qcoeff[5*64+0]=0; |
613 |
|
} |
614 |
|
|
615 |
if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q) |
if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q) |
616 |
CodeBlockIntra(frame, pMB, qcoeff, bs, pStat); |
CodeBlockIntra(frame, pMB, qcoeff, bs, pStat); |
617 |
else |
else |
698 |
scan_tables[2] : scan_tables[0]; |
scan_tables[2] : scan_tables[0]; |
699 |
int bits; |
int bits; |
700 |
|
|
|
|
|
701 |
/* ------------------------------------------------------------------ |
/* ------------------------------------------------------------------ |
702 |
when a block is skipped it is decoded DIRECT(0,0) |
when a block is skipped it is decoded DIRECT(0,0) |
703 |
hence is interpolated from forward & backward frames |
hence is interpolated from forward & backward frames |
749 |
|
|
750 |
switch (mb->mode) { |
switch (mb->mode) { |
751 |
case MODE_INTERPOLATE: |
case MODE_INTERPOLATE: |
752 |
CodeVector(bs, mb->pmvs[1].x, vcode, pStat); /* forward vector of interpolate mode */ |
CodeVector(bs, mb->pmvs[1].x, vcode); /* forward vector of interpolate mode */ |
753 |
CodeVector(bs, mb->pmvs[1].y, vcode, pStat); |
CodeVector(bs, mb->pmvs[1].y, vcode); |
754 |
case MODE_BACKWARD: |
case MODE_BACKWARD: |
755 |
vcode = bcode; |
vcode = bcode; |
756 |
case MODE_FORWARD: |
case MODE_FORWARD: |
757 |
CodeVector(bs, mb->pmvs[0].x, vcode, pStat); |
CodeVector(bs, mb->pmvs[0].x, vcode); |
758 |
CodeVector(bs, mb->pmvs[0].y, vcode, pStat); |
CodeVector(bs, mb->pmvs[0].y, vcode); |
759 |
break; |
break; |
760 |
case MODE_DIRECT: |
case MODE_DIRECT: |
761 |
CodeVector(bs, mb->pmvs[3].x, 1, pStat); /* fcode is always 1 for delta vector */ |
CodeVector(bs, mb->pmvs[3].x, 1); /* fcode is always 1 for delta vector */ |
762 |
CodeVector(bs, mb->pmvs[3].y, 1, pStat); /* prediction is always (0,0) */ |
CodeVector(bs, mb->pmvs[3].y, 1); /* prediction is always (0,0) */ |
763 |
default: break; |
default: break; |
764 |
} |
} |
765 |
|
|