2 * Copyright (c) 2008 Luca Abeni
4 * This is free software; see GPL.txt
11 #include <libavformat/avformat.h>
12 #include <libavdevice/avdevice.h>
13 #include <libswscale/swscale.h>
20 #include "streamer_config.h"
24 #include <ul_logreg.h>
27 #ifdef CONFIG_STREAMER_WITH_FRSH
31 #ifdef CONFIG_STREAMER_WITH_FRSH
32 /*temporrary solution to pass network parameters */
33 extern long int udp_budget, udp_period;
34 #endif /*CONFIG_STREAMER_WITH_FRSH*/
36 static const char *sdp_file = "sdp.txt";
37 static const char *vdev = "/dev/video0";
38 static const char *dst = "127.0.0.1";
39 static int dport = 20000;
40 static int width = 352;
41 static int height = 288;
43 static const char *impform = "video4linux2";
44 AVFormatContext *s, *os;
46 static void sdp_print(AVFormatContext *s, const char *fname)
51 f = fopen(fname, "w");
52 avf_sdp_create(&s, 1, sdp, sizeof(sdp));
53 fprintf(f, "%s\n", sdp);
60 printf("usage: streamer [ options ]\n");
61 printf(" -w <number> send image width\n");
62 printf(" -h <number> send image height\n");
63 printf(" -r <number> refresh rate\n");
64 printf(" -r <path> video device [%s]\n", vdev);
65 printf(" -m <addr> destination IP address\n");
66 printf(" -i <string> input video device format [%s]\n", impform);
67 #ifdef CONFIG_STREAMER_WITH_FRSH
68 printf(" -b <number> network budget\n");
69 printf(" -p <number> network period for given budget\n");
70 #endif /*CONFIG_STREAMER_WITH_FRSH*/
72 printf(" -l <number>|<domain>=<number>,...\n");
73 #endif /*CONFIG_OC_ULUT*/
76 static int args_parse(int argc, char *argv[])
80 while ((v = getopt(argc, argv, "w:h:r:d:m:i:l:b:p:")) >= 0) {
86 height = atoi(optarg);
99 if(!strcmp(impform, "v4l"))
100 impform = "video4linux";
101 else if(!strcmp(impform, "v4l2"))
102 impform = "video4linux2";
104 #ifdef CONFIG_STREAMER_WITH_FRSH
106 udp_budget = atol(optarg);
109 udp_period = atol(optarg);
111 #endif /*CONFIG_STREAMER_WITH_FRSH*/
113 #ifdef CONFIG_OC_ULUT
115 ul_log_domain_arg2levels(optarg);
117 #endif /*CONFIG_OC_ULUT*/
119 default: /* unknown option */
120 fprintf(stderr, "%s: illegal option %c\n", argv[0], v);
129 int streamer_run_done_rq;
131 void* streamer_run(void* args)
136 while (!(done = streamer_run_done_rq)) {
138 pkt = read_input_packet(s);
145 pkt->pts += s->streams[pkt->stream_index]->start_time;
146 //rt_job_start(pkt->pts);
147 f = pkt_decode(s, pkt);
149 opkt = pkt_encode(os, f);
162 void wait_for_ending_command(void) {
164 sigemptyset(&sigset);
165 sigaddset(&sigset, SIGINT);
166 sigaddset(&sigset, SIGTERM);
167 sigwaitinfo(&sigset, NULL);
169 static void block_signals(void) {
171 sigemptyset(&sigset);
172 sigaddset(&sigset, SIGINT);
173 sigaddset(&sigset, SIGTERM);
174 sigprocmask(SIG_BLOCK,&sigset,NULL);
175 pthread_sigmask(SIG_BLOCK,&sigset,NULL);
179 int main(int argc, char *argv[])
182 //long int cpu_budget, cpu_period;
187 #ifdef CONFIG_STREAMER_WITH_FRSH
189 if (ret) PERROR_AND_EXIT(ret, "frsh_init1");
191 /* fill default network contract params */
194 #endif /*CONFIG_STREAMER_WITH_FRSH*/
196 avcodec_register_all();
198 avdevice_register_all();
200 args_parse(argc, argv);
202 s = open_input_stream(vdev, width, height, fps, impform);
204 fprintf(stderr, "Cannot open input file %s\n", vdev);
209 os = open_output_stream(dst, dport, CODEC_TYPE_VIDEO);
211 fprintf(stderr, "Cannot open output stream\n");
215 os->streams[0]->codec->width = s->streams[0]->codec->width;
216 os->streams[0]->codec->height = s->streams[0]->codec->height;
217 os->streams[0]->codec->time_base = s->streams[0]->codec->time_base;
218 codec_connect(s->streams[0]->codec, os->streams[0]->codec);
220 dump_format(os, 0, os->filename, 1);
221 sdp_print(os, sdp_file);
223 #if CONFIG_STREAMER_WITH_FRSH && CONFIG_AQUOSA
224 frsh_thread_attr_t frsh_attr;
225 frsh_thread_id_t thread;
226 frsh_vres_id_t cpu_vres;
227 frsh_contract_t cpu_contract;
228 frsh_rel_time_t cpu_budget, cpu_period;
230 cpu_budget = fosa_msec_to_rel_time(50);
231 cpu_period = fosa_msec_to_rel_time(100);
232 /* Contract negotiation for CPU */
233 ret = frsh_contract_init(&cpu_contract);
234 if (ret) PERROR_AND_EXIT(ret, "CPU:frsh_contract_init");
236 ret = frsh_contract_set_basic_params(&cpu_contract,
241 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
242 ret = frsh_contract_set_resource_and_label(&cpu_contract,
243 FRSH_RT_PROCESSOR, FRSH_CPU_ID_DEFAULT, "aqcpu_cont");
244 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
246 ret = frsh_contract_negotiate(&cpu_contract, &cpu_vres);
247 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
248 printf("Aqcpu vres negotiated\n");
250 pthread_attr_init(&frsh_attr);
251 ret = frsh_thread_create_and_bind(cpu_vres, &thread, &frsh_attr,
252 streamer_run, (void*) NULL);
253 if (ret) PERROR_AND_EXIT(ret, "frsh_thread_create_and_bind");
255 wait_for_ending_command();
257 streamer_run_done_rq = 1;
259 pthread_join(thread.pthread_id, (void**) NULL);
261 printf("Ending contracts\n");
263 ret = frsh_contract_cancel(cpu_vres);
264 if (ret) PERROR_AND_EXIT(ret, "frsh_contract_cancel");
266 printf("Finishing\n");
268 close_output_stream(os);
271 pthread_t streamer_th;
273 pthread_attr_init(&attr);
275 ret = pthread_create(&streamer_th, &attr, streamer_run, (void*) NULL);
277 printf("Failed to create streamer thread\n.");
279 wait_for_ending_command();
281 streamer_run_done_rq = 1;
283 pthread_join(streamer_th, (void**) NULL);
285 printf("Finishing\n");
287 close_output_stream(os);