📄 umc_h264_dec_decode_mb.cpp
字号:
{ case MBTYPE_FORWARD: case MBTYPE_BACKWARD: case MBTYPE_BIDIR: for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { pMVL0[j].mvx = (Ipp16s) mvxL0; pMVL0[j].mvy = (Ipp16s) mvyL0; pRefIndexL0[j] = RefIxL0; } pMVL0 += 4; pRefIndexL0 += 4; } if (bIsBSlice) { for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { pMVL1[j].mvx = (Ipp16s) mvxL1; pMVL1[j].mvy = (Ipp16s) mvyL1; pRefIndexL1[j] = RefIxL1; } pMVL1 += 4; pRefIndexL1 += 4; } } break; case MBTYPE_INTER_16x8: // store in 8 top or bottom half blocks for (i = 0; i < 2; i++) { for (j = 0; j < 4; j++) { pMVL0[j].mvx = (Ipp16s) mvxL0; pMVL0[j].mvy = (Ipp16s) mvyL0; pRefIndexL0[j] = RefIxL0; } pMVL0 += 4; pRefIndexL0 += 4; } if (bIsBSlice) { for (i = 0; i < 2; i++) { for (j = 0; j < 4; j++) { pMVL1[j].mvx = (Ipp16s) mvxL1; pMVL1[j].mvy = (Ipp16s) mvyL1; pRefIndexL1[j] = RefIxL1; } pMVL1 += 4; pRefIndexL1 += 4; } if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR) dec_refIxL1++; } block++; sboffset=8; if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR) dec_refIxL0++; dirPart = m_cur_mb.LocalMacroblockInfo->sbdir[block]; // next partition break; case MBTYPE_INTER_8x16: // store in 8 left or right half blocks for (i = 0; i < 4; i++) { for (j = 0; j < 2; j++) { pMVL0[j].mvx = (Ipp16s) mvxL0; pMVL0[j].mvy = (Ipp16s) mvyL0; pRefIndexL0[j] = RefIxL0; } pMVL0 += 4; pRefIndexL0 += 4; } if (bIsBSlice) { // store in 8 left or right half blocks for (i = 0; i < 4; i++) { for (j = 0; j < 2; j++) { pMVL1[j].mvx = (Ipp16s) mvxL1; pMVL1[j].mvy = (Ipp16s) mvyL1; pRefIndexL1[j] = RefIxL1; } pMVL1 += 4; pRefIndexL1 += 4; } if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR) dec_refIxL1++; } block++; sboffset=2; if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR) dec_refIxL0++; dirPart = m_cur_mb.LocalMacroblockInfo->sbdir[block]; // next partition break; case MBTYPE_INTER_8x8: case MBTYPE_INTER_8x8_REF0: switch (m_cur_mb.GlobalMacroblockInfo->sbtype[block>>2]) { case SBTYPE_8x8: pMVL0[0].mvx = (Ipp16s) mvxL0; pMVL0[0].mvy = (Ipp16s) mvyL0; pMVL0[1].mvx = (Ipp16s) mvxL0; pMVL0[1].mvy = (Ipp16s) mvyL0; pMVL0[4].mvx = (Ipp16s) mvxL0; pMVL0[4].mvy = (Ipp16s) mvyL0; pMVL0[4 + 1].mvx = (Ipp16s) mvxL0; pMVL0[4 + 1].mvy = (Ipp16s) mvyL0; pRefIndexL0[0] = RefIxL0; pRefIndexL0[1] = RefIxL0; pRefIndexL0[4] = RefIxL0; pRefIndexL0[4+1] = RefIxL0; if (bIsBSlice) { pMVL1[0].mvx = (Ipp16s) mvxL1; pMVL1[0].mvy = (Ipp16s) mvyL1; pMVL1[1].mvx = (Ipp16s) mvxL1; pMVL1[1].mvy = (Ipp16s) mvyL1; pMVL1[4].mvx = (Ipp16s) mvxL1; pMVL1[4].mvy = (Ipp16s) mvyL1; pMVL1[4 + 1].mvx = (Ipp16s) mvxL1; pMVL1[4 + 1].mvy = (Ipp16s) mvyL1; pRefIndexL1[0] = RefIxL1; pRefIndexL1[1] = RefIxL1; pRefIndexL1[4] = RefIxL1; pRefIndexL1[4+1] = RefIxL1; if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR) dec_refIxL1++; } if (block == 4) { sboffset += 8 - 2; } else { sboffset += 2; } block += 4; if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR) dec_refIxL0++; break; case SBTYPE_8x4: pMVL0[0].mvx = (Ipp16s) mvxL0; pMVL0[0].mvy = (Ipp16s) mvyL0; pMVL0[1].mvx = (Ipp16s) mvxL0; pMVL0[1].mvy = (Ipp16s) mvyL0; pRefIndexL0[0] = RefIxL0; pRefIndexL0[1] = RefIxL0; if (bIsBSlice) { pMVL1[0].mvx = (Ipp16s) mvxL1; pMVL1[0].mvy = (Ipp16s) mvyL1; pMVL1[1].mvx = (Ipp16s) mvxL1; pMVL1[1].mvy = (Ipp16s) mvyL1; pRefIndexL1[0] = RefIxL1; pRefIndexL1[1] = RefIxL1; } if (subblock == 1) { if (block == 4) { sboffset+=2; } else { sboffset-=2; } block += 4; subblock = 0; if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR) dec_refIxL0++; if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR) dec_refIxL1++; } else { subblock++; sboffset += 4; } break; case SBTYPE_4x8: pMVL0[0].mvx = (Ipp16s) mvxL0; pMVL0[0].mvy = (Ipp16s) mvyL0; pMVL0[4].mvx = (Ipp16s) mvxL0; pMVL0[4].mvy = (Ipp16s) mvyL0; pRefIndexL0[0] = RefIxL0; pRefIndexL0[4] = RefIxL0; if (bIsBSlice) { pMVL1[0].mvx = (Ipp16s) mvxL1; pMVL1[0].mvy = (Ipp16s) mvyL1; pMVL1[4].mvx = (Ipp16s) mvxL1; pMVL1[4].mvy = (Ipp16s) mvyL1; pRefIndexL1[0] = RefIxL1; pRefIndexL1[4] = RefIxL1; } if (subblock == 1) { if (block == 4) { sboffset += 8 - 3; } else { sboffset++; } block += 4; subblock = 0; if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR) dec_refIxL0++; if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR) dec_refIxL1++; } else { subblock++; sboffset++; } break; case SBTYPE_4x4: pMVL0[0].mvx = (Ipp16s) mvxL0; pMVL0[0].mvy = (Ipp16s) mvyL0; pRefIndexL0[0] = RefIxL0; if (bIsBSlice) { pMVL1[0].mvx = (Ipp16s) mvxL1; pMVL1[0].mvy = (Ipp16s) mvyL1; pRefIndexL1[0] = RefIxL1; } sboffset += (xyoff[block+subblock][0]>>2) + ((xyoff[block+subblock][1])>>2)*4; if (subblock == 3) { block += 4; subblock = 0; if (dirPart == D_DIR_FWD || dirPart == D_DIR_BIDIR) dec_refIxL0++; if (dirPart == D_DIR_BWD || dirPart == D_DIR_BIDIR) dec_refIxL1++; } else { subblock++; } break; case SBTYPE_DIRECT: // nothing to do except advance to next 8x8 partition if (block == 4) { sboffset += 8 - 2; } else { sboffset += 2; } block += 4; break; } // 8x8 switch sbtype if (block<16) dirPart = m_cur_mb.LocalMacroblockInfo->sbdir[block>>2]; // next partition break; } // switch mbtype } // for partCtrdone: return status;} // DecodeMotionVectors///////////////////////////////////////////////////////////////////////////////// DecodeSkipMotionVectors//// Used for computing motion vector for non-B frame SKIP macroblock. No MV// data is transmitted in the bitstream, MV from above and left are used as// MV predictors.//// Initializes MV for the MB in the non-zero case only.//// Returns true if zero MV is to be used for SKIP MB./////////////////////////////////////////////////////////////////////////////////boolH264VideoDecoder::DecodeSkipMotionVectors(){ Ipp32s pmvx, pmvy; Ipp32s mvx, mvy; Ipp32s px0, px1; Ipp32s py0, py1; Ipp8s slRefIx; // ref index, sb to the left Ipp8s saRefIx; // ref index, sb to the left bool bUseZeroMV = true; bool bAboveMVIsZero; bool bLeftMVIsZero; H264DecoderMotionVector *sl; // pointer to MV, sb to the left H264DecoderMotionVector *sa; // pointer to MV, sb above H264DecoderMotionVector *MV = m_cur_mb.MVs[0]->MotionVectors; Ipp8s *RefIndex = m_cur_mb.RefIdxs[0]->RefIdxs; /////////////////////////////////////////////////////////////////// if (m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num>=0 && m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num>=0) { // Both above and left are available sl = &m_pCurrentFrame->m_mbinfo.MV[0][m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num].MotionVectors[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].block_num]; sa = &m_pCurrentFrame->m_mbinfo.MV[0][m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num].MotionVectors[m_cur_mb.CurrentBlockNeighbours.mb_above.block_num]; slRefIx = m_pCurrentFrame->m_mbinfo.RefIdxs[0][m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num].RefIdxs[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].block_num]; saRefIx = m_pCurrentFrame->m_mbinfo.RefIdxs[0][m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num].RefIdxs[m_cur_mb.CurrentBlockNeighbours.mb_above.block_num]; px0 = sl->mvx; py0 = sl->mvy; px1 = sa->mvx; py1 = sa->mvy; if (pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo) && !GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num])) { py0 /= 2; slRefIx *=2; } if (!pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo) && GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mbs_left[0].mb_num])) { py0 *= 2; slRefIx >>=1; } if (pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo) && !GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num])) { py1 /= 2; saRefIx*=2; } if (!pGetMBFieldDecodingFlag(m_cur_mb.GlobalMacroblockInfo) && GetMBFieldDecodingFlag(m_pCurrentFrame->m_mbinfo.mbs[m_cur_mb.CurrentBlockNeighbours.mb_above.mb_num]))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -