📄 movie_rec.c
字号:
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
MOVIE_AIC23_stop();
GUI_controlPanelButtonStateSet(&BUTTON_RECORD_STOP);
if(FS_FILE_IO && MovieCtrl.QtFileFormat) {
MOVIE_REC_qtffCreate(mode);
}
}
static Uint16 intType, cmd;
static Uint32 frameSize;
void MPEG4_REC_isr() {
DSPC_readData((char*)&intType, 1, 0xFF);
if(intType == 1) { // Request
ARMDSP_getArmCmd( &cmd, (Uint16*)&Mpeg4RecDspReq, sizeof(Mpeg4RecDspReq)/2);
switch(cmd) {
case MPEG4_REC_INPUT_REQ:
break;
case MPEG4_REC_DATA_FWD_REQ:
if(Mpeg4RecDspReq.FwdDataType == 0)
MovieCtrl.VideoBuffWrite = TRUE;
if(Mpeg4RecDspReq.FwdDataType == 1)
MovieCtrl.AudioBuffWrite = TRUE;
break;
case MPEG4_REC_ERROR_STOP:
break;
default:
// invalid request stop DSP
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendArmReply( cmd, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
if(cmd==MPEG4_REC_INPUT_REQ) {
frameSize = MAKE_WORD32(Mpeg4RecDspReq.VideoSizeHigh, Mpeg4RecDspReq.VideoSizeLow) - MovieCtrl.VideoSize;
MEM_FILE_write(&MovieCtrl.IndexFile, (char*)&frameSize, sizeof(Uint32));
MovieCtrl.VideoSize += frameSize;
MovieCtrl.AudioSize = MAKE_WORD32(Mpeg4RecDspReq.AudioSizeHigh, Mpeg4RecDspReq.AudioSizeLow);
MovieCtrl.FrameCount= MAKE_WORD32(Mpeg4RecDspReq.FrameCountHigh,Mpeg4RecDspReq.FrameCountLow);
}
if(MovieCtrl.VideoSize >= MovieCtrl.MaxVideoSize || MovieCtrl.MovieStopped == TRUE ){
// Stop recording
ARMDSP_sendArmReply( cmd | DSP_CMD_COMPLETE, NULL, 0 );
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendDspCmd( MPEG4_REC_STOP, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
if(MovieCtrl.FrameCount==1)
OSD_winEnable( OSD_VID_WIN0, TRUE);
switch(Mpeg4RecDspReq.Status) {
case 1: // encoding
MovieCtrl.CurDspWinBuffer = (MovieCtrl.CurDspWinBuffer+1)%3;
Mpeg4RecDspReqReply.VideoAddrHigh = HIGH_WORD( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
Mpeg4RecDspReqReply.VideoAddrLow = LOW_WORD( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
ARMDSP_sendArmReply( cmd | DSP_CMD_COMPLETE, (Uint16*)&Mpeg4RecDspReqReply, sizeof(Mpeg4RecDspReqReply)/2 );
break;
case 11:
case 12:
case 13:
// Stop recording
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendDspCmd( MPEG4_REC_STOP, NULL, 0);
MovieCtrl.DspStopped = TRUE;
break;
default:
MovieCtrl.DspStopped = TRUE;
break;
}
} else { // ACK
}
}
void MJPEG_REC_isr() {
DSPC_readData((char*)&intType, 1, 0xFF);
if(intType == 1) { // Request
ARMDSP_getArmCmd( &cmd, (Uint16*)&MjpegRecDspReq, sizeof(MjpegRecDspReq)/2);
switch(cmd) {
case MJPEG_REC_INPUT_REQ:
break;
case MJPEG_REC_DATA_FWD_REQ:
if(MjpegRecDspReq.FwdDataType == 0)
MovieCtrl.VideoBuffWrite = TRUE;
if(MjpegRecDspReq.FwdDataType == 1)
MovieCtrl.AudioBuffWrite = TRUE;
ARMDSP_sendArmReply( cmd | DSP_CMD_COMPLETE, NULL, 0 );
break;
case MJPEG_REC_ERROR_STOP:
break;
default:
// invalid request stop DSP
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendArmReply( cmd, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
if(MovieCtrl.VideoSize >= MovieCtrl.MaxVideoSize || MovieCtrl.MovieStopped == TRUE ){
// Stop recording
ARMDSP_sendArmReply( cmd | DSP_CMD_COMPLETE, NULL, 0 );
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendDspCmd( MJPEG_REC_STOP, NULL, 0);
MovieCtrl.DspStopped = TRUE;
return;
}
if(MovieCtrl.FrameCount==1)
OSD_winEnable( OSD_VID_WIN0, TRUE);
if(cmd==MJPEG_REC_INPUT_REQ) {
frameSize = MAKE_WORD32(MjpegRecDspReq.VideoSizeHigh, MjpegRecDspReq.VideoSizeLow) - MovieCtrl.VideoSize;
MEM_FILE_write(&MovieCtrl.IndexFile, (char*)&frameSize, sizeof(Uint32));
MovieCtrl.VideoSize += frameSize;
MovieCtrl.AudioSize = MAKE_WORD32(MjpegRecDspReq.AudioSizeHigh, MjpegRecDspReq.AudioSizeLow);
MovieCtrl.FrameCount= MAKE_WORD32(MjpegRecDspReq.FrameCountHigh,MjpegRecDspReq.FrameCountLow);
switch(MjpegRecDspReq.Status) {
case 1: // encoding
MovieCtrl.CurDspWinBuffer = (MovieCtrl.CurDspWinBuffer+1)%3;
MjpegRecDspReqReply.VideoAddrHigh = HIGH_WORD( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
MjpegRecDspReqReply.VideoAddrLow = LOW_WORD( MovieCtrl.VideoWinBuffer[MovieCtrl.CurDspWinBuffer] - SDRAM_MEMORY_BASE );
ARMDSP_sendArmReply( cmd | DSP_CMD_COMPLETE, (Uint16*)&MjpegRecDspReqReply, sizeof(MjpegRecDspReqReply)/2 );
break;
case 11:
case 12:
case 13:
// Stop recording
INTC_enable( INT_DSP, FALSE);
INTCDetachISR( INT_DSP );
ARMDSP_sendDspCmd( MJPEG_REC_STOP, NULL, 0);
MovieCtrl.DspStopped = TRUE;
break;
default:
MovieCtrl.DspStopped = TRUE;
break;
}
}
} else { // ACK
}
}
void MOVIE_REC_switchBuffer() {
if( ((MovieCtrl.CurVideoWinBuffer+1)%3) != MovieCtrl.CurDspWinBuffer) {
switch(MovieCtrl.CurVideoWinBuffer) {
case 0:
PREV_setWriteAddr( (char*)MovieCtrl.VideoWinBuffer[1]);
OSD_setWinAddr( OSD_VID_WIN0, (char*)MovieCtrl.VideoWinBuffer[2]);
MovieCtrl.CurVideoWinBuffer=1;
break;
case 1:
PREV_setWriteAddr( (char*)MovieCtrl.VideoWinBuffer[2]);
OSD_setWinAddr( OSD_VID_WIN0, (char*)MovieCtrl.VideoWinBuffer[0]);
MovieCtrl.CurVideoWinBuffer=2;
break;
case 2:
PREV_setWriteAddr( (char*)MovieCtrl.VideoWinBuffer[0]);
OSD_setWinAddr( OSD_VID_WIN0, (char*)MovieCtrl.VideoWinBuffer[1]);
MovieCtrl.CurVideoWinBuffer=0;
break;
}
}
GUI_controlPanelTimerUpdate(MovieCtrl.FrameCount/MovieCtrl.FrameRate);
}
static PREV_ConfigData prevConfig_movie;
void MOVIE_REC_initPREV(MOVIE_MODE mode) {
// init preview in QVGA mode, with triple buffering
OSD_winEnable( OSD_VID_WIN0, FALSE );
CCDC_enable( FALSE, FALSE );
PREV_enable( FALSE );
while( PREV_isEnabled() == TRUE )
;
CCDM_init (CCDM_3D3, CCDM_DRAFT_MODE);
CCDCSetMode(CCDM_3D3, CCDM_DRAFT_MODE);
PREVSetMode(CCDM_3D3, CCDM_DRAFT_MODE);
OSDSetMode( OSD_VID_WIN0, VID_320x240, (char*)OSD_VIDEO_WIN0_ADDR);
prevConfig_movie.ccdcInputWidth8bits = FALSE;
prevConfig_movie.alawEnable = FALSE;
prevConfig_movie.oneShotEnable = FALSE;
prevConfig_movie.resizeOnlyEnable = FALSE;
prevConfig_movie.sdramInputEnable = FALSE;
prevConfig_movie.burstAlignModeEnable= FALSE;
prevConfig_movie.writeEnableValid = FALSE;
prevConfig_movie.readAddress = NULL;
prevConfig_movie.writeAddress = NULL;
prevConfig_movie.hstart = 233;
prevConfig_movie.vstart = 2;
prevConfig_movie.inputPixelsH = CCDM_3D3_RAW_DATA_WIDTH_DRAFT_MODE;
prevConfig_movie.inputLinesV = CCDM_3D3_RAW_DATA_HEIGHT_DRAFT_MODE;
prevConfig_movie.outputPixelsH = 320;
prevConfig_movie.outputLinesV = 240;
switch(mode) {
case MOVIE_MJPEG_MODE:
if( MjpegRecStartCmd.ImageSize == MJPEG_REC_640x480
|| MjpegRecStartCmd.ImageSize == MJPEG_REC_720x480 ) {
if(MjpegRecStartCmd.ImageSize==MJPEG_REC_640x480) {
prevConfig_movie.outputPixelsH = 640;
OSDSetMode( OSD_VID_WIN0, VID_640x480, (char*)OSD_VIDEO_WIN0_ADDR);
} else {
prevConfig_movie.outputPixelsH = 720;
OSDSetMode( OSD_VID_WIN0, VID_720x480, (char*)OSD_VIDEO_WIN0_ADDR);
}
prevConfig_movie.sdramInputEnable = TRUE;
prevConfig_movie.readAddress = (char*)MOVIE_CCD_RAW_DATA_ADDR;
prevConfig_movie.outputLinesV = 480;
prevConfig_movie.hstart = CCDM_3D3_RAW_DATA_WIDTH_DRAFT_MODE;
prevConfig_movie.vstart = 0;
CCDC_setSdramAddress(prevConfig_movie.readAddress);
}
break;
}
PREV_setConfig( &prevConfig_movie );
PREV_setWriteAddr( (char*)OSD_VIDEO_WIN0_ADDR);
AEWBDemoStop();
INTC_enable( INT_VD0, FALSE);
INTC_clearIRQ( INT_VD0 );
CCDC_enable(TRUE, FALSE);
switch(mode) {
case MOVIE_MJPEG_MODE:
if(MjpegRecStartCmd.ImageSize==MJPEG_REC_640x480||MjpegRecStartCmd.ImageSize==MJPEG_REC_720x480) {
CCDC_enable(TRUE, TRUE);
}
break;
}
PREV_enable(TRUE);
{
int i;
for(i=0; i<4; i++)
INTC_waitForInt(INT_VD0, 0 );
}
INTCAttachISR( INT_VD0, MOVIE_REC_switchBuffer );
INTC_enable( INT_VD0, TRUE);
while(MovieCtrl.CurVideoWinBuffer != 2 )
;
}
STATUS MOVIE_REC_initMovieCtrl(MOVIE_MODE mode) {
MovieCtrl.VideoWinBuffer[0] = OSD_VIDEO_WIN0_ADDR;
MovieCtrl.VideoWinBuffer[1] = OSD_VIDEO_WIN1_ADDR;
MovieCtrl.VideoWinBuffer[2] = OSD_VIDEO_WIN2_ADDR;
MovieCtrl.CurVideoWinBuffer = 0;
MovieCtrl.CurDspWinBuffer = 0;
MovieCtrl.VideoRingBuffer.startAddr = MOVIE_BUFFER_ADDR;
MovieCtrl.VideoRingBuffer.size = MOVIE_BUFFER_SIZE;
MovieCtrl.VideoRingBuffer.curBuff = 0;
MovieCtrl.AudioRingBuffer.startAddr = AUDIO_BUFFER_ADDR;
MovieCtrl.AudioRingBuffer.size = AUDIO_BUFFER_SIZE;
MovieCtrl.AudioRingBuffer.curBuff = 0;
MovieCtrl.VideoSize = 0;
MovieCtrl.AudioSize = 0;
MovieCtrl.FrameCount = 0;
MovieCtrl.CurVideoFileSize = 0;
MovieCtrl.CurAudioFileSize = 0;
MovieCtrl.FS_VideoFile = NULL;
MovieCtrl.FS_AudioFile = NULL;
profile_clear(10);
switch(mode) {
case MOVIE_MPEG4_MODE:
MovieCtrl.FrameRate =Mpeg4RecStartCmd.FrameRate;
MovieCtrl.AudioFormat=Mpeg4RecStartCmd.AudioFormat;
break;
case MOVIE_MJPEG_MODE:
MovieCtrl.FrameRate=MjpegRecStartCmd.FrameRate;
break;
default:
return E_INVALID_INPUT;
}
MovieCtrl.VideoBuffWrite = FALSE;
MovieCtrl.AudioBuffWrite = FALSE;
MovieCtrl.DspStopped = FALSE;
MovieCtrl.MovieStopped = FALSE;
MovieCtrl.MoviePaused = FALSE;
MovieCtrl.MovieFF = FALSE;
MovieCtrl.MovieFullScreen= FALSE;
if(FS_FILE_IO) {
int maxFileSize;
char fname[40];
UART_sendString( UART0, "\r\n Creating file for storing data to memory card ... " );
maxFileSize = FS_diskFree(FileDevice);
if(maxFileSize < 500*KB ) {
UART_sendString( UART0, "\r\n"
"\r\n ERROR : Cannot save movie. Insufficient space on Memory card." );
return E_RESOURCE_UNAVAILABLE;
}
switch(mode) {
case MOVIE_MJPEG_MODE:
MovieCtrl.MaxVideoSize = maxFileSize - maxFileSize/6;
break;
case MOVIE_MPEG4_MODE:
if(Mpeg4RecStartCmd.AudioFormat==MOVIE_AUDIO_FORMAT_G711)
MovieCtrl.MaxVideoSize = maxFileSize - maxFileSize/3;
else
MovieCtrl.MaxVideoSize = maxFileSize - maxFileSize/7;
break;
default:
return E_DEVICE;
}
UART_sendString( UART0, "\r\n"
"\r\n Creating movie file. Please Wait ... " );
switch(mode) {
case MOVIE_MPEG4_MODE:
if( NewFileName(fname, &MovieCtrl.Mpeg4FileIndex, MPEG4_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n"
"\r\n ERROR : Memory card access error." );
return E_DEVICE;
}
GUI_fileInfoPanelSetInfo(MovieCtrl.Mpeg4FileIndex);
break;
case MOVIE_MJPEG_MODE:
if( NewFileName(fname, &MovieCtrl.MjpegFileIndex, MJPEG_FILE) != E_PASS ) {
UART_sendString( UART0, "\r\n"
"\r\n ERROR : Memory card access error." );
return E_DEVICE;
}
GUI_fileInfoPanelSetInfo(MovieCtrl.MjpegFileIndex);
break;
default:
return E_DEVICE;
}
if(MovieCtrl.QtFileFormat==FALSE) {
MovieCtrl.FS_VideoFile = FILE_open( fname, "wb", FILEIO_MFW_MODE );
} else {
MovieCtrl.FS_VideoFile = FILE_open( fname, "wb", 0 );
}
if( MovieCtrl.FS_VideoFile == NULL ) {
UART_sendString( UART0, "\r\n"
"\r\n ERROR : Memory card access error." );
return E_DEVICE;
}
UART_sendString( UART0, "Done." );
sprintf( UART_outBuff, "\r\n MOVIE FILE : %s ", fname );
UART_sendString( UART0, UART_outBuff );
if(MovieCtrl.QtFileFormat==FALSE) {
UART_sendString( UART0, "\r\n"
"\r\n Creating audio file. Please Wait ... " );
strcpy( fname + (strlen(fname) - 3), "AUD" ); // make extension as .AUD for audio file
MovieCtrl.FS_AudioFile = FILE_open( fname, "wb", FILEIO_MFW_MODE );
if( MovieCtrl.FS_AudioFile == NULL ){
UART_sendString( UART0, "\r\n"
"\r\n ERROR : Memory card access error." );
return E_DEVICE;
}
UART_sendString( UART0, "Done." );
sprintf( UART_outBuff, "\r\n AUDIO FILE : %s ", fname );
UART_sendString( UART0, UART_outBuff );
} else {
// init QT Params, write mdat atom header, open audio file in SDRAM memory
Uint32 mdat_atom[4];
char *mdat_atom_ptr;
mdat_atom_ptr = (char*)mdat_atom;
strcpy(mdat_atom_ptr, "....mdat");
MEM_FILE_open( &MovieCtrl.AudioFile, MEM_FS_BUFFER_ADDR + MB, "wb" );
FILE_write( MovieCtrl.FS_VideoFile, mdat_atom_ptr, 8 );
switch(mode) {
case MOVIE_MPEG4_MODE:
QTInitParams(&MovieCtrl.prmQT, QT_MP4_FORMAT);
{
char temp[] = {
0x00,0x00,0x01,0x00,
0x00,0x00,0x01,0x20,
0x00,0x84,0x40,0x19,
0x28,0x50,0x20,0xF0,
0xA3,0x1F
};
memcpy(MovieCtrl.prmQT.ESDSAtomInfo,temp,18);
MovieCtrl.prmQT.ChunkOffset = 18;
}
break;
case MOVIE_MJPEG_MODE:
QTInitParams(&MovieCtrl.prmQT, QT_MJPEGA_FORMAT);
break;
default:
return E_INVALID_INPUT;
}
}
MEM_FILE_open( &MovieCtrl.IndexFile, MEM_FS_BUFFER_ADDR, "wb" );
} else {
switch(mode) {
case MOVIE_MJPEG_MODE:
MovieCtrl.MaxVideoSize = 7*MB; /* for now */
break;
case MOVIE_MPEG4_MODE:
if(Mpeg4RecStartCmd.AudioFormat==MOVIE_AUDIO_FORMAT_G711)
MovieCtrl.MaxVideoSize = 5*MB; /* for now */
else
MovieCtrl.MaxVideoSize = 7*MB; /* for now */
break;
default:
return E_DEVICE;
}
MEM_FILE_open( &MovieCtrl.VideoFile, MEM_FS_BUFFER_ADDR, "wb" );
MEM_FILE_open( &MovieCtrl.IndexFile, MEM_FS_BUFFER_ADDR + MovieCtrl.MaxVideoSize + 200*KB, "wb" );
MEM_FILE_open( &MovieCtrl.AudioFile, MEM_FS_BUFFER_ADDR + MovieCtrl.MaxVideoSize + 200*KB + MB, "wb" );
}
GUI_controlPanelSeekBarMaxPositionSet(MovieCtrl.MaxVideoSize);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -