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

📄 movie_play.c

📁 dm270 source code
💻 C
📖 第 1 页 / 共 3 页
字号:
			          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 + -