diff options
Diffstat (limited to 'docs/av_api.md')
-rw-r--r-- | docs/av_api.md | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/docs/av_api.md b/docs/av_api.md new file mode 100644 index 00000000..08e05a6d --- /dev/null +++ b/docs/av_api.md | |||
@@ -0,0 +1,156 @@ | |||
1 | A/V API reference | ||
2 | |||
3 | Take toxmsi/phone.c as a reference | ||
4 | |||
5 | Initialization: | ||
6 | |||
7 | phone_t* initPhone(uint16_t _listen_port, uint16_t _send_port); | ||
8 | function initializes sample phone. _listen_port and _send_port are variables only meant | ||
9 | for local testing. You will not have to do anything regarding to that since | ||
10 | everything will be started within a mesenger. | ||
11 | |||
12 | |||
13 | Phone requires one msi session and two rtp sessions ( one for audio and one for | ||
14 | video ). | ||
15 | |||
16 | msi_session_t* msi_init_session( void* _core_handler, const uint8_t* _user_agent ); | ||
17 | |||
18 | initializes msi session. | ||
19 | Params: | ||
20 | void* _core_handler - pointer to an object handling networking, | ||
21 | const uint8_t* _user_agent - string describing phone client version. | ||
22 | |||
23 | Return value: | ||
24 | msi_session_t* - pointer to a newly created msi session handler. | ||
25 | |||
26 | msi_session_t reference: | ||
27 | |||
28 | How to handle msi session: | ||
29 | Controling is done via callbacks and action handlers. | ||
30 | First register callbacks for every state/action received and make sure | ||
31 | NOT TO PLACE SOMETHING LIKE LOOPS THAT TAKES A LOT OF TIME TO EXECUTE; every callback is being called | ||
32 | directly from event loop. You can find examples in phone.c. | ||
33 | |||
34 | Register callbacks: | ||
35 | void msi_register_callback_call_started ( MCALLBACK ); | ||
36 | void msi_register_callback_call_canceled ( MCALLBACK ); | ||
37 | void msi_register_callback_call_rejected ( MCALLBACK ); | ||
38 | void msi_register_callback_call_ended ( MCALLBACK ); | ||
39 | |||
40 | void msi_register_callback_recv_invite ( MCALLBACK ); | ||
41 | void msi_register_callback_recv_ringing ( MCALLBACK ); | ||
42 | void msi_register_callback_recv_starting ( MCALLBACK ); | ||
43 | void msi_register_callback_recv_ending ( MCALLBACK ); | ||
44 | void msi_register_callback_recv_error ( MCALLBACK ); | ||
45 | |||
46 | void msi_register_callback_requ_timeout ( MCALLBACK ); | ||
47 | |||
48 | MCALLBACK is defined as: void (*callback) (void* _arg) | ||
49 | msi_session_t* handler is being thrown as _arg so you can use that and _agent_handler to get to your own phone handler | ||
50 | directly from callback. | ||
51 | |||
52 | |||
53 | Actions: | ||
54 | int msi_invite ( msi_session_t* _session, call_type _call_type, uint32_t _timeoutms ); | ||
55 | Sends call invite. Before calling/sending invite msi_session_t::_friend_id is needed to be set or else | ||
56 | it will not work. _call_type is type of the call ( Audio/Video ) and _timeoutms is how long | ||
57 | will poll wait until request is terminated. | ||
58 | |||
59 | int msi_hangup ( msi_session_t* _session ); | ||
60 | Hangs up active call | ||
61 | |||
62 | int msi_answer ( msi_session_t* _session, call_type _call_type ); | ||
63 | Answer incomming call. _call_type set's callee call type. | ||
64 | |||
65 | int msi_cancel ( msi_session_t* _session ); | ||
66 | Cancel current request. | ||
67 | |||
68 | int msi_reject ( msi_session_t* _session ); | ||
69 | Reject incomming call. | ||
70 | |||
71 | |||
72 | |||
73 | |||
74 | Now for rtp: | ||
75 | You will need 2 sessions; one for audio one for video. | ||
76 | You start them with: | ||
77 | |||
78 | rtp_session_t* rtp_init_session ( int _max_users, int _multi_session ); | ||
79 | |||
80 | Params: | ||
81 | int _max_users - max users. -1 if undefined | ||
82 | int _multi_session - any positive number means uses multi session; -1 if not. | ||
83 | |||
84 | Return value: | ||
85 | rtp_session_t* - pointer to a newly created rtp session handler. | ||
86 | |||
87 | How to handle rtp session: | ||
88 | Take a look at | ||
89 | void* phone_handle_media_transport_poll ( void* _hmtc_args_p ) in phone.c | ||
90 | on example. Basically what you do is just receive a message via: | ||
91 | |||
92 | struct rtp_msg_s* rtp_recv_msg ( rtp_session_t* _session ); | ||
93 | |||
94 | and then you use payload within the rtp_msg_s struct. Don't forget to deallocate it with: | ||
95 | void rtp_free_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg ); | ||
96 | Receiving should be thread safe so don't worry about that. | ||
97 | |||
98 | When you capture and encode a payload you want to send it ( obviously ). | ||
99 | |||
100 | first create a new message with: | ||
101 | struct rtp_msg_s* rtp_msg_new ( rtp_session_t* _session, const uint8_t* _data, uint32_t _length ); | ||
102 | |||
103 | and then send it with: | ||
104 | int rtp_send_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg, void* _core_handler ); | ||
105 | |||
106 | _core_handler is the same network handler as in msi_session_s struct. | ||
107 | |||
108 | |||
109 | |||
110 | A/V initialization: | ||
111 | |||
112 | int init_receive_audio(codec_state *cs); | ||
113 | int init_receive_video(codec_state *cs); | ||
114 | Initialises the A/V decoders. On failure it will print the reason and return 0. On success it will return 1. | ||
115 | |||
116 | int init_send_audio(codec_state *cs); | ||
117 | int init_send_video(codec_state *cs); | ||
118 | Initialises the A/V encoders. On failure it will print the reason and return 0. On success it will return 1. | ||
119 | init_send_audio will also let the user select an input device. init_send_video will determine the webcam's output codec and initialise the appropriate decoder. | ||
120 | |||
121 | int video_encoder_refresh(codec_state *cs, int bps); | ||
122 | Reinitialises the video encoder with a new bitrate. ffmpeg does not expose the needed VP8 feature to change the bitrate on the fly, so this serves as a workaround. | ||
123 | In the future, VP8 should be used directly and ffmpeg should be dropped from the dependencies. | ||
124 | The variable bps is the required bitrate in bits per second. | ||
125 | |||
126 | |||
127 | |||
128 | A/V encoding/decoding: | ||
129 | |||
130 | void *encode_video_thread(void *arg); | ||
131 | Spawns the video encoding thread. The argument should hold a pointer to a codec_state. | ||
132 | This function should only be called if video encoding is supported (when init_send_video returns 1). | ||
133 | Each video frame gets encoded into a packet, which is sent via RTP. Every 60 frames a new bidirectional interframe is encoded. | ||
134 | |||
135 | void *encode_audio_thread(void *arg); | ||
136 | Spawns the audio encoding thread. The argument should hold a pointer to a codec_state. | ||
137 | This function should only be called if audio encoding is supported (when init_send_audio returns 1). | ||
138 | Audio frames are read from the selected audio capture device during intitialisation. This audio capturing can be rerouted to a different device on the fly. | ||
139 | Each audio frame is encoded into a packet, and sent via RTP. All audio frames have the same amount of samples, which is defined in AV_codec.h. | ||
140 | |||
141 | int video_decoder_refresh(codec_state *cs, int width, int height); | ||
142 | Sets the SDL window dimensions and creates a pixel buffer with the requested size. It also creates a scaling context, which will be used to convert the input image format to YUV420P. | ||
143 | |||
144 | void *decode_video_thread(void *arg); | ||
145 | Spawns a video decoding thread. The argument should hold a pointer to a codec_state. The codec_state is assumed to contain a successfully initialised video decoder. | ||
146 | This function reads video packets and feeds them to the video decoder. If the video frame's resolution has changed, video_decoder_refresh() is called. Afterwards, the frame is displayed on the SDL window. | ||
147 | |||
148 | void *decode_audio_thread(void *arg); | ||
149 | Spawns an audio decoding thread. The argument should hold a pointer to a codec_state. The codec_state is assumed to contain a successfully initialised audio decoder. | ||
150 | All received audio packets are pushed into a jitter buffer and are reordered. If there is a missing packet, or a packet has arrived too late, it is treated as a lost packet and the audio decoder is informed of the packet loss. The audio decoder will then try to reconstruct the lost packet, based on information from previous packets. | ||
151 | Audio is played on the default OpenAL output device. | ||
152 | |||
153 | |||
154 | If you have any more qustions/bug reports/feature request contact the following users on the irc channel #tox-dev on irc.freenode.net: | ||
155 | For RTP and MSI: mannol | ||
156 | For audio and video: Martijnvdc \ No newline at end of file | ||