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

📄 slicemae.c

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