亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? movie_rec.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/ccdm_3d3.h>
#include <user/ccdm.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_rec.h>

#include <util/mem_fs.h>

#include <demo/dm270_demo.h>
#include <demo/mem_alloc.h>
#include <demo/menu.h>
#include <demo/ui.h>

#include <util/file_name_gen.h>

#include <demo_gui/demo_gui.h>

#include <qtff/qt.h>

//MPEG-4
MPEG4_REC_START_CMD		Mpeg4RecStartCmd;
MPEG4_REC_CMD_REPLY		Mpeg4RecStartCmdReply;

MPEG4_REC_DSP_REQ		Mpeg4RecDspReq;
MPEG4_REC_DSP_REQ_REPLY Mpeg4RecDspReqReply;

//MJPEG
MJPEG_REC_START_CMD		MjpegRecStartCmd;
MJPEG_REC_CMD_REPLY		MjpegRecStartCmdReply;

MJPEG_REC_DSP_REQ		MjpegRecDspReq;
MJPEG_REC_DSP_REQ_REPLY MjpegRecDspReqReply;


STATUS MOVIE_REC_init() {

	//MPEG-4    
	Mpeg4RecStartCmd.VideoAddrHigh			= HIGH_WORD(OSD_VIDEO_WIN0_OFFSET);         
	Mpeg4RecStartCmd.VideoAddrLow			= LOW_WORD (OSD_VIDEO_WIN0_OFFSET);          
	Mpeg4RecStartCmd.WorkAreaAddrHigh		= HIGH_WORD(WORK_AREA_OFFSET);
	Mpeg4RecStartCmd.WorkAreaAddrLow		= LOW_WORD (WORK_AREA_OFFSET);       
	Mpeg4RecStartCmd.RingBuffAddrHigh		= HIGH_WORD(MOVIE_BUFFER_OFFSET);
	Mpeg4RecStartCmd.RingBuffAddrLow       	= LOW_WORD (MOVIE_BUFFER_OFFSET);
	Mpeg4RecStartCmd.RingBuffSizeHigh		= HIGH_WORD(MOVIE_BUFFER_SIZE);
	Mpeg4RecStartCmd.RingBuffSizeLow       	= LOW_WORD (MOVIE_BUFFER_SIZE);
	Mpeg4RecStartCmd.AvgBitRateHigh			= HIGH_WORD(MPEG4_REC_AVG_BITRATE);
	Mpeg4RecStartCmd.AvgBitRateLow			= LOW_WORD (MPEG4_REC_AVG_BITRATE);
	Mpeg4RecStartCmd.MaxBitRateHigh			= HIGH_WORD(MPEG4_REC_MAX_BITRATE);
	Mpeg4RecStartCmd.MaxBitRateLow         	= LOW_WORD (MPEG4_REC_MAX_BITRATE);
	Mpeg4RecStartCmd.ImageSize				= MPEG4_REC_320x240;          
	Mpeg4RecStartCmd.FrameRate				= MPEG4_FRAME_RATE;            
	Mpeg4RecStartCmd.SecPerGOV				= 1;
	Mpeg4RecStartCmd.PreFilter				= 0;			// MPEG4 Pre Filter,0:None 1-7:Adaptive 8-31:Fixed
	Mpeg4RecStartCmd.RateControl			= (Uint16)-2;	// MPEG4 Rate Control, Fixed QP:1-31, Rate Control:-1, Frame&Bit Rate:-2
	Mpeg4RecStartCmd.IniQvalue				= 4;
	Mpeg4RecStartCmd.IniIPRatio				= 4;
	Mpeg4RecStartCmd.ShortCycleSpeedControl	= 7;
	Mpeg4RecStartCmd.LongCycleSpeedControl	= 31;
	Mpeg4RecStartCmd.Reserved				= 0;              
	Mpeg4RecStartCmd.AudioRingBuffAddrHigh	= HIGH_WORD(AUDIO_BUFFER_OFFSET); 
	Mpeg4RecStartCmd.AudioRingBuffAddrLow  	= LOW_WORD (AUDIO_BUFFER_OFFSET); 
	Mpeg4RecStartCmd.AudioRingBuffSizeHigh 	= HIGH_WORD(AUDIO_BUFFER_SIZE);   
	Mpeg4RecStartCmd.AudioRingBuffSizeLow  	= LOW_WORD (AUDIO_BUFFER_SIZE);   
	Mpeg4RecStartCmd.AudioBitRate			= MPEG_G726_32KBPS;          
	Mpeg4RecStartCmd.AudioQuality			= 2;          
    Mpeg4RecStartCmd.VoiceDelayTime			= 0;          
	Mpeg4RecStartCmd.AudioFormat			= MOVIE_AUDIO_FORMAT_G711;
	
	//MJPEG    
	MjpegRecStartCmd.VideoAddrHigh			= HIGH_WORD(OSD_VIDEO_WIN0_OFFSET);         
	MjpegRecStartCmd.VideoAddrLow			= LOW_WORD (OSD_VIDEO_WIN0_OFFSET);          
	MjpegRecStartCmd.RingBuffAddrHigh		= HIGH_WORD(MOVIE_BUFFER_OFFSET);
	MjpegRecStartCmd.RingBuffAddrLow       	= LOW_WORD (MOVIE_BUFFER_OFFSET);
	MjpegRecStartCmd.RingBuffSizeHigh		= HIGH_WORD(MOVIE_BUFFER_SIZE);
	MjpegRecStartCmd.RingBuffSizeLow       	= LOW_WORD (MOVIE_BUFFER_SIZE);
	MjpegRecStartCmd.ImageSize				= MJPEG_REC_320x240;          
	MjpegRecStartCmd.ImgFormat				= 0;//Image data format =. 0:VIDEO, 1:SEPARATE420, 2:SEPARATE422
	MjpegRecStartCmd.EncFormat				= MOVIE_ENC_IMAGE_FORMAT_YUV420;// 4:YUV420, 3:YUV422
	MjpegRecStartCmd.RestartMakerInterval	= 0;
	MjpegRecStartCmd.QFactor			    = 128;
	MjpegRecStartCmd.FrameRate				= MJPEG_FRAME_RATE;
	MjpegRecStartCmd.Reserved				= 0;              
	MjpegRecStartCmd.AudioRingBuffAddrHigh	= HIGH_WORD(AUDIO_BUFFER_OFFSET); 
	MjpegRecStartCmd.AudioRingBuffAddrLow  	= LOW_WORD (AUDIO_BUFFER_OFFSET); 
	MjpegRecStartCmd.AudioRingBuffSizeHigh 	= HIGH_WORD(AUDIO_BUFFER_SIZE);   
	MjpegRecStartCmd.AudioRingBuffSizeLow  	= LOW_WORD (AUDIO_BUFFER_SIZE);   
	MjpegRecStartCmd.AudioBitRate			= MJPEG_G711_64KBPS;          	
	
	MovieCtrl.QtFileFormat					= TRUE;
	return  E_PASS;
}

void MOVIE_REC_run(MOVIE_MODE mode) {
	BOOL stopped;
	char ch;

	switch(mode) {
		case MOVIE_MPEG4_MODE:
			UART_sendString( UART0, mpeg4_record_in_progress_menu);
			break;
		case MOVIE_MJPEG_MODE:
			UART_sendString( UART0, mjpeg_record_in_progress_menu);
			break;			
		default:
			return;
	}

	if( MOVIE_REC_START_run(mode) != E_PASS )
		return;

	stopped=FALSE;
	while(!stopped) {
		ch = UI_checkInput();

		switch(ch) {
			case '1':
				MOVIE_REC_PAUSE_run(mode);
				break;
			case '2':
				UART_sendString( UART0, "\r\n\n  Stopping recording. Please wait ...");
				// if movie is paused, resume it and then stop it
				if(MovieCtrl.MoviePaused)
					MOVIE_REC_PAUSE_run(mode);
					
				MovieCtrl.MovieStopped = TRUE;
				break;
			case '3':
				MOVIE_REC_FULLSCREEN_run(mode);
				break;
			default :
				GUI_controlPanelSeekBarUpdate(MovieCtrl.VideoSize);
				//GUI_controlPanelTimerUpdate(MovieCtrl.FrameCount/MovieCtrl.FrameRate);

				stopped = MovieCtrl.DspStopped;
				MOVIE_REC_IN_PROGRESS_run(mode);
				if(stopped)
					MOVIE_REC_STOP_run(mode);
				break;
		}
	}
}

void MOVIE_REC_PAUSE_run(MOVIE_MODE mode) {
	Uint16 cmd;
	
	if(MovieCtrl.FrameCount<1)
		return;

	if(MovieCtrl.MoviePaused==TRUE) {
		MovieCtrl.MoviePaused=FALSE;
		UART_sendString( UART0, "\r\n Record Resumed.");
		GUI_controlPanelButtonStateSet(&BUTTON_RECORD_START);
	} else {
		MovieCtrl.MoviePaused=TRUE;
		UART_sendString( UART0, "\r\n Record Paused.");
		GUI_controlPanelButtonStateSet(&BUTTON_RECORD_PAUSE);
	}
	cmd = 0;
	DSPC_writeData((char*)&cmd, 1, ARM_DSP_DSPCCR);

	switch(mode) {
		case MOVIE_MPEG4_MODE:
			ARMDSP_sendDspCmd(MPEG4_REC_PAUSE, NULL, 0);
			TMRDelay(20);
			do {
				DSPC_readData((char*)&cmd, 1, ARM_DSP_DSPCCR);
			} while( (cmd&DSP_CMD_MASK) != MPEG4_REC_PAUSE );
			break;
		case MOVIE_MJPEG_MODE:
			ARMDSP_sendDspCmd(MJPEG_REC_PAUSE, NULL, 0);
			TMRDelay(20);
			do {
				DSPC_readData((char*)&cmd, 1, ARM_DSP_DSPCCR);
			} while( (cmd&DSP_CMD_MASK) != MJPEG_REC_PAUSE );
			break;
		default:
			break;
	}			
			
	if( (cmd&DSP_CMD_COMPLETE)!=DSP_CMD_COMPLETE )
		MovieCtrl.DspStopped = TRUE;
}


STATUS MOVIE_REC_START_run(MOVIE_MODE mode) {
	STATUS status;
	Uint16 cmd;

	// stop OSD, PREV, CCDC
	OSD_winEnable( OSD_VID_WIN0, FALSE);
	PREV_enable(FALSE);
	CCDC_enable(FALSE, FALSE);

	INTC_clearIRQ(INT_DSP);
	INTC_enable( INT_DSP, FALSE);

	
	

	// download DSP code
	switch(mode) {
		case MOVIE_MPEG4_MODE:
			status = DSPLoadCode(mpeg4_encode);
			break;
		case MOVIE_MJPEG_MODE:
			status = DSPLoadCode(mjpeg_encode);
			break;			
		default:
			return E_INVALID_INPUT;
	}

	if(status!=E_PASS) {
		UART_sendString( UART0, "\r\n ERROR : DSPLoadCode(). ");
		return status;
	}

	MOVIE_AIC23_init(TRUE);

	// wait for DSP to be ready
	do {
		ARMDSP_getArmCmd(&cmd, NULL, 0);
	} while( cmd != 0x777 ) ;

	// init MovieCtrl data structure
	status = MOVIE_REC_initMovieCtrl(mode);
	if(status != E_PASS ) 
		return status;

	// init PREV, CCDC, OSD
	MOVIE_REC_initPREV(mode);

	switch(mode) {
		case MOVIE_MPEG4_MODE:
			INTC_clearIRQ(INT_DSP);
			ARMDSP_sendDspCmd( MPEG4_REC_START, (Uint16*)&Mpeg4RecStartCmd, sizeof(Mpeg4RecStartCmd)/2);
			break;
		case MOVIE_MJPEG_MODE:
			INTC_clearIRQ(INT_DSP);
			ARMDSP_sendDspCmd( MJPEG_REC_START, (Uint16*)&MjpegRecStartCmd, sizeof(MjpegRecStartCmd)/2);
			break;			
		default:
			return E_INVALID_INPUT;
	}

	INTC_waitForInt( INT_DSP, 0);

    switch(mode) {
    	case MOVIE_MPEG4_MODE:
			ARMDSP_getDspReply( &cmd, (Uint16*)&Mpeg4RecStartCmdReply, sizeof(Mpeg4RecStartCmdReply)/2 );

			// check reply
			if( (cmd & DSP_CMD_MASK) != MPEG4_REC_START) {
				UART_sendString( UART0, "\r\n ERROR : MPEG4 record start DSP command, failed.");
				return E_DEVICE;
			}

			if( (cmd & DSP_CMD_COMPLETE) != DSP_CMD_COMPLETE) {
				UART_sendString( UART0, "\r\n ERROR : MPEG4 record start DSP command, failed.");
				return E_DEVICE;
			}

			if( (cmd & DSP_CMD_INVALID_CMD ) || (cmd & DSP_CMD_INVALID_PARAM ) ) {
				UART_sendString( UART0, "\r\n ERROR : MPEG4 record start DSP command, invalid DSP command/paramters.");
				return E_DEVICE;
			}
			break;	
    	case MOVIE_MJPEG_MODE:
			ARMDSP_getDspReply( &cmd, (Uint16*)&MjpegRecStartCmdReply, sizeof(MjpegRecStartCmdReply)/2 );

			// check reply
			if( (cmd & DSP_CMD_MASK) != MJPEG_REC_START) {
				UART_sendString( UART0, "\r\n ERROR : MJPEG record start DSP command, failed.");
				return E_DEVICE;
			}

			if( (cmd & DSP_CMD_COMPLETE) != DSP_CMD_COMPLETE) {
				UART_sendString( UART0, "\r\n ERROR : MJPEG record start DSP command, failed.");
				return E_DEVICE;
			}

			if( (cmd & DSP_CMD_INVALID_CMD ) || (cmd & DSP_CMD_INVALID_PARAM ) ) {
				UART_sendString( UART0, "\r\n ERROR : MJPEG record start DSP command, invalid DSP command/paramters.");
				return E_DEVICE;
			}
			break;	
		default:
			return E_INVALID_INPUT;
	}		
		

	// attach DSP HINT ISR
	switch(mode) {
		case MOVIE_MPEG4_MODE:     
			INTC_enable( INT_DSP, FALSE);
			INTCAttachISR( INT_DSP, MPEG4_REC_isr );
			INTC_enable( INT_DSP, TRUE);
			GUI_controlPanelButtonStateSet(&BUTTON_RECORD_START);
			break;
		case MOVIE_MJPEG_MODE:     
			INTC_enable( INT_DSP, FALSE);
			INTCAttachISR( INT_DSP, MJPEG_REC_isr );
			INTC_enable( INT_DSP, TRUE);
			GUI_controlPanelButtonStateSet(&BUTTON_RECORD_START);
			break;			
		default:
			return E_INVALID_INPUT;
	}

	return E_PASS;
}

void MOVIE_REC_IN_PROGRESS_run(MOVIE_MODE mode) {
	if(MovieCtrl.VideoBuffWrite) {
		MovieCtrl.VideoBuffWrite = FALSE;
		if(FS_FILE_IO) {
			profile_start(10);
			FILE_write( MovieCtrl.FS_VideoFile , (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
			          MovieCtrl.VideoRingBuffer.size/3 
					);
			profile_end(10);
		} else {
			MEM_FILE_write( &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;
		MovieCtrl.CurVideoFileSize += MovieCtrl.VideoRingBuffer.size/3;
		UART_sendString( UART0, "+" );
	}
	if(MovieCtrl.AudioBuffWrite) {
		MovieCtrl.AudioBuffWrite = FALSE;
		if(FS_FILE_IO && MovieCtrl.QtFileFormat==FALSE) {
			profile_start(10);
			FILE_write( MovieCtrl.FS_AudioFile, (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
			          MovieCtrl.AudioRingBuffer.size/3 
					);
			profile_end(10);
		} else {
			MEM_FILE_write( &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;
		MovieCtrl.CurAudioFileSize += MovieCtrl.AudioRingBuffer.size/3;
		UART_sendString( UART0, "." );
	}
}

void MOVIE_REC_STOP_run(MOVIE_MODE mode) {

	// flush incompltely filled buffer (Video, Audio) data to file
	if(FS_FILE_IO) {
		if(MovieCtrl.FS_VideoFile!=NULL) {
			if(MovieCtrl.VideoSize > MovieCtrl.CurVideoFileSize) {
				MovieCtrl.VideoSize += (MovieCtrl.VideoSize+4)&0x3; 
				if(MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize <= MovieCtrl.VideoRingBuffer.size/3) {
					FILE_write( MovieCtrl.FS_VideoFile, (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
							  MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize
							);
					MovieCtrl.CurVideoFileSize +=  (MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize);
				} else {
					FILE_write( MovieCtrl.FS_VideoFile, (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
							  (MovieCtrl.VideoRingBuffer.size/3)
							  
							);
					MovieCtrl.CurVideoFileSize += (MovieCtrl.VideoRingBuffer.size/3);

					MovieCtrl.VideoRingBuffer.curBuff = (MovieCtrl.VideoRingBuffer.curBuff+1)%3;
					FILE_write( MovieCtrl.FS_VideoFile, (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
							  (MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize)%(MovieCtrl.VideoRingBuffer.size/3)
							);
					MovieCtrl.CurVideoFileSize += ( (MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize)%(MovieCtrl.VideoRingBuffer.size/3) );
				}
			}
			if(FS_FILE_IO && MovieCtrl.QtFileFormat==FALSE)
				FILE_close( MovieCtrl.FS_VideoFile, FILEIO_NO_FAT_CACHE_FLUSH );
			else {
				// QTFF wrapper needs to be appended to this file, so this file is kept open
				// this file would be closed inside MOVIE_REC_qtffCreate();
			}
		}
	} else {
		if(MovieCtrl.VideoSize > MovieCtrl.CurVideoFileSize) {
			if(MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize <= MovieCtrl.VideoRingBuffer.size/3) {
				MEM_FILE_write( &MovieCtrl.VideoFile, 
						  (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
						  MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize );
				MovieCtrl.CurVideoFileSize +=  (MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize);
			} else {
				MEM_FILE_write( &MovieCtrl.VideoFile, 
						  (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
						  (MovieCtrl.VideoRingBuffer.size/3) );
				MovieCtrl.CurVideoFileSize += (MovieCtrl.VideoRingBuffer.size/3);

				MovieCtrl.VideoRingBuffer.curBuff = (MovieCtrl.VideoRingBuffer.curBuff+1)%3;
				MEM_FILE_write( &MovieCtrl.VideoFile, 
						  (char*)MovieCtrl.VideoRingBuffer.startAddr + MovieCtrl.VideoRingBuffer.curBuff*(MovieCtrl.VideoRingBuffer.size/3), 
						  (MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize)%(MovieCtrl.VideoRingBuffer.size/3) );
				
				MovieCtrl.CurVideoFileSize += ( (MovieCtrl.VideoSize - MovieCtrl.CurVideoFileSize)%(MovieCtrl.VideoRingBuffer.size/3) );
			}
		}
		MEM_FILE_close( &MovieCtrl.VideoFile );
	}
	// flush incompltely filled buffer (Video, Audio) data to file
	if(FS_FILE_IO && MovieCtrl.QtFileFormat==FALSE) {
		if(MovieCtrl.FS_AudioFile!=NULL) {
			if( MovieCtrl.AudioSize > MovieCtrl.CurAudioFileSize ) {
				if(MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize <= MovieCtrl.AudioRingBuffer.size/3) {
					FILE_write( MovieCtrl.FS_AudioFile, (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
							  MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize
							);
					MovieCtrl.CurAudioFileSize +=  (MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize);
				} else {
					FILE_write( MovieCtrl.FS_AudioFile, (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
							  (MovieCtrl.AudioRingBuffer.size/3)
							);
					MovieCtrl.CurAudioFileSize +=  (MovieCtrl.AudioRingBuffer.size/3);

					MovieCtrl.AudioRingBuffer.curBuff = (MovieCtrl.AudioRingBuffer.curBuff+1)%3;
					FILE_write( MovieCtrl.FS_AudioFile, (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
							  (MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize)%(MovieCtrl.AudioRingBuffer.size/3)
							);
					MovieCtrl.CurAudioFileSize +=  (MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize)%(MovieCtrl.AudioRingBuffer.size/3);
				}
			}
			FILE_close( MovieCtrl.FS_AudioFile, 0 );
		}
	} else {
		if( MovieCtrl.AudioSize > MovieCtrl.CurAudioFileSize ) {
			if(MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize <= MovieCtrl.AudioRingBuffer.size/3) {
				MEM_FILE_write( &MovieCtrl.AudioFile, 
					  (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
					  MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize );		
				MovieCtrl.CurAudioFileSize +=  (MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize);
			} else {
				MEM_FILE_write( &MovieCtrl.AudioFile, 
					  (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
					  (MovieCtrl.AudioRingBuffer.size/3) );		
				MovieCtrl.CurAudioFileSize +=  (MovieCtrl.AudioRingBuffer.size/3);

				MovieCtrl.AudioRingBuffer.curBuff = (MovieCtrl.AudioRingBuffer.curBuff+1)%3;
				MEM_FILE_write( &MovieCtrl.AudioFile, 
					  (char*)MovieCtrl.AudioRingBuffer.startAddr + MovieCtrl.AudioRingBuffer.curBuff*(MovieCtrl.AudioRingBuffer.size/3), 
					  (MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize)%(MovieCtrl.AudioRingBuffer.size/3) );		
				MovieCtrl.CurAudioFileSize +=  (MovieCtrl.AudioSize - MovieCtrl.CurAudioFileSize)%(MovieCtrl.AudioRingBuffer.size/3);
			}

		}
		MEM_FILE_close( &MovieCtrl.AudioFile );
	}

	MEM_FILE_seek ( &MovieCtrl.IndexFile, 0, MEM_FILE_SEEK_START );
    MEM_FILE_write( &MovieCtrl.IndexFile, (char*)&MovieCtrl.FrameCount, sizeof(Uint32) );
	MEM_FILE_close( &MovieCtrl.IndexFile );

	sprintf( UART_outBuff,  "\r\n"
                            "\r\n  Recording Stopped. "
							"\r\n  %ld video frames encoded."
							"\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 );

	INTC_enable( INT_VD0, FALSE);
	INTCDetachISR( INT_VD0 );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线一区免费| 国产色产综合色产在线视频| 亚洲高清中文字幕| 在线播放亚洲一区| 另类专区欧美蜜桃臀第一页| www激情久久| 99这里只有精品| 亚洲毛片av在线| 91精品国产综合久久福利软件 | 欧美三电影在线| 首页国产丝袜综合| 久久久精品人体av艺术| 99re热这里只有精品免费视频 | 8x福利精品第一导航| 蜜桃av一区二区| 国产亚洲成av人在线观看导航| 成人免费视频网站在线观看| 怡红院av一区二区三区| 日韩丝袜美女视频| www.亚洲免费av| 婷婷激情综合网| 国产午夜精品美女毛片视频| 色狠狠综合天天综合综合| 欧美aaa在线| 国产精品久久777777| 欧美日韩成人综合天天影院 | 一本到高清视频免费精品| 丝袜亚洲另类欧美| 中文字幕成人在线观看| 欧美日韩高清一区| 成人91在线观看| 麻豆91免费观看| 亚洲免费看黄网站| 久久亚洲一区二区三区明星换脸 | 亚洲色图欧美偷拍| 精品噜噜噜噜久久久久久久久试看 | 成人免费视频在线观看| 欧美日韩精品福利| 91在线观看高清| 精品一二三四区| 亚洲成人黄色小说| 综合久久给合久久狠狠狠97色 | 久久精品视频网| 欧美午夜一区二区三区| 不卡一二三区首页| 激情成人午夜视频| 日韩黄色在线观看| 亚洲激情网站免费观看| 国产精品亲子乱子伦xxxx裸| 日韩午夜av电影| 欧美日韩不卡一区| 在线影视一区二区三区| www.欧美.com| 国产精品一色哟哟哟| 免费人成精品欧美精品| 亚洲国产日韩av| 亚洲精品亚洲人成人网 | 一区二区三区四区国产精品| 久久精品这里都是精品| 26uuu色噜噜精品一区二区| 欧美福利视频一区| 欧美精品一卡二卡| 欧美三级乱人伦电影| 在线视频一区二区免费| 91在线观看高清| av高清不卡在线| www.欧美精品一二区| 成人国产精品免费网站| 成人av在线观| 不卡一二三区首页| 91在线国产观看| 色综合中文字幕国产| 粉嫩高潮美女一区二区三区| 韩国理伦片一区二区三区在线播放| 日韩av电影天堂| 全国精品久久少妇| 久久国产日韩欧美精品| 九九热在线视频观看这里只有精品| 日本不卡视频在线| 老色鬼精品视频在线观看播放| 奇米亚洲午夜久久精品| 国内外精品视频| 风间由美一区二区三区在线观看 | 九色|91porny| 国产曰批免费观看久久久| 国产伦理精品不卡| 高清不卡一区二区| 色综合久久中文字幕综合网| 欧美亚洲尤物久久| 欧美一卡2卡3卡4卡| 精品国产sm最大网站| 国产日韩欧美综合在线| 国产精品国产自产拍高清av王其 | 午夜激情综合网| 日韩va欧美va亚洲va久久| 视频精品一区二区| 精品在线播放免费| 成人网页在线观看| 欧美日韩美少妇| 久久亚洲捆绑美女| 国产精品对白交换视频 | 一区二区三国产精华液| 日韩电影在线免费看| 国产一区二区三区美女| 波多野结衣91| 91精品国产欧美一区二区18| 国产亚洲精品福利| 亚洲国产成人精品视频| 久久av中文字幕片| 99久久99久久精品免费看蜜桃| 欧美色大人视频| 久久网这里都是精品| 亚洲精品一卡二卡| 国产尤物一区二区在线| 在线视频一区二区三区| 精品国产污网站| 亚洲黄色尤物视频| 国产乱子伦视频一区二区三区| 97se亚洲国产综合自在线不卡 | 丝袜美腿成人在线| 成人av资源网站| 欧美一区二区三区人| 国产精品久久久久久亚洲伦| 日韩精品欧美精品| 97久久精品人人做人人爽 | 中文字幕欧美三区| 青青草91视频| 欧美在线不卡视频| 国产清纯在线一区二区www| 亚洲成av人片一区二区梦乃| 国产ts人妖一区二区| 欧美一区二区三区色| 亚洲人被黑人高潮完整版| 韩国v欧美v亚洲v日本v| 欧美日本在线视频| 亚洲黄色小视频| 成人黄色一级视频| 2020国产精品自拍| 日韩精品国产精品| 欧美色图片你懂的| 亚洲欧洲日韩在线| 高清beeg欧美| 久久久久久免费毛片精品| 日韩avvvv在线播放| 在线精品视频一区二区三四| 欧美韩国日本一区| 国产精品影音先锋| 久久五月婷婷丁香社区| 久久精品国产精品亚洲综合| 欧美日韩国产大片| 亚洲高清视频的网址| 91麻豆swag| 成人免费视频在线观看| 成人午夜免费av| 国产精品嫩草99a| 久久精品国产99国产| 91精品在线免费| 肉色丝袜一区二区| 欧美日韩高清一区| 香蕉久久一区二区不卡无毒影院| 日本精品一级二级| 夜夜操天天操亚洲| 欧美日韩国产精品自在自线| 午夜久久久久久电影| 制服丝袜av成人在线看| 日本特黄久久久高潮| 制服丝袜激情欧洲亚洲| 乱中年女人伦av一区二区| 日韩免费观看高清完整版| 蜜臀av国产精品久久久久| 欧美一区二区国产| 久热成人在线视频| 国产日韩欧美综合在线| 不卡的av电影在线观看| 亚洲色大成网站www久久九九| 91浏览器在线视频| 亚洲成人1区2区| 日韩一区二区三区视频在线观看| 蜜桃久久精品一区二区| 久久精品亚洲一区二区三区浴池 | 蜜桃av一区二区三区电影| 日韩欧美国产一二三区| 国产真实乱对白精彩久久| 久久久久久久久97黄色工厂| 国产成人综合在线观看| 国产精品乱人伦中文| 91行情网站电视在线观看高清版| 亚洲国产日韩av| 欧美本精品男人aⅴ天堂| 国产成人精品亚洲午夜麻豆| 中文字幕制服丝袜成人av| 欧美性色欧美a在线播放| 日本一区中文字幕| 久久九九国产精品| 91高清视频免费看| 久久国产精品第一页| 国产精品丝袜一区| 制服丝袜成人动漫| av电影一区二区| 天堂一区二区在线免费观看|