⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slicemae.c

📁 au1200 linux2.6.11 硬件解码mae驱动和maiplayer播放器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -