📄 movie_play.c
字号:
/*
DM270 ARM Evaluation Software
(c)Texas Instruments 2003
*/
#include <system/intc270.h>
#include <system/uart270.h>
#include <system/dspc270.h>
#include <user/armdsp.h>
#include <user/prev.h>
#include <user/ccdc.h>
#include <user/osd.h>
#include <user/intc.h>
#include <dsp/dspsource.h>
#include <appl/movie_main.h>
#include <appl/movie_play.h>
#include <util/mem_fs.h>
#include <util/file_name_gen.h>
#include <demo/mem_alloc.h>
#include <demo/menu.h>
#include <demo/ui.h>
#include <demo_gui/demo_gui.h>
#include <qtff/qt.h>
#include <qtff/qt_parse.h>
//MPEG4
MPEG4_PLAY_START_CMD Mpeg4PlayStartCmd;
MPEG4_PLAY_CMD_REPLY Mpeg4PlayStartCmdReply;
MPEG4_PLAY_DSP_REQ Mpeg4PlayDspReq;
MPEG4_PLAY_DSP_REQ_REPLY Mpeg4PlayDspReqReply;
//MJPEG
MJPEG_PLAY_START_CMD MjpegPlayStartCmd;
MJPEG_PLAY_CMD_REPLY MjpegPlayStartCmdReply;
MJPEG_PLAY_DSP_REQ MjpegPlayDspReq;
MJPEG_PLAY_DSP_REQ_REPLY MjpegPlayDspReqReply;
STATUS MOVIE_PLAY_init() {
//MPEG4
Mpeg4PlayStartCmd.RingBuffAddrHigh = HIGH_WORD(MOVIE_BUFFER_OFFSET);
Mpeg4PlayStartCmd.RingBuffAddrLow = LOW_WORD (MOVIE_BUFFER_OFFSET);
Mpeg4PlayStartCmd.RingBuffSizeHigh = HIGH_WORD(MOVIE_BUFFER_SIZE);
Mpeg4PlayStartCmd.RingBuffSizeLow = LOW_WORD (MOVIE_BUFFER_SIZE);
Mpeg4PlayStartCmd.VideoSizeHigh = 0;
Mpeg4PlayStartCmd.VideoSizeLow = 0;
Mpeg4PlayStartCmd.WorkAreaAddrHigh = HIGH_WORD(WORK_AREA_OFFSET);
Mpeg4PlayStartCmd.WorkAreaAddrLow = LOW_WORD (WORK_AREA_OFFSET);
Mpeg4PlayStartCmd.WorkAreaSizeHigh = HIGH_WORD(352*288);
Mpeg4PlayStartCmd.WorkAreaSizeLow = LOW_WORD (352*288);
Mpeg4PlayStartCmd.VideoAddrHigh = HIGH_WORD(OSD_VIDEO_WIN0_OFFSET);
Mpeg4PlayStartCmd.VideoAddrLow = LOW_WORD (OSD_VIDEO_WIN0_OFFSET);
Mpeg4PlayStartCmd.FrameWidth = 352;
Mpeg4PlayStartCmd.FrameHeight = 288;
Mpeg4PlayStartCmd.StartX = 0;
Mpeg4PlayStartCmd.StartY = 0;
Mpeg4PlayStartCmd.DeblockFilter = 1;
Mpeg4PlayStartCmd.Reserved = 0;
Mpeg4PlayStartCmd.AudioRingBuffAddrHigh = HIGH_WORD(AUDIO_BUFFER_OFFSET);
Mpeg4PlayStartCmd.AudioRingBuffAddrLow = LOW_WORD (AUDIO_BUFFER_OFFSET);
Mpeg4PlayStartCmd.AudioRingBuffSizeHigh = HIGH_WORD(AUDIO_BUFFER_SIZE);
Mpeg4PlayStartCmd.AudioRingBuffSizeLow = LOW_WORD (AUDIO_BUFFER_SIZE);
Mpeg4PlayStartCmd.AudioSizeHigh = 0;
Mpeg4PlayStartCmd.AudioSizeLow = 0;
Mpeg4PlayStartCmd.AudioBitRate = MPEG_G726_32KBPS;
Mpeg4PlayStartCmd.AudioFormat = MOVIE_AUDIO_FORMAT_G711;
Mpeg4PlayDspReqReply.VideoAddrHigh = 0;
Mpeg4PlayDspReqReply.VideoAddrLow = 0;
Mpeg4PlayDspReqReply.StartX = 0;
Mpeg4PlayDspReqReply.StartY = 0;
Mpeg4PlayDspReqReply.DecodeMode = MPEG4_PLAY_NORMAL;
Mpeg4PlayDspReqReply.SkipSec = 0;
//MJPEG
MjpegPlayStartCmd.RingBuffAddrHigh = HIGH_WORD(MOVIE_BUFFER_OFFSET);
MjpegPlayStartCmd.RingBuffAddrLow = LOW_WORD (MOVIE_BUFFER_OFFSET);
MjpegPlayStartCmd.RingBuffSizeHigh = HIGH_WORD(MOVIE_BUFFER_SIZE);
MjpegPlayStartCmd.RingBuffSizeLow = LOW_WORD (MOVIE_BUFFER_SIZE);
MjpegPlayStartCmd.VideoSizeHigh = 0;
MjpegPlayStartCmd.VideoSizeLow = 0;
MjpegPlayStartCmd.VideoAddrHigh = HIGH_WORD(OSD_VIDEO_WIN0_OFFSET);
MjpegPlayStartCmd.VideoAddrLow = LOW_WORD (OSD_VIDEO_WIN0_OFFSET);
MjpegPlayStartCmd.FrameWidth = 720;
MjpegPlayStartCmd.FrameHeight = 480;
MjpegPlayStartCmd.StartX = 0;
MjpegPlayStartCmd.StartY = 0;
MjpegPlayStartCmd.Reserved = 0;
MjpegPlayStartCmd.AudioRingBuffAddrHigh = HIGH_WORD(AUDIO_BUFFER_OFFSET);
MjpegPlayStartCmd.AudioRingBuffAddrLow = LOW_WORD (AUDIO_BUFFER_OFFSET);
MjpegPlayStartCmd.AudioRingBuffSizeHigh = HIGH_WORD(AUDIO_BUFFER_SIZE);
MjpegPlayStartCmd.AudioRingBuffSizeLow = LOW_WORD (AUDIO_BUFFER_SIZE);
MjpegPlayStartCmd.AudioSizeHigh = 0;
MjpegPlayStartCmd.AudioSizeLow = 0;
MjpegPlayStartCmd.AudioBitRate = MJPEG_G711_64KBPS;
MjpegPlayStartCmd.FrameRate = MJPEG_FRAME_RATE;
MjpegPlayDspReqReply.VideoAddrHigh = 0;
MjpegPlayDspReqReply.VideoAddrLow = 0;
MjpegPlayDspReqReply.StartX = 0;
MjpegPlayDspReqReply.StartY = 0;
MjpegPlayDspReqReply.DecodeMode = MJPEG_PLAY_NORMAL;
MjpegPlayDspReqReply.SkipSec = 0;
MovieCtrl.FrameRate=MJPEG_FRAME_RATE;
return E_PASS;
}
void MOVIE_PLAY_run(MOVIE_MODE mode) {
BOOL stopped;
char ch;
switch(mode) {
case MOVIE_MPEG4_MODE:
UART_sendString( UART0, mpeg4_playback_in_progress_menu);
break;
case MOVIE_MJPEG_MODE:
UART_sendString( UART0, mjpeg_playback_in_progress_menu);
break;
default:
return;
}
if( MOVIE_PLAY_START_run(mode, FALSE) != E_PASS ) {
MOVIE_PLAY_STOP_run(mode, FALSE);
return;
}
stopped=FALSE;
while(!stopped) {
ch = UI_checkInput();
switch(ch) {
case '1':
MOVIE_PLAY_PAUSE_run(mode);
break;
case '2':
UART_sendString( UART0, "\r\n\n Stopping playback. Please wait ...");
if(MovieCtrl.MoviePaused) // if movie is paused, resume it and then stop it
MOVIE_PLAY_PAUSE_run(mode);
MovieCtrl.MovieStopped = TRUE;
break;
case '3':
MOVIE_PLAY_FULLSCREEN_run(mode);
break;
default :
GUI_controlPanelSeekBarUpdate(MovieCtrl.VideoSize);
//GUI_controlPanelTimerUpdate(MovieCtrl.FrameCount/MovieCtrl.FrameRate);
stopped = MovieCtrl.DspStopped;
MOVIE_PLAY_IN_PROGRESS_run(mode);
if(stopped)
MOVIE_PLAY_STOP_run(mode, FALSE);
break;
}
}
}
STATUS MOVIE_PLAY_START_run(MOVIE_MODE mode, BOOL thumbnail) {
STATUS status;
Uint16 cmd;
// stop OSD, PREV, CCDC
OSD_winEnable( OSD_VID_WIN0, FALSE);
CCDC_enable(FALSE, FALSE);
PREV_enable(FALSE);
while(PREV_isEnabled())
;
INTC_clearIRQ(INT_DSP);
INTC_enable( INT_DSP, FALSE);
// download DSP code
switch(mode) {
case MOVIE_MPEG4_MODE:
status = DSPLoadCode(mpeg4_decode);
break;
case MOVIE_MJPEG_MODE:
status = DSPLoadCode(mjpeg_decode);
break;
default:
return E_INVALID_INPUT;
}
if(status!=E_PASS) {
UART_sendString( UART0, "\r\n ERROR : DSPLoadCode(). ");
return status;
}
MOVIE_AIC23_init(FALSE);
// wait for DSP to be ready
do {
ARMDSP_getArmCmd(&cmd, NULL, 0);
} while( cmd != 0x777 ) ;
// init MovieCtrl data structure
status = MOVIE_PLAY_initMovieCtrl(mode);
if(status != E_PASS )
return status;
// init PREV, CCDC, OSD
MOVIE_PLAY_initOSD(mode);
// fill input buffers with video data
MOVIE_PLAY_readBuff(FALSE);
MOVIE_PLAY_readBuff(FALSE);
// no need to read audio in thumbnail decode mode
if(thumbnail==FALSE) {
MOVIE_PLAY_readBuff(TRUE);
MOVIE_PLAY_readBuff(TRUE);
}
switch(mode) {
case MOVIE_MPEG4_MODE:
Mpeg4PlayStartCmd.VideoSizeHigh = HIGH_WORD(MovieCtrl.VideoSize);
Mpeg4PlayStartCmd.VideoSizeLow = LOW_WORD (MovieCtrl.VideoSize);
Mpeg4PlayStartCmd.AudioSizeHigh = HIGH_WORD(MovieCtrl.AudioSize);
Mpeg4PlayStartCmd.AudioSizeLow = LOW_WORD (MovieCtrl.AudioSize);
Mpeg4PlayStartCmd.AudioFormat = MovieCtrl.AudioFormat;
MovieCtrl.VideoSize = 0;
MovieCtrl.AudioSize = 0;
INTC_clearIRQ(INT_DSP);
if(thumbnail==TRUE) {
ARMDSP_sendDspCmd( MPEG4_PLAY_THUMBNAIL, (Uint16*)&Mpeg4PlayStartCmd, sizeof(Mpeg4PlayStartCmd)/2);
} else {
ARMDSP_sendDspCmd( MPEG4_PLAY_START, (Uint16*)&Mpeg4PlayStartCmd, sizeof(Mpeg4PlayStartCmd)/2);
}
break;
case MOVIE_MJPEG_MODE:
MjpegPlayStartCmd.VideoSizeHigh = HIGH_WORD(MovieCtrl.VideoSize);
MjpegPlayStartCmd.VideoSizeLow = LOW_WORD (MovieCtrl.VideoSize);
MjpegPlayStartCmd.AudioSizeHigh = HIGH_WORD(MovieCtrl.AudioSize);
MjpegPlayStartCmd.AudioSizeLow = LOW_WORD (MovieCtrl.AudioSize);
MjpegPlayStartCmd.FrameRate = MovieCtrl.FrameRate;
MovieCtrl.VideoSize = 0;
MovieCtrl.AudioSize = 0;
INTC_clearIRQ(INT_DSP);
if(thumbnail==TRUE) {
ARMDSP_sendDspCmd( MJPEG_PLAY_THUMBNAIL, (Uint16*)&MjpegPlayStartCmd, sizeof(MjpegPlayStartCmd)/2);
} else {
ARMDSP_sendDspCmd( MJPEG_PLAY_START, (Uint16*)&MjpegPlayStartCmd, sizeof(MjpegPlayStartCmd)/2);
}
break;
default:
return E_INVALID_INPUT;
}
INTC_waitForInt( INT_DSP, 0);
switch(mode) {
case MOVIE_MPEG4_MODE:
ARMDSP_getDspReply( &cmd, (Uint16*)&Mpeg4PlayStartCmdReply, sizeof(Mpeg4PlayStartCmdReply)/2 );
OSD_setWinStartPosition( OSD_VID_WIN0, (720-Mpeg4PlayStartCmdReply.FrameWidth)/2, (240-Mpeg4PlayStartCmdReply.FrameHeight/2)/2);
OSD_setWinSize( OSD_VID_WIN0, Mpeg4PlayStartCmdReply.FrameWidth, Mpeg4PlayStartCmdReply.FrameHeight/2);
// check reply
if(thumbnail) {
if( (cmd & DSP_CMD_MASK) != MPEG4_PLAY_THUMBNAIL) {
UART_sendString( UART0, "\r\n ERROR : MPEG4 thumbnail decode DSP command, failed.");
return E_DEVICE;
}
} else {
if( (cmd & DSP_CMD_MASK) != MPEG4_PLAY_START) {
UART_sendString( UART0, "\r\n ERROR : MPEG4 playback start DSP command, failed.");
return E_DEVICE;
}
}
if( (cmd & DSP_CMD_COMPLETE) != DSP_CMD_COMPLETE) {
UART_sendString( UART0, "\r\n ERROR : MPEG4 playback DSP command, failed.");
return E_DEVICE;
}
if( (cmd & DSP_CMD_INVALID_CMD ) || (cmd & DSP_CMD_INVALID_PARAM ) ) {
UART_sendString( UART0, "\r\n ERROR : MPEG4 playback DSP command, invalid DSP command/paramters.");
return E_DEVICE;
}
break;
case MOVIE_MJPEG_MODE:
ARMDSP_getDspReply( &cmd, (Uint16*)&MjpegPlayStartCmdReply, sizeof(MjpegPlayStartCmdReply)/2 );
OSD_setWinStartPosition( OSD_VID_WIN0, (720-MjpegPlayStartCmdReply.FrameWidth)/2, (240-MjpegPlayStartCmdReply.FrameHeight/2)/2);
OSD_setWinSize( OSD_VID_WIN0, MjpegPlayStartCmdReply.FrameWidth, MjpegPlayStartCmdReply.FrameHeight/2);
// check reply
if(thumbnail) {
if( (cmd & DSP_CMD_MASK) != MJPEG_PLAY_THUMBNAIL) {
UART_sendString( UART0, "\r\n ERROR : MJPEG thumbnail decode DSP command, failed.");
return E_DEVICE;
}
} else {
if( (cmd & DSP_CMD_MASK) != MJPEG_PLAY_START) {
UART_sendString( UART0, "\r\n ERROR : MJPEG playback start DSP command, failed.");
return E_DEVICE;
}
}
if( (cmd & DSP_CMD_COMPLETE) != DSP_CMD_COMPLETE) {
UART_sendString( UART0, "\r\n ERROR : MJPEG playback DSP command, failed.");
return E_DEVICE;
}
if( (cmd & DSP_CMD_INVALID_CMD ) || (cmd & DSP_CMD_INVALID_PARAM ) ) {
UART_sendString( UART0, "\r\n ERROR : MJPEG playback DSP command, invalid DSP command/paramters.");
return E_DEVICE;
}
break;
default:
return E_INVALID_INPUT;
}
if(thumbnail) {
switch(mode)
{
case MOVIE_MPEG4_MODE:
INTC_waitForInt(INT_DSP, 0);
ARMDSP_getArmCmd( &cmd, (Uint16*)&Mpeg4PlayDspReq, sizeof(Mpeg4PlayDspReq)/2);
MovieCtrl.VideoSize = MAKE_WORD32(Mpeg4PlayDspReq.VideoSizeHigh, Mpeg4PlayDspReq.VideoSizeLow);
MovieCtrl.AudioSize = MAKE_WORD32(Mpeg4PlayDspReq.AudioSizeHigh, Mpeg4PlayDspReq.AudioSizeLow);
MovieCtrl.FrameCount= MAKE_WORD32(Mpeg4PlayDspReq.FrameCountHigh,Mpeg4PlayDspReq.FrameCountLow);
OSD_winEnable( OSD_VID_WIN0, TRUE );
MOVIE_PLAY_STOP_run(mode, TRUE);
break;
case MOVIE_MJPEG_MODE:
INTC_waitForInt(INT_DSP, 0);
ARMDSP_getArmCmd( &cmd, (Uint16*)&MjpegPlayDspReq, sizeof(MjpegPlayDspReq)/2);
MovieCtrl.VideoSize = MAKE_WORD32(MjpegPlayDspReq.VideoSizeHigh, MjpegPlayDspReq.VideoSizeLow);
MovieCtrl.AudioSize = MAKE_WORD32(MjpegPlayDspReq.AudioSizeHigh, MjpegPlayDspReq.AudioSizeLow);
MovieCtrl.FrameCount= MAKE_WORD32(MjpegPlayDspReq.FrameCountHigh,MjpegPlayDspReq.FrameCountLow);
OSD_winEnable( OSD_VID_WIN0, TRUE );
MOVIE_PLAY_STOP_run(mode, TRUE);
break;
default:
return E_INVALID_INPUT;
}
} else {
// attach DSP HINT ISR
switch(mode) {
case MOVIE_MPEG4_MODE:
INTC_clearIRQ(INT_DSP);
INTC_enable( INT_DSP, FALSE);
INTCAttachISR( INT_DSP, MPEG4_PLAY_isr );
INTC_enable( INT_DSP, TRUE);
INTC_clearIRQ(INT_OSD);
INTC_enable( INT_OSD, FALSE );
INTCAttachISR( INT_OSD, MOVIE_PLAY_switchBuffer );
INTC_enable( INT_OSD, TRUE );
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_START);
break;
case MOVIE_MJPEG_MODE:
INTC_clearIRQ(INT_DSP);
INTC_enable( INT_DSP, FALSE);
INTCAttachISR( INT_DSP, MJPEG_PLAY_isr );
INTC_enable( INT_DSP, TRUE);
INTC_clearIRQ(INT_OSD);
INTC_enable( INT_OSD, FALSE );
INTCAttachISR( INT_OSD, MOVIE_PLAY_switchBuffer );
INTC_enable( INT_OSD, TRUE );
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_START);
break;
default:
return E_INVALID_INPUT;
}
}
return E_PASS;
}
void MOVIE_PLAY_switchBuffer() {
if( MovieCtrl.CurVideoWinBuffer != MovieCtrl.CurDspWinBuffer) {
switch(MovieCtrl.CurVideoWinBuffer) {
case 0:
OSD_setWinAddr( OSD_VID_WIN0, (char*)MovieCtrl.VideoWinBuffer[0]);
MovieCtrl.CurVideoWinBuffer=1;
break;
case 1:
OSD_setWinAddr( OSD_VID_WIN0, (char*)MovieCtrl.VideoWinBuffer[1]);
MovieCtrl.CurVideoWinBuffer=2;
break;
case 2:
OSD_setWinAddr( OSD_VID_WIN0, (char*)MovieCtrl.VideoWinBuffer[2]);
MovieCtrl.CurVideoWinBuffer=0;
break;
}
}
GUI_controlPanelTimerUpdate(MovieCtrl.FrameCount/MovieCtrl.FrameRate);
}
static Uint16 intType, cmd;
void MPEG4_PLAY_isr() {
DSPC_readData((char*)&intType, 1, 0xFF);
if(intType == 1) { // Request
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -