--- motion_est.c 2003/06/19 10:06:26 1.71 +++ motion_est.c 2003/06/26 10:37:09 1.72 @@ -667,11 +667,12 @@ for(i = 0; i < 4; i++) { int s = 8*((i&1) + (i>>1)*data->iEdgedWidth); transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth); - bits += data->temp[i] = Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, i); + bits += data->temp[i] = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, i); } bits += t = BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0); + //8x8 blocks for inter4v mode if (data->temp[0] + t < data->iMinSAD[1]) { data->iMinSAD[1] = data->temp[0] + t; current[1].x = x; current[1].y = y; } if (data->temp[1] < data->iMinSAD[2]) { @@ -681,7 +682,6 @@ if (data->temp[3] < data->iMinSAD[4]) { data->iMinSAD[4] = data->temp[3]; current[4].x = x; current[4].y = y; } - bits += BITS_MULT*xvid_cbpy_tab[15-(cbp>>2)].len; if (bits >= data->iMinSAD[0]) return; @@ -693,13 +693,13 @@ //chroma U ptr = interpolate8x8_switch2(data->RefQ + 64, data->RefP[4], 0, 0, xc, yc, data->iEdgedWidth/2, data->rounding); transfer_8to16subro(in, ptr, data->CurU, data->iEdgedWidth/2); - bits += Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, 4); + bits += Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 4); if (bits >= data->iMinSAD[0]) return; //chroma V ptr = interpolate8x8_switch2(data->RefQ + 64, data->RefP[5], 0, 0, xc, yc, data->iEdgedWidth/2, data->rounding); transfer_8to16subro(in, ptr, data->CurV, data->iEdgedWidth/2); - bits += Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, 5); + bits += Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5); bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len; @@ -708,9 +708,7 @@ current[0].x = x; current[0].y = y; *dir = Direction; } - } - static void CheckCandidateBits8(const int x, const int y, const int Direction, int * const dir, const SearchData * const data) { @@ -733,7 +731,7 @@ } transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth); - bits = Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, 5); + bits = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5); bits += BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0); if (bits < data->iMinSAD[0]) { @@ -975,7 +973,7 @@ Data->iMinSAD[0] = sad; } - /* final skip decision, a.k.a. "the vector you found, really that good?" */ + // final skip decision, a.k.a. "the vector you found, really that good?" if (skip_possible && (pMB->sad16 < (int)iQuant * MAX_SAD00_FOR_SKIP)) if ( (100*sad)/(pMB->sad16+1) > FINAL_SKIP_THRESH) if (Data->chroma || SkipDecisionP(pCurrent, pRef, x, y, Data->iEdgedWidth/2, iQuant, Data->rrv)) { @@ -983,7 +981,7 @@ sad = 0; } - /* intra decision */ + // intra decision if (iQuant > 8) InterBias += 100 * (iQuant - 8); // to make high quants work if (y != 0) @@ -1089,7 +1087,7 @@ VECTOR currentMV[5]; VECTOR currentQMV[5]; int32_t iMinSAD[5]; - DECLARE_ALIGNED_MATRIX(dct_space, 2, 64, int16_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(dct_space, 3, 64, int16_t, CACHE_LINE); SearchData Data; memset(&Data, 0, sizeof(SearchData)); Data.iEdgedWidth = iEdgedWidth; @@ -2161,8 +2159,9 @@ } } -#define INTRA_THRESH 1700 -#define INTER_THRESH 1200 +#define INTRA_THRESH 2200 +#define INTER_THRESH 50 +#define INTRA_THRESH2 95 int MEanalysis( const IMAGE * const pRef, @@ -2177,8 +2176,9 @@ int sSAD = 0; MACROBLOCK * const pMBs = Current->mbs; const IMAGE * const pCurrent = &Current->image; - int IntraThresh = INTRA_THRESH, InterThresh = INTER_THRESH + 10*b_thresh; + int IntraThresh = INTRA_THRESH, InterThresh = INTER_THRESH + b_thresh; int s = 0, blocks = 0; + int complexity = 0; int32_t iMinSAD[5], temp[5]; VECTOR currentMV[5]; @@ -2190,6 +2190,7 @@ Data.temp = temp; CheckCandidate = CheckCandidate32I; + if (intraCount != 0) { if (intraCount < 10) // we're right after an I frame IntraThresh += 15* (intraCount - 10) * (intraCount - 10); @@ -2198,15 +2199,15 @@ IntraThresh -= (IntraThresh * (maxIntra - 8*(maxIntra - intraCount)))/maxIntra; } - InterThresh -= (350 - 8*b_thresh) * bCount; - if (InterThresh < 300 + 5*b_thresh) InterThresh = 300 + 5*b_thresh; + InterThresh -= 12 * bCount; + if (InterThresh < 15 + b_thresh) InterThresh = 15 + b_thresh; if (sadInit) (*sadInit) (); for (y = 1; y < pParam->mb_height-1; y += 2) { for (x = 1; x < pParam->mb_width-1; x += 2) { int i; - blocks += 4; + blocks += 10; if (bCount == 0) pMBs[x + y * pParam->mb_width].mvs[0] = zeroMV; else { //extrapolation of the vector found for last frame @@ -2221,28 +2222,28 @@ for (i = 0; i < 4; i++) { int dev; MACROBLOCK *pMB = &pMBs[x+(i&1) + (y+(i>>1)) * pParam->mb_width]; - if (pMB->sad16 > IntraThresh) { - dev = dev16(pCurrent->y + (x + (i&1) + (y + (i>>1)) * pParam->edged_width) * 16, - pParam->edged_width); - if (dev + IntraThresh < pMB->sad16) { - pMB->mode = MODE_INTRA; - if (++intra > ((pParam->mb_height-2)*(pParam->mb_width-2))/2) return I_VOP; - } + dev = dev16(pCurrent->y + (x + (i&1) + (y + (i>>1)) * pParam->edged_width) * 16, + pParam->edged_width); + + complexity += dev; + if (dev + IntraThresh < pMB->sad16) { + pMB->mode = MODE_INTRA; + if (++intra > ((pParam->mb_height-2)*(pParam->mb_width-2))/2) return I_VOP; } - if (pMB->mvs[0].x == 0 && pMB->mvs[0].y == 0) s++; + + if (pMB->mvs[0].x == 0 && pMB->mvs[0].y == 0) + if (dev > 500 && pMB->sad16 < 1000) + sSAD += 1000; sSAD += pMB->sad16; } } } + complexity >>= 7; - sSAD /= blocks; - - if (b_thresh < 20) { - s = (10*s) / blocks; - if (s > 4) sSAD += (s - 2) * (40 - 2*b_thresh); //static block - looks bad when in bframe... - } + sSAD /= complexity + 4*blocks; + if (intraCount > 12 && sSAD > INTRA_THRESH2 ) return I_VOP; if (sSAD > InterThresh ) return P_VOP; emms(); return B_VOP; @@ -2621,14 +2622,14 @@ //chroma U ptr = interpolate8x8_switch2(Data->RefQ + 64, Data->RefP[4], 0, 0, sumx, sumy, Data->iEdgedWidth/2, Data->rounding); transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2); - bits += Block_CalcBits(coeff, in, Data->iQuant, Data->quant_type, &cbp, 4); + bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4); if (bits >= *Data->iMinSAD) return bits; //chroma V ptr = interpolate8x8_switch2(Data->RefQ + 64, Data->RefP[5], 0, 0, sumx, sumy, Data->iEdgedWidth/2, Data->rounding); transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2); - bits += Block_CalcBits(coeff, in, Data->iQuant, Data->quant_type, &cbp, 5); + bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5); bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER4V & 7) | ((cbp & 3) << 3)].len; @@ -2645,7 +2646,7 @@ for(i = 0; i < 4; i++) { int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth); transfer_8to16copy(in, Data->Cur + s, Data->iEdgedWidth); - bits += Block_CalcBitsIntra(coeff, in, Data->iQuant, Data->quant_type, &cbp, i, &dc); + bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i, &dc); if (bits >= Data->iMinSAD[0]) return bits; } @@ -2654,13 +2655,13 @@ //chroma U transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2); - bits += Block_CalcBitsIntra(coeff, in, Data->iQuant, Data->quant_type, &cbp, 4, &dc); + bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, &dc); if (bits >= Data->iMinSAD[0]) return bits; //chroma V transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2); - bits += Block_CalcBitsIntra(coeff, in, Data->iQuant, Data->quant_type, &cbp, 5, &dc); + bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, &dc); bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTRA & 7) | ((cbp & 3) << 3)].len;