📄 umc_h264_sd_inlines.h
字号:
}
else if (!above_right_avail_4x4[Block->block_num])
{
Block->mb_num = -1;
}
else
{
Block->block_num-=3;
Block->mb_num = m_CurMBAddr;
}
return;
} // void H264SegmentDecoder::GetTopRightLocationForCurrentMBLumaNonMBAFF(H264DecoderBlockLocation *Block)
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block,Ipp32s AdditionalDecrement)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
Ipp32s MB_N;
//luma
if (BLOCK_IS_ON_LEFT_EDGE(Block->block_num))
{
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/4;
yN*=4;
yN-=AdditionalDecrement;
yN/=2;
Block->block_num=(yN/4)*4;
if (AdditionalDecrement)
MB_N=MB_X + 1;
else
MB_N=MB_X;
AdditionalDecrement=0;
}
}
else
{
if (xfff)
{
// 1 0 1
MB_N=MB_X + 1;
}
else
{
// 1 0 0
Ipp32u yN = Block->block_num/4;
yN*=4;
yN-=AdditionalDecrement;
yN+=16;
yN/=2;
Block->block_num=(yN/4)*4;
if (AdditionalDecrement)
MB_N=MB_X + 1;
else
MB_N=MB_X;
AdditionalDecrement=0;
}
}
}
else
{
if (curmbtf)
{
if (xfff)
{
//0 1 1
Ipp32u yN = Block->block_num/4;
yN*=4;
yN-=AdditionalDecrement;
yN*=2;
if (yN<16)
{
MB_N=MB_X;
}
else
{
yN-=16;
MB_N=MB_X + 1;
}
Block->block_num=(yN/4)*4;
AdditionalDecrement=0;
}
else
{
// 0 1 0
MB_N=MB_X;
}
}
else
{
if (xfff)
{
// 0 0 1
Ipp32u yN = Block->block_num/4;
yN*=4;
yN-=AdditionalDecrement;
yN*=2;
if (yN<15)
{
yN++;
MB_N=MB_X;
}
else
{
yN-=15;
MB_N=MB_X + 1;
}
Block->block_num=(yN/4)*4;
AdditionalDecrement=0;
}
else
{
// 0 0 0
MB_N=MB_X + 1;
}
}
}
}
else
{
Block->mb_num = -1;//no left neighbours
return;
}
Block->block_num+=3-4*AdditionalDecrement;
Block->mb_num = MB_N;
}
else
{
Block->block_num--;
Block->mb_num = m_CurMBAddr;
}
return;
} // void H264SegmentDecoder::GetLeftLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block,Ipp32s AdditionalDecrement)
inline
void H264SegmentDecoder::GetTopLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block, Ipp32s DeblockCalls)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s pair_offset = (curmbtf) ? (1) : (-1);
Ipp32s MB_X;
Ipp32s MB_N;
//luma
if (BLOCK_IS_ON_TOP_EDGE(Block->block_num))
{
if (curmbfff && !curmbtf )
{
MB_N = m_CurMBAddr + pair_offset;
Block->block_num+=12;
}
else
{
MB_X = m_cur_mb.CurrentMacroblockNeighbours.mb_B;
if (MB_X>=0)
{
Ipp8u xfff=!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]);
MB_N=MB_X;
Block->block_num+=12;
if (curmbfff || !curmbtf || xfff)
{
if (!(curmbfff && curmbtf && !xfff && DeblockCalls))
MB_N+= 1;
}
}
else
{
Block->mb_num = -1;
return;
}
}
Block->mb_num = MB_N;
return ;
}
else
{
Block->block_num-=4;
Block->mb_num = m_CurMBAddr;
return;
}
} // void H264SegmentDecoder::GetTopLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block,Ipp8u DeblockCalls)
inline
void H264SegmentDecoder::GetTopLeftLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s MB_X;
Ipp32s MB_N;
//luma
if (BLOCK_IS_ON_LEFT_EDGE(Block->block_num) && BLOCK_IS_ON_TOP_EDGE(Block->block_num))
{
if (curmbfff && !curmbtf )
{
MB_X = m_cur_mb.CurrentMacroblockNeighbours.mb_A;
if (MB_X<0)
{
Block->mb_num = -1;
return;
}
if (!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]))
{
MB_N = MB_X;
Block->block_num+=15;
}
else
{
MB_N = MB_X + 1;
Block->block_num+=7;
}
}
else
{
MB_X = m_cur_mb.CurrentMacroblockNeighbours.mb_D;
if (MB_X>=0)
{
if (curmbfff==curmbtf)
{
MB_N=MB_X + 1;
}
else
{
if (!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]))
{
MB_N=MB_X + 1;
}
else
{
MB_N=MB_X;
}
}
Block->block_num+=15;
}
else
{
Block->mb_num = -1;
return;
}
}
Block->mb_num = MB_N;
return;
}
else if (BLOCK_IS_ON_LEFT_EDGE(Block->block_num))
{
//Block->block_num-=4;
GetLeftLocationForCurrentMBLumaMBAFF(Block,1);
return;
}
else if (BLOCK_IS_ON_TOP_EDGE(Block->block_num))
{
Block->block_num--;
GetTopLocationForCurrentMBLumaMBAFF(Block,0);
return;
}
else
{
Block->block_num-=5;
Block->mb_num = m_CurMBAddr;
return;
}
} // void H264SegmentDecoder::GetTopLeftLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block)
inline
void H264SegmentDecoder::GetTopRightLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block)
{
bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo);
bool curmbtf = !(m_CurMBAddr & 1);
Ipp32s MB_X;
Ipp32s MB_N;
//luma
if (Block->block_num==3)
{
if (curmbfff && !curmbtf )
{
Block->mb_num = -1;
return;
}
else
{
MB_X = m_cur_mb.CurrentMacroblockNeighbours.mb_C;
if (MB_X>=0)
{
if (curmbfff==curmbtf)
{
MB_N=MB_X + 1;
}
else
{
if (!GetMBFieldDecodingFlag(m_gmbinfo->mbs[MB_X]))
{
MB_N=MB_X + 1;
}
else
{
MB_N=MB_X;
}
}
Block->block_num+=9;
}
else
{
Block->mb_num = -1;
return;
}
}
Block->mb_num = MB_N;
return;
}
else if ( BLOCK_IS_ON_TOP_EDGE(Block->block_num))
{
Block->block_num++;
GetTopLocationForCurrentMBLumaMBAFF(Block,0);
return;
}
else if (!above_right_avail_4x4_lin[Block->block_num])
{
Block->mb_num = -1;
return;
}
else
{
Block->block_num-=3;
Block->mb_num = m_CurMBAddr;
}
return;
} // void H264SegmentDecoder::GetTopRightLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block)
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBChromaNonMBAFFBMEH(H264DecoderBlockLocation *Block)
{
//chroma
if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num-16,1))
{
Block->block_num+=1;
Block->mb_num=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
}
else
{
Block->block_num--;
Block->mb_num=m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBChromaNonMBAFFH2(H264DecoderBlockLocation *Block)
{
//chroma
if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num-16,2))
{
Block->block_num+=1;
Block->mb_num=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
}
else
{
Block->block_num--;
Block->mb_num=m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetLeftLocationForCurrentMBChromaNonMBAFFH4(H264DecoderBlockLocation *Block)
{
//chroma
if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num-16,3))
{
Block->block_num+=3;
Block->mb_num=m_cur_mb.CurrentMacroblockNeighbours.mb_A;
}
else
{
Block->block_num--;
Block->mb_num=m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetTopLocationForCurrentMBChromaNonMBAFFBMEH(H264DecoderBlockLocation *Block)
{
//chroma
if (CHROMA_BLOCK_IS_ON_TOP_EDGE(Block->block_num-16,1))
{
Block->block_num+=2;
Block->mb_num = m_cur_mb.CurrentMacroblockNeighbours.mb_B;
}
else
{
Block->block_num-=2;
Block->mb_num = m_CurMBAddr;
}
return;
}
inline
void H264SegmentDecoder::GetTopLocationForCurrentMBChromaNonMBAFFH2(H264DecoderBlockLocation *Block)
{
//chroma
if (CHROMA_BLOCK_IS_ON_TOP_EDGE(Block->block_num-16,2))
{
Block->block_num+=6;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -