/************************************************************************* UpdateModelMB : update adaptive model at end of macroblock (for lowest resolution only) *************************************************************************/ private static void UpdateModelMB(COLORFORMAT cf, int iChannels, int[] iLaplacianMean, CAdaptiveModel pModel) { iLaplacianMean[0] *= Constant.aWeight0[pModel.m_band - CAdaptiveModel.BAND.BAND_DC]; if (cf == COLORFORMAT.YUV_420) { iLaplacianMean[1] *= Constant.aWeight2[pModel.m_band - CAdaptiveModel.BAND.BAND_DC]; } else if (cf == COLORFORMAT.YUV_422) { iLaplacianMean[1] *= Constant.aWeight2[3 + (pModel.m_band) - CAdaptiveModel.BAND.BAND_DC]; } else { iLaplacianMean[1] *= Constant.aWeight1[pModel.m_band - CAdaptiveModel.BAND.BAND_DC][iChannels - 1]; if (pModel.m_band == CAdaptiveModel.BAND.BAND_AC) iLaplacianMean[1] >>= 4; } for (int j = 0; j < 2; j++) { int iLM = iLaplacianMean[j]; int iMS = pModel.m_iFlcState[j]; int iDelta = (iLM - Constant.MODELWEIGHT) >> 2; if (iDelta <= -8) { iDelta += 4; if (iDelta < -16) iDelta = -16; iMS += iDelta; if (iMS < -8) { if (pModel.m_iFlcBits[j] == 0) iMS = -8; else { iMS = 0; pModel.m_iFlcBits[j]--; } } } else if (iDelta >= 8) { iDelta -= 4; if (iDelta > 15) iDelta = 15; iMS += iDelta; if (iMS > 8) { if (pModel.m_iFlcBits[j] >= 15) { pModel.m_iFlcBits[j] = 15; iMS = 8; } else { iMS = 0; pModel.m_iFlcBits[j]++; } } } pModel.m_iFlcState[j] = iMS; if (cf == COLORFORMAT.Y_ONLY) break; } }
/************************************************************************* UpdateModelMB : update adaptive model at end of macroblock (for lowest resolution only) *************************************************************************/ private static void UpdateModelMB(int[] iLaplacianMean, CAdaptiveModel pModel) { iLaplacianMean[0] *= Constant.aWeight0[pModel.m_band - CAdaptiveModel.BAND.BAND_DC]; iLaplacianMean[1] *= Constant.aWeight1[pModel.m_band - CAdaptiveModel.BAND.BAND_DC][0]; if (pModel.m_band == CAdaptiveModel.BAND.BAND_AC) { iLaplacianMean[1] >>= 4; } int j = 0; int iLM = iLaplacianMean[j]; int iMS = pModel.m_iFlcState[j]; int iDelta = (iLM - Constant.MODELWEIGHT) >> 2; if (iDelta <= -8) { iDelta += 4; if (iDelta < -16) iDelta = -16; iMS += iDelta; if (iMS < -8) { if (pModel.m_iFlcBits[j] == 0) iMS = -8; else { iMS = 0; pModel.m_iFlcBits[j]--; } } } else if (iDelta >= 8) { iDelta -= 4; if (iDelta > 15) iDelta = 15; iMS += iDelta; if (iMS > 8) { if (pModel.m_iFlcBits[j] >= 15) { pModel.m_iFlcBits[j] = 15; iMS = 8; } else { iMS = 0; pModel.m_iFlcBits[j]++; } } } pModel.m_iFlcState[j] = iMS; }