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

📄 umc_vc1_deblock_com.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2004-2007 Intel Corporation. All Rights Reserved.
//
//
//          VC-1 (VC1) decoder, deblocking
//
*/
#include "umc_defs.h"

#if defined (UMC_ENABLE_VC1_VIDEO_DECODER)

#include "umc_vc1_dec_seq.h"
#include "umc_vc1_common_defs.h"
#include "umc_vc1_dec_debug.h"

#ifdef _OWN_FUNCTION
IppStatus _own_FilterDeblockingLuma_VerEdge_VC1(Ipp8u* pSrcDst,Ipp32s pQuant, Ipp32s srcdstStep,Ipp32s EdgeDisabledFlag)
{
    IppStatus ret = ippStsNoErr;
    Ipp8u* pRPixel;
    Ipp16s p1, p2, p3, p4, p5, p6, p7, p8;
    Ipp16s a0, a1, a2, a3;
    Ipp16s clip, d;
    Ipp32s i;
    Ipp32s count;

    for (count = 0; count < 4;count++)
    {
        pRPixel = pSrcDst + 2 * srcdstStep + 4*count*srcdstStep;

        if (!(EdgeDisabledFlag & (1 << count) ))
        {

            p4 = pRPixel[-1];
            p5 = pRPixel[0];

            if (!((p4-p5)/2))
                continue;

            p1 = pRPixel[-4];
            p2 = pRPixel[-3];
            p3 = pRPixel[-2];
            p6 = pRPixel[1];
            p7 = pRPixel[2];
            p8 = pRPixel[3];

            a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;
            if (vc1_abs_16s(a0) < pQuant)
            {
                a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                if (a3 < vc1_abs_16s(a0))
                {
                    d = 5*((VC1_SIGN(a0)*a3) - a0) / 8;
                    clip = (p4 - p5)/2;
                    if (d*clip > 0)
                    {
                        if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                            d = clip;
                    }
                    else
                        d=0;
                    pRPixel[-1] = (Ipp8u)(p4 - d);
                    pRPixel[0] = (Ipp8u)(p5 + d);
                }
                else
                    continue;
            }
            else
                continue;
            pRPixel -= 2 * srcdstStep;
            for (i=4; i--; pRPixel += srcdstStep)
            {
                if (i==1)
                    continue;

                p4 = pRPixel[-1];
                p5 = pRPixel[0];

                if (!((p4-p5)/2))
                    continue;

                p1 = pRPixel[-4];
                p2 = pRPixel[-3];
                p3 = pRPixel[-2];
                p6 = pRPixel[1];
                p7 = pRPixel[2];
                p8 = pRPixel[3];

                a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;

                if (vc1_abs_16s(a0) < pQuant)
                {
                    a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                    a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                    a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                    if (a3 < vc1_abs_16s(a0))
                    {
                        d = 5*((VC1_SIGN(a0) * a3) - a0) / 8;
                        clip = (p4 - p5)/2;
                        if (d*clip > 0)
                        {
                            if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                                d = clip;
                        }
                        else
                            d=0;
                        pRPixel[-1] = (Ipp8u)(p4 - d);
                        pRPixel[0] = (Ipp8u)(p5 + d);
                    }
                }
            }
        }
    }
    return ret;
}

IppStatus _own_FilterDeblockingChroma_VerEdge_VC1(Ipp8u* pSrcDst,Ipp32s pQuant, Ipp32s srcdstStep,Ipp32s EdgeDisabledFlag)
{
    static Ipp32s EdgeTable[2] = {IPPVC_EDGE_HALF_1,IPPVC_EDGE_HALF_2};
    IppStatus ret = ippStsNoErr;
    Ipp8u* pRPixel;
    Ipp16s p1, p2, p3, p4, p5, p6, p7, p8;
    Ipp16s a0, a1, a2, a3;
    Ipp16s clip, d;
    Ipp32s i;
    Ipp32s count;

    for (count = 0; count < 2;count++)
    {

        pRPixel = pSrcDst + 2 * srcdstStep + 4*count*srcdstStep;

        if (!(EdgeDisabledFlag & (EdgeTable[count]) ))
        {

            p4 = pRPixel[-1];
            p5 = pRPixel[0];

            if (!((p4-p5)/2))
                continue;

            p1 = pRPixel[-4];
            p2 = pRPixel[-3];
            p3 = pRPixel[-2];
            p6 = pRPixel[1];
            p7 = pRPixel[2];
            p8 = pRPixel[3];

            a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;
            if (vc1_abs_16s(a0) < pQuant)
            {
                a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                if (a3 < vc1_abs_16s(a0))
                {
                    d = 5*((VC1_SIGN(a0)*a3) - a0) / 8;
                    clip = (p4 - p5)/2;
                    if (d*clip > 0)
                    {
                        if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                            d = clip;
                    }
                    else
                        d=0;
                    pRPixel[-1] = (Ipp8u)(p4 - d);
                    pRPixel[0] = (Ipp8u)(p5 + d);
                }
                else
                    continue;
            }
            else
                continue;
            pRPixel -= 2 * srcdstStep;
            for (i=4; i--; pRPixel += srcdstStep)
            {
                if (i==1)
                    continue;

                p4 = pRPixel[-1];
                p5 = pRPixel[0];

                if (!((p4-p5)/2))
                    continue;

                p1 = pRPixel[-4];
                p2 = pRPixel[-3];
                p3 = pRPixel[-2];
                p6 = pRPixel[1];
                p7 = pRPixel[2];
                p8 = pRPixel[3];

                a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;

                if (vc1_abs_16s(a0) < pQuant)
                {
                    a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                    a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                    a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                    if (a3 < vc1_abs_16s(a0))
                    {
                        d = 5*((VC1_SIGN(a0) * a3) - a0) / 8;
                        clip = (p4 - p5)/2;
                        if (d*clip > 0)
                        {
                            if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                                d = clip;
                        }
                        else
                            d=0;
                        pRPixel[-1] = (Ipp8u)(p4 - d);
                        pRPixel[0] = (Ipp8u)(p5 + d);
                    }
                }
            }
        }
    }
    return ret;
}

IppStatus _own_FilterDeblockingLuma_HorEdge_VC1(Ipp8u* pSrcDst,Ipp32s pQuant, Ipp32s srcdstStep,Ipp32s EdgeDisabledFlag)
{
    IppStatus ret = ippStsNoErr;
    Ipp8u* pRPixel;
    Ipp16s p1, p2, p3, p4, p5, p6, p7, p8;
    Ipp16s a0, a1, a2, a3;
    Ipp16s clip, d;
    Ipp32s i;
    Ipp32s count;

    for (count = 0; count < 4;count++)
    {

        pRPixel = pSrcDst + 2 + 4*count;

        if (!(EdgeDisabledFlag & (1 << count) ))
        {

            p4 = pRPixel[-1*srcdstStep];
            p5 = pRPixel[0];

            if (!((p4-p5)/2))
                continue;

            p1 = pRPixel[-4*srcdstStep];
            p2 = pRPixel[-3*srcdstStep];
            p3 = pRPixel[-2*srcdstStep];
            p6 = pRPixel[1*srcdstStep];
            p7 = pRPixel[2*srcdstStep];
            p8 = pRPixel[3*srcdstStep];

            a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;
            if (vc1_abs_16s(a0) < pQuant)
            {
                a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                if (a3 < vc1_abs_16s(a0))
                {
                    d = 5*((VC1_SIGN(a0)*a3) - a0) / 8;
                    clip = (p4 - p5)/2;
                    if (d*clip > 0)
                    {
                        if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                            d = clip;
                    }
                    else
                        d=0;
                    pRPixel[-1*srcdstStep] = (Ipp8u)(p4 - d);
                    pRPixel[0] = (Ipp8u)(p5 + d);
                }
                else
                    continue;
            }
            else
                continue;
            pRPixel -= 2;
            for (i=4; i--; pRPixel += 1)
            {
                if (i==1)
                    continue;

                p4 = pRPixel[-1*srcdstStep];
                p5 = pRPixel[0];

                if (!((p4-p5)/2))
                    continue;

                p1 = pRPixel[-4*srcdstStep];
                p2 = pRPixel[-3*srcdstStep];
                p3 = pRPixel[-2*srcdstStep];
                p6 = pRPixel[1*srcdstStep];
                p7 = pRPixel[2*srcdstStep];
                p8 = pRPixel[3*srcdstStep];

                a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;

                if (vc1_abs_16s(a0) < pQuant)
                {
                    a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                    a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                    a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                    if (a3 < vc1_abs_16s(a0))
                    {
                        d = 5*((VC1_SIGN(a0) * a3) - a0) / 8;
                        clip = (p4 - p5)/2;
                        if (d*clip > 0)
                        {
                            if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                                d = clip;
                        }
                        else
                            d=0;
                        pRPixel[-1*srcdstStep] = (Ipp8u)(p4 - d);
                        pRPixel[0] = (Ipp8u)(p5 + d);
                    }
                }
            }
        }
    }
    return ret;
}


IppStatus _own_FilterDeblockingChroma_HorEdge_VC1(Ipp8u* pSrcDst,Ipp32s pQuant, Ipp32s srcdstStep,Ipp32s EdgeDisabledFlag)
{
    IppStatus ret = ippStsNoErr;
    static Ipp32s EdgeTable[2] = {IPPVC_EDGE_HALF_1,IPPVC_EDGE_HALF_2};
    Ipp8u* pRPixel;
    Ipp16s p1, p2, p3, p4, p5, p6, p7, p8;
    Ipp16s a0, a1, a2, a3;
    Ipp16s clip, d;
    Ipp32s i;
    Ipp32s count;

    for (count = 0; count < 2;count++)
    {
        pRPixel = pSrcDst + 2 + 4*count;

        if (!(EdgeDisabledFlag & (EdgeTable[count]) ))
        {

            p4 = pRPixel[-1*srcdstStep];
            p5 = pRPixel[0];

            if (!((p4-p5)/2))
                continue;

            p1 = pRPixel[-4*srcdstStep];
            p2 = pRPixel[-3*srcdstStep];
            p3 = pRPixel[-2*srcdstStep];
            p6 = pRPixel[1*srcdstStep];
            p7 = pRPixel[2*srcdstStep];
            p8 = pRPixel[3*srcdstStep];

            a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;
            if (vc1_abs_16s(a0) < pQuant)
            {
                a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                if (a3 < vc1_abs_16s(a0))
                {
                    d = 5*((VC1_SIGN(a0)*a3) - a0) / 8;
                    clip = (p4 - p5)/2;
                    if (d*clip > 0)
                    {
                        if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                            d = clip;
                    }
                    else
                        d=0;
                    pRPixel[-1*srcdstStep] = (Ipp8u)(p4 - d);
                    pRPixel[0] = (Ipp8u)(p5 + d);
                }
                else
                    continue;
            }
            else
                continue;
            pRPixel -= 2;
            for (i=4; i--; pRPixel += 1)
            {
                if (i==1)
                    continue;

                p4 = pRPixel[-1*srcdstStep];
                p5 = pRPixel[0];

                if (!((p4-p5)/2))
                    continue;

                p1 = pRPixel[-4*srcdstStep];
                p2 = pRPixel[-3*srcdstStep];
                p3 = pRPixel[-2*srcdstStep];
                p6 = pRPixel[1*srcdstStep];
                p7 = pRPixel[2*srcdstStep];
                p8 = pRPixel[3*srcdstStep];

                a0 = (2*(p3 - p6) - 5*(p4 - p5) + 4) >> 3;

                if (vc1_abs_16s(a0) < pQuant)
                {
                    a1 = (2*(p1 - p4) - 5*(p2 - p3) + 4) >> 3;
                    a2 = (2*(p5 - p8) - 5*(p6 - p7) + 4) >> 3;
                    a3 = IPP_MIN(vc1_abs_16s(a1), vc1_abs_16s(a2));
                    if (a3 < vc1_abs_16s(a0))
                    {
                        d = 5*((VC1_SIGN(a0) * a3) - a0) / 8;
                        clip = (p4 - p5)/2;
                        if (d*clip > 0)
                        {
                            if (vc1_abs_16s(d) > vc1_abs_16s(clip))
                                d = clip;
                        }
                        else
                            d=0;
                        pRPixel[-1*srcdstStep] = (Ipp8u)(p4 - d);
                        pRPixel[0] = (Ipp8u)(p5 + d);
                    }
                }
            }
        }
    }
    return ret;
}

#endif



Ipp32s SubBlockPattern(VC1Block* _pBlk, VC1SingletonBlock* _sBlk)
{
    Ipp32s subbpattern = 0;
    if ((_sBlk->Coded ==0)&&(_pBlk->blkType < VC1_BLK_INTRA_TOP))
    {
        _pBlk->blkType = VC1_BLK_INTER8X8;
    }
    if (_sBlk->Coded ==0)
    {
        return 0;
    }

    switch (_pBlk->blkType)
    {
    case VC1_BLK_INTER4X4:
        subbpattern =  _sBlk->numCoef;
        break;

    case VC1_BLK_INTER8X4:
        if (_sBlk->numCoef & VC1_SBP_0)
        {
            subbpattern |= 0xC;
        }

        if (_sBlk->numCoef & VC1_SBP_1)
        {
            subbpattern |= 0x3;
        }
        break;

    case VC1_BLK_INTER4X8:
        if (_sBlk->numCoef & VC1_SBP_0)
        {
            subbpattern |= 0xA;
        }

        if (_sBlk->numCoef & VC1_SBP_1)
        {
            subbpattern |= 0x5;
        }
        break;

    default:
        subbpattern = 0xF;
    }
    return subbpattern;
}
#endif //UMC_ENABLE_VC1_VIDEO_DECODER

⌨️ 快捷键说明

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