WIPVideo » History » Version 14
Saúl Ibarra Corretgé, 09/10/2013 10:32 AM
1 | 1 | Saúl Ibarra Corretgé | h1. WIPVideo |
---|---|---|---|
2 | |||
3 | 5 | Saúl Ibarra Corretgé | Notes while video is a work in progress. Repository: http://devel.ag-projects.com/cgi-bin/darcsweb.cgi?r=saul/python-sipsimple-video;a=summary |
4 | 1 | Saúl Ibarra Corretgé | |
5 | h2. Dependencies |
||
6 | |||
7 | The following dependencies are required to build PJSIP with video support (including H264) |
||
8 | |||
9 | * SDL 2 |
||
10 | * ffmpeg (libavformat, libswscale, libavcodec, libavutil) |
||
11 | * libx264 |
||
12 | |||
13 | Versions I have tried: |
||
14 | |||
15 | * SDL (2.0.0-7655) |
||
16 | * ffmpeg (2.0 release) |
||
17 | * libx264 (snapshot-20130806-2245-stable) |
||
18 | |||
19 | h2. Patches |
||
20 | |||
21 | 11 | Saúl Ibarra Corretgé | -If the above versions are used, PJSIP needs to be patched with the attached patch (avcodec.diff) or it won't compile. This does not occur when compiling it against the latest library versions on Debian unstable.- No longer needed. |
22 | 3 | Saúl Ibarra Corretgé | |
23 | h2. Compiling dependencies |
||
24 | |||
25 | All dependencies will be compiled to a directory in the user's HOME directory: |
||
26 | |||
27 | <pre> |
||
28 | export MY_VIDEO_LIBS=$HOME/work/ag-projects/video/local |
||
29 | </pre> |
||
30 | |||
31 | h3. libx264 |
||
32 | |||
33 | <pre> |
||
34 | ./configure --enable-shared --disable-avs --disable-swscale --disable-lavf --disable-ffms --disable-gpac --prefix=$MY_VIDEO_LIBS |
||
35 | make |
||
36 | make install |
||
37 | 8 | Saúl Ibarra Corretgé | |
38 | # If a 32bit build is wanted, then run this configure instead: |
||
39 | ./configure --host=i386-apple-darwin --enable-shared --disable-avs --disable-swscale --disable-lavf --disable-ffms --disable-gpac --prefix=$MY_VIDEO_LIBS |
||
40 | 3 | Saúl Ibarra Corretgé | </pre> |
41 | |||
42 | h3. ffmpeg |
||
43 | |||
44 | <pre> |
||
45 | # Some exports |
||
46 | export PKG_CONFIG_PATH=$MY_VIDEO_LIBS/lib/pkgconfig |
||
47 | 1 | Saúl Ibarra Corretgé | |
48 | 7 | Saúl Ibarra Corretgé | ./configure --enable-shared --disable-static --enable-memalign-hack --enable-gpl --enable-libx264 --prefix=$MY_VIDEO_LIBS --extra-cflags="`pkg-config --cflags x264`" --extra-ldflags="`pkg-config --libs x264`" |
49 | 3 | Saúl Ibarra Corretgé | make |
50 | make install |
||
51 | 9 | Saúl Ibarra Corretgé | |
52 | # If a 32bit build is wanted do: |
||
53 | ./configure --enable-shared --disable-static --enable-memalign-hack --enable-gpl --enable-libx264 --prefix=$MY_VIDEO_LIBS --extra-cflags="`pkg-config --cflags x264`" --extra-ldflags="`pkg-config --libs x264`" --cc="gcc -m32" --disable-asm |
||
54 | # TODO: I WANT MY ASM |
||
55 | 3 | Saúl Ibarra Corretgé | </pre> |
56 | |||
57 | h3. SDL |
||
58 | |||
59 | <pre> |
||
60 | ./configure --disable-audio --prefix=$MY_VIDEO_LIBS |
||
61 | make |
||
62 | make install |
||
63 | 10 | Saúl Ibarra Corretgé | |
64 | # If a 32bit build is wanted: |
||
65 | CFLAGS="-arch i386" CXXFLAGS="-arch i386" LDFLAGS="-arch i386" ./configure --disable-audio --prefix=$MY_VIDEO_LIBS |
||
66 | 3 | Saúl Ibarra Corretgé | </pre> |
67 | 4 | Saúl Ibarra Corretgé | |
68 | h2. Compiling PJSIP (pjsua, for testing) |
||
69 | |||
70 | <pre> |
||
71 | svn co http://svn.pjsip.org/repos/pjproject/trunk pjsip |
||
72 | cd pjsip |
||
73 | echo "#define PJMEDIA_HAS_VIDEO 1" > pjlib/include/pj/config_site.h |
||
74 | ./configure --with-sdl=$MY_VIDEO_LIBS --with-ffmpeg=$MY_VIDEO_LIBS |
||
75 | make dep |
||
76 | make |
||
77 | # pjsua will be located in pjsip-apps/bin/ |
||
78 | </pre> |
||
79 | 12 | Saúl Ibarra Corretgé | |
80 | h2. Proposed API |
||
81 | |||
82 | 13 | Saúl Ibarra Corretgé | API for video components is based on 2 different types of video capable entities: |
83 | |||
84 | * VideoProducer: a source for video data, for example a video camera or a remote video stream |
||
85 | * VideoConsumer: a sink or destination for video data, for example a video rendering window |
||
86 | |||
87 | h3. Data flow |
||
88 | |||
89 | Data flow works in _pull_ fashion, that is, a producer doesn't start to produce data until there is a consumer which will consume it. |
||
90 | |||
91 | h3. VideoProducer |
||
92 | |||
93 | Produces video data. |
||
94 | |||
95 | Internal API: |
||
96 | |||
97 | * _add_consumer: attach a consumer, called by the consumer |
||
98 | * _remove_consumer: detach a consumer from a producer, called by the consumer |
||
99 | * _start: start producing video data |
||
100 | * _stop: stop producing video data |
||
101 | |||
102 | Public API: |
||
103 | |||
104 | * close: remove all consumers and stop producing video data |
||
105 | 14 | Saúl Ibarra Corretgé | * producer_port: pointer to the pjmedia_port object |
106 | |||
107 | h3. VideoConsumer |
||
108 | |||
109 | Consumes video data. |
||
110 | |||
111 | Internal API: |
||
112 | |||
113 | * _start: start consuming video data |
||
114 | * _stop: stop consuming video data |
||
115 | |||
116 | Public API: |
||
117 | |||
118 | * attach: tie this consumer to a producer, in order to render the video data generated by the producer |
||
119 | * detach: untie this consumer from a producer |
||
120 | * consumer_port: pointer to the pjmedia_port object |