📄 movie_play.c
字号:
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);
if( MovieCtrl.FrameCount == 1 )
OSD_winEnable( OSD_VID_WIN0, TRUE );
if(MovieCtrl.MovieStopped) {
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendDspCmd( MPEG4_PLAY_STOP, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
switch(cmd) {
case MPEG4_PLAY_DISPLAY:
if(MovieCtrl.MovieFF || MovieCtrl.MovieREV) {
if(MovieCtrl.MovieFF)
Mpeg4PlayDspReqReply.DecodeMode = MPEG4_PLAY_FF;
if(MovieCtrl.MovieREV)
Mpeg4PlayDspReqReply.DecodeMode = MPEG4_PLAY_REV;
} else {
Mpeg4PlayDspReqReply.DecodeMode = MPEG4_PLAY_NORMAL;
}
MovieCtrl.CurDspWinBuffer = (MovieCtrl.CurDspWinBuffer+1)%3;
Mpeg4PlayDspReqReply.VideoAddrHigh = HIGH_WORD( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
Mpeg4PlayDspReqReply.VideoAddrLow = LOW_WORD ( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
ARMDSP_sendArmReply( MPEG4_PLAY_DISPLAY | DSP_CMD_COMPLETE, (Uint16*)&Mpeg4PlayDspReqReply, sizeof(Mpeg4PlayDspReqReply)/2 );
return;
case MPEG4_PLAY_DATA_IN_REQ:
if(Mpeg4PlayDspReq.FrameDataInType == 0 )
MovieCtrl.VideoBuffWrite = TRUE;
if(Mpeg4PlayDspReq.FrameDataInType == 1 )
MovieCtrl.AudioBuffWrite = TRUE;
ARMDSP_sendArmReply( MPEG4_PLAY_DATA_IN_REQ | DSP_CMD_COMPLETE, NULL, 0 );
return;
case MPEG4_PLAY_COMPLETE_REQ:
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendArmReply( MPEG4_PLAY_COMPLETE_REQ | DSP_CMD_COMPLETE, NULL, 0 );
MovieCtrl.DspStopped = TRUE;
return;
default:
// invalid request stop DSP
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendArmReply( cmd, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
} else { // ACK
asm(" NOP");
}
}
void MJPEG_PLAY_isr() {
DSPC_readData((char*)&intType, 1, 0xFF);
if(intType == 1) { // Request
ARMDSP_getArmCmd( &cmd, (Uint16*)&MjpegPlayDspReq, sizeof(MjpegPlayDspReq)/2);
if((cmd==MJPEG_PLAY_DISPLAY)||(cmd==MJPEG_PLAY_COMPLETE_REQ)){
MovieCtrl.VideoSize = MAKE_WORD32(MjpegPlayDspReq.VideoSizeHigh, MjpegPlayDspReq.VideoSizeLow);
MovieCtrl.AudioSize = MAKE_WORD32(MjpegPlayDspReq.AudioSizeHigh, MjpegPlayDspReq.AudioSizeLow);
MovieCtrl.FrameCount= MAKE_WORD32(MjpegPlayDspReq.FrameCountHigh,MjpegPlayDspReq.FrameCountLow);
}
if( MovieCtrl.FrameCount == 1 )
OSD_winEnable( OSD_VID_WIN0, TRUE );
if(MovieCtrl.MovieStopped) {
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendDspCmd( MJPEG_PLAY_STOP, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
switch(cmd) {
case MJPEG_PLAY_DISPLAY:
if(MovieCtrl.MovieFF || MovieCtrl.MovieREV) {
if(MovieCtrl.MovieFF)
MjpegPlayDspReqReply.DecodeMode = MJPEG_PLAY_FF;
if(MovieCtrl.MovieREV)
MjpegPlayDspReqReply.DecodeMode = MJPEG_PLAY_REV;
} else {
MjpegPlayDspReqReply.DecodeMode = MJPEG_PLAY_NORMAL;
}
MovieCtrl.CurDspWinBuffer = (MovieCtrl.CurDspWinBuffer+1)%3;
MjpegPlayDspReqReply.VideoAddrHigh = HIGH_WORD( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
MjpegPlayDspReqReply.VideoAddrLow = LOW_WORD ( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
ARMDSP_sendArmReply( MJPEG_PLAY_DISPLAY | DSP_CMD_COMPLETE, (Uint16*)&MjpegPlayDspReqReply, sizeof(MjpegPlayDspReqReply)/2 );
return;
case MJPEG_PLAY_DATA_IN_REQ:
if(MjpegPlayDspReq.FrameDataInType == 0 )
MovieCtrl.VideoBuffWrite = TRUE;
if(MjpegPlayDspReq.FrameDataInType == 1 )
MovieCtrl.AudioBuffWrite = TRUE;
ARMDSP_sendArmReply( MJPEG_PLAY_DATA_IN_REQ | DSP_CMD_COMPLETE, NULL, 0 );
return;
case MJPEG_PLAY_COMPLETE_REQ:
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendArmReply( MJPEG_PLAY_COMPLETE_REQ | DSP_CMD_COMPLETE, NULL, 0 );
MovieCtrl.DspStopped = TRUE;
return;
default:
// invalid request stop DSP
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendArmReply( cmd, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
} else { // ACK
asm(" NOP");
}
}
void MOVIE_PLAY_IN_PROGRESS_run(MOVIE_MODE mode) {
if(MovieCtrl.VideoBuffWrite) {
MovieCtrl.VideoBuffWrite = FALSE;
if(MovieCtrl.MovieREV)
MOVIE_PLAY_readBuffReverse(FALSE);
else
MOVIE_PLAY_readBuff( FALSE );
UART_sendString( UART0, "+" );
}
if(MovieCtrl.AudioBuffWrite) {
MovieCtrl.AudioBuffWrite = FALSE;
if(MovieCtrl.MovieREV)
MOVIE_PLAY_readBuffReverse(TRUE);
else
MOVIE_PLAY_readBuff( TRUE );
UART_sendString( UART0, "." );
}
}
void MOVIE_PLAY_STOP_run(MOVIE_MODE mode, BOOL thumbnail) {
if(FS_FILE_IO) {
FILE_close( MovieCtrl.FS_VideoFile, 0 );
FILE_close( MovieCtrl.FS_AudioFile, 0 );
} else {
MEM_FILE_close( &MovieCtrl.VideoFile );
MEM_FILE_close( &MovieCtrl.AudioFile );
}
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
INTC_enable( INT_OSD, FALSE);
INTCDetachISR( INT_OSD );
if(thumbnail) {
sprintf( UART_outBuff, "\r\n"
"\r\n Thumbnail decode done. "
"\r\n Thumbnail size = %ld B"
"\r\n"
"\r\n", MovieCtrl.VideoSize );
} else {
sprintf( UART_outBuff, "\r\n"
"\r\n Playback Stopped. "
"\r\n %ld video frames decoded."
"\r\n Video data size = %ld B"
"\r\n Audio data size = %ld B"
"\r\n"
"\r\n", MovieCtrl.FrameCount, MovieCtrl.VideoSize, MovieCtrl.AudioSize );
}
UART_sendString( UART0, UART_outBuff );
MOVIE_AIC23_stop();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_STOP);
}
void MOVIE_PLAY_PAUSE_run(MOVIE_MODE mode) {
volatile Uint16 cmd;
if(MovieCtrl.FrameCount<1)
return;
if(MovieCtrl.MoviePaused==TRUE) {
MovieCtrl.MoviePaused=FALSE;
UART_sendString( UART0, "\r\n Playback Resumed.");
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_START);
} else {
MovieCtrl.MoviePaused=TRUE;
UART_sendString( UART0, "\r\n Playback Paused.");
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_PAUSE);
}
cmd = 0;
DSPC_writeData((char*)&cmd, 1, ARM_DSP_DSPCCR);
switch(mode) {
case MOVIE_MPEG4_MODE:
ARMDSP_sendDspCmd(MPEG4_PLAY_PAUSE, NULL, 0);
TMRDelay(20);
do {
DSPC_readData((char*)&cmd, 1, ARM_DSP_DSPCCR);
} while( (cmd&DSP_CMD_MASK) != MPEG4_PLAY_PAUSE );
break;
case MOVIE_MJPEG_MODE:
ARMDSP_sendDspCmd(MJPEG_PLAY_PAUSE, NULL, 0);
TMRDelay(20);
do {
DSPC_readData((char*)&cmd, 1, ARM_DSP_DSPCCR);
} while( (cmd&DSP_CMD_MASK) != MJPEG_PLAY_PAUSE );
break;
default:
break;
}
if( (cmd&DSP_CMD_COMPLETE)!=DSP_CMD_COMPLETE )
MovieCtrl.DspStopped = TRUE;
}
void MOVIE_PLAY_FF_run(MOVIE_MODE mode) {
if(MovieCtrl.MovieFF == TRUE) {
MovieCtrl.MovieFF=FALSE;
UART_sendString( UART0, "\r\n Playback Normal.");
} else {
MovieCtrl.MovieFF=TRUE;
MovieCtrl.MovieREV=FALSE;
UART_sendString( UART0, "\r\n Playback FF.");
}
if(MovieCtrl.MoviePaused==TRUE) {
UART_sendString( UART0, " -- Paused.");
}
}
void MOVIE_PLAY_REV_run(MOVIE_MODE mode) {
if(MovieCtrl.MovieREV == TRUE) {
MovieCtrl.MovieREV=FALSE;
UART_sendString( UART0, "\r\n Playback Normal.");
MEM_FILE_seek(&MovieCtrl.AudioFile, 2*(MovieCtrl.AudioRingBuffer.size/3), MEM_FILE_SEEK_CUR);
MEM_FILE_seek(&MovieCtrl.VideoFile, 2*(MovieCtrl.VideoRingBuffer.size/3), MEM_FILE_SEEK_CUR);
} else {
MovieCtrl.MovieREV=TRUE;
MovieCtrl.MovieFF=FALSE;
UART_sendString( UART0, "\r\n Playback Rewind.");
MEM_FILE_seek(&MovieCtrl.AudioFile, -2*(Int32)(MovieCtrl.AudioRingBuffer.size/3), MEM_FILE_SEEK_CUR);
MEM_FILE_seek(&MovieCtrl.VideoFile, -2*(Int32)(MovieCtrl.VideoRingBuffer.size/3), MEM_FILE_SEEK_CUR);
}
if(MovieCtrl.MoviePaused==TRUE) {
UART_sendString( UART0, "\r\n -- Paused.");
}
}
void MOVIE_PLAY_initOSD(MOVIE_MODE mode) {
switch(mode) {
case MOVIE_MPEG4_MODE:
OSDSetMode( OSD_VID_WIN0, VID_352x288, (char*)OSD_VIDEO_WIN0_ADDR);
break;
case MOVIE_MJPEG_MODE:
OSDSetMode( OSD_VID_WIN0, VID_720x480, (char*)OSD_VIDEO_WIN0_ADDR);
break;
default:
break;
}
}
STATUS MOVIE_PLAY_initMovieCtrl(MOVIE_MODE mode) {
MovieCtrl.VideoWinBuffer[0] = OSD_VIDEO_WIN0_ADDR;
MovieCtrl.VideoWinBuffer[1] = OSD_VIDEO_WIN1_ADDR;
MovieCtrl.VideoWinBuffer[2] = OSD_VIDEO_WIN2_ADDR;
MovieCtrl.CurVideoWinBuffer = 0;
MovieCtrl.CurDspWinBuffer = 0;
MovieCtrl.VideoRingBuffer.startAddr = MOVIE_BUFFER_ADDR;
MovieCtrl.VideoRingBuffer.size = MOVIE_BUFFER_SIZE;
MovieCtrl.VideoRingBuffer.curBuff = 0;
MovieCtrl.AudioRingBuffer.startAddr = AUDIO_BUFFER_ADDR;
MovieCtrl.AudioRingBuffer.size = AUDIO_BUFFER_SIZE;
MovieCtrl.AudioRingBuffer.curBuff = 0;
MovieCtrl.FrameCount = 0;
MovieCtrl.FS_VideoFile = NULL;
MovieCtrl.FS_AudioFile = NULL;
switch(mode) {
case MOVIE_MPEG4_MODE:
MovieCtrl.FrameRate=MPEG4_FRAME_RATE;
break;
case MOVIE_MJPEG_MODE:
//MovieCtrl.FrameRate=MJPEG_FRAME_RATE;
break;
default:
return E_INVALID_INPUT;
}
profile_clear(11);
if(FS_FILE_IO) {
char fname[40];
UART_sendString( UART0, "\r\n Loading Movie. Please Wait ... " );
switch(mode) {
case MOVIE_MPEG4_MODE:
if( GenFileName(fname, MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n ERROR : File Access");
return E_DEVICE;
}
GUI_fileInfoPanelSetInfo(MovieCtrl.Mpeg4FileIndex);
break;
case MOVIE_MJPEG_MODE:
if( GenFileName(fname, MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n ERROR : File Access");
return E_DEVICE;
}
GUI_fileInfoPanelSetInfo(MovieCtrl.MjpegFileIndex);
break;
default:
return E_DEVICE;
}
if( MOVIE_PLAY_qtffParse(mode, fname) != E_PASS ) {
// file does not have QT wrapper, open as raw bitstream
UART_sendString( UART0, "\r\n Loading Video. Please Wait ... " );
MovieCtrl.FS_VideoFile = FILE_open( fname, "rb", 0 );
if(MovieCtrl.FS_VideoFile == NULL ) {
UART_sendString( UART0, "\r\n ERROR : File Access");
return E_DEVICE;
}
FILE_sizeGet(MovieCtrl.FS_VideoFile, (int*)&MovieCtrl.VideoSize );
UART_sendString( UART0, "Done.");
sprintf( UART_outBuff, "\r\n FILE : %s ", fname );
UART_sendString( UART0, UART_outBuff );
strcpy( fname + (strlen(fname) - 3), "AUD" ); // make extension as .AUD for audio file
UART_sendString( UART0, "\r\n Loading Audio. Please Wait ... " );
MovieCtrl.FS_AudioFile = FILE_open( fname, "rb", 0 );
if(MovieCtrl.FS_AudioFile == NULL ) {
UART_sendString( UART0, "\r\n ERROR : File Access");
return E_DEVICE;
}
FILE_sizeGet(MovieCtrl.FS_AudioFile, (int*)&MovieCtrl.AudioSize );
UART_sendString( UART0, "Done.");
sprintf( UART_outBuff, "\r\n FILE : %s ", fname );
UART_sendString( UART0, UART_outBuff );
}
} else {
MEM_FILE_open( &MovieCtrl.VideoFile, MEM_FS_BUFFER_ADDR, "rb" );
MEM_FILE_open( &MovieCtrl.AudioFile, MEM_FS_BUFFER_ADDR + MovieCtrl.MaxVideoSize + 200*KB + MB, "rb" );
MovieCtrl.VideoSize = MovieCtrl.VideoFile.size;
MovieCtrl.AudioSize = MovieCtrl.AudioFile.size;
}
MovieCtrl.FrameCount = 0;
MovieCtrl.VideoBuffWrite = FALSE;
MovieCtrl.AudioBuffWrite = FALSE;
MovieCtrl.DspStopped = FALSE;
MovieCtrl.MovieStopped = FALSE;
MovieCtrl.MoviePaused = FALSE;
MovieCtrl.MovieFF = FALSE;
MovieCtrl.MovieREV = FALSE;
MovieCtrl.MovieFullScreen= FALSE;
GUI_controlPanelSeekBarMaxPositionSet(MovieCtrl.VideoSize);
return E_PASS;
}
void MOVIE_PLAY_readBuff(BOOL audio) {
if(audio) {
if(FS_FILE_IO) {
profile_start(11);
FILE_read( MovieCtrl.FS_AudioFile, (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3),
MovieCtrl.AudioRingBuffer.size/3
);
profile_end(11);
} else {
MEM_FILE_read( &MovieCtrl.AudioFile,
(char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3),
MovieCtrl.AudioRingBuffer.size/3 );
}
MovieCtrl.AudioRingBuffer.curBuff = (MovieCtrl.AudioRingBuffer.curBuff+1)%3;
} else {
if(FS_FILE_IO) {
profile_start(11);
FILE_read(MovieCtrl.FS_VideoFile, (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3),
MovieCtrl.VideoRingBuffer.size/3
);
profile_end(11);
} else {
MEM_FILE_read( &MovieCtrl.VideoFile,
(char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3),
MovieCtrl.VideoRingBuffer.size/3 );
}
MovieCtrl.VideoRingBuffer.curBuff = (MovieCtrl.VideoRingBuffer.curBuff+1)%3;
}
}
void MOVIE_PLAY_readBuffReverse(BOOL audio) {
if(audio) {
MovieCtrl.AudioRingBuffer.curBuff--;
if((Int32)MovieCtrl.AudioRingBuffer.curBuff<0)
MovieCtrl.AudioRingBuffer.curBuff=2;
MEM_FILE_seek(&MovieCtrl.AudioFile, -2*(Int32)(MovieCtrl.AudioRingBuffer.size/3), MEM_FILE_SEEK_CUR);
MEM_FILE_read( &MovieCtrl.AudioFile,
(char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -