📄 movie_play.c
字号:
MovieCtrl.AudioRingBuffer.size/3 );
} else {
MovieCtrl.VideoRingBuffer.curBuff--;
if((Int32)MovieCtrl.VideoRingBuffer.curBuff<0)
MovieCtrl.VideoRingBuffer.curBuff=2;
MEM_FILE_seek(&MovieCtrl.VideoFile, -2*(Int32)(MovieCtrl.VideoRingBuffer.size/3), MEM_FILE_SEEK_CUR);
MEM_FILE_read( &MovieCtrl.VideoFile,
(char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3),
MovieCtrl.VideoRingBuffer.size/3 );
}
}
/*-----------------------------------------------------------------------------\
@RoutineName :: MOVIE_nextFile
@Description ::
Goto next Movie file in device
@Parameters ::
NONE
@Return ::
E_PASS, success
E_DEVICE, failure
\-----------------------------------------------------------------------------*/
STATUS MOVIE_nextFile(MOVIE_MODE mode) {
char fname[40];
switch(mode) {
case MOVIE_MPEG4_MODE:
if( GetNextIndex(&MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
if( GetFirstIndex(&MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : MPEG4 files not found.");
return E_DEVICE;
}
}
if( GenFileName(fname, MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : File Access");
return E_DEVICE;
}
break;
case MOVIE_MJPEG_MODE:
if( GetNextIndex(&MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
if( GetFirstIndex(&MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : MJPEG files not found.");
return E_DEVICE;
}
}
if( GenFileName(fname, MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : File Access");
return E_DEVICE;
}
break;
default:
return E_DEVICE;
}
return E_PASS;
}
/*-----------------------------------------------------------------------------\
@RoutineName :: MOVIE_prevFile
@Description ::
Goto Previous Movie file in device
@Parameters ::
NONE
@Return ::
E_PASS, success
E_DEVICE, failure
\-----------------------------------------------------------------------------*/
STATUS MOVIE_prevFile(MOVIE_MODE mode) {
char fname[40];
switch(mode) {
case MOVIE_MPEG4_MODE:
if( GetPrevIndex(&MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
if( GetLastIndex(&MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : MPEG4 files not found.");
return E_DEVICE;
}
}
if( GenFileName(fname, MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : File Access");
return E_DEVICE;
}
break;
case MOVIE_MJPEG_MODE:
if( GetPrevIndex(&MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
if( GetLastIndex(&MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : MJPEG files not found.");
return E_DEVICE;
}
}
if( GenFileName(fname, MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n E_DEVICE : File Access");
return E_DEVICE;
}
break;
default:
return E_DEVICE;
}
return E_PASS;
}
/*-----------------------------------------------------------------------------\
@RoutineName :: MOVIE_firstFile
@Description ::
Goto First Movie file in device
@Parameters ::
NONE
@Return ::
E_PASS, success
E_DEVICE, failure
\-----------------------------------------------------------------------------*/
STATUS MOVIE_firstFile(MOVIE_MODE mode) {
STATUS status;
switch(mode) {
case MOVIE_MPEG4_MODE:
status = GetFirstIndex(&MovieCtrl.Mpeg4FileIndex, MPEG4_FILE);
break;
case MOVIE_MJPEG_MODE:
status = GetFirstIndex(&MovieCtrl.MjpegFileIndex, MJPEG_FILE);
break;
default:
status = E_DEVICE;
break;
}
return status;
}
/*-----------------------------------------------------------------------------\
@RoutineName :: MOVIE_lastFile
@Description ::
Goto Last Movie file in device
@Parameters ::
NONE
@Return ::
E_PASS, success
E_DEVICE, failure
\-----------------------------------------------------------------------------*/
STATUS MOVIE_lastFile(MOVIE_MODE mode) {
STATUS status;
switch(mode) {
case MOVIE_MPEG4_MODE:
status = GetLastIndex(&MovieCtrl.Mpeg4FileIndex, MPEG4_FILE);
break;
case MOVIE_MJPEG_MODE:
status = GetLastIndex(&MovieCtrl.MjpegFileIndex, MJPEG_FILE);
break;
default:
status = E_DEVICE;
break;
}
return status;
}
Uint32 MoviePlaybackCount;
void MOVIE_PLAY_CONTINOUS_run(MOVIE_MODE mode) {
BOOL stopped, exit, nextFile, prevFile, forwardDir, errorFile;
char ch;
switch(mode) {
case MOVIE_MPEG4_MODE:
UART_sendString( UART0, mpeg4_playback_continous_menu);
break;
case MOVIE_MJPEG_MODE:
UART_sendString( UART0, mjpeg_playback_continous_menu);
break;
default:
return;
}
if( MOVIE_PLAY_START_run(mode, FALSE) != E_PASS ) {
MOVIE_PLAY_STOP_run(mode, FALSE);
errorFile=TRUE;
} else {
errorFile=FALSE;
MoviePlaybackCount=1;
}
stopped = nextFile = prevFile = exit = FALSE;
forwardDir = TRUE;
while(1) {
ch = UI_checkInput();
switch(ch) {
case '0':
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;
exit=TRUE;
break;
case '1':
MOVIE_PLAY_PAUSE_run(mode);
break;
case '2':
MOVIE_PLAY_FULLSCREEN_run(mode);
break;
case '3':
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;
prevFile = FALSE;
nextFile = TRUE;
forwardDir = TRUE;
break;
case '4':
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;
nextFile = FALSE;
prevFile = TRUE;
forwardDir = FALSE;
break;
default :
GUI_controlPanelSeekBarUpdate(MovieCtrl.VideoSize);
//GUI_controlPanelTimerUpdate(MovieCtrl.FrameCount/MovieCtrl.FrameRate);
if(!errorFile) {
stopped = MovieCtrl.DspStopped;
MOVIE_PLAY_IN_PROGRESS_run(mode);
}
if(stopped || errorFile ) {
if(!errorFile)
MOVIE_PLAY_STOP_run(mode, FALSE);
if(exit) {
return;
}
if(nextFile || forwardDir ) {
GUI_controlPanelReset();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_NEXT);
MOVIE_nextFile(mode);
forwardDir = TRUE;
} else
if(prevFile || !forwardDir ) {
GUI_controlPanelReset();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_PREV);
MOVIE_prevFile(mode);
forwardDir = FALSE;
}
nextFile = FALSE;
prevFile = FALSE;
UART_sendString( UART0, mpeg4_playback_continous_menu);
if( MOVIE_PLAY_START_run(mode, FALSE) != E_PASS ) {
MOVIE_PLAY_STOP_run(mode, FALSE);
errorFile = TRUE;
} else {
errorFile = FALSE;
MoviePlaybackCount++;
sprintf( UART_outBuff, "\r\n\n Playing Movie No. : %ld \r\n", MoviePlaybackCount);
UART_sendString( UART0, UART_outBuff );
}
}
break;
}
}
}
void MOVIE_PLAY_FULLSCREEN_run(MOVIE_MODE mode) {
if(mode==MOVIE_MJPEG_MODE)
return;
if(MovieCtrl.MovieFullScreen) {
MovieCtrl.MovieFullScreen = FALSE;
OSDSetMode( OSD_VID_WIN0, VID_352x288, NULL);
OSD_setWinStartPosition( OSD_VID_WIN0, (720-Mpeg4PlayStartCmdReply.FrameWidth)/2, (240-Mpeg4PlayStartCmdReply.FrameHeight/2)/2);
OSD_setWinSize( OSD_VID_WIN0, Mpeg4PlayStartCmdReply.FrameWidth, Mpeg4PlayStartCmdReply.FrameHeight/2);
} else {
Int16 startX, startY;
MovieCtrl.MovieFullScreen = TRUE;
switch(mode) {
case MOVIE_MPEG4_MODE:
OSDSetMode( OSD_VID_WIN0, VID_FLD_352x288, NULL);
startX = (720-Mpeg4PlayStartCmdReply.FrameWidth*2)/2;
startY = (240-Mpeg4PlayStartCmdReply.FrameHeight)/2;
if(startX<0)
startX = 0;
if(startY<0)
startY = 0;
OSD_setWinStartPosition( OSD_VID_WIN0, startX, startY);
OSD_setWinSize( OSD_VID_WIN0, Mpeg4PlayStartCmdReply.FrameWidth*2, Mpeg4PlayStartCmdReply.FrameHeight);
break;
default:
break;
}
}
}
STATUS MOVIE_PLAY_qtffParse(MOVIE_MODE mode, char *fname) {
FILE_ID *qtFile;
Uint32 mdatSize;
Uint32 mdatAtomTag;
sprintf( UART_outBuff, "\r\n FILE : %s ", fname );
UART_sendString( UART0, UART_outBuff );
UART_sendString( UART0, "\r\n Checking for QTFF ... ");
qtFile = FILE_open( fname, "rb", 0 );
if(qtFile==NULL) {
UART_sendString( UART0, "\r\n ERROR : File Access");
return E_DEVICE;
}
FILE_read( qtFile, (char*)&mdatSize, 4 );
FILE_read( qtFile, (char*)&mdatAtomTag, 4);
mdatSize=byte_swap32(mdatSize);
mdatAtomTag=byte_swap32(mdatAtomTag);
if(mdatAtomTag==QT_MDAT_TAG) {
// qt file
char *moovAddr;
STATUS status;
UART_sendString( UART0, "Found.");
UART_sendString( UART0, "\r\n Seeking MOOV Atom ... " );
moovAddr = (char*)MEM_FS_BUFFER_ADDR;
FILE_seek( qtFile, mdatSize, SEEK_SET);
FILE_read( qtFile, moovAddr, MB);
FILE_close(qtFile, 0);
UART_sendString( UART0, "done." );
UART_sendString( UART0, "\r\n Parsing MOOV Atom ... " );
MovieCtrl.prmQT.Ssize = NULL;
status = QTParseMOOVAtom((Uint8*)moovAddr, 0, &MovieCtrl.prmQT);
if(status!=E_PASS) {
UART_sendString( UART0, "Error in parsing." );
return E_DEVICE;
}
UART_sendString( UART0, "done." );
UART_sendString( UART0, "\r\n Seeking Video Chunk ... " );
MovieCtrl.FS_VideoFile = FILE_open( fname, "rb", 0 );
if(MovieCtrl.FS_VideoFile==NULL) {
return E_DEVICE;
}
switch(mode) {
case MOVIE_MPEG4_MODE:
FILE_seek(MovieCtrl.FS_VideoFile, 8, SEEK_SET);
break;
case MOVIE_MJPEG_MODE:
FILE_seek(MovieCtrl.FS_VideoFile, MovieCtrl.prmQT.ChunkOffset, SEEK_SET);
break;
default:
return E_DEVICE;
}
UART_sendString( UART0, "done." );
UART_sendString( UART0, "\r\n Seeking Audio Chunk ... " );
MovieCtrl.FS_AudioFile = FILE_open( fname, "rb", 0 );
if(MovieCtrl.FS_AudioFile==NULL) {
return E_DEVICE;
}
FILE_seek(MovieCtrl.FS_AudioFile, MovieCtrl.prmQT.audioPrmQT.ChunkOffset, SEEK_SET);
UART_sendString( UART0, "done." );
MovieCtrl.VideoSize = MovieCtrl.prmQT.audioPrmQT.ChunkOffset - MovieCtrl.prmQT.ChunkOffset;
MovieCtrl.AudioSize = mdatSize - MovieCtrl.prmQT.audioPrmQT.ChunkOffset;
if(MovieCtrl.prmQT.FrameRate<=30)
MovieCtrl.FrameRate = MovieCtrl.prmQT.FrameRate;
switch(mode) {
case MOVIE_MPEG4_MODE:
MovieCtrl.AudioFormat=MOVIE_AUDIO_FORMAT_G711;
break;
}
UART_sendString( UART0, "\r\n Playing ...\r\n\n");
return E_PASS;
} else {
UART_sendString( UART0, "Not Found. Loading as raw MJPEG bitstream.");
FILE_close(qtFile, 0);
}
return E_DEVICE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -