📄 umc_vc1_enc_deblocking.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) 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 + -