41 |
* * |
* * |
42 |
* Revision history: * |
* Revision history: * |
43 |
* * |
* * |
44 |
* 28.10.2002 GMC support - gruel * |
* 04.01.2003 GMC support - gruel * |
45 |
* 28.06.2002 added check_resync_marker() * |
* 28.06.2002 added check_resync_marker() * |
46 |
* 14.04.2002 bframe encoding * |
* 14.04.2002 bframe encoding * |
47 |
* 08.03.2002 initial version; isibaar * |
* 08.03.2002 initial version; isibaar * |
49 |
******************************************************************************/ |
******************************************************************************/ |
50 |
|
|
51 |
|
|
52 |
|
#include <stdio.h> |
53 |
#include <stdlib.h> |
#include <stdlib.h> |
54 |
#include "../portab.h" |
#include "../portab.h" |
55 |
|
#include "../global.h" |
56 |
#include "bitstream.h" |
#include "bitstream.h" |
57 |
#include "zigzag.h" |
#include "zigzag.h" |
58 |
#include "vlc_codes.h" |
#include "vlc_codes.h" |
60 |
|
|
61 |
#include "../utils/mbfunctions.h" |
#include "../utils/mbfunctions.h" |
62 |
|
|
|
#define ABS(X) (((X)>0)?(X):-(X)) |
|
|
#define CLIP(X,A) (X > A) ? (A) : (X) |
|
|
|
|
63 |
VLC intra_table[4*2048*64]; |
VLC intra_table[4*2048*64]; |
64 |
VLC inter_table[4*2048*64]; |
VLC inter_table[4*2048*64]; |
65 |
|
|
406 |
|
|
407 |
int32_t i; |
int32_t i; |
408 |
uint32_t bits, mcbpc, cbpy; |
uint32_t bits, mcbpc, cbpy; |
|
int mcsel=0; |
|
409 |
|
|
410 |
mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3); |
mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3); |
411 |
cbpy = 15 - (pMB->cbp >> 2); |
cbpy = 15 - (pMB->cbp >> 2); |
416 |
|
|
417 |
if ( (frame->coding_type == S_VOP) && (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) ) |
if ( (frame->coding_type == S_VOP) && (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) ) |
418 |
{ |
{ |
419 |
if (frame->quarterpel) { |
/* decision on GMC is done in encoder.c now */ |
420 |
if ( (pMB->qmvs[0].x == frame->GMC_MV.x) && (pMB->qmvs[0].y == frame->GMC_MV.y) ) |
BitstreamPutBit(bs, pMB->mcsel); // mcsel: '0'=local motion, '1'=GMC |
|
mcsel=1; |
|
|
} else { |
|
|
if ( (pMB->mvs[0].x == frame->GMC_MV.x) && (pMB->mvs[0].y == frame->GMC_MV.y) ) |
|
|
mcsel=1; |
|
|
} |
|
|
BitstreamPutBit(bs, mcsel); // mcsel: '0'=local motion, '1'=GMC |
|
421 |
} |
} |
422 |
|
|
423 |
// write cbpy |
// write cbpy |
447 |
} |
} |
448 |
} |
} |
449 |
// code motion vector(s) if motion is local |
// code motion vector(s) if motion is local |
450 |
if (mcsel==0) |
if (!pMB->mcsel) |
451 |
for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) { |
for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) { |
452 |
CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat); |
CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat); |
453 |
CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat); |
CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat); |
674 |
|
|
675 |
uint32_t index; |
uint32_t index; |
676 |
|
|
677 |
index = CLIP(BitstreamShowBits(bs, 9), 256); |
index = MIN(BitstreamShowBits(bs, 9), 256); |
678 |
|
|
679 |
BitstreamSkip(bs, mcbpc_inter_table[index].len); |
BitstreamSkip(bs, mcbpc_inter_table[index].len); |
680 |
|
|