📄 umc_h264_dec_mblevel_calc.cpp
字号:
Block->block_num--; Block->mb_num = m_CurMBAddr; } return;}void H264VideoDecoder::GetLeftLumaBlockAcrossBoundary(H264DecoderBlockLocation *Block,Ipp8s y){ if (m_CurSliceHeader.MbaffFrameFlag) { bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); bool curmbtf = !pGetMBBottomFlag(m_cur_mb.GlobalMacroblockInfo); Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A; Ipp32s MB_N=-1; Ipp32s Block_N=-1; if (MB_X>=0) { Ipp8u xfff=!GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[MB_X]); if (curmbfff) { if (curmbtf) { if (xfff) { // 1 1 1 MB_N=MB_X; Block_N = y/4; } else { // 1 1 0 Ipp32u yN = y; yN/=2; if (y&1) MB_N=MB_X + mb_width; else MB_N=MB_X; Block_N = yN/4; } } else { if (xfff) { // 1 0 1 MB_N=MB_X + mb_width; Block_N = y/4; } else { // 1 0 0 Ipp32u yN = y; yN+=16; yN/=2; if (y&1) MB_N=MB_X + mb_width; else MB_N=MB_X; Block_N=yN/4; } } } else { if (curmbtf) { if (xfff) { //0 1 1 Ipp32u yN = y; yN*=2; if (yN<16) { MB_N=MB_X; } else { yN-=16; MB_N=MB_X + mb_width; } Block_N=yN/4; } else { // 0 1 0 MB_N=MB_X; Block_N=y/4; } } else { if (xfff) { // 0 0 1 Ipp32u yN = y; if (yN<8) { yN=yN*2+1; MB_N=MB_X; } else { yN=yN*2+1-16; MB_N=MB_X + mb_width; } Block_N=yN/4; } else { // 0 0 0 MB_N=MB_X + mb_width; Block_N=y/4; } } } } Block->block_num=Block_N*4+3; Block->mb_num = MB_N; } else { Block->mb_num = m_cur_mb.CurrentMacroblockNeighbours.mb_A; Block->block_num = (y/4)*4+3; }}void H264VideoDecoder::GetLeftChromaMacroBlockAcrossBoundary(Ipp32s& mb){ if (m_CurSliceHeader.MbaffFrameFlag) { bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); bool curmbtf = !pGetMBBottomFlag(m_cur_mb.GlobalMacroblockInfo); Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A; Ipp32s MB_N=-1; if (MB_X>=0) { Ipp8u xfff=!GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[MB_X]); if (curmbfff) { if (curmbtf) { if (xfff) { // 1 1 1 MB_N=MB_X; } else { // 1 1 0 if (mb&1) MB_N=MB_X + mb_width; else MB_N=MB_X; } } else { if (xfff) { // 1 0 1 MB_N=MB_X + mb_width; } else { // 1 0 0 if (mb&1) MB_N=MB_X + mb_width; else MB_N=MB_X; } } } else { if (curmbtf) { if (xfff) { //0 1 1 if (mb<4) { MB_N=MB_X; } else { MB_N=MB_X + mb_width; } } else { // 0 1 0 MB_N=MB_X; } } else { if (xfff) { // 0 0 1 if (mb<4) { MB_N=MB_X; } else { MB_N=MB_X + mb_width; } } else { // 0 0 0 MB_N=MB_X + mb_width; } } } } mb = MB_N; } else { mb = m_cur_mb.CurrentMacroblockNeighbours.mb_A; }}void H264VideoDecoder::GetLeftLocationForCurrentMBChromaMBAFF(H264DecoderBlockLocation *Block){ bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); bool curmbtf = !pGetMBBottomFlag(m_cur_mb.GlobalMacroblockInfo); //Ipp32s mb_width = m_pCurrentFrame->macroBlockSize().width; Ipp32s MB_X=m_cur_mb.CurrentMacroblockNeighbours.mb_A; Ipp32s MB_N; //chroma if (CHROMA_BLOCK_IS_ON_LEFT_EDGE(Block->block_num)) { Ipp32u dec_value=16; if (Block->block_num>=20) dec_value=20; Block->block_num-=dec_value; if (MB_X>=0) //left mb addr vaild? { Ipp8u xfff=!GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.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+mb_width; } 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+mb_width; } 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 + mb_width; } Block->block_num=(yN/4)*2+xN; } else { // 0 0 0 MB_N=MB_X + mb_width; } } } } else { Block->mb_num = -1;//no left neighbours return; } Block->block_num+=dec_value; Block->block_num+=1; Block->mb_num = MB_N; } else { Block->block_num--; Block->mb_num = m_CurMBAddr; } return;}void H264VideoDecoder::GetTopLocationForCurrentMBLumaNonMBAFF(H264DecoderBlockLocation *Block){ //luma if (BLOCK_IS_ON_TOP_EDGE(Block->block_num)) { Block->block_num+=12; Block->mb_num = m_cur_mb.CurrentMacroblockNeighbours.mb_B; } else { Block->block_num-=4; Block->mb_num = m_CurMBAddr; } return;}void H264VideoDecoder::GetTopLocationForCurrentMBChromaNonMBAFF(H264DecoderBlockLocation *Block){ //chroma if (CHROMA_BLOCK_IS_ON_TOP_EDGE(Block->block_num)) { Block->block_num+=2; Block->mb_num = m_cur_mb.CurrentMacroblockNeighbours.mb_B; } else { Block->block_num-=2; Block->mb_num = m_CurMBAddr; } return;}void H264VideoDecoder::GetTopLocationForCurrentMBLumaMBAFF(H264DecoderBlockLocation *Block,Ipp8u DeblockCalls){ bool curmbfff = !pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo); bool curmbtf = !pGetMBBottomFlag(m_cur_mb.GlobalMacroblockInfo); //Ipp32s mb_width = m_pCurrentFrame->macroBlockSize().width; Ipp32s pair_offset = curmbtf? mb_width:-mb_width; 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_pCurrentFrame->m_mbinfo.mbs[MB_X]); MB_N=MB_X; Block->block_num+=12; if (curmbfff || !curmbtf || xfff) { if (!(curmbfff && curmbtf && !xfff && DeblockCalls)) MB_N+= mb_width; } } else { Block->mb_num = -1; return; } } Block->mb_num = MB_N;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -