int main() { int i; struct picture_t pic; struct encoded_pic_t encoded_pic; errno = 0; if(!camera_init(&pic)) goto error_cam; if(!encoder_init(&pic)){ fprintf(stderr,"failed to initialize encoder\n"); goto error_encoder; } if(!preview_init(&pic)) goto error_preview; if(!output_init(&pic)) goto error_output; if(!encoder_encode_headers(&encoded_pic)) goto error_output; if(!output_write_headers(&encoded_pic)) goto error_output; if(!camera_on()) goto error_cam_on; if(signal(SIGINT, stop_recording) == SIG_ERR){ fprintf(stderr,"signal() failed\n"); goto error_signal; } printf("Press ctrl-c to stop recording...\n"); recording = 1; for(i=0; recording; i++){ if(!camera_get_frame(&pic)) break; gen_osd_info(); osd_print(&pic, osd_string); if((i&7)==0) // i%8==0 preview_display(&pic); if(!encoder_encode_frame(&pic, &encoded_pic)) break; applog_flush(); if(!output_write_frame(&encoded_pic)) break; } printf("\nrecorded %d frames\n", i); error_signal: camera_off(); error_cam_on: output_close(); error_output: preview_close(); error_preview: encoder_close(); error_encoder: camera_close(); error_cam: return 0; }
/* Quits preview pane or view modes. */ static void cmd_ctrl_wz(key_info_t key_info, keys_info_t *keys_info) { leave_view_mode(); preview_close(); }
int main() { int s32MainFd,temp; struct timespec ts = { 2, 0 }; //================================================= ringmalloc(640*480); errno = 0; if(!camera_init(&pic)) goto error_cam; if(!encoder_init(&pic)) goto error_encoder; if(!preview_init(&pic)) goto error_preview; get_filename(); printf("file:%s\n",mkv_filename); if(!output_init(&pic,mkv_filename)) goto error_output; if(!encoder_encode_headers(&encoded_pic)) goto error_output; memcpy(&header_pic,&encoded_pic,sizeof(encoded_pic)); header_pic.buffer=malloc(encoded_pic.length); memcpy(header_pic.buffer,encoded_pic.buffer,encoded_pic.length); if(!output_write_headers(&encoded_pic,&psp)) goto error_output; encoder_release(&encoded_pic); if(!camera_on()) goto error_cam_on; //================================================ printf("RTSP server START\n"); PrefsInit(); printf("listen for client connecting...\n"); signal(SIGINT, IntHandl); s32MainFd = tcp_listen(SERVER_RTSP_PORT_DEFAULT); /* 初始化schedule_list 队列,创建调度线程,参考 schedule.c */ if (ScheduleInit(&pic,&encoded_pic) == ERR_FATAL) { fprintf(stderr,"Fatal: Can't start scheduler %s, %i \nServer is aborting.\n", __FILE__, __LINE__); return 0; } /* 将所有可用的RTP端口号放入到port_pool[MAX_SESSION] 中 */ RTP_port_pool_init(RTP_DEFAULT_PORT); //循环等待 if((temp = pthread_create(&thread[0], NULL, cam_thread, NULL)) != 0) printf("cam_thread error!\n"); else printf("cam_thread ok\n"); pthread_mutex_init(&mut,NULL); while (!g_s32Quit) { nanosleep(&ts, NULL); /*查找收到的rtsp连接, * 对每一个连接产生所有的信息放入到结构体rtsp_list中 */ // trace_point(); EventLoop(s32MainFd); } ringfree(); printf("The Server quit!\n"); camera_off(); error_cam_on: output_close(); error_output: preview_close(); error_preview: encoder_close(); error_encoder: camera_close(); error_cam: return NULL; }