📄 wmv9_filters.c
字号:
for (iCol = 0; iCol < (iNumCols >> 1); iCol ++)
{
pCurr = ppxliV + iCol * 8;
for (iY = 0; iY < ((iHeight >> 1) + 31) >> 5; iY ++)
{
uchFlag = *puchFilterFlag ++;
MAE_FilterColumn (MAE_pWMVDec, pCurr, (U8_WMV)(uchFlag >> 4), MAE_pWMVDec->m_iWidthPrevUV, MAE_pWMVDec->m_iStepSize);
MAE_FilterColumn (MAE_pWMVDec, pCurr + 16 * MAE_pWMVDec->m_iWidthPrevUV, (U8_WMV)(uchFlag & 0xf), MAE_pWMVDec->m_iWidthPrevUV, MAE_pWMVDec->m_iStepSize);
pCurr += (32 * MAE_pWMVDec->m_iWidthPrevUV);
}
}
}
void MAE_FilterRow (MAE_tWMVDecInternalMember *MAE_pWMVDec, U8_WMV* pRow, U8_WMV uchBitField, I32_WMV iPitch, I32_WMV iStepSize)
{
// assert (!(uchBitField & 0xf0));
switch (uchBitField)
{
case 0:
break;
case 1:
MAE_g_FilterHorizontalEdgeV9(pRow + 12, iPitch, iStepSize, 4);
break;
case 2:
MAE_g_FilterHorizontalEdgeV9(pRow + 8, iPitch, iStepSize, 4);
break;
case 3:
MAE_g_FilterHorizontalEdgeV9(pRow + 8, iPitch, iStepSize, 8);
break;
case 4:
MAE_g_FilterHorizontalEdgeV9(pRow + 4, iPitch, iStepSize, 4);
break;
case 5:
MAE_g_FilterHorizontalEdgeV9(pRow + 4, iPitch, iStepSize, 4);
MAE_g_FilterHorizontalEdgeV9(pRow + 12, iPitch, iStepSize, 4);
break;
case 6:
MAE_g_FilterHorizontalEdgeV9(pRow + 4, iPitch, iStepSize, 8);
break;
case 7:
MAE_g_FilterHorizontalEdgeV9(pRow + 4, iPitch, iStepSize, 12);
break;
case 8:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 4);
break;
case 9:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 4);
MAE_g_FilterHorizontalEdgeV9(pRow + 12, iPitch, iStepSize, 4);
break;
case 10:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 4);
MAE_g_FilterHorizontalEdgeV9(pRow + 8, iPitch, iStepSize, 4);
break;
case 11:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 4);
MAE_g_FilterHorizontalEdgeV9(pRow + 8, iPitch, iStepSize, 8);
break;
case 12:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 8);
break;
case 13:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 8);
MAE_g_FilterHorizontalEdgeV9(pRow + 12, iPitch, iStepSize, 4);
break;
case 14:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 12);
break;
case 15:
MAE_g_FilterHorizontalEdgeV9(pRow, iPitch, iStepSize, 16);
break;
}
}
void MAE_FilterColumn (MAE_tWMVDecInternalMember *MAE_pWMVDec, U8_WMV* pCol, U8_WMV uchBitField, I32_WMV iPitch, I32_WMV iStepSize)
{
//assert (!(uchBitField & 0xf0));
switch (uchBitField)
{
case 0:
break;
case 1:
MAE_g_FilterVerticalEdgeV9(pCol + 12 * iPitch, iPitch, iStepSize, 4);
break;
case 2:
MAE_g_FilterVerticalEdgeV9(pCol + 8 * iPitch, iPitch, iStepSize, 4);
break;
case 3:
MAE_g_FilterVerticalEdgeV9(pCol + 8 * iPitch, iPitch, iStepSize, 8);
break;
case 4:
MAE_g_FilterVerticalEdgeV9(pCol + 4 * iPitch, iPitch, iStepSize, 4);
break;
case 5:
MAE_g_FilterVerticalEdgeV9(pCol + 4 * iPitch, iPitch, iStepSize, 4);
MAE_g_FilterVerticalEdgeV9(pCol + 12 * iPitch, iPitch, iStepSize, 4);
break;
case 6:
MAE_g_FilterVerticalEdgeV9(pCol + 4 * iPitch, iPitch, iStepSize, 8);
break;
case 7:
MAE_g_FilterVerticalEdgeV9(pCol + 4 * iPitch, iPitch, iStepSize, 12);
break;
case 8:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 4);
break;
case 9:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 4);
MAE_g_FilterVerticalEdgeV9(pCol + 12 * iPitch, iPitch, iStepSize, 4);
break;
case 10:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 4);
MAE_g_FilterVerticalEdgeV9(pCol + 8 * iPitch, iPitch, iStepSize, 4);
break;
case 11:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 4);
MAE_g_FilterVerticalEdgeV9(pCol + 8 * iPitch, iPitch, iStepSize, 8);
break;
case 12:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 8);
break;
case 13:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 8);
MAE_g_FilterVerticalEdgeV9(pCol + 12 * iPitch, iPitch, iStepSize, 4);
break;
case 14:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 12);
break;
case 15:
MAE_g_FilterVerticalEdgeV9(pCol, iPitch, iStepSize, 16);
break;
}
}
static I32_WMV MAE_s_iNextPixel[4] = {-2, 1, 2, 1};
void MAE_g_FilterHorizontalEdgeV9(U8_WMV* pV5, I32_WMV iPixelDistance, I32_WMV iStepSize,
I32_WMV iNumPixel)
{
I32_WMV i, j;
// Filter horizontal line
for ( j = 0; j < iNumPixel >> 2; j ++) {
pV5 += 2;
for ( i = 0; i < 4; i++) {
I32_WMV v1, v2, v3, v4, v5, v6, v7, v8;
I32_WMV v4_v5, a30, absA30;
U8_WMV *pVtmp = pV5;
v5 = *pV5;
pVtmp -= iPixelDistance;
v4 = *pVtmp;
pVtmp -= iPixelDistance;
v3 = *pVtmp;
pVtmp -= iPixelDistance;
v2 = *pVtmp;
pVtmp -= iPixelDistance;
v1 = *pVtmp;
pVtmp = pV5 + iPixelDistance;
v6 = *pVtmp;
pVtmp += iPixelDistance;
v7 = *pVtmp;
pVtmp += iPixelDistance;
v8 = *pVtmp;
v4_v5 = v4 - v5;
a30 = (2*(v3-v6) - 5*v4_v5 + 4) >> 3;
absA30 = abs(a30);
if (absA30 < iStepSize) {
I32_WMV v2_v3 = v2 - v3;
I32_WMV v6_v7 = v6 - v7;
I32_WMV a31 = (2 * (v1-v4) - 5 * v2_v3 + 4) >> 3;
I32_WMV a32 = (2 * (v5-v8) - 5 * v6_v7 + 4) >> 3;
I32_WMV iMina31_a32 = mae_min(abs(a31),abs(a32));
if (iMina31_a32 < absA30){
I32_WMV a, c;
c = v4_v5/2;
if (0 < c) {
if (a30 < 0) {
I32_WMV dA30;
dA30 = absA30 - iMina31_a32 ; // > 0
a = (5 * dA30) >> 3; // >= 0
if (a > c){
a = c;
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=11");
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=10");
*(pV5 - iPixelDistance) = v4 - a;
*(pV5) = v5 + a;
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=9");
} else if (c < 0) {
if (a30 >= 0) {
I32_WMV dA30;
dA30 = iMina31_a32 - absA30; // < 0
a = (5 * dA30 + 7) >> 3; // <= 0
if (a < c) {
a = c;
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=8");
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=7");
*(pV5 - iPixelDistance) = v4 - a;
*(pV5) = v5 + a;
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=6");
}
else if (i == 0)
{
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=5");
pV5 += 2;
break;
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=4");
}
else if (i == 0)
{
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=3");
pV5 += 2;
break;
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=2");
}
else if (i == 0)
{
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=1");
pV5 += 2;
break;
}
else
fcov_coverage_point_hit("WMV9_smoothing_FilterHorizontalEdgeV9/branch=0");
pV5 += MAE_s_iNextPixel[i];
}
}
}
void MAE_g_FilterVerticalEdgeV9 (U8_WMV* pVhstart, I32_WMV iPixelDistance, I32_WMV iStepSize,
I32_WMV iNumPixel)
{
U8_WMV *pVh;
I32_WMV i, j;
for (j = 0; j < iNumPixel >> 2; j++)
{
// Filter vertical line
pVhstart += (iPixelDistance*2);
for (i = 0; i < 4; ++i) {
I32_WMV v1, v2, v3, v4, v5, v6, v7, v8;
I32_WMV v4_v5, a30, absA30;
pVh = pVhstart;
v1 = pVh[1];
v2 = pVh[2];
v3 = pVh[3];
v4 = pVh[4];
v5 = pVh[5];
v6 = pVh[6];
v7 = pVh[7];
v8 = pVh[8];
v4_v5 = v4 - v5;
a30 = (2*(v3-v6) - 5*v4_v5 + 4) >> 3;
absA30 = abs(a30);
if (absA30 < iStepSize) {
I32_WMV v2_v3 = v2 - v3;
I32_WMV v6_v7 = v6 - v7;
I32_WMV a31 = (2 * (v1-v4) - 5 * v2_v3 + 4) >> 3;
I32_WMV a32 = (2 * (v5-v8) - 5 * v6_v7 + 4) >> 3;
I32_WMV iMina31_a32 = mae_min(abs(a31),abs(a32));
if (iMina31_a32 < absA30){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -