+ return NULL;
+}
+
+void wait_for_ending_command(void) {
+ sigset_t sigset;
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGINT);
+ sigaddset(&sigset, SIGTERM);
+ sigwaitinfo(&sigset, NULL);
+}
+static void block_signals(void) {
+ sigset_t sigset;
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGINT);
+ sigaddset(&sigset, SIGTERM);
+ sigprocmask(SIG_BLOCK,&sigset,NULL);
+ pthread_sigmask(SIG_BLOCK,&sigset,NULL);
+}
+
+
+int main(int argc, char *argv[])
+{
+
+ //long int cpu_budget, cpu_period;
+ int ret;
+
+ block_signals();
+
+#ifdef CONFIG_FFMPEG_WITH_FRSH
+ ret = frsh_init();
+ if (ret) PERROR_AND_EXIT(ret, "frsh_init1");
+
+ /* fill default network contract params */
+ frsh_rtp_budget = 100*bitrate/8/100;
+ frsh_rtp_period_ms = 1000;
+ frsh_rtp_deadline_ms = 1000/fps;
+#endif /*CONFIG_FFMPEG_WITH_FRSH*/
+
+ avcodec_register_all();
+ av_register_all();
+ avdevice_register_all();
+
+ args_parse(argc, argv);
+
+ s = open_input_stream(vdev, width, height, fps, impform);
+ if (s == NULL) {
+ fprintf(stderr, "Cannot open input file %s\n", vdev);
+
+ return -1;
+ }
+ codec_open(s);
+ os = open_output_stream(dst, dport, CODEC_TYPE_VIDEO, fps);
+ if (os == NULL) {
+ fprintf(stderr, "Cannot open output stream\n");
+
+ return -1;
+ }
+ os->streams[0]->codec->width = s->streams[0]->codec->width;
+ os->streams[0]->codec->height = s->streams[0]->codec->height;
+ os->streams[0]->codec->time_base = s->streams[0]->codec->time_base;
+ os->streams[0]->codec->bit_rate = bitrate;
+ codec_connect(s->streams[0]->codec, os->streams[0]->codec);
+ out_codec_open(os);
+ dump_format(os, 0, os->filename, 1);
+ sdp_print(os, sdp_file);
+
+#if CONFIG_FFMPEG_WITH_FRSH
+ frsh_thread_attr_t frsh_attr;
+ frsh_thread_id_t thread;
+ frsh_vres_id_t cpu_vres;
+ frsh_contract_t cpu_contract;
+ frsh_rel_time_t cpu_budget, cpu_period;
+
+ cpu_budget = fosa_msec_to_rel_time(5);
+ cpu_period = fosa_msec_to_rel_time(1000/fps);
+ /* Contract negotiation for CPU */
+ ret = frsh_contract_init(&cpu_contract);
+ if (ret) PERROR_AND_EXIT(ret, "CPU:frsh_contract_init");
+
+ ret = frsh_contract_set_basic_params(&cpu_contract,
+ &cpu_budget,
+ &cpu_period,
+ FRSH_WT_BOUNDED,
+ FRSH_CT_REGULAR);
+ if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
+ ret = frsh_contract_set_resource_and_label(&cpu_contract,
+ FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, "camera_ctrl");
+ if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
+
+ ret = frsh_contract_negotiate(&cpu_contract, &cpu_vres);
+ if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
+ printf("Aqcpu vres negotiated\n");
+
+ pthread_attr_init(&frsh_attr);
+ ret = frsh_thread_create_and_bind(cpu_vres, &thread, &frsh_attr,
+ streamer_run, (void*) NULL);
+ if (ret) PERROR_AND_EXIT(ret, "frsh_thread_create_and_bind");
+
+ wait_for_ending_command();
+
+ streamer_run_done_rq = 1;
+
+ pthread_join(thread.pthread_id, (void**) NULL);
+
+ printf("Ending contracts\n");
+
+ ret = frsh_contract_cancel(cpu_vres);
+ if (ret) PERROR_AND_EXIT(ret, "frsh_contract_cancel");
+
+ printf("Finishing\n");
+
+ close_output_stream(os);
+#else
+ pthread_attr_t attr;
+ pthread_t streamer_th;
+
+ pthread_attr_init(&attr);
+
+ ret = pthread_create(&streamer_th, &attr, streamer_run, (void*) NULL);
+ if (ret)
+ printf("Failed to create streamer thread\n.");
+
+ wait_for_ending_command();
+
+ streamer_run_done_rq = 1;
+
+ pthread_join(streamer_th, (void**) NULL);
+
+ printf("Finishing\n");
+
+ close_output_stream(os);
+#endif
+