[xiph-commits] r14585 - branches/theora-thusnelda/lib/enc
xiphmont at svn.xiph.org
xiphmont at svn.xiph.org
Thu Mar 13 19:09:52 PDT 2008
Author: xiphmont
Date: 2008-03-13 19:09:51 -0700 (Thu, 13 Mar 2008)
New Revision: 14585
Modified:
branches/theora-thusnelda/lib/enc/dct_encode.c
branches/theora-thusnelda/lib/enc/encode.c
branches/theora-thusnelda/lib/enc/encoder_lookup.h
branches/theora-thusnelda/lib/enc/mode.c
Log:
Rollback to 14583; the direction is still correct, but I have one tricky change that should be made first that would be a pain in the ass to debug as part of the larger re-flowing.
Modified: branches/theora-thusnelda/lib/enc/dct_encode.c
===================================================================
--- branches/theora-thusnelda/lib/enc/dct_encode.c 2008-03-13 08:20:14 UTC (rev 14584)
+++ branches/theora-thusnelda/lib/enc/dct_encode.c 2008-03-14 02:09:51 UTC (rev 14585)
@@ -557,117 +557,10 @@
}
#endif
-void mb_background(CP_INSTANCE *cpi,
- coding_mode_t mode,
- int fi,
- mv_t mv,
- ogg_int16_t *block){
-
- int mv_div = (plane?4:2);
- unsigned char *frame_ptr = &cpi->frame[cpi->frag_buffer_index[fi]];
- int stride = cpi->stride[plane];
-
- if ( ModeUsesMC[mode] ){
-
- ogg_int32_t MvShift;
- ogg_int32_t MvModMask;
- ogg_int32_t AbsRefOffset;
- ogg_int32_t AbsXOffset;
- ogg_int32_t AbsYOffset;
- ogg_int32_t MVOffset; /* Baseline motion vector offset */
- ogg_int32_t ReconPtr2Offset; /* Offset for second reconstruction in
- half pixel MC */
- unsigned char *ReconPtr1; /* DCT reconstructed image pointers */
- unsigned char *ReconPtr2; /* Pointer used in half pixel MC */
- int bi = cpi->frag_buffer_index[fi];
- unsigned char *thisrecon = &cpi->recon[bi];
-
- if ( ModeUsesMC[mode] ){
- switch(MvDivisor) {
- case 2:
- MvShift = 1;
- MvModMask = 1;
- break;
- case 4:
- MvShift = 2;
- MvModMask = 3;
- break;
- default:
- break;
- }
-
- /* Set up the baseline offset for the motion vector. */
- MVOffset = ((mv.y / MvDivisor) * PixelsPerLine) + (mv.x / MvDivisor);
-
- /* Work out the offset of the second reference position for 1/2
- pixel interpolation. For the U and V planes the MV specifies 1/4
- pixel accuracy. This is adjusted to 1/2 pixel as follows ( 0->0,
- 1/4->1/2, 1/2->1/2, 3/4->1/2 ). */
- ReconPtr2Offset = 0;
- AbsXOffset = mv.x % MvDivisor;
- AbsYOffset = mv.y % MvDivisor;
-
- if ( AbsXOffset ) {
- if ( mv.x > 0 )
- ReconPtr2Offset += 1;
- else
- ReconPtr2Offset -= 1;
- }
-
- if ( AbsYOffset ) {
- if ( mv.y > 0 )
- ReconPtr2Offset += PixelsPerLine;
- else
- ReconPtr2Offset -= PixelsPerLine;
- }
-
- if ( mode==CODE_GOLDEN_MV ) {
- ReconPtr1 = &cpi->golden[bi];
- } else {
- ReconPtr1 = &cpi->lastrecon[bi];
- }
-
- ReconPtr1 += MVOffset;
- ReconPtr2 = ReconPtr1 + ReconPtr2Offset;
-
- AbsRefOffset = abs((int)(ReconPtr1 - ReconPtr2));
-
- /* Is the MV offset exactly pixel alligned */
- if ( AbsRefOffset == 0 ){
- dsp_sub8x8(cpi->dsp, FiltPtr, ReconPtr1, DctInputPtr, PixelsPerLine);
- dsp_copy8x8 (cpi->dsp, ReconPtr1, thisrecon, PixelsPerLine);
- } else {
- /* Fractional pixel MVs. */
- /* Note that we only use two pixel values even for the diagonal */
- dsp_sub8x8avg2(cpi->dsp, FiltPtr, ReconPtr1, ReconPtr2, DctInputPtr, PixelsPerLine);
- dsp_copy8x8_half (cpi->dsp, ReconPtr1, ReconPtr2, thisrecon, PixelsPerLine);
- }
-
- } else {
- if ( ( mode==CODE_INTER_NO_MV ) ||
- ( mode==CODE_USING_GOLDEN ) ) {
- if ( mode==CODE_INTER_NO_MV ) {
- ReconPtr1 = &cpi->lastrecon[bi];
- } else {
- ReconPtr1 = &cpi->golden[bi];
- }
-
- dsp_sub8x8(cpi->dsp, FiltPtr, ReconPtr1, DctInputPtr,PixelsPerLine);
- dsp_copy8x8 (cpi->dsp, ReconPtr1, thisrecon, PixelsPerLine);
- } else if ( mode==CODE_INTRA ) {
- dsp_sub8x8_128(cpi->dsp, FiltPtr, DctInputPtr, PixelsPerLine);
- dsp_set8x8(cpi->dsp, 128, thisrecon, PixelsPerLine);
- }
- }
-
-
-}
-
void TransformQuantizeBlock (CP_INSTANCE *cpi,
coding_mode_t mode,
int fi,
- mv_t mv,
- int key){
+ mv_t mv){
unsigned char *FiltPtr = &cpi->frame[cpi->frag_buffer_index[fi]];
int qi = cpi->BaseQ; // temporary
@@ -677,9 +570,8 @@
ogg_int32_t *q = cpi->iquant_tables[inter][plane][qi];
ogg_int16_t DCTInput[64];
ogg_int16_t DCTOutput[64];
- ogg_int32_t MvDivisor; /* Defines MV resolution (2 = 1/2
- pixel for Y or 4 = 1/4 for UV) */
-
+ ogg_int32_t MvDivisor; /* Defines MV resolution (2 = 1/2
+ pixel for Y or 4 = 1/4 for UV) */
/* Set plane specific values */
if (plane == 0){
MvDivisor = 2; /* 1/2 pixel accuracy in Y */
Modified: branches/theora-thusnelda/lib/enc/encode.c
===================================================================
--- branches/theora-thusnelda/lib/enc/encode.c 2008-03-13 08:20:14 UTC (rev 14584)
+++ branches/theora-thusnelda/lib/enc/encode.c 2008-03-14 02:09:51 UTC (rev 14585)
@@ -203,68 +203,6 @@
}
}
-static ogg_uint32_t CodeMBPlane ( CP_INSTANCE *cpi, macroblock_t *mp, int plane, int subsample, int key){
- int B;
- unsigned char *cp = cpi->frag_coded;
- int fi;
- int *yuv = mp->yuv[plane];
-
- switch(subsample){
- case 1:
- {
- int coded=0;
-
- for ( B=0; B<4; B++) {
- fi = yuv[B];
- if (cp[fi])
- cp[fi] = TransformQuantizeBlock( cpi, mp->mode, fi, mp->mv[B],key );
- if(cp[fi]) coded=1;
- }
-
- return coded;
- }
- case 2:
- /* fill me in when we need to support 4:2:2 */
- return 1;
- case 4:
- fi = yuv[0];
- if ( cp[fi] ) {
-
- if(mp->mode == CODE_INTER_FOURMV){
- mv_t mv;
-
- /* Calculate motion vector as the average of the Y plane ones. */
- /* Uncoded members are 0,0 and not special-cased */
- mv.x = mp->mv[0].x + mp->mv[1].x + mp->mv[2].x + mp->mv[3].x;
- mv.y = mp->mv[0].y + mp->mv[1].y + mp->mv[2].y + mp->mv[3].y;
-
- mv.x = ( mv.x >= 0 ? (mv.x + 2) / 4 : (mv.x - 2) / 4);
- mv.y = ( mv.y >= 0 ? (mv.y + 2) / 4 : (mv.y - 2) / 4);
-
- cp[fi] = TransformQuantizeBlock( cpi, mp->mode, fi, mv, key);
- }else
- cp[fi] = TransformQuantizeBlock( cpi, mp->mode, fi, mp->mv[0], key);
-
- }
- if(cp[fi]) return 1;
- }
- return 0;
-}
-
-static ogg_uint32_t CodeMB420 ( CP_INSTANCE *cpi, macroblock_t *mp, int key){
- int coded = 0;
- if(CodeMBPlane(cpi,mp,0,1,key)){
- coded = CodeMBPlane(cpi,mp,1,4,key);
- coded |= CodeMBPlane(cpi,mp,2,4,key);
- }
-
- if(!coded){
-
-
- }
-
-}
-
static void ChooseTokenTables (CP_INSTANCE *cpi, int huff[4]) {
int i,plane;
int best;
Modified: branches/theora-thusnelda/lib/enc/encoder_lookup.h
===================================================================
--- branches/theora-thusnelda/lib/enc/encoder_lookup.h 2008-03-13 08:20:14 UTC (rev 14584)
+++ branches/theora-thusnelda/lib/enc/encoder_lookup.h 2008-03-14 02:09:51 UTC (rev 14585)
@@ -17,28 +17,6 @@
#include "codec_internal.h"
-static signed char mvmap[2][63] = {
- { -15,-15,-14, -14,-13,-13,-12, -12,-11,-11,-10, -10, -9, -9, -8,
- -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0,
- 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
- 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15 },
- { -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4, -4,
- -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
- 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7 }
-};
-
-static signed char mvmap2[2][63] = {
- { -1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1,
- 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1,
- 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
- 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
- { -1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,
- 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,
- 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
- 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }
-};
-
static const ogg_uint32_t MvPattern[(MAX_MV_EXTENT * 2) + 1] = {
0x000000ff, 0x000000fd, 0x000000fb, 0x000000f9,
0x000000f7, 0x000000f5, 0x000000f3, 0x000000f1,
Modified: branches/theora-thusnelda/lib/enc/mode.c
===================================================================
--- branches/theora-thusnelda/lib/enc/mode.c 2008-03-13 08:20:14 UTC (rev 14584)
+++ branches/theora-thusnelda/lib/enc/mode.c 2008-03-14 02:09:51 UTC (rev 14585)
@@ -173,7 +173,7 @@
_mode: The mode that was chosen.*/
-static void oc_mode_count( CP_INSTANCE *cpi,
+static void oc_mode_set( CP_INSTANCE *cpi,
macroblock_t *mb,
int _mode){
@@ -181,6 +181,7 @@
int ri;
int si;
+ mb->mode = _mode;
chooser->mode_counts[_mode]++;
/* Re-order the scheme0 mode list if necessary. */
@@ -282,6 +283,28 @@
return cost;
}
+static signed char mvmap[2][63] = {
+ { -15,-15,-14, -14,-13,-13,-12, -12,-11,-11,-10, -10, -9, -9, -8,
+ -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0,
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15 },
+ { -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4, -4,
+ -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7 }
+};
+
+static signed char mvmap2[2][63] = {
+ { -1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1,
+ 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1, 0,-1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
+ { -1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,
+ 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1,
+ 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
+ 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }
+};
+
#define AV(a) ((r[a]+(int)r2[a])>>1)
static int BInterSAD(CP_INSTANCE *cpi, int fi, int plane, int goldenp, mv_t mv, int qp){
@@ -403,55 +426,6 @@
return cost;
}
-void mb_get_dct_input(CP_INSTANCE *cpi,
- coding_mode_t mode,
- int fi,
- mv_t mv,
- ogg_int16_t *block){
-
- int qp = (plane?1:0);
- int bi = cpi->frag_buffer_index[fi];
- unsigned char *frame_ptr = &cpi->frame[bi];
- unsigned char *recon = ((mode == CODE_USING_GOLDEN ||
- mode == CODE_GOLDEN_MV) ?
- cpi->golden : cpi->lastrecon);
- int stride = cpi->stride[plane];
-
- switch(mode){
- case CODE_INTER_PLUS_MV:
- case CODE_INTER_LAST_MV:
- case CODE_INTER_PRIOR_LAST:
- case CODE_GOLDEN_MV:
- case CODE_INTER_FOURMV:
-
- {
- int mx = mvmap[qp][mv.x+31];
- int my = mvmap[qp][mv.y+31];
- int mx2 = mvmap2[qp][mv.x+31];
- int my2 = mvmap2[qp][mv.y+31];
-
- unsigned char *r = recon + bi+ my * stride + mx;
- int j;
-
- if(mx2 || my2){
- unsigned char *r2 = r + my2 * stride + mx2;
- dsp_sub8x8avg2(cpi->dsp, frame_ptr, r1, r2, block, stride);
- }else{
- dsp_sub8x8(cpi->dsp, frame_ptr, r1, block, stride);
- }
- }
- break;
-
- case CODE_USING_GOLDEN:
- case CODE_INTER_NO_MV:
- dsp_sub8x8(cpi->dsp, frame_ptr, recon[bi], block, stride);
- break;
- case CODE_INTRA:
- dsp_sub8x8_128(cpi->dsp, frame_ptr, block, stride);
- break;
- }
-}
-
int PickModes(CP_INSTANCE *cpi){
unsigned char qi = cpi->BaseQ; // temporary
superblock_t *sb = cpi->super[0];
@@ -475,182 +449,145 @@
macroblock_t *mb = &cpi->macro[mbi];
if(cpi->FrameType == KEY_FRAME){
- mb->mode = mode = CODE_INTRA;
- }else{
+ mb->mode = CODE_INTRA;
+ continue;
+ }
- /**************************************************************
- Find the block choice with the lowest estimated coding cost
+ /**************************************************************
+ Find the block choice with the lowest estimated coding cost
- NOTE THAT if U or V is coded but no Y from a macro block then
- the mode must be CODE_INTER_NO_MV */
+ NOTE THAT if U or V is coded but no Y from a macro block then
+ the mode will be CODE_INTER_NO_MV as this is the default
+ state to which the mode data structure is initialised in
+ encoder and decoder at the start of each frame. */
- /* block coding cost is estimated from correlated SAD metrics */
+ /* block coding cost is estimated from correlated SAD metrics */
- cost[CODE_INTER_NO_MV] = MBInterCost420(cpi,qi,mbi,(mv_t){0,0},0);
+ cost[CODE_INTER_NO_MV] = MBInterCost420(cpi,qi,mbi,(mv_t){0,0},0);
+
+ /* 'should this have been a keyframe in retrospect' tracking;
+ includes none of the rest of the inter-style labelling and
+ flagging overhead, but must count 'uncoded' frags within the
+ frame */
+ intrabits += MBIntraCost420(cpi,qi,mbi,1);
+
+ if(mb->coded == 0){
+
+ oc_mode_set(cpi,mb,CODE_INTER_NO_MV);
+ mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = (mv_t){0,0};
+
+ }else{
+ int mb_mv_bits_0;
+ int mb_gmv_bits_0;
+ int mb_4mv_bits_0;
+ int mb_4mv_bits_1;
+ int mode;
+
+ cost[CODE_INTRA] = MBIntraCost420(cpi,qi,mbi,0);
+ cost[CODE_INTER_PLUS_MV] = MBInterCost420(cpi,qi,mbi,mb->analysis_mv[0][0],0);
+ cost[CODE_INTER_LAST_MV] = MBInterCost420(cpi,qi,mbi,last_mv,0);
+ cost[CODE_INTER_PRIOR_LAST] = MBInterCost420(cpi,qi,mbi,prior_mv,0);
+ cost[CODE_USING_GOLDEN] = MBInterCost420(cpi,qi,mbi,(mv_t){0,0},1);
+ cost[CODE_GOLDEN_MV] = MBInterCost420(cpi,qi,mbi,mb->analysis_mv[0][1],1);
+ cost[CODE_INTER_FOURMV] = MBInter4Cost420(cpi,qi,mbi,mb->mv,0);
- /* 'should this have been a keyframe in retrospect' tracking;
- includes none of the rest of the inter-style labelling and
- flagging overhead, but must count 'uncoded' frags within the
- frame */
- intrabits += MBIntraCost420(cpi,qi,mbi,1);
+ /* add estimated labelling cost for each mode */
+ for(i = 0; i < 8; i++)
+ cost[i] += oc_mode_cost(cpi,i) << OC_BIT_SCALE;
- if(mb->coded == 0){
-
- mode = CODE_INTER_NO_MV;
- mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = (mv_t){0,0};
-
- }else{
- int mb_mv_bits_0;
- int mb_gmv_bits_0;
- int mb_4mv_bits_0;
- int mb_4mv_bits_1;
- int mode;
-
- cost[CODE_INTRA] = MBIntraCost420(cpi,qi,mbi,0);
- cost[CODE_INTER_PLUS_MV] = MBInterCost420(cpi,qi,mbi,mb->analysis_mv[0][0],0);
- cost[CODE_INTER_LAST_MV] = MBInterCost420(cpi,qi,mbi,last_mv,0);
- cost[CODE_INTER_PRIOR_LAST] = MBInterCost420(cpi,qi,mbi,prior_mv,0);
- cost[CODE_USING_GOLDEN] = MBInterCost420(cpi,qi,mbi,(mv_t){0,0},1);
- cost[CODE_GOLDEN_MV] = MBInterCost420(cpi,qi,mbi,mb->analysis_mv[0][1],1);
- cost[CODE_INTER_FOURMV] = MBInter4Cost420(cpi,qi,mbi,mb->mv,0);
-
- /* add estimated labelling cost for each mode */
- for(i = 0; i < 8; i++)
- cost[i] += oc_mode_cost(cpi,i) << OC_BIT_SCALE;
-
- /* Add the motion vector bits for each mode that requires them.*/
- mb_mv_bits_0 = MvBits[mb->analysis_mv[0][0].x + MAX_MV_EXTENT] +
- MvBits[mb->analysis_mv[0][0].y + MAX_MV_EXTENT];
- mb_gmv_bits_0 = MvBits[mb->analysis_mv[0][1].x+MAX_MV_EXTENT] +
- MvBits[mb->analysis_mv[0][1].y+MAX_MV_EXTENT];
- mb_4mv_bits_0 = mb_4mv_bits_1 = 0;
- if(mb->coded & 1){
- mb_4mv_bits_0 += MvBits[mb->mv[0].x + MAX_MV_EXTENT] +
- MvBits[mb->mv[0].y+MAX_MV_EXTENT];
- mb_4mv_bits_1 += 12;
- }
- if(mb->coded & 2){
- mb_4mv_bits_0 += MvBits[mb->mv[1].x+MAX_MV_EXTENT] +
- MvBits[mb->mv[1].y+MAX_MV_EXTENT];
- mb_4mv_bits_1 += 12;
- }
- if(mb->coded & 4){
- mb_4mv_bits_0 += MvBits[mb->mv[2].x+MAX_MV_EXTENT] +
- MvBits[mb->mv[2].y+MAX_MV_EXTENT];
- mb_4mv_bits_1 += 12;
- }
- if(mb->coded & 8){
- mb_4mv_bits_0 += MvBits[mb->mv[3].x+MAX_MV_EXTENT] +
- MvBits[mb->mv[3].y+MAX_MV_EXTENT];
- mb_4mv_bits_1 += 12;
- }
-
- /* We use the same opportunity cost method of estimating the
- cost of coding the motion vectors with the two different
- schemes as we do for estimating the cost of the mode
- labels. However, because there are only two schemes and
- they're both pretty simple, this can just be done inline.*/
- cost[CODE_INTER_PLUS_MV] +=
- ((OC_MINI(cpi->MVBits_0 + mb_mv_bits_0, cpi->MVBits_1+12)-
- OC_MINI(cpi->MVBits_0, cpi->MVBits_1)) << OC_BIT_SCALE);
- cost[CODE_GOLDEN_MV] +=
- ((OC_MINI(cpi->MVBits_0 + mb_gmv_bits_0, cpi->MVBits_1+12)-
- OC_MINI(cpi->MVBits_0, cpi->MVBits_1)) << OC_BIT_SCALE);
- cost[CODE_INTER_FOURMV] +=
- ((OC_MINI(cpi->MVBits_0 + mb_4mv_bits_0, cpi->MVBits_1 + mb_4mv_bits_1)-
- OC_MINI(cpi->MVBits_0, cpi->MVBits_1)) << OC_BIT_SCALE);
-
- /* train this too... because the bit cost of an MV should be
- considered in the context of LAST_MV and PRIOR_LAST. */
- cost[CODE_INTER_PLUS_MV] -= 384;
-
- /* Finally, pick the mode with the cheapest estimated bit cost.*/
- mode=0;
- for(i=1;i<8;i++)
- if(cost[i]<cost[mode])
- mode=i;
-
- /* add back such that inter/intra counting are relatively correct */
- cost[CODE_INTER_PLUS_MV] += 384;
-
- /* set MVs and mode */
- switch(mode){
- case CODE_INTER_PLUS_MV:
- mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = mb->analysis_mv[0][0];
- break;
- case CODE_INTER_LAST_MV:
- mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = last_mv;
- break;
- case CODE_INTER_PRIOR_LAST:
- mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = prior_mv;
- break;
- case CODE_INTER_FOURMV:
- break;
- case CODE_GOLDEN_MV:
- mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = mb->analysis_mv[0][1];
- break;
- default:
- mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = (mv_t){0,0};
- break;
- }
- mb->mode = mode;
+ /* Add the motion vector bits for each mode that requires them.*/
+ mb_mv_bits_0 = MvBits[mb->analysis_mv[0][0].x + MAX_MV_EXTENT] +
+ MvBits[mb->analysis_mv[0][0].y + MAX_MV_EXTENT];
+ mb_gmv_bits_0 = MvBits[mb->analysis_mv[0][1].x+MAX_MV_EXTENT] +
+ MvBits[mb->analysis_mv[0][1].y+MAX_MV_EXTENT];
+ mb_4mv_bits_0 = mb_4mv_bits_1 = 0;
+ if(mb->coded & 1){
+ mb_4mv_bits_0 += MvBits[mb->mv[0].x + MAX_MV_EXTENT] +
+ MvBits[mb->mv[0].y+MAX_MV_EXTENT];
+ mb_4mv_bits_1 += 12;
}
- }
+ if(mb->coded & 2){
+ mb_4mv_bits_0 += MvBits[mb->mv[1].x+MAX_MV_EXTENT] +
+ MvBits[mb->mv[1].y+MAX_MV_EXTENT];
+ mb_4mv_bits_1 += 12;
+ }
+ if(mb->coded & 4){
+ mb_4mv_bits_0 += MvBits[mb->mv[2].x+MAX_MV_EXTENT] +
+ MvBits[mb->mv[2].y+MAX_MV_EXTENT];
+ mb_4mv_bits_1 += 12;
+ }
+ if(mb->coded & 8){
+ mb_4mv_bits_0 += MvBits[mb->mv[3].x+MAX_MV_EXTENT] +
+ MvBits[mb->mv[3].y+MAX_MV_EXTENT];
+ mb_4mv_bits_1 += 12;
+ }
+
+ /* We use the same opportunity cost method of estimating the
+ cost of coding the motion vectors with the two different
+ schemes as we do for estimating the cost of the mode
+ labels. However, because there are only two schemes and
+ they're both pretty simple, this can just be done inline.*/
+ cost[CODE_INTER_PLUS_MV] +=
+ ((OC_MINI(cpi->MVBits_0 + mb_mv_bits_0, cpi->MVBits_1+12)-
+ OC_MINI(cpi->MVBits_0, cpi->MVBits_1)) << OC_BIT_SCALE);
+ cost[CODE_GOLDEN_MV] +=
+ ((OC_MINI(cpi->MVBits_0 + mb_gmv_bits_0, cpi->MVBits_1+12)-
+ OC_MINI(cpi->MVBits_0, cpi->MVBits_1)) << OC_BIT_SCALE);
+ cost[CODE_INTER_FOURMV] +=
+ ((OC_MINI(cpi->MVBits_0 + mb_4mv_bits_0, cpi->MVBits_1 + mb_4mv_bits_1)-
+ OC_MINI(cpi->MVBits_0, cpi->MVBits_1)) << OC_BIT_SCALE);
- if(mb->coded){
- ogg_int16_t background[64];
- ogg_int16_t dct_input[64];
- ogg_int16_t dct_output[64];
- /* Code the macroblock now, as the quantize R/D step could
- potentially decide that we didn't really want to code the
- block after all, and in that case we want to be able to
- back out. */
- /* Get DCT input */
- mb_get_dct_input(cpi, mode, fi, mv, block);
- /* Quantize */
-
- /* Code */
-
- /* Reconsider coding this MB */
-
- /* update reconstructed frame */
-
- /* Update MVs and bit tracking metrics */
+ /* train this too... because the bit cost of an MV should be
+ considered in the context of LAST_MV and PRIOR_LAST. */
+ cost[CODE_INTER_PLUS_MV] -= 384;
- switch(mode){
- case CODE_INTER_PLUS_MV:
- cpi->MVBits_0 += mb_mv_bits_0;
- cpi->MVBits_1 += 12;
- prior_mv = last_mv;
- last_mv = mb->analysis_mv[0][0];
- break;
- case CODE_INTER_LAST_MV:
- break;
- case CODE_INTER_PRIOR_LAST:
- prior_mv = last_mv;
- last_mv = mb->mv[0];
- break;
- case CODE_INTER_FOURMV:
- cpi->MVBits_0 += mb_4mv_bits_0;
- cpi->MVBits_1 += mb_4mv_bits_1;
- prior_mv = last_mv;
- last_mv = mb->mv[3]; /* if coded, it is still used forced to 0,0 according to spec */
- /* XXXX Spec doc is wrong, should use last-coded Y block vector! */
- break;
- case CODE_GOLDEN_MV:
- cpi->MVBits_0 += mb_gmv_bits_0;
- cpi->MVBits_1 += 12;
- break;
- default:
- break;
+
+ /* Finally, pick the mode with the cheapest estimated bit cost.*/
+ mode=0;
+ for(i=1;i<8;i++)
+ if(cost[i]<cost[mode])
+ mode=i;
+
+ /* add back such that inter/intra counting are relatively correct */
+ cost[CODE_INTER_PLUS_MV] += 384;
+
+ switch(mode){
+ case CODE_INTER_PLUS_MV:
+ cpi->MVBits_0 += mb_mv_bits_0;
+ cpi->MVBits_1 += 12;
+ prior_mv = last_mv;
+ last_mv = mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = mb->analysis_mv[0][0];
+ break;
+ case CODE_INTER_LAST_MV:
+ mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = last_mv;
+ break;
+ case CODE_INTER_PRIOR_LAST:
+ mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = prior_mv;
+ prior_mv = last_mv;
+ last_mv = mb->mv[0];
+ break;
+ case CODE_INTER_FOURMV:
+ cpi->MVBits_0 += mb_4mv_bits_0;
+ cpi->MVBits_1 += mb_4mv_bits_1;
+ prior_mv = last_mv;
+ last_mv = mb->mv[3]; /* if coded, it is still used forced to 0,0 according to spec */
+ break;
+ case CODE_GOLDEN_MV:
+ cpi->MVBits_0 += mb_gmv_bits_0;
+ cpi->MVBits_1 += 12;
+ mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = mb->analysis_mv[0][1];
+ break;
+ default:
+ mb->mv[0] = mb->mv[1] = mb->mv[2] = mb->mv[3] = (mv_t){0,0};
+ break;
+ }
+ oc_mode_set(cpi,mb,mode);
}
- oc_mode_count(cpi,mb,mode);
- }
- interbits += cost[mb->mode];
-
+ interbits += cost[mb->mode];
+
+ }
}
-
if(cpi->FrameType != KEY_FRAME){
More information about the commits
mailing list