📄 jpeg_mjpeg_callbacks.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 + -