#include <frsh.h>
#endif
+#ifdef CONFIG_STREAMER_WITH_FRSH
+/*temporrary solution to pass network parameters */
extern long int udp_budget, udp_period;
+#endif /*CONFIG_STREAMER_WITH_FRSH*/
static const char *sdp_file = "sdp.txt";
static const char *vdev = "/dev/video0";
printf(" -r <path> video device [%s]\n", vdev);
printf(" -m <addr> destination IP address\n");
printf(" -i <string> input video device format [%s]\n", impform);
+ #ifdef CONFIG_STREAMER_WITH_FRSH
+ printf(" -b <number> network budget\n");
+ printf(" -p <number> network period for given budget\n");
+ #endif /*CONFIG_STREAMER_WITH_FRSH*/
#ifdef CONFIG_OC_ULUT
printf(" -l <number>|<domain>=<number>,...\n");
#endif /*CONFIG_OC_ULUT*/
{
int v;
- while ((v = getopt(argc, argv, "w:h:r:d:m:i:l:")) >= 0) {
+ while ((v = getopt(argc, argv, "w:h:r:d:m:i:l:b:p:")) >= 0) {
switch (v) {
case 'w':
width = atoi(optarg);
else if(!strcmp(impform, "v4l2"))
impform = "video4linux2";
break;
+ #ifdef CONFIG_STREAMER_WITH_FRSH
+ case 'b':
+ udp_budget = atol(optarg);
+ break;
+ case 'p':
+ udp_period = atol(optarg);
+ break;
+ #endif /*CONFIG_STREAMER_WITH_FRSH*/
+
#ifdef CONFIG_OC_ULUT
case 'l':
ul_log_domain_arg2levels(optarg);
return 0;
}
+int streamer_run_done_rq;
+
void* streamer_run(void* args)
{
int done;
done = 0;
- while (!done) {
+ while (!(done = streamer_run_done_rq)) {
AVPacket *pkt;
pkt = read_input_packet(s);
if (pkt == NULL) {
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_STREAMER_WITH_FRSH
ret = frsh_init();
if (ret) PERROR_AND_EXIT(ret, "frsh_init1");
-#endif /*CONFIG_STREAMER_WITH_FRSH*/
-
- /* fill contract params */
+
+ /* fill default network contract params */
udp_budget = 50000;
udp_period = 500;
-
+#endif /*CONFIG_STREAMER_WITH_FRSH*/
+
avcodec_register_all();
av_register_all();
avdevice_register_all();
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, 0,"aqcpu_cont");
+ FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, "aqcpu_cont");
if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
ret = frsh_contract_negotiate(&cpu_contract, &cpu_vres);
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;
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
return 0;