📄 movie_rec.c
字号:
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 + -