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

📄 movie_rec.c

📁 dm270 source code
💻 C
📖 第 1 页 / 共 3 页
字号:

	MEM_FILE_write( &MovieCtrl.IndexFile, (char*)&MovieCtrl.FrameCount, sizeof(Uint32) );					
	
	return E_PASS;
}

void MOVIE_REC_FULLSCREEN_run(MOVIE_MODE mode) {
	if(mode==MOVIE_MJPEG_MODE)
		return;

	if(MovieCtrl.MovieFullScreen) {
		MovieCtrl.MovieFullScreen = FALSE;
		OSDSetMode( OSD_VID_WIN0, VID_320x240, NULL);
	} else {
		MovieCtrl.MovieFullScreen = TRUE;
		OSDSetMode( OSD_VID_WIN0, VID_FLD_320x240, NULL);
	}
}

void MOVIE_REC_CONFIG_run(MOVIE_MODE mode) {
	switch(mode) {
		case MOVIE_MJPEG_MODE:
			MJPEG_REC_CONFIG_run();
			break;
		case MOVIE_MPEG4_MODE:
			MPEG4_REC_CONFIG_run();
			break;
	}

}

static char mjpeg_record_config_menu[] = {
	"\r\n"
	"\r\n =========================="
	"\r\n MJPEG Record Configuration"
	"\r\n =========================="
	"\r\n"
	"\r\n Current configuration is:"
	"\r\n Frame-size   : %dx%d"
	"\r\n Image format : %s"
	"\r\n Frame-rate   : %d"
	"\r\n QTFF         : %s"
	"\r\n"
	"\r\n 0 : Previous Menu"
	"\r\n 1 : Modify Frame-size"
	"\r\n 2 : Modify Image Format"
	"\r\n 3 : Modify Frame-rate" 
    "\r\n 4 : Enable/disable QT File Format" 
	"\r\n"
	"\r\n Enter choice : "
};

void MJPEG_REC_CONFIG_run() {

	char ch;
	Uint16 width, height;
	char   image_format[16]="";
	char   buf[16]="";

	while(1) {

		if(MjpegRecStartCmd.ImageSize==MJPEG_REC_640x480) {
			width  = 640;
			height = 480;
		} else 
		if(MjpegRecStartCmd.ImageSize==MJPEG_REC_720x480) {
			width  = 720;
			height = 480;
		} else 
		if(MjpegRecStartCmd.ImageSize==MJPEG_REC_320x240) {
			width  = 320;
			height = 240;
		} 
		if(MjpegRecStartCmd.EncFormat==MOVIE_ENC_IMAGE_FORMAT_YUV420) {
			strcpy( image_format, "YUV420" );
		} 
		if(MjpegRecStartCmd.EncFormat==MOVIE_ENC_IMAGE_FORMAT_YUV422) {
			strcpy( image_format, "YUV422" );
		} 
		if(MovieCtrl.QtFileFormat) {
			strcpy( buf, "YES" );
		} else {
			strcpy( buf, "NO" );
		}	

		sprintf( UART_outBuff, mjpeg_record_config_menu,
				width, height,
				image_format,
				MjpegRecStartCmd.FrameRate,
				buf
			);

		UART_sendString( UART0, UART_outBuff );

		ch = UI_getInput();

		switch(ch) {
			case '0':
				return;
			case '1':
				UART_sendString( UART0, 
					"\r\n"
					"\r\n"
					"\r\n Select frame-size [1: 320x240, 2: 640x480, 3: 720x480] : "
					);				
				ch = UI_getInput();
				switch(ch) {
					case '1':
						MjpegRecStartCmd.ImageSize = MJPEG_REC_320x240;
						break;
					case '2':
						MjpegRecStartCmd.ImageSize = MJPEG_REC_640x480;
						break;
					case '3':
						MjpegRecStartCmd.ImageSize = MJPEG_REC_720x480;
						break;
				}
				break;
			case '2':
				UART_sendString( UART0, 
					"\r\n"
					"\r\n"
					"\r\n Select image format [1: YUV420, 2: YUV422] : "
					);				
				ch = UI_getInput();
				switch(ch) {
					case '1':
						MjpegRecStartCmd.EncFormat = MOVIE_ENC_IMAGE_FORMAT_YUV420;
						break;
					case '2':
						MjpegRecStartCmd.EncFormat = MOVIE_ENC_IMAGE_FORMAT_YUV422;
						break;
				}
				break;
			case '3':
				UART_sendString( UART0, 
					"\r\n"
					"\r\n"
					"\r\n Select frame-rate [1: 15fps, 2: 20fps, 3: 25fps, 4: 30fps] : "
					);				
				ch = UI_getInput();
				switch(ch) {
					case '1':
						MjpegRecStartCmd.FrameRate = 15;						
						break;
					case '2':
						MjpegRecStartCmd.FrameRate = 20;
						break;
					case '3':
						MjpegRecStartCmd.FrameRate = 25;						
						break;
					case '4':
						MjpegRecStartCmd.FrameRate = 30;
						break;
				}
				break;
			case '4':
				UART_sendString( UART0, 
					"\r\n"
					"\r\n"
					"\r\n QT File Format [1: Enable, 2: Disable] : "
					);				
				ch = UI_getInput();
				switch(ch) {
					case '1':
						MovieCtrl.QtFileFormat = TRUE;
						break;
					case '2':
						MovieCtrl.QtFileFormat = FALSE;						
						break;
				}
				break;
			default:
				break;
		}
	}

}


