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

📄 wmv9_filters.c

📁 au1200 linux2.6.11 硬件解码mae驱动和maiplayer播放器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  OverlapBlockVerticalEdge : overlap vertical block edge

  Filter coefficients:
  Forward
  inner pair: [7 37 -5 -7] // 32
  outer pair: [37 0 0 -5] // 32
  Inverse
  inner pair: [-2 14 2 2] // 8
  outer pair: [14 0 0 2]  // 8
****************************************************************************************/
#define MAE_OUTER_1 ((7 * v0 + v3 + iRnd + 3) >> 3)
#define MAE_INNER_1 ((7 * v1 - v0 + v2 + v3 + 4 - iRnd) >> 3)
#define MAE_INNER_2 ((7 * v2 - v3 + v1 + v0 + iRnd + 3) >> 3)
#define MAE_OUTER_2 ((7 * v3 + v0 + 4 - iRnd) >> 3)

void MAE_g_OverlapBlockVerticalEdge (I16_WMV *pInOut, I32_WMV iStride)
{
    I32_WMV iRnd = 1;
    I32_WMV ii ;

    for ( ii = 0; ii < 8; ii++) {
        I16_WMV v0 = pInOut[-2];
        I16_WMV v1 = pInOut[-1];
        I16_WMV v2 = pInOut[0];
        I16_WMV v3 = pInOut[1];

        pInOut[-2] = MAE_OUTER_1;
        pInOut[-1] = MAE_INNER_1;
        pInOut[0] = MAE_INNER_2;
        pInOut[1] = MAE_OUTER_2;

        iRnd ^= 1;
        pInOut += iStride;
    }
}
/****************************************************************************************
  MAE_OverlapBlockHorizontalEdge : overlap horizontal block edge

  Filter coefficients:
  Forward
  inner pair: [7 37 -5 -7] // 32
  outer pair: [37 0 0 -5] // 32
  Inverse
  inner pair: [-2 14 2 2] // 8
  outer pair: [14 0 0 2]  // 8
****************************************************************************************/
const I32_WMV MAE_g_iOverlapOffset = 128;

void MAE_g_OverlapBlockHorizontalEdge ( I16_WMV *pSrcTop, I16_WMV *pSrcCurr,
                                    I32_WMV iSrcStride, U8_WMV *pDst, I32_WMV iDstStride,
                                    Bool_WMV bTop, Bool_WMV bCurrent, Bool_WMV bWindup)
{
    I32_WMV  iRnd = 1;

    I32_WMV i ;
    I32_WMV ii, jj;

    pSrcTop += 6 * iSrcStride;

    if (bTop && bCurrent) {
        for ( i = 0; i < 8; i++) {
            I16_WMV v0 = pSrcTop[i];
            I16_WMV v1 = pSrcTop[i + iSrcStride];
            I16_WMV v2 = pSrcCurr[i];
            I16_WMV v3 = pSrcCurr[i + iSrcStride];

            I32_WMV k = MAE_OUTER_1 + MAE_g_iOverlapOffset;
            pDst[i - 2 * iDstStride] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
            k = MAE_OUTER_2 + MAE_g_iOverlapOffset;
            pDst[i + iDstStride] = (k < 0) ? 0 : ((k > 255) ? 255 : k);

            k = MAE_INNER_1 + MAE_g_iOverlapOffset;
            pDst[i - iDstStride] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
            k = MAE_INNER_2 + MAE_g_iOverlapOffset;
            pDst[i] = (k < 0) ? 0 : ((k > 255) ? 255 : k);

            iRnd ^= 1;
        }

        pSrcCurr += 2 * iSrcStride;
        pDst += 2 * iDstStride;

        if (!bWindup) {
  
          for (i = 0; i < 4; i++) {
              for ( jj = 0; jj < 8; jj++) {
                  I32_WMV k = pSrcCurr[jj] + MAE_g_iOverlapOffset;
                  pDst[jj] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
              }
              pSrcCurr += iSrcStride;
              pDst += iDstStride;
          }
        } 
    }
    // remaining 2 of past
    else if (bTop) {
        pDst -= 2 * iDstStride;
        for ( ii = 0; ii < 2; ii++) {
            for ( jj = 0; jj < 8; jj++) {
                I32_WMV k = pSrcTop[jj] + MAE_g_iOverlapOffset;
                pDst[jj] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
            }
            pSrcTop += iSrcStride;
            pDst += iDstStride;
        }
    }
    // remaining 6 of current
    else if (bCurrent) {
        I32_WMV ii;
       for ( ii = 0; ii < (bWindup ? 2 : 6); ii++) {
            for ( jj = 0; jj < 8; jj++) {
                I32_WMV k = pSrcCurr[jj] + MAE_g_iOverlapOffset;
                pDst[jj] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
            }
            pSrcCurr += iSrcStride;
            pDst += iDstStride;
        }
    }
}


void MAE_DeblockSLFrame_V9 (MAE_tWMVDecInternalMember *MAE_pWMVDec,
    U8_WMV* ppxliCurrY, U8_WMV* ppxliCurrU, U8_WMV* ppxliCurrV,
    U8_WMV* puchFilter8x8RowFlagY, U8_WMV* puchFilter8x8RowFlagU, U8_WMV* puchFilter8x8RowFlagV,
    U8_WMV* puchFilter8x4RowFlagY, U8_WMV* puchFilter8x4RowFlagU, U8_WMV* puchFilter8x4RowFlagV,
    U8_WMV* puchFilter8x8ColFlagY, U8_WMV* puchFilter8x8ColFlagU, U8_WMV* puchFilter8x8ColFlagV,
    U8_WMV* puchFilter4x8ColFlagY, U8_WMV* puchFilter4x8ColFlagU, U8_WMV* puchFilter4x8ColFlagV,
    MAE_LOOPF_FLAG* pLoopFilterFlag, MAE_U32_WMV uiMBStart, MAE_U32_WMV uiMBEnd)
{
    I32_WMV i8x8OffsetY = 0;
    I32_WMV i8x8OffsetUV = 0;
    if (uiMBStart == 0)
    {
        i8x8OffsetY = 8 * MAE_pWMVDec->m_iWidthPrevY;
        i8x8OffsetUV = 8 * MAE_pWMVDec->m_iWidthPrevUV;
    }


    MAE_GenerateRowLoopFilterFlags (MAE_pWMVDec,
        puchFilter8x8RowFlagY, puchFilter8x8RowFlagU, puchFilter8x8RowFlagV,
        puchFilter8x4RowFlagY, puchFilter8x4RowFlagU, puchFilter8x4RowFlagV,
        pLoopFilterFlag, uiMBStart, uiMBEnd, uiMBStart == 0);

    MAE_GenerateColumnLoopFilterFlags (MAE_pWMVDec,
        puchFilter8x8ColFlagY, puchFilter8x8ColFlagU, puchFilter8x8ColFlagV,
        puchFilter4x8ColFlagY, puchFilter4x8ColFlagU, puchFilter4x8ColFlagV,
        pLoopFilterFlag, uiMBEnd - uiMBStart);

    MAE_DeblockRows(MAE_pWMVDec,
        ppxliCurrY + i8x8OffsetY,
        ppxliCurrU + i8x8OffsetUV,
        ppxliCurrV + i8x8OffsetUV,
        (uiMBEnd - uiMBStart) * 2 - (uiMBStart == 0),
        puchFilter8x8RowFlagY,
        puchFilter8x8RowFlagU,
        puchFilter8x8RowFlagV);

    MAE_DeblockRows(MAE_pWMVDec,
        ppxliCurrY + (4 * MAE_pWMVDec->m_iWidthPrevY),
        ppxliCurrU + (4 * MAE_pWMVDec->m_iWidthPrevUV),
        ppxliCurrV + (4 * MAE_pWMVDec->m_iWidthPrevUV),
        (uiMBEnd - uiMBStart) * 2,
        puchFilter8x4RowFlagY,
        puchFilter8x4RowFlagU,
        puchFilter8x4RowFlagV);

    MAE_DeblockColumns(MAE_pWMVDec,
        ppxliCurrY + 8,
        ppxliCurrU + 8,
        ppxliCurrV + 8,
        MAE_pWMVDec->m_uintNumMBX * 2 - 1,
        (uiMBEnd - uiMBStart) << 4,
        puchFilter8x8ColFlagY,
        puchFilter8x8ColFlagU,
        puchFilter8x8ColFlagV);

    MAE_DeblockColumns(MAE_pWMVDec,
        ppxliCurrY + 4,
        ppxliCurrU + 4,
        ppxliCurrV + 4,
        MAE_pWMVDec->m_uintNumMBX * 2,
        (uiMBEnd - uiMBStart) << 4,
        puchFilter4x8ColFlagY,
        puchFilter4x8ColFlagU,
        puchFilter4x8ColFlagV);
}

#define MAE_EXTRACT0_ROWX4(x) ((x & 0xc0) << 0)
#define MAE_EXTRACT1_ROWX4(x) ((x & 0xc0) >> 2)
#define MAE_EXTRACT2_ROWX4(x) ((x & 0xc0) >> 4)
#define MAE_EXTRACT3_ROWX4(x) ((x & 0xc0) >> 6)
#define MAE_EXTRACT0_ROWX8(x) ((x & 0xc) << 4)
#define MAE_EXTRACT1_ROWX8(x) ((x & 0xc) << 2)
#define MAE_EXTRACT2_ROWX8(x) ((x & 0xc) >> 0)
#define MAE_EXTRACT3_ROWX8(x) ((x & 0xc) >> 2)

#define MAE_EXTRACT0_COLX4(x) ((x & 0x30) << 2)
#define MAE_EXTRACT1_COLX4(x) ((x & 0x30) << 0)
#define MAE_EXTRACT2_COLX4(x) ((x & 0x30) >> 2)
#define MAE_EXTRACT3_COLX4(x) ((x & 0x30) >> 4)
#define MAE_EXTRACT0_COLX8(x) ((x & 0x3) << 6)
#define MAE_EXTRACT1_COLX8(x) ((x & 0x3) << 4)
#define MAE_EXTRACT2_COLX8(x) ((x & 0x3) << 2)
#define MAE_EXTRACT3_COLX8(x) ((x & 0x3) >> 0)

void MAE_GenerateRowLoopFilterFlags (MAE_tWMVDecInternalMember *MAE_pWMVDec,
    U8_WMV* puchFilterRowFlagY, U8_WMV* puchFilterRowFlagU, U8_WMV* puchFilterRowFlagV,
    U8_WMV* puchFilterRowFlagY2, U8_WMV* puchFilterRowFlagU2, U8_WMV* puchFilterRowFlagV2,
    MAE_LOOPF_FLAG* pLoopFilterFlag, I32_WMV iMBYStart, I32_WMV iMBYEnd, Bool_WMV bFirstRow)
{
    U8_WMV* puch8x4FilterRow0 = puchFilterRowFlagY2;
    U8_WMV* puch8x4FilterRow1 = puchFilterRowFlagY2 + ((MAE_pWMVDec->m_uintNumMBX + 1) >> 1);
    U8_WMV* puch8x8FilterRow0 = puchFilterRowFlagY;
    U8_WMV* puch8x8FilterRow1 = puchFilterRowFlagY + ((MAE_pWMVDec->m_uintNumMBX + 1) >> 1);
    U8_WMV uch8x4Flag0, uch8x4Flag1, uch8x8Flag0, uch8x8Flag1;
    U8_WMV uch8x8FlagU, uch8x8FlagV, uch8x4FlagU, uch8x4FlagV;
    I32_WMV  i4MBX, iMBY;

    uch8x4Flag0 = 0, uch8x4Flag1 = 0, uch8x8Flag0 = 0, uch8x8Flag1 = 0;

    uch8x8FlagU = 0, uch8x8FlagV = 0, uch8x4FlagU = 0, uch8x4FlagV = 0;



    if (bFirstRow)
    {
        iMBYStart = 1;
        for (i4MBX = 0; i4MBX < (I32_WMV) MAE_pWMVDec->m_uintNumMBX >> 2; i4MBX ++)
        {

            // Extract flag from pLoopFilterFlag
            uch8x4Flag0 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [0]);
            uch8x4Flag0 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [1]);
            uch8x4Flag1 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [2]);
            uch8x4Flag1 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [3]);
            uch8x8Flag0 = MAE_EXTRACT0_ROWX8(pLoopFilterFlag->chFlag [2]);
            uch8x8Flag0 |= MAE_EXTRACT1_ROWX8(pLoopFilterFlag->chFlag [3]);
            uch8x4FlagU = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [4]);
            uch8x4FlagV = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [5]);
            uch8x4Flag0 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 1)->chFlag [0]);
            uch8x4Flag0 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 1)->chFlag [1]);
            uch8x4Flag1 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 1)->chFlag [2]);
            uch8x4Flag1 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 1)->chFlag [3]);
            uch8x8Flag0 |= MAE_EXTRACT2_ROWX8((pLoopFilterFlag + 1)->chFlag [2]);
            uch8x8Flag0 |= MAE_EXTRACT3_ROWX8((pLoopFilterFlag + 1)->chFlag [3]);
            uch8x4FlagU |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 1)->chFlag [4]);
            uch8x4FlagV |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 1)->chFlag [5]);


            *puch8x4FilterRow0++ = uch8x4Flag0;
            *puch8x4FilterRow1++ = uch8x4Flag1;
            *puch8x8FilterRow0++ = uch8x8Flag0;

            uch8x4Flag0 = MAE_EXTRACT0_ROWX4((pLoopFilterFlag + 2)->chFlag [0]);
            uch8x4Flag0 |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 2)->chFlag [1]);
            uch8x4Flag1 = MAE_EXTRACT0_ROWX4((pLoopFilterFlag + 2)->chFlag [2]);
            uch8x4Flag1 |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 2)->chFlag [3]);
            uch8x8Flag0 = MAE_EXTRACT0_ROWX8((pLoopFilterFlag + 2)->chFlag [2]);
            uch8x8Flag0 |= MAE_EXTRACT1_ROWX8((pLoopFilterFlag + 2)->chFlag [3]);
            uch8x4FlagU |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 2)->chFlag [4]);
            uch8x4FlagV |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 2)->chFlag [5]);
            uch8x4Flag0 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 3)->chFlag [0]);
            uch8x4Flag0 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [1]);
            uch8x4Flag1 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 3)->chFlag [2]);
            uch8x4Flag1 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [3]);
            uch8x8Flag0 |= MAE_EXTRACT2_ROWX8((pLoopFilterFlag + 3)->chFlag [2]);
            uch8x8Flag0 |= MAE_EXTRACT3_ROWX8((pLoopFilterFlag + 3)->chFlag [3]);
            uch8x4FlagU |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [4]);
            uch8x4FlagV |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [5]);


            *puch8x4FilterRow0++ = uch8x4Flag0;
            *puch8x4FilterRow1++ = uch8x4Flag1;
            *puch8x8FilterRow0++ = uch8x8Flag0;


            *puchFilterRowFlagU2++ = uch8x4FlagU;
            *puchFilterRowFlagV2++ = uch8x4FlagV;
            pLoopFilterFlag += 4;
        }

        if (MAE_pWMVDec->m_uintNumMBX & 3)
        {
            uch8x4Flag0 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [0]);
            uch8x4Flag0 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [1]);
            uch8x4Flag1 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [2]);
            uch8x4Flag1 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [3]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -