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

📄 movie_play.c

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