void MPEG4_REC_CONFIG_run() {
	static char mpeg4_record_config_menu[] = {
		"\r\n"
		"\r\n =========================="
		"\r\n MPEG4 Record Configuration"
		"\r\n =========================="
		"\r\n"
		"\r\n Current configuration is:"
		"\r\n Frame-size   : %dx%d"
		"\r\n Audio format : %s"
		"\r\n Frame-rate   : %d"
		"\r\n QTFF         : %s"
		"\r\n"
		"\r\n 0 : Previous Menu"
		"\r\n 1 : Modify Audio Format"
        "\r\n 2 : Enable/disable QT File Format" 
		"\r\n"
		"\r\n Enter choice : "
	};

	char ch;
	Uint16 width, height;
	char   audio_format[8]="";
	char   buf[8]="";

	while(1) {

		if(Mpeg4RecStartCmd.ImageSize==MPEG4_REC_320x240) {
			width  = 320;
			height = 240;
		} else 
		if(Mpeg4RecStartCmd.ImageSize==MPEG4_REC_352x288) {
			width  = 352;
			height = 288;
		} else 
		if(Mpeg4RecStartCmd.ImageSize==MPEG4_REC_176x144) {
			width  = 176;
			height = 144;
		} 
		if(Mpeg4RecStartCmd.AudioFormat==MOVIE_AUDIO_FORMAT_G726) {
			strcpy( audio_format, "G726" );
		} 
		if(Mpeg4RecStartCmd.AudioFormat==MOVIE_AUDIO_FORMAT_G711) {
			strcpy( audio_format, "G711" );
		} 
		if(MovieCtrl.QtFileFormat) {
			strcpy( buf, "YES" );
		} else {
			strcpy( buf, "NO" );
		}

		sprintf( UART_outBuff, mpeg4_record_config_menu,
				width, height,
				audio_format,
				Mpeg4RecStartCmd.FrameRate,
				buf
			);

		UART_sendString( UART0, UART_outBuff );

		ch = UI_getInput();

		switch(ch) {
			case '0':
				return;
			case '1':
				UART_sendString( UART0, 
					"\r\n"
					"\r\n"
					"\r\n Select audio format [1: G711, 2: G726] : "
					);				
				ch = UI_getInput();
				switch(ch) {
					case '1':
						Mpeg4RecStartCmd.AudioFormat = MOVIE_AUDIO_FORMAT_G711;
						break;
					case '2':
						Mpeg4RecStartCmd.AudioFormat = MOVIE_AUDIO_FORMAT_G726;
						MovieCtrl.QtFileFormat = FALSE;
						break;
				}
				break;
			case '2':
				UART_sendString( UART0, 
					"\r\n"
					"\r\n"
					"\r\n QT File Format [1: Enable, 2: Disable] : "
					);				
				ch = UI_getInput();
				switch(ch) {
					case '1':
						MovieCtrl.QtFileFormat = TRUE;
						Mpeg4RecStartCmd.AudioFormat = MOVIE_AUDIO_FORMAT_G711;
						break;
					case '2':
						MovieCtrl.QtFileFormat = FALSE;						
						break;
				}
				break;
			default:
				break;
		}
	}

}

void MOVIE_REC_qtffCreate(MOVIE_MODE mode) {
	Uint32 moovSize;
	char   *moovAddr;
	Uint32 moovOffset;
	char fname[40];

	UART_sendString( UART0, "\r\n Creating QTFF wrapper. Please wait ... " );
    MovieCtrl.prmQT.Videosize = MovieCtrl.CurVideoFileSize;
    MovieCtrl.prmQT.Scount    = MovieCtrl.FrameCount;
    MovieCtrl.prmQT.Ssize     = (Uint32*)(MovieCtrl.IndexFile.base_addr+4);

	switch(mode) {
		case MOVIE_MPEG4_MODE:
			MovieCtrl.prmQT.Ssize[0] -= MovieCtrl.prmQT.ChunkOffset;
			break;
	}

	MovieCtrl.prmQT.audioPrmQT.IncludeAudio  = 1;
	MovieCtrl.prmQT.audioPrmQT.AudioDataSize = MovieCtrl.CurAudioFileSize;

	// Make multiple of 4 bytes
	MovieCtrl.CurAudioFileSize += 4-(MovieCtrl.CurAudioFileSize+4)&0x3;
	// flush audio to file
	UART_sendString( UART0, "\r\n Writing Audio. Please wait ... " );
	FILE_write( MovieCtrl.FS_VideoFile, (char*)MovieCtrl.AudioFile.base_addr, MovieCtrl.CurAudioFileSize );
	UART_sendString( UART0, "Done" );

	UART_sendString( UART0, "\r\n Writing QT MOOV atom. Please wait ... " );
	moovAddr = (char*)MovieCtrl.AudioFile.base_addr;
	moovSize = QTMakeMovieAtom(&MovieCtrl.prmQT, (Uint8*)moovAddr);
	FILE_write( MovieCtrl.FS_VideoFile, moovAddr, moovSize );
	UART_sendString( UART0, "Done" );


	UART_sendString( UART0, "\r\n Updating QT MDAT atom size. Please wait ... " );
	moovOffset=MovieCtrl.CurAudioFileSize+MovieCtrl.CurVideoFileSize+QT_CHUNK_OFFSET;
	moovOffset=byte_swap32(moovOffset);
	
	switch(mode) {
		case MOVIE_MPEG4_MODE:
			if( GenFileName(fname, MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
				UART_sendString( UART0, "\r\n  E_DEVICE : File Access");
				return;
			}
			break;
		case MOVIE_MJPEG_MODE:
			if( GenFileName(fname, MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
				UART_sendString( UART0, "\r\n  E_DEVICE : File Access");
				return;
			}
			break;
		default:
			return;
	}

	#ifdef _Pr_KERNEL_
	FILE_seek( MovieCtrl.FS_VideoFile, 0, SEEK_SET);
	#else
	FILE_close(MovieCtrl.FS_VideoFile, FILEIO_NO_FAT_CACHE_FLUSH);
	FILE_open( fname, "ab", 0 );
	#endif

	FILE_write( MovieCtrl.FS_VideoFile, (char*)&moovOffset, 4 );
	FILE_close(MovieCtrl.FS_VideoFile, 0);

	UART_sendString( UART0, "Done" );
	UART_sendString( UART0, "\r\n QTFF wrapper creation completed." );
}

/* Used QT File Format */

/*-----------------------------------------------------------------------------\
@RoutineName :: GetMovieFrameRate

@Description ::
    Gets the desired Movie Frame Rate
    This routine should typically query the system and retrieve the frame rate.
    For now the frame rate is hard coded in the const MJPEG_FRAMERATE

@Parameters  ::
    Uint32   videoDataFormat     ::  Video Data Format .. H263 or MJPEG

@Return      ::
    Movie Frame Rate

\-----------------------------------------------------------------------------*/
Uint32 GetMovieFrameRate( Uint32 videoDataFormat ) {
     return MovieCtrl.FrameRate;
}

/*-----------------------------------------------------------------------------\
@RoutineName :: GetMovieWidth

@Description ::
    Gets the desired Movie display width
    This routine should typically query the system and retrieve the width
    For now the width is hard coded in the const MOVIE_IMAGE_WIDTH

@Parameters  ::
    Uint32 videoDataFormat       ::  Video Data Format .. H263 or MJPEG or MPEG-4

@Return      ::
    Movie width in pixels

\-----------------------------------------------------------------------------*/
Uint16  GetMovieWidth( Uint32 videoDataFormat ){
	Uint16 width;

    switch( videoDataFormat ) {
        case QT_MJPEGA_FORMAT:
			if(MjpegRecStartCmd.ImageSize==MJPEG_REC_640x480) {
				width  = 640;
			} else 
			if(MjpegRecStartCmd.ImageSize==MJPEG_REC_720x480) {
				width  = 720;
			} else 
			if(MjpegRecStartCmd.ImageSize==MJPEG_REC_320x240) {
				width  = 320;
			} 			
            return width;
        case QT_H263_FORMAT:
            return 320;
        case QT_MP4_FORMAT:
            return 320;
        default:
            return 320;
    }
}

/*-----------------------------------------------------------------------------\
@RoutineName :: GetMovieHeight

@Description ::
    Gets the desired Movie display height
    This routine should typically query the system and retrieve the height
    For now the height is hard coded in the const MOVIE_IMAGE_HEIGHT

@Parameters  ::
    Uint32 videoDataFormat       ::  Video Data Format .. H263 or MJPEG or MPEG-4

@Return      ::
    Movie height in pixels
\-----------------------------------------------------------------------------*/
Uint16  GetMovieHeight(Uint32 videoDataFormat ) {
	Uint16 height;

    switch( videoDataFormat ) {
        case QT_MJPEGA_FORMAT:
			if(MjpegRecStartCmd.ImageSize==MJPEG_REC_640x480) {
				height = 480;
			} else 
			if(MjpegRecStartCmd.ImageSize==MJPEG_REC_720x480) {
				height = 480;
			} else 
			if(MjpegRecStartCmd.ImageSize==MJPEG_REC_320x240) {
				height = 240;
			} 			
            return height;
        case QT_H263_FORMAT:
            return 240;
        case QT_MP4_FORMAT:
            return 240;
        default:
            return 240;
    }
}

/*-----------------------------------------------------------------------------\
@RoutineName :: GetMovieKeyFrameInterval

@Description ::
    Gets the desired Movie Key Frame Interval
    Key Frames in a movie are those frames which do not depend on previous frames.
    eg. I frames in MPEG

@Parameters  ::
    Uint32 videoDataFormat       ::  Video Data Format .. H263 or MJPEG or MPEG-4

@Return      ::
    Movie Key frame interval

\-----------------------------------------------------------------------------*/
Uint16  GetMovieKeyFrameInterval(Uint32 videoDataFormat ) {
    switch( videoDataFormat ) {
        case QT_MJPEGA_FORMAT:
            return 1;
        case QT_H263_FORMAT:
            return 1;
        case QT_MP4_FORMAT:
            return 1;
        default:
            return 1;
    }
}

/* End of routines required QT File Format */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -