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

📄 jpeg_mjpeg_callbacks.c

📁 这个是balckfin533/561的MPEG和Mjpeg的源代码
💻 C
字号:
/*****************************************************************************

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_callbacks.c,v $
$Revision: 1.3 $
$Date: 2006/11/20 05:54:44 $

Project:	BlackfinSDK (JPEG-MJPEG)
Title:		System Service callback routines
Author(s):	bmk
Revised	by:	

Description:
			PPI callback service routines for JPEG-MJPEG Encoder/Decoder

References:
			None

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

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

Modification History:
====================
$Log: jpeg_mjpeg_callbacks.c,v $
Revision 1.3  2006/11/20 05:54:44  bmk
Enabled streaming for video output

Revision 1.2  2006/11/10 07:18:59  bmk
merged BF533 & BF561 apps
Fixed BF561 cache issue

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

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

#include <jpeg_mjpeg_system.h>				// system includes
#include <drivers\encoder\adi_adv717x.h>	// video encoder driver includes
#include <drivers\usb\net2272\adi_net2272.h>// NET2272 device driver includes
#include <adi_usbio_blackfin.h>				// USB I/O functions for Blackfin

/*****************
Globals
*****************/

// 2D Video Input buffers
static	ADI_DEV_2D_BUFFER VideoIn2DBuf[NUM_VIDEO_IN_BUFS];
// 2D Video Output buffers
static	ADI_DEV_2D_BUFFER VideoOut2DBuf[NUM_VIDEO_OUT_BUFS];

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

    Function:       VideoIn

    Description:    Video In callback service routine

*********************************************************************/
section ("Callback_Code")
void VideoIn(
	void *AppHandle,
	u32  Event,
	void *pArg
){            
    // Case of (event type)
    switch (Event) 
    {        
        // Case (buffer processed)
        case ADI_DEV_EVENT_BUFFER_PROCESSED:

        	VideoFrameCompletedFlag = TRUE;
        	
			VideoFrameCounter ++;
			
			if (StartMDMA) 
			{
				if (FrameReady)
				{
					// Check for free YUV buffer(s)
					if (BufferLevel > 0)
					{
						FrameReady = FALSE;

						// ITU656 to YUV frame conversion
						// Source - video (ITU656) Buffers	 
						// pArg points to buffer holding ITU656 video data
						pSrcDescStartAddr 	= (u8 *)pArg;						
						// Destination - YUV buffers	
						// next YUV buffer to be used to build YUV frame for encoding
						pDestDescStartAddr	= pYUVBufs [YUV_MDMA_BufID];

						// update MDMA descriptor addresses (used for ITU656 to YUV frame conversion)
						Update_MDMA_DescAddr ();
 						// Kick off ITU656 to YUV frame conversion
 						KickOffMDMA_YUV_ITU656(); 						
					}
					else
						FrameDroppedCounter++;
				}
				else 
					FrameDroppedCounter++;
			}        	
        	
            break;	

        // Case (DMA Error)
        case ADI_DEV_EVENT_DMA_ERROR_INTERRUPT:

         	// turn on all LEDs and wait for help
            ezTurnOnAllLEDs();
            while (1) ;
                      
		default:	// other events
         	// turn on all LEDs and wait for help
            ezTurnOnAllLEDs();
            while (1) ;
    }
}

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

    Function:       VideoOut

    Description:    Video Out callback service routine

*********************************************************************/
section ("Callback_Code")
void VideoOut(
	void *AppHandle,
	u32  Event,
	void *pArg
){            
    // Case of (event type)
    switch (Event) 
    {
        
        // Case (buffer processed)
        case ADI_DEV_EVENT_BUFFER_PROCESSED:
			// when the buffer chain was created, the CallbackParameter value for the buffer
			// that was generating the callback was set to be the start address 
			// of the processed Video Frame
				
			VideoFrameCounter ++;
			
			if (StartMDMA) 
			{
				if (FrameReady)
				{
					// Check to see if there is a new frame to play
					if (BufferLevel > 0)
					{
						FrameReady = FALSE;

						// YUV to ITU656 frame conversion
						// Source - YUV buffers	
						// next YUV buffer to be used to build video (ITU656) frame
						pSrcDescStartAddr	= pYUVBufs [YUV_MDMA_BufID];
						// Destination - video (ITU656) Buffers
						// pArg points to ITU656 buffer that is ready to accept next frame
						pDestDescStartAddr 	= (u8 *)pArg;						

						// update MDMA descriptor addresses (used for YUV to video (ITU656) frame conversion)
						Update_MDMA_DescAddr ();
 						// Kick off YUV to ITU656 frame conversion
 						KickOffMDMA_YUV_ITU656();
 												
					}
					else
						FrameDroppedCounter++;
				}
				else 
					FrameDroppedCounter++;
			}
				        
            break;	

        // Case (DMA Error)
        case ADI_DEV_EVENT_DMA_ERROR_INTERRUPT:

         	// turn on all LEDs and wait for help
            ezTurnOnAllLEDs();
            while (1) ;
                      
		default:	// other events
         	// turn on all LEDs and wait for help
            ezTurnOnAllLEDs();
            while (1) ;
    }
}

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

	Function:		USB_Callback

	Description:	USB I/O callback function

*********************************************************************/
section ("Callback_Code")
void USB_Callback(
	void 	*AppHandle,
	u32  	Event,
	void 	*pArg
){
	switch (Event)
	{
		// case (NET2272 device configured)
		case ADI_NET2272_EVENT_SET_CONFIG:

			// pArg holds the configuration number
			if (0x01 == (u32)pArg)
				Net2272Ready = TRUE;	// Net2272 configuration Done
			else
				Net2272Ready = FALSE;	// Net2272 configuration Failed

			break;

		// case (reset signaling detected)
		case ADI_NET2272_EVENT_ROOT_PORT_RESET:
		// case (cable unplugged)
		case ADI_NET2272_EVENT_VBUS_FALSE:
		
			// Net2272 yet to be configured
			Net2272Ready = FALSE;

			break;
	    
		// case (USB data Tx complete)
		case ADI_NET2272_EVENT_DATA_TX:

			Net2272TxDone = TRUE;	// Tx Done

			break;

		// case (USB data Rx complete)
		case ADI_NET2272_EVENT_DATA_RX:

			Net2272RxDone = TRUE;	// Rx Done

			break;
									
		// CASE (an error)
		case ADI_DEV_EVENT_DMA_ERROR_INTERRUPT:

			// turn on all LEDs and wait for help
			ezTurnOnAllLEDs();
			while (1) ;

		// CASE (buffer processed)
		case ADI_DMA_EVENT_DESCRIPTOR_PROCESSED:			
				while (1) ;
						
		default:
			break;
	}

	return;
}

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

    Function:       SubmitVideoInBuffers
    Description:    Prepares and submits Video Input Buffers (for ADV7183)

*********************************************************************/
section("sdram0_bank1_cache")
void	SubmitVideoInBufs	(void)
{
    
	u8 i,j;
	
	j = 1;	// by default atlease 1 buffer is submitted for Video In
	
	// Disable Video In dataflow
	ezErrorCheck(adi_dev_Control(ADV7183DeviceHandle, ADI_DEV_CMD_SET_DATAFLOW, (void*)FALSE));
		
	// use only one buffer for JPEG
	VideoIn2DBuf[0].Data = (void*)(pITU656Frames[0]);
	
	// use both ITU656 buffers for MJPEG
	if (Coding_Algorithm == CODING_ALGORITHM_MJPEG)
	{
		VideoIn2DBuf[1].Data = (void*)(pITU656Frames[1]);
		j=2;
	}

	for (i=0;i<j;i++)
	{
		// Configure Video Out Buffer 
		VideoIn2DBuf[i].ElementWidth 		= DMA_BUS_SIZE;					// 32 bit transfer for BF561/16 bit transfer for BF533
		VideoIn2DBuf[i].XModify 			= DMA_BUS_SIZE;					// 4 bytes increment for BF561/2 bytes increment for BF533
		VideoIn2DBuf[i].XCount 				= (DataPerLine/DMA_BUS_SIZE);	// Video Data per line
		VideoIn2DBuf[i].YCount 				= FrameLines;					// Total number of lines in a frame
		VideoIn2DBuf[i].YModify 			= DMA_BUS_SIZE;					// 4 bytes increment for BF561/2 bytes increment for BF533
		VideoIn2DBuf[i].CallbackParameter	= VideoIn2DBuf[i].Data;			// call back parameter
		VideoIn2DBuf[i].pNext				= NULL;							
	}
	
	for (i=0;i<j;i++)					
		// submit the video input buffer(s)
		ezErrorCheck(adi_dev_Read(ADV7183DeviceHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&VideoIn2DBuf[i]));

	// Enable Video In dataflow
	ezErrorCheck(adi_dev_Control(ADV7183DeviceHandle, ADI_DEV_CMD_SET_DATAFLOW, (void*)TRUE));

	return;
}

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

    Function:       SubmitVideoOutBuffers
    Description:    Prepares and submits Video Output Buffers (for ADV717x)

*********************************************************************/
section("sdram0_bank1_cache")
void	SubmitVideoOutBufs	(void)
{   
	u8 i,j;		

	// Close the PPI device allocated for video out (to submit new buffer(s))
	ezErrorCheck(adi_dev_Control(ADV717xDeviceHandle, ADI_ADV717x_CMD_SET_PPI_STATUS, (void *)ADI_ADV717x_PPI_CLOSE));	

	j = 1;	// atleast 1 buffer must be submitted for Video Out
	
	// use only one buffer for JPEG	
	VideoOut2DBuf[0].Data = (void*)(pITU656Frames[0]);
	
	// use both ITU656 buffers for MJPEG
	if (Coding_Algorithm == CODING_ALGORITHM_MJPEG)
	{
		VideoOut2DBuf[1].Data = (void*)(pITU656Frames[1]);
		j=2;
	}
	
	for (i=0;i<j;i++)
	{
		// Configure Video Out Buffer 
		VideoOut2DBuf[i].ElementWidth 		= DMA_BUS_SIZE;					// 32 bit transfer for BF561/16 bit transfer for BF533
		VideoOut2DBuf[i].XModify 			= DMA_BUS_SIZE;					// 4 bytes increment for BF561/2 bytes increment for BF533
		VideoOut2DBuf[i].XCount 			= (DataPerLine/DMA_BUS_SIZE);	// Video Data per line
		VideoOut2DBuf[i].YCount 			= FrameLines;					// Total number of lines in a frame
		VideoOut2DBuf[i].YModify 			= DMA_BUS_SIZE;					// 4 bytes increment for BF561/2 bytes increment for BF533
		VideoOut2DBuf[i].CallbackParameter	= VideoOut2DBuf[i].Data;		// call back parameter
		VideoOut2DBuf[i].pNext				= NULL;							
	}
	
	// Open PPI device for video out
	ezErrorCheck(adi_dev_Control(ADV717xDeviceHandle, ADI_ADV717x_CMD_SET_PPI_STATUS, (void *)ADI_ADV717x_PPI_OPEN));	
	// Set Dataflow method
	ezErrorCheck(adi_dev_Control(ADV717xDeviceHandle, ADI_DEV_CMD_SET_DATAFLOW_METHOD, (void *) ADI_DEV_MODE_CHAINED_LOOPBACK));
	// Enable streaming
	ezErrorCheck(adi_dev_Control(ADV717xDeviceHandle, ADI_DEV_CMD_SET_STREAMING, (void *) TRUE));	

	for (i=0;i<j;i++)					
		// submit the video output buffer(s) to PPI for display
		ezErrorCheck(adi_dev_Write(ADV717xDeviceHandle, ADI_DEV_2D, (ADI_DEV_BUFFER *)&VideoOut2DBuf[i]));

	// Enable Video out dataflow
	ezErrorCheck(adi_dev_Control(ADV717xDeviceHandle, ADI_DEV_CMD_SET_DATAFLOW, (void*)TRUE));

	return;
}

/*****/

⌨️ 快捷键说明

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