C_RESULT video_stage_recorder_transform(video_stage_recorder_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) { time_t temptime; vp_os_mutex_lock( &out->lock ); if( out->status == VP_API_STATUS_INIT ) { out->numBuffers = 1; out->indexBuffer = 0; out->lineSize = NULL; //out->buffers = (int8_t **) vp_os_malloc( sizeof(int8_t *) ); } out->size = in->size; out->status = in->status; out->buffers = in->buffers; if( in->status == VP_API_STATUS_ENDED ) { out->status = in->status; } else if(in->status == VP_API_STATUS_STILL_RUNNING) { out->status = VP_API_STATUS_PROCESSING; } else { out->status = in->status; } if(cfg->startRec==VIDEO_RECORD_HOLD) { struct timeval tv; struct tm *atm; gettimeofday(&tv,NULL); temptime = (time_t)tv.tv_sec; atm = localtime(&temptime); //atm = localtime(&tv.tv_sec); sprintf(video_filename, "%s/video_%04d%02d%02d_%02d%02d%02d.%s", VIDEO_FILE_DEFAULT_PATH, atm->tm_year+1900, atm->tm_mon+1, atm->tm_mday, atm->tm_hour, atm->tm_min, atm->tm_sec, VIDEO_FILE_EXTENSION); cfg->fp = fopen(video_filename, "wb"); if (cfg->fp == NULL) printf ("error open file %s\n", video_filename); cfg->startRec=VIDEO_RECORD_START; } if( cfg->fp != NULL && out->size > 0 && out->status == VP_API_STATUS_PROCESSING && cfg->startRec==VIDEO_RECORD_START) { vp_api_picture_t* picture = (vp_api_picture_t *) in->buffers; #if defined (NAVDATA_VISION_INCLUDED) && defined (USE_ELINUX) navdata_set_raw_picture(picture_captured++); #endif fwrite(picture->y_buf, picture->width * picture->height, 1, cfg->fp); #ifdef USE_VIDEO_YUV fwrite(picture->cb_buf, picture->width * picture->height >> 2, 1, cfg->fp); fwrite(picture->cr_buf, picture->width * picture->height >> 2, 1, cfg->fp); #endif }
C_RESULT video_stage_recorder_transform(video_stage_recorder_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) { #ifndef _WIN32 time_t temptime; struct timeval tv; #ifdef USE_FIXED_60FPS static struct timeval old_tv; static uint8_t* old_pic=NULL; unsigned long delta_us=0; int ratio=0; int i=0; #endif vp_os_mutex_lock( &out->lock ); if( out->status == VP_API_STATUS_INIT ) { out->numBuffers = 1; out->indexBuffer = 0; out->lineSize = NULL; //out->buffers = (int8_t **) vp_os_malloc( sizeof(int8_t *) ); } out->size = in->size; out->status = in->status; out->buffers = in->buffers; if( in->status == VP_API_STATUS_ENDED ) { out->status = in->status; } else if(in->status == VP_API_STATUS_STILL_RUNNING) { out->status = VP_API_STATUS_PROCESSING; } else { out->status = in->status; } gettimeofday(&tv,NULL); vp_api_picture_t* picture = (vp_api_picture_t *) in->buffers; if(cfg->startRec==VIDEO_RECORD_HOLD) { struct tm *atm; temptime = (time_t)tv.tv_sec; atm = localtime(&temptime); //atm = localtime(&tv.tv_sec); printf("recording video\n"); sprintf(cfg->video_filename, "%s/video_%04d%02d%02d_%02d%02d%02d_w%i_h%i.%s", VIDEO_FILE_DEFAULT_PATH, atm->tm_year+1900, atm->tm_mon+1, atm->tm_mday, atm->tm_hour, atm->tm_min, atm->tm_sec, picture->width,picture->height, VIDEO_FILE_EXTENSION); memcpy(video_filename, cfg->video_filename, sizeof(video_filename)); cfg->fp = fopen(cfg->video_filename, "wb"); if (cfg->fp == NULL) printf ("error open file %s\n", cfg->video_filename); cfg->startRec=VIDEO_RECORD_START; } if(cfg->startRec==VIDEO_PICTURE_HOLD) { struct tm *atm; temptime = (time_t)tv.tv_sec; atm = localtime(&temptime); //atm = localtime(&tv.tv_sec); printf("recording picture\n"); sprintf(cfg->video_filename, "%s/picture_%04d%02d%02d_%02d%02d%02d_w%i_h%i.%s", VIDEO_FILE_DEFAULT_PATH, atm->tm_year+1900, atm->tm_mon+1, atm->tm_mday, atm->tm_hour, atm->tm_min, atm->tm_sec, picture->width,picture->height, VIDEO_FILE_EXTENSION); memcpy(video_filename, cfg->video_filename, sizeof(video_filename)); cfg->fp = fopen(cfg->video_filename, "wb"); if (cfg->fp == NULL) printf ("error open file %s\n", cfg->video_filename); cfg->startRec=VIDEO_PICTURE_START; } if( cfg->fp != NULL && out->size > 0 && out->status == VP_API_STATUS_PROCESSING && (cfg->startRec==VIDEO_RECORD_START||cfg->startRec==VIDEO_PICTURE_START )) { #if defined (NAVDATA_VISION_INCLUDED) && defined (USE_ELINUX) navdata_set_raw_picture(picture_captured++); #endif #ifdef USE_FIXED_60FPS delta_us=(tv.tv_sec*1000000+tv.tv_usec)-(old_tv.tv_sec*1000000+old_tv.tv_usec); ratio=delta_us/16666; old_tv=tv; for(i=0; i<ratio && old_pic; i++) { fwrite(old_pic, picture->width * picture->height, 1, cfg->fp); #ifdef USE_VIDEO_YUV fwrite(old_pic+(picture->width * picture->height), picture->width * picture->height >> 1, 1, cfg->fp); #endif } if(old_pic==NULL) { old_pic=vp_os_malloc(picture->width * picture->height*3/2); } memcpy(old_pic, picture->y_buf, picture->width * picture->height); memcpy(old_pic + picture->width * picture->height, picture->cb_buf, picture->width * picture->height >> 2); memcpy(old_pic + picture->width * picture->height*5/4, picture->cr_buf, picture->width * picture->height >> 2); #endif //USE_FIXED_60FPS fwrite(picture->y_buf, picture->width * picture->height, 1, cfg->fp); #ifdef USE_VIDEO_YUV fwrite(picture->cb_buf, picture->width * picture->height >> 2, 1, cfg->fp); fwrite(picture->cr_buf, picture->width * picture->height >> 2, 1, cfg->fp); #endif if(cfg->startRec==VIDEO_PICTURE_START )//if picture, we stop after one picture ( and if video we continue ) { cfg->startRec=VIDEO_RECORD_STOP; } }