亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
91福利精品视频| 国产欧美日韩另类视频免费观看| 欧美一级日韩免费不卡| 欧美激情一区二区| 日日嗨av一区二区三区四区| 国产 日韩 欧美大片| 欧美三级资源在线| 国产精品久久影院| 九九热在线视频观看这里只有精品| 97aⅴ精品视频一二三区| 精品国产91乱码一区二区三区| 亚洲国产精品久久久久婷婷884 | 蜜桃视频一区二区三区| 972aa.com艺术欧美| 久久先锋影音av| 久久丁香综合五月国产三级网站| 欧美亚洲综合在线| 亚洲精品乱码久久久久| 丁香六月综合激情| 国产日韩v精品一区二区| 福利电影一区二区| 日韩视频免费观看高清完整版在线观看 | 亚洲午夜久久久久久久久久久 | 亚洲人亚洲人成电影网站色| 国产精品一区二区黑丝| 日韩三区在线观看| 丝袜美腿高跟呻吟高潮一区| 色狠狠一区二区三区香蕉| 国产精品久久久久久久久快鸭| 国产精品99久久久久久久vr| 久久综合色之久久综合| 精品午夜一区二区三区在线观看| 欧美精品色一区二区三区| 亚洲国产你懂的| 欧美日韩中文字幕一区| 亚洲午夜影视影院在线观看| 欧美探花视频资源| 日韩中文字幕一区二区三区| 欧美日韩一区二区在线观看| 亚洲成人免费视| 欧美精品久久99久久在免费线| 亚洲一区在线观看免费| 91.麻豆视频| 麻豆精品精品国产自在97香蕉| 日韩欧美国产一区二区三区 | 久久精品国产77777蜜臀| 日韩亚洲欧美综合| 国产一区二区在线视频| 国产人伦精品一区二区| 不卡一区二区中文字幕| 一区二区三区日韩欧美精品| 欧美日韩国产综合一区二区三区| 热久久久久久久| 久久―日本道色综合久久| 国产成人亚洲精品狼色在线| 亚洲人成网站在线| 亚洲免费大片在线观看| 欧美图区在线视频| 男女视频一区二区| 亚洲国产高清不卡| 欧美日韩在线一区二区| 国产精品影视天天线| 亚洲视频一区二区在线| 欧美一区二区三区在线电影 | 日本欧美在线观看| 久久久精品人体av艺术| 色女孩综合影院| 精品一区二区三区久久久| 中文字幕一区在线观看视频| 欧美美女网站色| 成人99免费视频| 男女视频一区二区| 自拍偷拍亚洲激情| 日韩美女天天操| 欧美探花视频资源| 懂色av中文一区二区三区| 午夜欧美在线一二页| 久久精品亚洲一区二区三区浴池| 欧美亚洲国产一区二区三区| 国产另类ts人妖一区二区| 水野朝阳av一区二区三区| 欧美韩国日本不卡| 日韩精品在线网站| 欧美系列一区二区| av中文字幕一区| 国内精品写真在线观看 | 亚洲最新视频在线观看| 久久综合色综合88| 在线不卡中文字幕播放| 在线一区二区三区做爰视频网站| 国产成a人无v码亚洲福利| 日韩福利电影在线观看| 亚洲精品日日夜夜| 欧美国产日韩在线观看| 精品国产不卡一区二区三区| 欧美日韩亚洲综合在线| 日韩精品一区二区三区在线播放 | 成人av在线观| 国产高清在线观看免费不卡| 日本不卡123| 亚洲成人动漫一区| 亚洲一区二区三区三| 中文字幕在线视频一区| 欧美激情一二三区| 国产偷国产偷精品高清尤物| 精品欧美一区二区在线观看| 3atv在线一区二区三区| 欧美另类高清zo欧美| 91高清视频免费看| 99久久国产综合色|国产精品| 国产a区久久久| 国产mv日韩mv欧美| 国产成人免费9x9x人网站视频| 国内精品视频一区二区三区八戒| 久久精品国产亚洲高清剧情介绍| 日本中文字幕一区二区有限公司| 视频一区二区欧美| 偷拍日韩校园综合在线| 亚洲国产综合在线| 天堂va蜜桃一区二区三区漫画版 | 国产在线观看一区二区| 久久国产三级精品| 国产真实乱偷精品视频免| 国产一区二区三区在线观看免费视频 | 欧美一区二区三区视频在线| 日韩三级在线免费观看| 久久综合av免费| 日本一区二区三区四区| 国产精品美女久久福利网站| 中文字幕在线一区免费| 伊人一区二区三区| 天天综合色天天综合色h| 五月天亚洲婷婷| 精品一区二区三区不卡| 国产精品白丝jk黑袜喷水| 国产sm精品调教视频网站| 91天堂素人约啪| 911精品产国品一二三产区| 欧美大尺度电影在线| 国产婷婷精品av在线| 亚洲精品国久久99热| 亚洲大片在线观看| 久久99精品国产91久久来源| 国产一区二区精品在线观看| 91在线无精精品入口| 欧美群妇大交群的观看方式| 欧美精品一区二区三区四区| 国产精品国产三级国产aⅴ入口 | 亚洲一二三四区不卡| 美国精品在线观看| 成人av免费在线观看| 欧美日韩在线不卡| 国产色综合一区| 亚洲国产三级在线| 国产美女视频91| 欧美色综合天天久久综合精品| 日韩欧美亚洲另类制服综合在线| 国产欧美日韩三区| 日韩激情中文字幕| 91蜜桃视频在线| 日韩精品一区二区三区在线观看 | 91黄色在线观看| 日韩欧美国产三级| 亚洲你懂的在线视频| 蜜臀久久久99精品久久久久久| 91首页免费视频| 日韩欧美资源站| 亚洲欧美aⅴ...| 国产乱码精品一品二品| 欧美日韩视频在线观看一区二区三区 | 午夜精品福利一区二区蜜股av| 欧美电影一区二区| 国产日韩欧美亚洲| 日韩精品亚洲一区| 色综合久久久久| 国产精品三级在线观看| 国内久久精品视频| 日韩欧美一区二区久久婷婷| 亚洲一区中文在线| 成人高清在线视频| 精品99一区二区| 一区二区三区精品| 不卡电影一区二区三区| 欧美tickle裸体挠脚心vk| 午夜亚洲福利老司机| 97精品电影院| 国产精品久久久久久久午夜片| 九九精品视频在线看| 欧美一二三区在线| 五月激情丁香一区二区三区| 色哟哟精品一区| 亚洲日本成人在线观看| 成年人午夜久久久| 国产精品家庭影院| 成人免费福利片| 国产精品国产三级国产普通话蜜臀| 狠狠色狠狠色合久久伊人| 日韩三级视频中文字幕| 日本怡春院一区二区| 91精品国产综合久久久久久漫画 |