📄 umc_h264_sd_inlines.h
字号:
Block->mb_num = m_cur_mb.CurrentMacroblockNeighbours.mb_B;
}
else
{
Block->block_num-=2;
Block->mb_num = m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetTopLocationForCurrentMBChromaNonMBAFFH4(H264DecoderBlockLocation *Block)
{
//chroma
if (CHROMA_BLOCK_IS_ON_TOP_EDGE(Block->block_num-16,3))
{
Block->block_num+=12;
Block->mb_num = m_cur_mb.CurrentMacroblockNeighbours.mb_B;
}
else
{
Block->block_num-=4;
Block->mb_num = m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBChromaMBAFFBMEH(H264DecoderBlockLocation *Block)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
Ipp32s MB_N;
Block->block_num-=16;
//chroma
if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num,1))
{
if (MB_X>=0) //left mb addr vaild?
{
Ipp8u xfff=!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]);
if (curmbfff)
{
if (curmbtf)
{
if (xfff)
{
// 1 1 1
MB_N=MB_X;
}
else
{
// 1 1 0
Ipp32u yN = Block->block_num/2, xN=Block->block_num%2;
yN/=2;
Block->block_num=yN*2+xN;
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 1 0 1
MB_N=MB_X+1;
}
else
{
// 1 0 0
Ipp32u yN = Block->block_num/2, xN=Block->block_num%2;
yN+=2;
yN/=2;
Block->block_num=yN*2+xN;
MB_N=MB_X;
}
}
}
else
{
if (curmbtf)
{
if (xfff)
{
//0 1 1
Ipp32u yN = Block->block_num/2, xN=Block->block_num%2;
if (yN<1)
{
yN*=2;
MB_N=MB_X;
}
else
{
yN*=2;
yN-=2;
MB_N=MB_X+1;
}
Block->block_num=yN*2+xN;
}
else
{
// 0 1 0
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 0 0 1
Ipp32u yN = Block->block_num/2, xN=Block->block_num%2;
if (yN<1)
{
yN*=8;
yN++;
MB_N=MB_X;
}
else
{
yN*=8;
yN-=7;
MB_N=MB_X + 1;
}
Block->block_num=(yN/4)*2+xN;
}
else
{
// 0 0 0
MB_N=MB_X + 1;
}
}
}
}
else
{
Block->mb_num = -1;//no left neighbours
return;
}
Block->block_num+=16;
Block->block_num+=1;
Block->mb_num = MB_N;
}
else
{
Block->block_num+=16;
Block->block_num--;
Block->mb_num = m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBChromaMBAFFH2(H264DecoderBlockLocation *Block)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
Ipp32s MB_N;
Block->block_num-=16;
//chroma
if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num,2))
{
if (MB_X>=0)
{
Ipp8u xfff=!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]);
if (curmbfff)
{
if (curmbtf)
{
if (xfff)
{
// 1 1 1
MB_N=MB_X;
}
else
{
// 1 1 0
Ipp32u yN = Block->block_num/2;
yN/=2;
Block->block_num = yN*2;
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 1 0 1
MB_N=MB_X + 1;
}
else
{
// 1 0 0
Ipp32u yN = Block->block_num/2;
yN*=4;
yN+=16;
yN/=2;
Block->block_num=(yN/4)*2;
MB_N=MB_X;
}
}
}
else
{
if (curmbtf)
{
if (xfff)
{
//0 1 1
Ipp32u yN = Block->block_num/2;
yN*=4;
yN*=2;
if (yN<16)
{
MB_N=MB_X;
}
else
{
yN-=16;
MB_N=MB_X + 1;
}
Block->block_num=(yN/4)*2;
}
else
{
// 0 1 0
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 0 0 1
Ipp32u yN = Block->block_num/2;
yN*=4;
yN*=2;
if (yN<16)
{
yN++;
MB_N=MB_X;
}
else
{
yN-=15;
MB_N=MB_X + 1;
}
Block->block_num=(yN/4)*2;
}
else
{
// 0 0 0
MB_N=MB_X + 1;
}
}
}
}
else
{
Block->mb_num = -1;//no left neighbours
return;
}
Block->block_num+=16;
Block->block_num++;
Block->mb_num = MB_N;
}
else
{
Block->block_num+=16;
Block->block_num++;
Block->mb_num = m_CurMBAddr;
}
}
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBChromaMBAFFH4(H264DecoderBlockLocation *Block)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
Ipp32s MB_N;
Block->block_num-=16;
//chroma
if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num,3))
{
if (MB_X>=0) //left mb addr vaild?
{
Ipp8u xfff=!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]);
if (curmbfff)
{
if (curmbtf)
{
if (xfff)
{
// 1 1 1
MB_N=MB_X;
}
else
{
// 1 1 0
Ipp32u yN = Block->block_num/4;
yN/=2;
Block->block_num=yN*4;
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 1 0 1
MB_N=MB_X+1;
}
else
{
// 1 0 0
Ipp32u yN = Block->block_num/4;
yN+=16;
yN/=2;
Block->block_num=yN*4;
MB_N=MB_X;
}
}
}
else
{
if (curmbtf)
{
if (xfff)
{
//0 1 1
Ipp32u yN = Block->block_num/4;
if (yN<1)
{
yN*=2;
MB_N=MB_X;
}
else
{
yN*=2;
yN-=4;
MB_N=MB_X+1;
}
Block->block_num=yN*4;
}
else
{
// 0 1 0
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 0 0 1
Ipp32u yN = Block->block_num/2;
if (yN<1)
{
yN*=8;
yN++;
MB_N=MB_X;
}
else
{
yN*=8;
yN-=15;
MB_N=MB_X + 1;
}
Block->block_num=(yN/4)*4;
}
else
{
// 0 0 0
MB_N=MB_X + 1;
}
}
}
}
else
{
Block->mb_num = -1;//no left neighbours
return;
}
Block->block_num+=16;
Block->mb_num = MB_N;
}
else
{
Block->block_num+=16;
Block->block_num--;
Block->mb_num = m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetTopLocationForCurrentMBChromaMBAFFBMEH(H264DecoderBlockLocation *Block)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s pair_offset = curmbtf? 1:-1;
Ipp32s MB_X;
Ipp32s MB_N;
//chroma
if (CHROMA_BLOCK_IS_ON_TOP_EDGE(Block->block_num-16,1))
{
if (curmbfff && !curmbtf )
{
MB_N = m_CurMBAddr + pair_offset;
Block->block_num+=2;
}
else
{
MB_X = m_cur_mb.CurrentMacroblockNeighbours.mb_B;
if (MB_X>=0)
{
Ipp8u xfff=!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]);
if (!curmbfff && curmbtf && !xfff)
{
MB_N=MB_X;
Block->block_num+=2;
}
else
{
//if (!curmbff && curmbtf && xfff)
// Block->block_num+=0;
//else
Block->block_num+=2;
MB_N=MB_X + 1;
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -