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

📄 decoder.c

📁 基于Linux的ffmepg decoder
💻 C
📖 第 1 页 / 共 5 页
字号:
			// dont care LMaddr			// dont care BlkWidth			ptDma->Control =				mDmaIntChainMask1b(TRUE) |				mDmaEn1b(TRUE) |				mDmaChainEn1b(TRUE) |				mDmaDir1b(DONT_CARE) |				mDmaSType2b(DONT_CARE) |				mDmaLType2b(DONT_CARE) |				mDmaLen12b(0) |				mDmaID4b(0);		}		u32grpc = (2 << (ID_CHN_1MV*2))			// disable 1mv				|(2 << (ID_CHN_4MV*2))		// disable 4mv				|(2 << (ID_CHN_IMG*2))		// disable IMG			#if (OUTPUT_FMT == OUTPUT_FMT_YUV)				|(2 << (ID_CHN_YUV*2))		// YUV dma: disable.			#else				|(2 << (ID_CHN_RGB*2))		// RGB dma: disable.			#endif				|(3 << (ID_CHN_ACDC*2));		// LdSt_ACDC sync to VLD_done											// load & store non-meaning//(16)prePXI(3S)		if (u32pipe & BIT_3ST) {			// keep swaping the MV-buffer			switch (mb_dmc->mode) {				case MODE_INTER:				case MODE_INTER_Q:				case MODE_NOT_CODED:					u32cmd_me |= MECTL_PXI_1MV;					break;				case MODE_INTER4V:					break;				default:					// skip pxi command, but count mb;					u32cmd_me |= MECTL_SKIP_PXI;					break;			}		}		else 	// skip pxi			u32cmd_me |= (MECTL_SKIP_PXI | MECTL_PXI_MBCNT_DIS);//(5)goME_pmv----------------(17)goME_pxi		if (u32pipe & (BIT_0ST | BIT_2ST | BIT_3ST))			ptMP4->MECTL = u32cmd_me;//************************************** change to next mb *******************		// update mb pointer		mbb_rgb = mbb_img;		mbb_img = mbb_dmc;		mbb_dmc = mbb_ref;		mbb_ref = mbb_vld;		mb_last = mb_rgb;		mb_rgb = mb_img;		mb_img = mb_dmc;		mb_dmc = mb_ref;		mb_ref = mb_vld;		i ++;		mbb_vld = &mbb[i%P_FRAME_PIPE];		mbb_vld->toggle = i & BIT0;//(18)preMoveImg(3S)//(19)preMoveYuv(3S)(Conf1) 		if (u32pipe & BIT_3ST) {			u32grpc &= ~(uint32_t)(3 << (ID_CHN_IMG * 2));		// exec IMG dma			// update address of destination			// dont forget to update the next one after the one mb-jumpping(dma ping-pong chain)			// mb_rgb is the next one after mb_img			if ((mb_img->mb_jump != 0) || (mb_rgb->mb_jump != 0)) {				if (mbb_vld->toggle == 0) {					// y					dma_cmd_tgl0[CHNP_IMG_Y] = 						mDmaSysMemAddr29b((uint32_t) dec->cur.y_phy + (uint32_t)mbb_img->x * 2 * SIZE_U +							(uint32_t)mbb_img->y * dec->mb_width * SIZE_Y)						|mDmaSysInc3b(DMA_INCS_256);		// 2 *  SIZE_U					// u					dma_cmd_tgl0[CHNP_IMG_U] =						mDmaSysMemAddr29b((uint32_t) dec->cur.u_phy + (uint32_t)mbb_img->mbpos * SIZE_U)						|mDmaSysInc3b(DMA_INCS_128);		// SIZE_U					// v					dma_cmd_tgl0[CHNP_IMG_V] =						mDmaSysMemAddr29b((uint32_t) dec->cur.v_phy + (uint32_t)mbb_img->mbpos * SIZE_V)						|mDmaSysInc3b(DMA_INCS_128);		// SIZE_U				}				else {					// y					dma_cmd_tgl1[CHNP_IMG_Y] = 						mDmaSysMemAddr29b((uint32_t) dec->cur.y_phy + (uint32_t)mbb_img->x * 2 * SIZE_U +							(uint32_t)mbb_img->y * dec->mb_width * SIZE_Y)						|mDmaSysInc3b(DMA_INCS_256);		// 2 *  SIZE_U					// u					dma_cmd_tgl1[CHNP_IMG_U] =						mDmaSysMemAddr29b((uint32_t) dec->cur.u_phy + (uint32_t)mbb_img->mbpos * SIZE_U)						|mDmaSysInc3b(DMA_INCS_128);		// SIZE_U					// v					dma_cmd_tgl1[CHNP_IMG_V] =						mDmaSysMemAddr29b((uint32_t) dec->cur.v_phy + (uint32_t)mbb_img->mbpos * SIZE_V)						|mDmaSysInc3b(DMA_INCS_128);		// SIZE_U				}			}			else if ((mbb_img->x == 0) || (mbb_img->x == 1)) {				u32temp = mDmaSysMemAddr29b((uint32_t) dec->cur.y_phy											+ (uint32_t) mbb_img->mbpos * SIZE_Y											- (uint32_t) mbb_img->x * 2 * SIZE_U)						|mDmaSysInc3b(DMA_INCS_256);		// 2 *  SIZE_U				if (mbb_vld->toggle == 0)					dma_cmd_tgl0[CHNP_IMG_Y] = u32temp;				else					dma_cmd_tgl1[CHNP_IMG_Y] = u32temp;			}		#if (OUTPUT_FMT == OUTPUT_FMT_YUV)			if ((mbb_img->x >= u32output_mb_start) && (mbb_img->x < u32output_mb_end) &&			(mbb_img->y >= u32output_mb_ystart) && (mbb_img->y < u32output_mb_yend)) {				u32grpc &= ~(uint32_t)(3 << (ID_CHN_YUV * 2));		// exec YUV dma				if (((mb_img->mb_jump != 0) || (mb_rgb->mb_jump != 0)) ||				(mbb_img->x == u32output_mb_start) || (mbb_img->x == (u32output_mb_start + 1))) {					if (mbb_vld->toggle == 0) {						// y output						dma_cmd_tgl0[CHNP_YUV_Y] = 							mDmaSysMemAddr29b((uint32_t) dec->output_base_phy +								((mbb_img->x - u32output_mb_start)  +								(mbb_img->y - u32output_mb_ystart) * dec->output_stride) * PIXEL_Y)							|mDmaSysInc3b(DMA_INCS_32);		// 2 * PIXEL_Y						// u output						dma_cmd_tgl0[CHNP_YUV_U] =							mDmaSysMemAddr29b((uint32_t) dec->output_base_u_phy +								((mbb_img->x - u32output_mb_start)  +								(mbb_img->y - u32output_mb_ystart) * dec->output_stride/2) * PIXEL_U)							|mDmaSysInc3b(DMA_INCS_16);		// 2 * PIXEL_U						// v output						dma_cmd_tgl0[CHNP_YUV_V] =							mDmaSysMemAddr29b((uint32_t) dec->output_base_v_phy +								((mbb_img->x - u32output_mb_start)  +								(mbb_img->y - u32output_mb_ystart) * dec->output_stride/2) * PIXEL_V)							|mDmaSysInc3b(DMA_INCS_16);		// 2 * PIXEL_V					}					else {						// y output						dma_cmd_tgl1[CHNP_YUV_Y] = 							mDmaSysMemAddr29b((uint32_t) dec->output_base_phy +								((mbb_img->x - u32output_mb_start)  +								(mbb_img->y - u32output_mb_ystart) * dec->output_stride) * PIXEL_Y)							|mDmaSysInc3b(DMA_INCS_32);		// 2 *  PIXEL_Y						// u output						dma_cmd_tgl1[CHNP_YUV_U] =							mDmaSysMemAddr29b((uint32_t) dec->output_base_u_phy +								((mbb_img->x - u32output_mb_start)  +								(mbb_img->y - u32output_mb_ystart) * dec->output_stride/2) * PIXEL_U)							|mDmaSysInc3b(DMA_INCS_16);		// 2 * PIXEL_U						// v output						dma_cmd_tgl1[CHNP_YUV_V] =							mDmaSysMemAddr29b((uint32_t) dec->output_base_v_phy +								((mbb_img->x - u32output_mb_start)  +								(mbb_img->y - u32output_mb_ystart) * dec->output_stride/2) * PIXEL_V)							|mDmaSysInc3b(DMA_INCS_16);		// 2 * PIXEL_V					}				}			}		#endif		}//(26)preMoveRGB(4S-R)(D)(Conf0)//(26')Conf1(4S-x) 		if (u32pipe & BIT_4ST) {			u32pipe &= ~ BIT_4ST;		#if (OUTPUT_FMT < OUTPUT_FMT_YUV)			u32pipe |=  BIT_DMA_RGB_GO;			// update address of destination			// dont forget to update the next one after the one mb-jumpping			// since dma is a ping-pong chain			// mb_last is the next one after mb_rgb			if ((mb_rgb->mb_jump != 0) || (mb_last->mb_jump != 0) ||				(mbb_rgb->x == u32output_mb_start) || (mbb_rgb->x == (u32output_mb_start + 1))) {				if ((mbb_rgb->x >= u32output_mb_start)					&& (mbb_rgb->x < u32output_mb_end)					&& (mbb_rgb->y >= u32output_mb_ystart)					&& (mbb_rgb->y < u32output_mb_yend)) {					if (mbb_vld->toggle == 0)						dma_cmd_tgl0[CHNP_RGB] =							mDmaSysMemAddr29b((uint32_t) dec->output_base_phy +								(mbb_rgb->x - u32output_mb_start) * PIXEL_Y * RGB_PIXEL_SIZE +								(mbb_rgb->y - u32output_mb_ystart) * dec->output_stride * PIXEL_Y * RGB_PIXEL_SIZE)							| mDmaSysInc3b(RGB_DMA_INC);		//PIXEL_Y * 2;					else						dma_cmd_tgl1[CHNP_RGB] =							mDmaSysMemAddr29b((uint32_t) dec->output_base_phy +								(mbb_rgb->x - u32output_mb_start) * PIXEL_Y * RGB_PIXEL_SIZE +								(mbb_rgb->y - u32output_mb_ystart) * dec->output_stride * PIXEL_Y * RGB_PIXEL_SIZE)							| mDmaSysInc3b(RGB_DMA_INC);		//PIXEL_Y * 2;				}			}			u32grpc &= ~(uint32_t)(3 << (ID_CHN_RGB * 2));		// exec RGB dma	 		if ((u32pipe & BIT_PRE_DT) == 0)				u32grpc |= 1 << (ID_CHN_RGB*2);				// RGB dma: skip but inscr.		#endif 		}		mFa526DrainWrBuf();DECODER_PFRAME_RECHECK://(6)waitME_PMV(0S)//(7)storeMV(0S)//(8)preMoveRef(0S-1S)		if (u32pipe & BIT_0ST) {			u32pipe &= ~ BIT_0ST;			u32pipe |= BIT_1ST;			vpe_prob_me_start();			// check PMV_done			while ((ptMP4->CPSTS & BIT3) == 0)				;			vpe_prob_me_end();			u32temp = ptMP4->VLDSTS;			while (u32temp  & 0xF000) 			{				mVpe_Indicator(0x92000000 | (u32temp  & 0xF000));				mVpe_FAIL();			 	//waitDMC & waitDT				while ((ptMP4->CPSTS & (BIT14 | BIT1)) != (BIT14 | BIT1))					;				// waitME				while ((ptMP4->CPSTS & BIT0) == 0)					;				u32temp = FindRsmkOrVopS(bs, ptMP4);			}			// Start code detected			if (u32temp & BIT2) {				u32ErrorCount ++;				// correct 'ref'ed(dmc) jump to correct next-'ref'ed(ref)				mb_dmc->mb_jump = dec->mb_width * dec->mb_height - mbb_ref->mbpos;				// correct 'vld'ed(ref) information				mbb_ref->x = 0;				mbb_ref->y = dec->mb_height;				mbb_ref->mbpos = dec->mb_width * dec->mb_height;				// no more VLD stage				u32pipe &= ~BIT_0ST;				u32cmd_mc &= ~MCCTL_DECGO;			}			// Resync marker detected			if (u32temp & BIT1) {				if (bRead_video_packet_header(dec, &fcode, NULL, &bound) == -1) {					mVpe_FAIL();					break;				}				if (bound != mbb_ref->mbpos) {					u32ErrorCount ++;					// correct 'ref'ed(dmc) jump to correct next-'ref'ed(ref)					mb_dmc->mb_jump = bound - mbb_ref->mbpos;					// correct 'vld'ed(ref) information					mb_ref = &dec->mbs[bound];					mb_ref->mb_jump = 0;					mbb_ref->x = bound % dec->mb_width;					mbb_ref->y = (int32_t)(bound / dec->mb_width);					mbb_ref->mbpos = bound;				}				mb_cnt_in_vp = (u32temp >> 16) - 1;				//pu32table = &Table_Output[4];				pu32table = &((uint32_t *)((uint32_t) dec->pu32BaseAddr + TABLE_OUTPUT_OFF))[4];				mbpos_in_vp = 0;			}			u32temp = *pu32table;			if (u32temp & BIT5) {	// not coded				mb_ref->mode = MODE_NOT_CODED;				if (dec->data_partitioned) {					// point to next entry if the one is the last					if (mbpos_in_vp >= ((u32temp >> 8) & 0xFFF))						pu32table += 4;				}			}			else {				mb_ref->mode = u32temp & 0x07;				mbb_ref->cbp = (u32temp >> 23) & 0x3F;				mbb_ref->quant = (ptMP4->VOP0 >> 8) & 0xFF;				if (dec->data_partitioned)			// point to next entry					pu32table += 4;			}			mbpos_in_vp ++;			//storeMV(0S)			if (mb_ref->mode <= MODE_INTER4V) {				uint32_t * pu32me = (uint32_t *) ((uint32_t)dec->pu32BaseAddr + ME_CMD_Q_OFF);				// which buffer valid?				mb_ref->MVuv.u32num = pu32me[MVUV_BUFF];				if (mb_ref->mode == MODE_INTER4V) {					mb_ref->mvs[0].u32num= pu32me[MV_BUFF + 0];					mb_ref->mvs[1].u32num= pu32me[MV_BUFF + 1];					mb_ref->mvs[2].u32num= pu32me[MV_BUFF + 2];					mb_ref->mvs[3].u32num= pu32me[MV_BUFF + 3];				} else {	// MODE_INTER or MODE_INTER_Q					mb_ref->mvs[0].u32num=					mb_ref->mvs[1].u32num=					mb_ref->mvs[2].u32num=					mb_ref->mvs[3].u32num= pu32me[MV_BUFF + 3];				}			}			else  {				mb_ref->mvs[0].u32num =				mb_ref->mvs[1].u32num =				mb_ref->mvs[2].u32num =				mb_ref->mvs[3].u32num = 0;			}			//preMoveRef			switch (mb_ref->mode) {				case MODE_INTER:				case MODE_INTER_Q:					u32grpc &= ~(uint32_t)(3 << (ID_CHN_1MV* 2));		// exec REF1MV dma					dma_mvRef1MV(dec, mb_ref, mbb_ref);					break;				case MODE_INTER4V:					u32grpc &= ~(uint32_t)(3 << (ID_CHN_4MV* 2));		// exec REF4MV dma					dma_mvRef4MV(dec, mb_ref, mbb_ref);					break;				case MODE_NOT_CODED:					u32grpc &= ~(uint32_t)(3 << (ID_CHN_1MV* 2));		// exec REF1MV dma					dma_mvRefNotCoded(dec, mbb_ref);					break;				default:					break;			}		}		mbb_vld->x = mbb_ref->x + 1;		mbb_vld->y = mbb_ref->y;		mbb_vld->mbpos = mbb_ref->mbpos + 1;		if (mbb_vld->x == dec->mb_width) {			mbb_vld->x = 0;			mbb_vld->y ++;		}		// indicator		mVpe_Indicator(0x91000000 | mbb_vld->y << 12 | mbb_vld->x);//(1)preVLD(x-0S)		u32cmd_mc = u32cmd_mc_reload;		u32cmd_me = mMECTL_RND1b(rounding) | MECTL_MEGO;		if (mbb_vld->y < dec->mb_height) {			u32pipe |= BIT_0ST;			// init mb_vld			mb_vld = &dec->mbs[mbb_vld->mbpos];			mb_vld->mb_jump = 0;			// init acdcPredict command parameter			u32temp = predict_acdc_P(dec->mbs, mbb_vld, (int32_t)dec->mb_width, bound);			u32cmd_mc = u32temp | u32cmd_mc_reload;		}//(9)preStoreACDC//(2)preLoadACDC		if ((mb_ref->mb_jump != 0) || (mb_dmc->mb_jump != 0) ||(mbb_vld->x == 0)) {			if (mbb_vld->toggle == 0) {				dma_cmd_tgl0[CHNP_STORE_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy)					| mDmaSysInc3b(DMA_INCS_128);				dma_cmd_tgl0[CHNP_LOAD_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy + 64)					| mDmaSysInc3b(DMA_INCS_128);			}else {				dma_cmd_tgl1[CHNP_STORE_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy)					| mDmaSysInc3b(DMA_INCS_128);				dma_cmd_tgl1[CHNP_LOAD_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy + 64)					| mDmaSysInc3b(DMA_INCS_128);			}		}		else if (mbb_vld->x == 1) {			if (mbb_vld->toggle == 0)				dma_cmd_tgl0[CHNP_STORE_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy + 64)					| mDmaSysInc3b(DMA_INCS_128);			else				dma_cmd_tgl1[CHNP_STORE_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy + 64)					| mDmaSysInc3b(DMA_INCS_128);		}		if (mbb_vld->x == (dec->mb_width - 1)) {			if (mbb_vld->toggle == 0)				dma_cmd_tgl0[CHNP_LOAD_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy)					| mDmaSysInc3b(DMA_INCS_128);			else				dma_cmd_tgl1[CHNP_LOAD_PREDITOR] =					mDmaSysMemAddr29b((uint32_t)dec->pu16ACDC_ptr_phy)					| mDmaSysInc3b(DMA_INCS_128);		}//(20)waitDMC(3S-4S)		if (u32pipe & BIT_3ST) {			u32pipe &= ~ BIT_3ST;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -