--- trunk/xvidcore/src/prediction/mbprediction.c 2002/06/12 20:38:41 195 +++ trunk/xvidcore/src/prediction/mbprediction.c 2002/07/03 12:32:50 254 @@ -42,6 +42,7 @@ * * * Revision history: * * * + * 29.06.2002 predict_acdc() bounding * * 12.12.2001 improved calc_acdc_prediction; removed need for memcpy * * 15.12.2001 moved pmv displacement to motion estimation * * 30.11.2001 mmx cbp support * @@ -90,8 +91,11 @@ int16_t qcoeff[64], uint32_t current_quant, int32_t iDcScaler, - int16_t predictors[8]) + int16_t predictors[8], + const int bound) + { + const int mbpos = (y * mb_width) + x; int16_t *left, *top, *diag, *current; int32_t left_quant = current_quant; @@ -111,7 +115,7 @@ // left macroblock - if (x && + if (x && mbpos >= bound + 1 && (pMBs[index - 1].mode == MODE_INTRA || pMBs[index - 1].mode == MODE_INTRA_Q)) { @@ -121,7 +125,7 @@ } // top macroblock - if (y && + if (mbpos >= bound + (int)mb_width && (pMBs[index - mb_width].mode == MODE_INTRA || pMBs[index - mb_width].mode == MODE_INTRA_Q)) { @@ -130,7 +134,7 @@ } // diag macroblock - if (x && y && + if (x && mbpos >= bound + (int)mb_width + 1 && (pMBs[index - 1 - mb_width].mode == MODE_INTRA || pMBs[index - 1 - mb_width].mode == MODE_INTRA_Q)) { @@ -241,6 +245,8 @@ int16_t *pCurrent = pMB->pred_values[block]; uint32_t i; + DPRINTF(DPRINTF_COEFF,"predictor[0] %i", predictors[0]); + dct_codes[0] += predictors[0]; // dc prediction pCurrent[0] = dct_codes[0] * iDcScaler; @@ -248,6 +254,8 @@ for (i = 1; i < 8; i++) { int level = dct_codes[i] + predictors[i]; + DPRINTF(DPRINTF_COEFF,"predictor[%i] %i",i, predictors[i]); + dct_codes[i] = level; pCurrent[i] = level; pCurrent[i + 7] = dct_codes[i * 8]; @@ -255,6 +263,7 @@ } else if (acpred_direction == 2) { for (i = 1; i < 8; i++) { int level = dct_codes[i * 8] + predictors[i]; + DPRINTF(DPRINTF_COEFF,"predictor[%i] %i",i*8, predictors[i]); dct_codes[i * 8] = level; pCurrent[i + 7] = level; @@ -379,7 +388,7 @@ iDcScaler = get_dc_scaler(iQuant, (j < 4) ? 1 : 0); predict_acdc(frame->mbs, x, y, mb_width, j, &qcoeff[j * 64], - iQuant, iDcScaler, predictors[j]); + iQuant, iDcScaler, predictors[j], 0); S += calc_acdc(pMB, j, &qcoeff[j * 64], iDcScaler, predictors[j]);