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

📄 jpeg_mjpeg_yuvitu.c

📁 这个是balckfin533/561的MPEG和Mjpeg的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************

Copyright (c) 2006 Analog Devices, Inc.	All	Rights Reserved. 

This software is proprietary and confidential to Analog	Devices, Inc. 
and	its	licensors.

*****************************************************************************

$RCSfile: jpeg_mjpeg_yuvitu.c,v $
$Revision: 1.2 $
$Date: 2006/11/10 07:18:58 $

Project:	BlackfinSDK (JPEG-MJPEG)
Title:		YUV <-> ITU656 conversion
Author(s):	bmk
Revised	by:	

Description:
			Functions to manage YUV to ITU656 & ITU656 to YUV conversion			

References:
			None

*****************************************************************************
Tab	Setting:			4

Target Processor:		ADSP-BF5xx
Target Tools Revision:	ADSP VisualDSP++ v4.5
******************************************************************************

Modification History:
====================
$Log: jpeg_mjpeg_yuvitu.c,v $
Revision 1.2  2006/11/10 07:18:58  bmk
merged BF533 & BF561 apps
Fixed BF561 caches issue

Revision 1.1  2006/11/03 07:12:08  bmk
SDK 2.0  files - Initial Entry

******************************************************************************
Include files
*****************************************************************************/

#include <jpeg_mjpeg_system.h>			// system includes
#include <string.h>

/*****************
Macros
******************/

#define		NUM_DESCRIPTORS		6		// Maximum number of descriptors to be used

/*************************
Local function prototypes
*************************/
// Installs Memory DMA for YUV <-> ITU656 conversion
void 		InstallMDMA_YUV_ITU656	(void);
// YUV <-> ITU656 conversion - MDMA callback function
static void	MDMA_YUV_ITU656Callback(void *AppHandle, u32  Event, void *pArg);

/*****************
Globals
******************/
// MDMA channel handles for YUV to ITU656 conversion
static ADI_DMA_CHANNEL_HANDLE 	MDMAHandleSrc;	// Source handle
static ADI_DMA_CHANNEL_HANDLE 	MDMAHandleDest;	// Destination handle

// source and destination descriptors
ADI_DMA_DESCRIPTOR_UNION 	SrcDescriptor [NUM_DESCRIPTORS];
ADI_DMA_DESCRIPTOR_UNION 	DestDescriptor[NUM_DESCRIPTORS];
// variables to update source & destination descriptor addresses
u32		SrcDescAddrUpdate [NUM_DESCRIPTORS];
u32		DestDescAddrUpdate[NUM_DESCRIPTORS];

// pointer to start of source descriptor chain
ADI_DMA_DESCRIPTOR_UNION 	*pSrcDescriptor ;
// pointer to start of destination descriptor chain
ADI_DMA_DESCRIPTOR_UNION 	*pDestDescriptor;

/*********************************************************************

	Function:		SetupMDMA_YUV_ITU656

	Description:	Initialises Descriptors for MDMA 
					(for YUV <-> ITU656 frame conversion)
					
	Create all descriptor pointers for the MDMA channels
	MDMA copies from YUV buffers and builds a ITU656 Video Frame or
	extracts YUV data from ITU656 frame and builds YUV buffer for
	JPEG encoding

*********************************************************************/
#pragma optimize_off 
section("sdram0_bank1_nocache")
void SetupMDMA_YUV_ITU656 (void)
{
	int i;
	
	for(i=0; i<NUM_DESCRIPTORS; i++) 
	{
		// Clear all the descriptor elements first
		memset(&SrcDescriptor[i],0,sizeof(ADI_DMA_DESCRIPTOR_UNION));
		
		SrcDescriptor[i].Large.Config.b_WNR 	= 0; 		// source
		SrcDescriptor[i].Large.Config.b_DMA2D 	= 1; 
		SrcDescriptor[i].Large.Config.b_RESTART = 1; 
		
		// Clear all the descriptor elements first
		memset(&DestDescriptor[i],0,sizeof(ADI_DMA_DESCRIPTOR_UNION));
		
		DestDescriptor[i].Large.Config.b_WNR 		= 1; 	// Destination
		DestDescriptor[i].Large.Config.b_DMA2D 		= 1; 
		DestDescriptor[i].Large.Config.b_RESTART 	= 1; 
	}

	// Create the linked list of descriptors	
	for(i=0; i<(NUM_DESCRIPTORS-1); i++) 
	{
		SrcDescriptor [i].Large.pNext 	= (ADI_DMA_DESCRIPTOR_LARGE *)&SrcDescriptor [i+1];
		DestDescriptor[i].Large.pNext 	= (ADI_DMA_DESCRIPTOR_LARGE *)&DestDescriptor[i+1];
	}

	// Create the termination descriptor for the list	
	SrcDescriptor [NUM_DESCRIPTORS-1].Large.pNext 	= NULL;
	DestDescriptor[NUM_DESCRIPTORS-1].Large.pNext 	= NULL;

	pSrcDescriptor 		= &SrcDescriptor [0];	// start of source descriptor chain
	pDestDescriptor 	= &DestDescriptor[0];	// start of destination descriptor chain

	// Install MDMA Driver for YUV to ITU656 conversion
	InstallMDMA_YUV_ITU656();

	return;
}
#pragma optimize_as_cmd_line 

