⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmv9_filters.c

📁 au1200 linux2.6.11 硬件解码mae驱动和maiplayer播放器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -