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

📄 umc_vc1_enc_deblocking.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
//                  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) 2007 Intel Corporation. All Rights Reserved.
//
//
//          VC-1 (VC1) encoder, deblocking functions
//
*/
#include "umc_defs.h"

#if defined (UMC_ENABLE_VC1_VIDEO_ENCODER)

#include "umc_vc1_enc_deblocking.h"
namespace UMC_VC1_ENCODER
{
static Ipp8u   curIndexesEx[2][2] = {
    {0,1}, //hor
    {0,2}  //ver
};
static Ipp8u   prevIndexesEx[2][2] = {
    {2,3}, //hor
    {1,3}  //ver
};
static Ipp8u   curIndexesIn[2][2] = {
    {2,3}, //hor
    {1,3}  //ver
};
static Ipp8u   prevIndexesIn[2][2] = {
    {0,1}, //hor
    {0,2}  //ver
};
void GetExternalEdge4MV_VST(VC1EncoderMBInfo *pPred, VC1EncoderMBInfo *pCur,bool bVer, Ipp8u& YFlag, Ipp8u& UFlag, Ipp8u& VFlag)
{
     sCoordinate    mvCurr    = {0,0}, mvPrev = {0,0};

     Ipp8u nCurr;
     Ipp8u nPrev;
     if (!pPred )
     {
        YFlag  = UFlag  = VFlag  = IPPVC_EDGE_ALL;
        return;
     }
     YFlag = UFlag = VFlag = 0;

     nCurr = curIndexesEx [bVer][0];
     nPrev = prevIndexesEx[bVer][0];

     //------------------ luma edge --------------------------------------------------------------------//
     if (!pPred->isIntra(nPrev) && !pCur->isIntra(nCurr))
     {
        pPred->GetMV(&mvPrev,nPrev);
        pCur->GetMV(&mvCurr,nCurr);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(nCurr,curIndexesEx [bVer][0]) && !pPred->isCoded(nPrev,prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_QUARTER_1;
            if (!pCur->isCoded(nCurr,curIndexesEx [bVer][1]) && !pPred->isCoded(nPrev,prevIndexesEx[bVer][1]))
                YFlag |= IPPVC_EDGE_QUARTER_2;
        }
     }
     nCurr = curIndexesEx [bVer][1];
     nPrev = prevIndexesEx[bVer][1];

    if (!pPred->isIntra(nPrev) && !pCur->isIntra(nCurr))
    {
        pPred->GetMV(&mvPrev,nPrev);
        pCur->GetMV (&mvCurr,nCurr);
        if  (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(nCurr,curIndexesEx [bVer][0]) && !pPred->isCoded(nPrev,prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_QUARTER_3;
            if (!pCur->isCoded(nCurr,curIndexesEx [bVer][1]) && !pPred->isCoded(nPrev,prevIndexesEx[bVer][1]))
                YFlag |= IPPVC_EDGE_QUARTER_4;
        }
    }
    //------------------- chroma edge ---------------------------------------------------------------------//

    if(!pPred->isIntra() && !pCur->isIntra())
    {
        pPred->GetMV(&mvPrev,4);
        pCur ->GetMV(&mvCurr,4);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(4,curIndexesEx [bVer][0]) && !pPred->isCoded(4,prevIndexesEx[bVer][0]))
                UFlag |= IPPVC_EDGE_HALF_1;
            if (!pCur->isCoded(4,curIndexesEx [bVer][1]) && !pPred->isCoded(4,prevIndexesEx[bVer][1]))
                UFlag |= IPPVC_EDGE_HALF_2;
            if (!pCur->isCoded(5,curIndexesEx [bVer][0]) && !pPred->isCoded(5,prevIndexesEx[bVer][0]))
                VFlag |= IPPVC_EDGE_HALF_1;
            if (!pCur->isCoded(5,curIndexesEx [bVer][1]) && !pPred->isCoded(5,prevIndexesEx[bVer][1]))
                VFlag |= IPPVC_EDGE_HALF_2;
        }
    }
    return;
}
void GetExternalEdge4MV_NOVST(VC1EncoderMBInfo *pPred, VC1EncoderMBInfo *pCur,bool bVer, Ipp8u& YFlag, Ipp8u& UFlag, Ipp8u& VFlag)
{
     sCoordinate    mvCurr    = {0,0}, mvPrev = {0,0};

     Ipp8u nCurr;
     Ipp8u nPrev;
     if (!pPred )
     {
        YFlag  = UFlag  = VFlag  = IPPVC_EDGE_ALL;
        return;
     }
     YFlag = UFlag = VFlag =  0;

     nCurr = curIndexesEx [bVer][0];
     nPrev = prevIndexesEx[bVer][0];

     //------------------ luma edge --------------------------------------------------------------------//
     if (!pPred->isIntra(nPrev) && !pCur->isIntra(nCurr))
     {
        pPred->GetMV(&mvPrev,nPrev);
        pCur->GetMV(&mvCurr,nCurr);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(nCurr,curIndexesEx [bVer][0]) && !pPred->isCoded(nPrev,prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_HALF_1;
        }
     }
     nCurr = curIndexesEx [bVer][1];
     nPrev = prevIndexesEx[bVer][1];

    if (!pPred->isIntra(nPrev) && !pCur->isIntra(nCurr))
    {
        pPred->GetMV(&mvPrev,nPrev);
        pCur->GetMV (&mvCurr,nCurr);
        if  (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(nCurr,curIndexesEx [bVer][0]) && !pPred->isCoded(nPrev,prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_HALF_2;
        }
    }
    //------------------- chroma edge ---------------------------------------------------------------------//

    if(!pPred->isIntra() && !pCur->isIntra())
    {
        pPred->GetMV(&mvPrev,4);
        pCur ->GetMV(&mvCurr,4);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(4,curIndexesEx [bVer][0]) && !pPred->isCoded(4,prevIndexesEx[bVer][0]))
                UFlag = IPPVC_EDGE_ALL;
            if (!pCur->isCoded(5,curIndexesEx [bVer][0]) && !pPred->isCoded(5,prevIndexesEx[bVer][0]))
                VFlag = IPPVC_EDGE_ALL;
        }
    }
    return;
}
void GetExternalEdge1MV_VST(VC1EncoderMBInfo *pPred, VC1EncoderMBInfo *pCur,bool bVer, Ipp8u& YFlag, Ipp8u& UFlag, Ipp8u& VFlag)
{
     sCoordinate    mvCurr    = {0,0}, mvPrev = {0,0};
     if (!pPred )
     {
        YFlag  = UFlag  = VFlag  = IPPVC_EDGE_ALL;
        return;
     }
     YFlag = UFlag = VFlag = 0;

     if (!pPred->isIntra() && !pCur->isIntra())
     {
        pPred->GetMV(&mvPrev,0);
        pCur->GetMV(&mvCurr,0);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(curIndexesEx [bVer][0],curIndexesEx [bVer][0]) && !pPred->isCoded(prevIndexesEx[bVer][0],prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_QUARTER_1;
            if (!pCur->isCoded(curIndexesEx [bVer][0],curIndexesEx [bVer][1]) && !pPred->isCoded(prevIndexesEx[bVer][0],prevIndexesEx[bVer][1]))
                YFlag |= IPPVC_EDGE_QUARTER_2;
            if (!pCur->isCoded(curIndexesEx [bVer][1],curIndexesEx [bVer][0]) && !pPred->isCoded(prevIndexesEx[bVer][1],prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_QUARTER_3;
            if (!pCur->isCoded(curIndexesEx [bVer][1],curIndexesEx [bVer][1]) && !pPred->isCoded(prevIndexesEx[bVer][1],prevIndexesEx[bVer][1]))
                YFlag |= IPPVC_EDGE_QUARTER_4;
            if (!pCur->isCoded(4,curIndexesEx [bVer][0]) && !pPred->isCoded(4,prevIndexesEx[bVer][0]))
                UFlag |= IPPVC_EDGE_HALF_1;
            if (!pCur->isCoded(4,curIndexesEx [bVer][1]) && !pPred->isCoded(4,prevIndexesEx[bVer][1]))
                UFlag |= IPPVC_EDGE_HALF_2;
            if (!pCur->isCoded(5,curIndexesEx [bVer][0]) && !pPred->isCoded(5,prevIndexesEx[bVer][0]))
                VFlag |= IPPVC_EDGE_HALF_1;
            if (!pCur->isCoded(5,curIndexesEx [bVer][1]) && !pPred->isCoded(5,prevIndexesEx[bVer][1]))
                VFlag |= IPPVC_EDGE_HALF_2;
        }
     }
    return;
}
void GetExternalEdge1MV_NOVST(VC1EncoderMBInfo *pPred, VC1EncoderMBInfo *pCur,bool bVer, Ipp8u& YFlag, Ipp8u& UFlag, Ipp8u& VFlag)
{
     sCoordinate    mvCurr    = {0,0}, mvPrev = {0,0};
     if (!pPred )
     {
        YFlag  = UFlag  = VFlag  = IPPVC_EDGE_ALL;
        return;
     }
     YFlag = UFlag = VFlag = 0;

     if (!pPred->isIntra() && !pCur->isIntra())
     {
        pPred->GetMV(&mvPrev,0);
        pCur->GetMV(&mvCurr,0);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(curIndexesEx [bVer][0],curIndexesEx [bVer][0]) && !pPred->isCoded(prevIndexesEx[bVer][0],prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_HALF_1;
            if (!pCur->isCoded(curIndexesEx [bVer][1],curIndexesEx [bVer][0]) && !pPred->isCoded(prevIndexesEx[bVer][1],prevIndexesEx[bVer][0]))
                YFlag |= IPPVC_EDGE_HALF_2;
            if (!pCur->isCoded(4,curIndexesEx [bVer][0]) && !pPred->isCoded(4,prevIndexesEx[bVer][0]))
                UFlag     = IPPVC_EDGE_ALL;
            if (!pCur->isCoded(5,curIndexesEx [bVer][0]) && !pPred->isCoded(5,prevIndexesEx[bVer][0]))
                VFlag     = IPPVC_EDGE_ALL;
        }
     }
    return;
}
//======================================Internal=================================//
//====================================only for luma==============================//

void GetInternalEdge4MV_VST(VC1EncoderMBInfo *pCur, Ipp8u& YFlagV, Ipp8u& YFlagH)
{
     sCoordinate    mvCurr    = {0,0}, mvPrev = {0,0};

     YFlagV = 0;
     YFlagH = 0;

     if (!pCur->isIntra(0) && !pCur->isIntra(1))
     {
        pCur->GetMV(&mvPrev,0);
        pCur->GetMV(&mvCurr,1);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(0,1) && !pCur->isCoded(1,0))
                YFlagV |= IPPVC_EDGE_QUARTER_1;
            if (!pCur->isCoded(0,3) && !pCur->isCoded(1,2))
                YFlagV |= IPPVC_EDGE_QUARTER_2;
        }
     }
     if (!pCur->isIntra(2) && !pCur->isIntra(3))
     {
        pCur->GetMV(&mvPrev,2);
        pCur->GetMV(&mvCurr,3);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(2,1) && !pCur->isCoded(3,0))
                YFlagV |= IPPVC_EDGE_QUARTER_3;
            if (!pCur->isCoded(2,3) && !pCur->isCoded(3,2))
                YFlagV |= IPPVC_EDGE_QUARTER_4;
        }
     }
     if (!pCur->isIntra(0) && !pCur->isIntra(2))
     {
        pCur->GetMV(&mvPrev,0);
        pCur->GetMV(&mvCurr,2);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(0,2) && !pCur->isCoded(2,0))
                YFlagH |= IPPVC_EDGE_QUARTER_1;
            if (!pCur->isCoded(0,3) && !pCur->isCoded(2,1))
                YFlagH |= IPPVC_EDGE_QUARTER_2;
        }
     }
     if (!pCur->isIntra(1) && !pCur->isIntra(3))
     {
        pCur->GetMV(&mvPrev,1);
        pCur->GetMV(&mvCurr,3);
        if (mvPrev.x == mvCurr.x && mvPrev.y == mvCurr.y)
        {
            if (!pCur->isCoded(1,2) && !pCur->isCoded(3,0))
                YFlagH |= IPPVC_EDGE_QUARTER_3;

⌨️ 快捷键说明

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