/*********************************************************************

    Function:       InstallMDMA_YUV_ITU656

    Description:    Installs Memory DMA for YUV <-> ITU656 conversion

*********************************************************************/
section("sdram0_bank1_nocache")
void InstallMDMA_YUV_ITU656(void)
{	

	// Open (memory)DMA channels
	ezErrorCheck( adi_dma_Open(	DMAManagerHandle, 				// DMA Manager Handle
								YUV_ITU656_MDMA_SRC_CHANNEL,	// MDMA Source channel ID
								NULL, 							// No client Handle
								&MDMAHandleSrc, 				// Address of Source Channel handle location
								ADI_DMA_MODE_DESCRIPTOR_LARGE, 	// DMA Mode
								DCBManagerHandle, 				// Deffered Callback Manager
								NULL) );						// No callback function provided for source channel

	ezErrorCheck( adi_dma_Open(	DMAManagerHandle, 				// DMA Manager Handle
								YUV_ITU656_MDMA_DEST_CHANNEL,	// MDMA Destination channel ID
								NULL, 							// No client Handle
								&MDMAHandleDest, 				// Address of Destination Channel handle location
								ADI_DMA_MODE_DESCRIPTOR_LARGE, 	// DMA Mode
								DCBManagerHandle, 				// Deffered Callback Manager
								MDMA_YUV_ITU656Callback) );		// Callback function for Destination channel

	// Enable MDMA dataflow
	ezErrorCheck(adi_dma_Control(MDMAHandleSrc, ADI_DMA_CMD_SET_DATAFLOW, (void*)TRUE) );
	ezErrorCheck(adi_dma_Control(MDMAHandleDest, ADI_DMA_CMD_SET_DATAFLOW, (void*)TRUE) );
	
	return;
}

/*********************************************************************

	Function:		KickOffMDMA_YUV_ITU656

	Description:	Kicks off MDMA for YUV <-> ITU656 conversion

*********************************************************************/
section("Callback_Code")
void KickOffMDMA_YUV_ITU656(void)
{
	// Queue Source descriptor chain
	ezErrorCheck( adi_dma_Queue(MDMAHandleSrc, pSrcDescriptor) );
	// Queue Destination descriptor chain
	ezErrorCheck( adi_dma_Queue(MDMAHandleDest, pDestDescriptor) );

	return;
}

/*********************************************************************

	Function:		FreeMDMA_YUVtoITU656

	Description:	Frees MDMA channels used for YUV to ITU656 conversion

*********************************************************************/
section("sdram0_bank1_nocache")
void FreeMDMA_YUV_ITU656(void)
{
	// stop the MDMA dataflow
	ezErrorCheck(adi_dma_Control(MDMAHandleSrc, ADI_DMA_CMD_SET_DATAFLOW, (void*)FALSE) );
	ezErrorCheck(adi_dma_Control(MDMAHandleDest, ADI_DMA_CMD_SET_DATAFLOW, (void*)FALSE) );

	// close the MDMA channel
	ezErrorCheck( adi_dma_Close(MDMAHandleSrc, FALSE) );
	ezErrorCheck( adi_dma_Close(MDMAHandleDest, FALSE) );

	return;
}

/*********************************************************************

    Function:       MDMA_YUV_ITU656Callback

    Description:    YUV <-> ITU656 conversion - MDMA callback function

*********************************************************************/
section ("Callback_Code")
static void MDMA_YUV_ITU656Callback(
	void *AppHandle,
	u32  Event,
	void *pArg
){         

	// CASEOF (event type)
	switch (Event) 
	{		
		// CASE (buffer processed)
		case ADI_DMA_EVENT_DESCRIPTOR_PROCESSED:
		
			// Update YUV buffer ID for MDMA processing
			if (BufferLevel > 0)
			{
			    YUV_MDMA_BufID++;
			    	    
				if (YUV_MDMA_BufID >= NUM_YUV_BUFS)
					YUV_MDMA_BufID = 0;
			
				// decrement buffer level
		    	BufferLevel--;
			}

    		// ITU656 Video Frame is ready
			FrameReady	= TRUE;						
					
			break;
			
		// CASE (an error)
		case ADI_DMA_EVENT_ERROR_INTERRUPT:
		
			// turn on all LEDs and wait for help
			ezTurnOnAllLEDs();
			while (1) ;			
	}

	return;
}


/*********************************************************************

	Function:		Update_MDMA_DescAddr

	Description:	Update source & destination Descriptor addresses 
					for YUV <-> Video (ITU656) frame conversion

*********************************************************************/
section ("Callback_Code")
void Update_MDMA_DescAddr(void)
{    
	// Update source descriptor chain start addresses (MDMA)
	SrcDescriptor [0].Large.StartAddress 	= (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[0]);
	SrcDescriptor [1].Large.StartAddress 	= (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[1]);
	SrcDescriptor [2].Large.StartAddress 	= (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[2]);
	SrcDescriptor [3].Large.StartAddress 	= (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[3]);
	SrcDescriptor [4].Large.StartAddress 	= (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[4]);
	SrcDescriptor [5].Large.StartAddress 	= (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[5]);

	// Update destination descriptor chain start addresses (MDMA)
	DestDescriptor[0].Large.StartAddress	= (void *)(pDestDescStartAddr + DestDescAddrUpdate[0]);
	DestDescriptor[1].Large.StartAddress 	= (void *)(pDestDescStartAddr + DestDescAddrUpdate[1]);
	DestDescriptor[2].Large.StartAddress 	= (void *)(pDestDescStartAddr + DestDescAddrUpdate[2]);
	DestDescriptor[3].Large.StartAddress 	= (void *)(pDestDescStartAddr + DestDescAddrUpdate[3]);
	DestDescriptor[4].Large.StartAddress 	= (void *)(pDestDescStartAddr + DestDescAddrUpdate[4]);
	DestDescriptor[5].Large.StartAddress 	= (void *)(pDestDescStartAddr + DestDescAddrUpdate[5]);
	
	return;
}

/*********************************************************************

	Function:		SetupMDMA_YUV420toITU656

	Description:	Configures MDMA Descriptors for YUV420 to 
					ITU656 frame conversion
					

⌨️ 快捷键说明

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