mjpg_streamer.c
main()
1、 通过getopt方法和while循环的方式解析输入参数;
2、 log相关;
3、 判断是否转换为daemon模式;
4、 初始化互斥锁和条件变量;
5、 SIGPIPE和SIGINT信号初始化;
6、 通过调用动态链接库为in结构体的init、stop、run、cmd和param赋值;
7、 global.in.init(&global.in.param);
8、 通过调用动态链接库为out结构体的init、stop、run、cmd和param赋值;
9、 global.out[i].init(&global.out[i].param);
10、 执行global.in.run();
11、 执行global.out[i].run(global.out[i].param.id);
12、 pause()。
input_file.c
input_init();
1、 将参数由字符串格式转换为数组的形式;
2、 通过getopt方法和while循环的方式解析输入参数;
3、 pglobal赋值。
input_stop()
pthread_cancel(worker)
input_run(void)
1、 开辟视频缓冲区pglobal->buf;
2、 创建线程pthread_create(&worker, 0, worker_thread, NULL);
3、 pthread_detach(worker)。
void *worker_thread( void *arg )
1、 pthread_cleanup_push;
2、 pthread_mutex_lock;
3、 memcpy_picture;
4、 pthread_cond_broadcast;
5、 pthread_mutex_unlock;
6、 usleep;
7、 pthread_cleanup_pop。
httpd.c
void *server_thread( void *arg )
1、创建流式套接字;
2、setsockopt
3、本地sockaddr_in配置;
4、地址和套接字捆绑bind;
5、套接字侦听listen;
6、阻塞等待客户端的链接accept;
7、创建线程处理客户端请求;
void *client_thread( void *arg )
1、将形参传递给局部变量;
2、初始化iobuf、req结构体;
3、_readline(int fd, iobuffer *iobuf, void *buffer, size_t len, int timeout)
从socket描述符fd中读取数据到iobuf里,再到buffer所指向的内存空间。
_read(fd, iobuf, &c, 1, timeout),包含select函数,从文件描述符集中读取数据。
4、用strstr检查客户端传来的命令中,需要的数据4种形式请求:SNAPSHOT、STREAM、COMMAND、FILE。
5、parse the rest of the HTTP-request。
6、check for username and password if parameter。
7、对于四种请求予以答复。