Beispiel #1
0
		/*************************************************************************
			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;
			}
		}
Beispiel #2
0
		/*************************************************************************
			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;
		}