📄 slicemae.c
字号:
else { iYSpec = 1; // Bi-directional pMV[0] = ( ((decoder->other_x << 16) & 0xFFFF0000) | ((decoder->other_y) & 0x0000FFFF) ); pMV[1] = ( ((decoder->other_x1 << 16) & 0xFFFF0000) | ((decoder->other_y1) & 0x0000FFFF) ); pMV[2] = ( ((decoder->f_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[0][1]>>iYSpec) & 0x0000FFFF) ); pMV[3] = ( ((decoder->f_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[0][1]>>iYSpec) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->other_x/iXShift) << 16) & 0xFFFF0000) | (((decoder->other_y)/iYShift) & 0x0000FFFF) ); pMV[5] = ( ((decoder->f_motion.pmv[0][0]/iXShift << 16) & 0xFFFF0000) | ( ((decoder->f_motion.pmv[0][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); pMV[6] = ( (( (decoder->other_x1/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->other_y1)/iYShift) & 0x0000FFFF) ); pMV[7] = ( ((decoder->f_motion.pmv[0][0]/iXShift << 16) & 0xFFFF0000) | ( ((decoder->f_motion.pmv[0][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); } return uiNumMVs;}uint32 initialize_mcomp_motion_vectors_zero (wrap_context *pWrapContext, mpeg2_decoder_t * decoder, int macroblock_modes){ int iBottomField; uint32 uiNumMVs = 0; header_words *pHeader; uint32 *pMV; uint32 *pWrapMB; if (!pWrapContext) return 0; pHeader = &local_header;//pWrapContext->pHeader; /* Get a pointer to the motion vectors */ pWrapMB = pWrapContext->pMB; //pMV = pWrapContext->pMV = WRAPSKIPMVS(pWrapMB, (decoder->bInterMatrixChanged ? 2 : 0), 0); pMV = pWrapContext->pMV;; // MacroBlock mode pHeader->header_word2.mbmode = MBMODE_FWD_ALL_420; // initialize to 1 // i.e use TOP field pointers pHeader->header_word3.fp = pHeader->header_word3.ft = pHeader->header_word3.fb = pHeader->header_word3.bt = pHeader->header_word3.bb = 1; // DCT type if (macroblock_modes & DCT_TYPE_INTERLACED) pHeader->header_word3.dctt = MAE_DCT_TYPE_FIELD; else pHeader->header_word3.dctt = MAE_DCT_TYPE_FRAME; // mbtype pHeader->header_word3.mbtype = MBT_16x16; iBottomField = (decoder->picture_structure == BOTTOM_FIELD); if (decoder->picture_structure != FRAME_PICTURE) { pHeader->header_word3.ft = pHeader->header_word3.fb = iBottomField ? 0 : 1; pHeader->header_word3.bt = pHeader->header_word3.bb = iBottomField ? 0 : 1; // enable field prediction pHeader->header_word3.fp = MAE_FIELD_PREDICTION; } else { // enable frame prediction pHeader->header_word3.fp = MAE_FRAME_PREDICTION; } switch(pHeader->header_word3.mbtype) { case MBT_16x8: if (pHeader->header_word2.mbmode == MBMODE_BID_ALL_420) { uiNumMVs = 8; } else { // FWD or BWD uiNumMVs = 6; } break; case MBT_16x16: if (pHeader->header_word2.mbmode == MBMODE_BID_ALL_420) { uiNumMVs = 6; } else { // FWD or BWD uiNumMVs = 5; } break; } // LUMA motion vectors // SPECIAL CASE : (Frame pict + Field pred) is to be treated as (Field pict + Field pred 16X8) if ( (decoder->picture_structure == FRAME_PICTURE) && ((macroblock_modes >> MOTION_TYPE_SHIFT) != MC_FIELD) ) { // 16x16 if ( (macroblock_modes & MACROBLOCK_MOTION_FORWARD) && (macroblock_modes & MACROBLOCK_MOTION_BACKWARD) ) { // Bi-directional pMV[0] = pMV[1] = pMV[2] = pMV[3] = pMV[4] = pMV[5] = 0; } else { if ( macroblock_modes & MACROBLOCK_MOTION_FORWARD ) { // Forward pMV[0] = pMV[1] = pMV[2] = pMV[3] = pMV[4] = 0; } else { if ( macroblock_modes & MACROBLOCK_MOTION_BACKWARD ) { // Backward pMV[0] = pMV[1] = pMV[2] = pMV[3] = pMV[4] = 0; } } } } else { // Field picture // 16x8 if ( (macroblock_modes & MACROBLOCK_MOTION_FORWARD) && (macroblock_modes & MACROBLOCK_MOTION_BACKWARD) ) { // Bi-directional pMV[0] = pMV[1] = pMV[2] = pMV[3] = pMV[4] = pMV[5] = pMV[6] = pMV[7] = 0; } else { if ( macroblock_modes & MACROBLOCK_MOTION_FORWARD ) { // Forward pMV[0] = pMV[1] = pMV[2] = pMV[3] = pMV[4] = pMV[5] = 0; } else { if ( macroblock_modes & MACROBLOCK_MOTION_BACKWARD ) { // Backward pMV[0] = pMV[1] = pMV[2] = pMV[3] = pMV[4] = pMV[5] = 0; } } } } return uiNumMVs;}uint32 initialize_mcomp_motion_vectors_reuse (wrap_context *pWrapContext, mpeg2_decoder_t * decoder, int macroblock_modes){ int iXShift, iYShift; uint32 uiNumMVs = 0; int iYSpec = 0; int iBottomField; header_words *pHeader; uint32 *pMV; uint32 *pWrapMB; if (!pWrapContext) return 0; pHeader = &local_header;//pWrapContext->pHeader; /* Get a pointer to the motion vectors */ pWrapMB = pWrapContext->pMB; //pMV = pWrapContext->pMV = WRAPSKIPMVS(pWrapMB, (decoder->bInterMatrixChanged ? 2 : 0), 0); pMV = pWrapContext->pMV; // Macroblock modes if ( (macroblock_modes & MACROBLOCK_MOTION_FORWARD) && (macroblock_modes & MACROBLOCK_MOTION_BACKWARD) ) pHeader->header_word2.mbmode = MBMODE_BID_ALL_420; else if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) pHeader->header_word2.mbmode = MBMODE_FWD_ALL_420; else if (macroblock_modes & MACROBLOCK_MOTION_BACKWARD) pHeader->header_word2.mbmode = MBMODE_BWD_ALL_420; //else if (macroblock_modes & MACROBLOCK_INTRA) else { pHeader->header_word2.mbmode = MBMODE_INTRA_ALL; return 0; //printf("n ERROR : How the hell did we get here ?"); } // DCT type if (macroblock_modes & DCT_TYPE_INTERLACED) pHeader->header_word3.dctt = MAE_DCT_TYPE_FIELD; else pHeader->header_word3.dctt = MAE_DCT_TYPE_FRAME; // mbtype pHeader->header_word3.mbtype = MBT_16x16; iBottomField = (decoder->picture_structure == BOTTOM_FIELD); iXShift = iYShift = 1; if (decoder->picture_structure != FRAME_PICTURE) { pHeader->header_word3.ft = pHeader->header_word3.fb = iBottomField ? 0 : 1; pHeader->header_word3.bt = pHeader->header_word3.bb = iBottomField ? 0 : 1; // enable field prediction pHeader->header_word3.fp = MAE_FIELD_PREDICTION; } else { // initialize to 1 // i.e use TOP field pointers pHeader->header_word3.ft = pHeader->header_word3.fb = pHeader->header_word3.bt = pHeader->header_word3.bb = 1; // enable frame prediction pHeader->header_word3.fp = MAE_FRAME_PREDICTION; } // CHROMA motion vectors switch (decoder->chroma_format) { // 4:2:0 case 0: iXShift = iYShift = 2; break; // 4:2:2 case 1: iXShift = 2; iYShift = 1; break; // 4:4:4 case 2: // no change break; }; switch(pHeader->header_word3.mbtype) { case MBT_16x8: if (pHeader->header_word2.mbmode == MBMODE_BID_ALL_420) { uiNumMVs = 8; } else { // FWD or BWD uiNumMVs = 6; } break; case MBT_16x16: if (pHeader->header_word2.mbmode == MBMODE_BID_ALL_420) { uiNumMVs = 6; } else { // FWD or BWD uiNumMVs = 5; } break; } // 16x16 if ( (macroblock_modes & MACROBLOCK_MOTION_FORWARD) && (macroblock_modes & MACROBLOCK_MOTION_BACKWARD) ) { // Bi-directional pMV[0] = pMV[1] = ( ((decoder->f_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[0][1]) & 0x0000FFFF) ); pMV[2] = pMV[3] = ( ((decoder->b_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->b_motion.pmv[0][1]) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->f_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->f_motion.pmv[0][1])/iYShift) & 0x0000FFFF) ); pMV[5] = ( (( (decoder->b_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->b_motion.pmv[0][1])/iYShift) & 0x0000FFFF) ); } else { if ( macroblock_modes & MACROBLOCK_MOTION_FORWARD ) { // Forward pMV[0] = pMV[1] = pMV[2] = pMV[3] = ( ((decoder->f_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[0][1]) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->f_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->f_motion.pmv[0][1])/iYShift) & 0x0000FFFF) ); } else { if ( macroblock_modes & MACROBLOCK_MOTION_BACKWARD ) { // Backward pMV[0] = pMV[1] = pMV[2] = pMV[3] = ( ((decoder->b_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->b_motion.pmv[0][1]) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->b_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->b_motion.pmv[0][1])/iYShift) & 0x0000FFFF) ); } } } return uiNumMVs;}uint32 initialize_mcomp_motion_vectors (wrap_context *pWrapContext, mpeg2_decoder_t * decoder, int macroblock_modes){ int iXShift, iYShift; int iYSpec = 0; uint32 uiNumMVs = 0; header_words *pHeader; _header_word0 *pHeaderWord0; _header_word1 *pHeaderWord1; _header_word2 *pHeaderWord2; _header_word3 *pHeaderWord3; uint32 *pMV; uint32 *pWrapMB; unsigned long ulMotionType = macroblock_modes >> MOTION_TYPE_SHIFT; unsigned long ulMotionForward = macroblock_modes & MACROBLOCK_MOTION_FORWARD; unsigned long ulMotionBackWard = macroblock_modes & MACROBLOCK_MOTION_BACKWARD; if (!pWrapContext) return 0; pHeader = &local_header;//pWrapContext->pHeader; pHeaderWord0 = &pHeader->header_word0; pHeaderWord1 = &pHeader->header_word1; pHeaderWord2 = &pHeader->header_word2; pHeaderWord3 = &pHeader->header_word3; /* Get a pointer to the motion vectors */ pWrapMB = pWrapContext->pMB; //pMV = pWrapContext->pMV = WRAPSKIPMVS(pWrapMB, (decoder->bInterMatrixChanged ? 2 : 0), 0); pMV = pWrapContext->pMV; /* If it is MC_ZERO call the mcomp func specific to it, so we dont duplicate that code here */ if ( ulMotionType == MC_ZERO) { return initialize_mcomp_motion_vectors_zero (pWrapContext, decoder, macroblock_modes); } // If it is MC_REUSE call the mcomp func specific to it, so we dont duplicate that // code here if ( ulMotionType == MC_REUSE) { return initialize_mcomp_motion_vectors_reuse (pWrapContext, decoder, macroblock_modes); } // Macroblock modes if ( (ulMotionForward) && (ulMotionBackWard) ) pHeaderWord2->mbmode = MBMODE_BID_ALL_420; else if (ulMotionForward) pHeaderWord2->mbmode = MBMODE_FWD_ALL_420; else if (ulMotionBackWard) pHeaderWord2->mbmode = MBMODE_BWD_ALL_420; //else if (macroblock_modes & MACROBLOCK_INTRA) else { pHeader->header_word2.mbmode = MBMODE_INTRA_ALL; return 0; //printf("n ERROR : How the hell did we get here ?"); } // initialize to 0 pHeaderWord3->fp = pHeaderWord3->ft = pHeaderWord3->fb = pHeaderWord3->bt = pHeaderWord3->bb = 0; // DCT type if (macroblock_modes & DCT_TYPE_INTERLACED) pHeaderWord3->dctt = MAE_DCT_TYPE_FIELD; else pHeaderWord3->dctt = MAE_DCT_TYPE_FRAME; if (decoder->picture_structure != FRAME_PICTURE) { // enable field prediction pHeaderWord3->fp = MAE_FIELD_PREDICTION; // mbtype if ( ulMotionType == MC_16X8) pHeaderWord3->mbtype = MBT_16x8; else pHeaderWord3->mbtype = MBT_16x16; // which field is the reference field ? if (ulMotionForward) { pHeaderWord3->ft = (decoder->fwd_top_motion_vertical_field_select == 0) ? 1 : 0; pHeaderWord3->fb = (decoder->fwd_bot_motion_vertical_field_select == 0) ? 1 : 0; } if (ulMotionBackWard) { pHeaderWord3->bt = (decoder->bwd_top_motion_vertical_field_select == 0) ? 1 : 0; pHeaderWord3->bb = (decoder->bwd_bot_motion_vertical_field_select == 0) ? 1 : 0; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -