亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲高清不卡在线观看| 日本不卡高清视频| 欧美日韩国产美女| 国产专区综合网| 一区二区不卡在线播放 | 欧美欧美欧美欧美| gogogo免费视频观看亚洲一| 亚洲国产人成综合网站| 国产精品日韩成人| 欧美成人精品二区三区99精品| 99久久精品国产精品久久| 免费成人av在线| 亚洲一区二区三区激情| 中文字幕在线播放不卡一区| 精品日韩在线一区| 欧美精品色综合| 色综合久久88色综合天天免费| 国产一区999| 日本成人在线不卡视频| 亚洲国产一区在线观看| 中文字幕制服丝袜一区二区三区| 精品国内片67194| 欧美丰满一区二区免费视频| 91国在线观看| 91麻豆国产自产在线观看| 成人在线综合网站| 国产99久久久国产精品潘金网站| 久久国产精品露脸对白| 五月激情综合婷婷| 亚洲成人激情综合网| 一区二区三区在线视频免费| 最新成人av在线| 国产精品久久国产精麻豆99网站| 久久久www成人免费毛片麻豆| 精品日韩在线观看| 精品国产网站在线观看| 欧美不卡一区二区| 精品精品欲导航| 精品粉嫩超白一线天av| 日韩免费高清视频| 精品福利一二区| 国产亚洲一区二区三区四区| 久久久噜噜噜久久人人看 | 成人激情校园春色| 成人网在线播放| 成人av资源在线观看| 成人黄色免费短视频| 成人av先锋影音| av中文一区二区三区| 91丨porny丨国产入口| 色婷婷精品大视频在线蜜桃视频| 一本久久综合亚洲鲁鲁五月天 | 91丨九色丨蝌蚪丨老版| 99国产精品国产精品毛片| 91在线视频免费观看| 色嗨嗨av一区二区三区| 欧美在线视频全部完| 91 com成人网| www久久精品| 国产精品进线69影院| 亚洲伦在线观看| 亚洲午夜国产一区99re久久| 日韩精品乱码av一区二区| 精品一区二区久久久| 成人污污视频在线观看| 在线亚洲人成电影网站色www| 欧美日韩一区二区三区不卡| 欧美一区二区三区电影| 久久久久久久久久久久久女国产乱| 亚洲国产成人午夜在线一区| 一区在线观看视频| 亚洲成av人片在线观看| 狠狠色伊人亚洲综合成人| 成人黄色片在线观看| 欧美日韩一区二区三区视频| 精品久久五月天| 国产精品视频一二三区| 亚洲成在线观看| 精品一区二区三区不卡| 日本乱码高清不卡字幕| 精品少妇一区二区三区在线播放 | 国产日产欧美一区| 亚洲精品中文在线观看| 免费一级片91| 99视频精品免费视频| 欧美日韩国产成人在线免费| 精品福利av导航| 亚洲线精品一区二区三区| 国模冰冰炮一区二区| 91福利视频网站| 久久一区二区视频| 亚洲国产日韩综合久久精品| 国产精品99久久久| 91精品国产综合久久精品性色| 中国色在线观看另类| 轻轻草成人在线| 97se亚洲国产综合自在线| 精品欧美久久久| 亚洲www啪成人一区二区麻豆| 国产精品资源在线| 欧美精品一二三| 日韩毛片一二三区| 国产精品自拍网站| 欧美电影免费观看完整版| 一区二区激情视频| 95精品视频在线| 久久精品欧美日韩精品 | 亚洲第四色夜色| 91丝袜美腿高跟国产极品老师 | 欧美一级日韩一级| 亚洲综合一区在线| 成人免费av网站| 精品久久久久久久久久久院品网| 亚洲6080在线| 91久久精品一区二区二区| 久久精品视频免费| 蜜桃视频一区二区| 欧美日韩久久不卡| 一区二区三区日韩精品视频| 成人99免费视频| 国产亚洲精品超碰| 国产一区二区三区在线看麻豆| 7777精品伊人久久久大香线蕉| 一区二区三区在线免费播放| 99国产精品久久久久久久久久| 国产精品网站在线| 国产999精品久久| 国产午夜亚洲精品午夜鲁丝片| 久久97超碰色| 日韩欧美国产电影| 美女视频网站久久| 日韩欧美三级在线| 免费高清成人在线| 欧美一区二视频| 日本aⅴ亚洲精品中文乱码| 欧美日韩黄视频| 丝瓜av网站精品一区二区| 欧美日韩成人在线一区| 午夜日韩在线电影| 91精品国产色综合久久久蜜香臀| 偷窥少妇高潮呻吟av久久免费| 欧美日韩亚洲综合在线 | 91精品国模一区二区三区| 奇米一区二区三区| 欧美α欧美αv大片| 久久99久久久欧美国产| 2014亚洲片线观看视频免费| 国产一区二区精品久久| 久久久精品国产免费观看同学| 国产成人午夜99999| 国产精品妹子av| 91免费观看视频在线| 一区二区成人在线视频| 91精品国产色综合久久ai换脸 | 91国产免费观看| 亚洲一区二区三区中文字幕| 欧美日韩一区不卡| 久久精品久久久精品美女| 欧美精品一区二区高清在线观看 | 91在线云播放| 亚洲丰满少妇videoshd| 日韩欧美一级二级| 国产宾馆实践打屁股91| 亚洲免费观看视频| 69堂国产成人免费视频| 国产精品一区二区久久不卡| 中文字幕日韩精品一区| 欧美浪妇xxxx高跟鞋交| 黄色日韩网站视频| 亚洲伦在线观看| 欧美zozozo| 99精品视频一区二区| 亚洲aⅴ怡春院| 国产日韩精品一区| 欧美三级在线看| 国产麻豆成人精品| 一区二区三区精品视频在线| 日韩美女视频在线| 97久久精品人人爽人人爽蜜臀| 日本午夜精品一区二区三区电影| 国产亚洲欧美日韩在线一区| 色综合天天综合网天天狠天天| 日本亚洲免费观看| 亚洲欧洲无码一区二区三区| 91精品国产乱码久久蜜臀| 国产成人高清视频| 丝袜亚洲另类欧美综合| 日韩一区在线免费观看| 日韩情涩欧美日韩视频| 色婷婷久久99综合精品jk白丝| 韩国一区二区三区| 亚洲成人综合视频| 国产精品久久久久婷婷二区次| 3d成人动漫网站| 91在线看国产| 国产尤物一区二区| 视频一区二区国产| 成人欧美一区二区三区1314| 精品少妇一区二区三区在线视频 | 欧洲中文字幕精品|