📄 slicemae.c
字号:
else { if ( ulMotionType == MC_FIELD ) { // special case; FRAME PICTURE with FIELD PREDICTION // mbtype pHeaderWord3->mbtype = MBT_16x8; // enable field prediction pHeaderWord3->fp = MAE_FIELD_PREDICTION; iYSpec = 1; // 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; } } else { // simple case; FRAME PICTURE with FRAME PREDICTION // mbtype pHeaderWord3->mbtype = MBT_16x16; // enable frame prediction pHeaderWord3->fp = MAE_FRAME_PREDICTION; } } iXShift = iYShift = 1; // 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(pHeaderWord3->mbtype) { case MBT_16x8: if (pHeaderWord2->mbmode == MBMODE_BID_ALL_420) { uiNumMVs = 8; } else { // FWD or BWD uiNumMVs = 6; } break; case MBT_16x16: if (pHeaderWord2->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) && (ulMotionType != MC_FIELD) ) { // 16x16 if ( (ulMotionForward) && (ulMotionBackWard) ) { // 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 ( ulMotionForward ) { // 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 ( ulMotionBackWard ) { // 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) ); } } } } else { // Field picture // 16x8 if ( (ulMotionForward) && (ulMotionBackWard) ) { // Bi-directional pMV[0] = ( ((decoder->f_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[0][1]>>iYSpec) & 0x0000FFFF) ); pMV[1] = ( ((decoder->f_motion.pmv[1][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[1][1]>>iYSpec) & 0x0000FFFF) ); pMV[2] = ( ((decoder->b_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->b_motion.pmv[0][1]>>iYSpec) & 0x0000FFFF) ); pMV[3] = ( ((decoder->b_motion.pmv[1][0] << 16) & 0xFFFF0000) | ((decoder->b_motion.pmv[1][1]>>iYSpec) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->f_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | (((decoder->f_motion.pmv[0][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); pMV[5] = ( (( (decoder->b_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->b_motion.pmv[0][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); pMV[6] = ( (( (decoder->f_motion.pmv[1][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->f_motion.pmv[1][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); pMV[7] = ( (( (decoder->b_motion.pmv[1][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->b_motion.pmv[1][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); } else { if ( ulMotionForward ) { // Forward pMV[0] = pMV[1] = ( ((decoder->f_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[0][1]>>iYSpec) & 0x0000FFFF) ); pMV[2] = pMV[3] = ( ((decoder->f_motion.pmv[1][0] << 16) & 0xFFFF0000) | ((decoder->f_motion.pmv[1][1]>>iYSpec) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->f_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | (((decoder->f_motion.pmv[0][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); pMV[5] = ( (( (decoder->f_motion.pmv[1][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->f_motion.pmv[1][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); } else { if ( ulMotionBackWard ) { // Backward pMV[0] = pMV[1] = ( ((decoder->b_motion.pmv[0][0] << 16) & 0xFFFF0000) | ((decoder->b_motion.pmv[0][1]>>iYSpec) & 0x0000FFFF) ); pMV[2] = pMV[3] = ( ((decoder->b_motion.pmv[1][0] << 16) & 0xFFFF0000) | ((decoder->b_motion.pmv[1][1]>>iYSpec) & 0x0000FFFF) ); pMV[4] = ( (( (decoder->b_motion.pmv[0][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->b_motion.pmv[0][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); pMV[5] = ( (( (decoder->b_motion.pmv[1][0]/iXShift) << 16) & 0xFFFF0000) | ( ((decoder->b_motion.pmv[1][1]>>iYSpec)/iYShift) & 0x0000FFFF) ); } } } } return uiNumMVs;}#ifdef NO_PERFvoid write_dct_output_intra (uint8_t *pDest, unsigned char *pSource, int iStride, int iWidth, int iRows){ int j; int jump = 0; int jump1 = 0; if ( !pDest || !pSource) { return; } for ( j = 0; j < iRows; j++) { memcpy (pDest + jump, pSource + jump1, 8 * sizeof(uint8_t)); jump += iStride; jump1 += iWidth; }}#elsevoid write_dct_output_intra (uint8_t *pDest, unsigned char *pSource, int iStride, int iWidth, int iRows){}#endif //#ifdef NO_PERF#ifdef NO_PERFvoid write_dct_output_non_intra (uint8_t *pDest, int8 *pSource, int iStride){ int j, i; int jump = 0; if ( !pDest || !pSource) { return; } for ( i = 0; i < 8; i++) { for ( j = 0; j < 8; j++) { pDest[jump + j] = CLIP_DCT (pSource[j] + pDest[jump + j]); } jump += iStride; pSource += 8; }}#elsevoid write_dct_output_non_intra (uint8_t *pDest, int8 *pSource, int iStride){}#endif //#ifdef NO_PERFvoid write_luma_output (mpeg2_decoder_t *decoder, unsigned char *pYOut, unsigned int uiXCord, unsigned int uiYCord){#ifdef NO_PERF uint8_t *dest_y_ptr; uint8_t *src_y_ptr; dest_y_ptr = decoder->dest[0] + uiXCord; src_y_ptr = pYOut + uiXCord + (uiYCord * decoder->stride); // Y0 write_dct_output_intra (dest_y_ptr, src_y_ptr, decoder->stride, decoder->stride, 8); // Y1 write_dct_output_intra (dest_y_ptr + 8, src_y_ptr + 8, decoder->stride, decoder->stride, 8); // Y2 write_dct_output_intra (dest_y_ptr + decoder->stride * 8, src_y_ptr + decoder->stride * 8, decoder->stride, decoder->stride, 8); // Y3 write_dct_output_intra (dest_y_ptr + decoder->stride * 8 + 8, src_y_ptr + decoder->stride * 8 + 8, decoder->stride, decoder->stride, 8);#endif //#ifdef NO_PERF}void write_chroma_output (mpeg2_decoder_t *decoder, unsigned char *pCbOut, unsigned char *pCrOut, unsigned int uiXCord, unsigned int uiYCord){#ifdef NO_PERF uint8_t *src_ptr; // 422 if (decoder->chroma_format == 1) { // CB0 src_ptr = pCbOut + (uiXCord/2) + ( (uiYCord) * (decoder->uv_stride)); write_dct_output_intra (decoder->dest[1] + (uiXCord >> 1), src_ptr, decoder->uv_stride, decoder->uv_stride, 16); // CR0 src_ptr = pCrOut + (uiXCord/2) + ( (uiYCord) * (decoder->uv_stride)); write_dct_output_intra (decoder->dest[2] + (uiXCord >> 1), src_ptr, decoder->uv_stride, decoder->uv_stride, 16); } else { // CB0 src_ptr = pCbOut + (uiXCord/2) + ( (uiYCord/2) * (decoder->uv_stride)); write_dct_output_intra (decoder->dest[1] + (uiXCord >> 1), src_ptr, decoder->uv_stride, decoder->uv_stride, 8); // CR0 src_ptr = pCrOut + (uiXCord/2) + ( (uiYCord/2) * (decoder->uv_stride)); write_dct_output_intra (decoder->dest[2] + (uiXCord >> 1), src_ptr, decoder->uv_stride, decoder->uv_stride, 8); }#endif //#ifdef NO_PERF}void Write_Final_Output (mpeg2_decoder_t * decoder, unsigned int uiXCord, unsigned int uiYCord, int iMBCount, uint8_t *dest[]){#ifdef NO_PERF INTERMEDITATE_BLOCK_CHECKERS BlockCheckersData; unsigned char MCompOut[64] = {0}; unsigned char szFileName[255]; // write intermediate output after IQUANT memset (szFileName, 0, 255); switch (decoder->coding_type) { case I_TYPE: sprintf(szFileName, "%s%d%s", FILE_INTRA_FINAL, decoder->iFrameCount, (decoder->bUseCModel ? MAE_FILE_EXTENSION : REF_FILE_EXTENSION)); break; case P_TYPE: sprintf(szFileName, "%s%d%s", FILE_INTER_P_FINAL, decoder->iFrameCount, (decoder->bUseCModel ? MAE_FILE_EXTENSION : REF_FILE_EXTENSION)); break; case B_TYPE: sprintf(szFileName, "%s%d%s", FILE_INTER_B_FINAL, decoder->iFrameCount, (decoder->bUseCModel ? MAE_FILE_EXTENSION : REF_FILE_EXTENSION)); break; }; BlockCheckersData.nIntraWithinInter = 0; BlockCheckersData.bBlockCoded = BLOCK_CODED; BlockCheckersData.nMB = iMBCount; BlockCheckersData.nOutputType = MOTION_COMP_DONE; // LUMA step size BlockCheckersData.nStepSize = decoder->stride; // Y1 block BlockCheckersData.blk_after_mcomp = dest[0] + uiXCord; BlockCheckersData.nBlkType = Y1_LUMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); // Y2 block BlockCheckersData.blk_after_mcomp = dest[0] + uiXCord + 8; BlockCheckersData.nBlkType = Y2_LUMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); // Y3 block BlockCheckersData.blk_after_mcomp = dest[0] + uiXCord + (decoder->stride * 8); BlockCheckersData.nBlkType = Y3_LUMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); // Y4 block BlockCheckersData.blk_after_mcomp = dest[0] + uiXCord + (decoder->stride * 8) + 8; BlockCheckersData.nBlkType = Y4_LUMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); // CHROMA step size BlockCheckersData.nStepSize = decoder->uv_stride; // CB0 block BlockCheckersData.blk_after_mcomp = dest[1] + (uiXCord >> 1); BlockCheckersData.nBlkType = U_CHROMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); if (decoder->chroma_format == 1) { // handle 422 // CB1 block BlockCheckersData.blk_after_mcomp = dest[1] + (uiXCord >> 1) + 8 * decoder->uv_stride; BlockCheckersData.nBlkType = U2_CHROMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); } // CR0 block BlockCheckersData.blk_after_mcomp = dest[2] + (uiXCord >> 1); BlockCheckersData.nBlkType = V_CHROMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); if (decoder->chroma_format == 1) { // handle 422 // CR1 block BlockCheckersData.blk_after_mcomp = dest[2] + (uiXCord >> 1) + 8 * decoder->uv_stride; BlockCheckersData.nBlkType = V2_CHROMA_BLOCK; InterChecksOnBlock (&BlockCheckersData, szFileName); }#endif //#ifdef NO_PERF}void Dump_Skipped (unsigned char *pFileName, int iBlockType, int iMacroBlockNum, int iOutputType){#ifdef NO_PERF INTERMEDITATE_BLOCK_CHECKERS BlockChecks; BlockChecks.nIntraWithinInter = 0; BlockChecks.bBlockCoded = BLOCK_NOT_CODED; BlockChecks.nBlkType = iBlockType; BlockChecks.blk_after_iquant = gBlockZeroIquant; BlockChecks.blk_after_idct_32bit = gBlockZeroIdct; BlockChecks.nMB = iMacroBlockNum; BlockChecks.nStepSize = 0; BlockChecks.nOutputType = iOutputType; InterChecksOnBlock (&BlockChecks, pFileName);#endif //#ifdef NO_PERF}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -