diff options
author | irungentoo <irungentoo@gmail.com> | 2013-11-10 14:32:46 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2013-11-10 14:32:46 -0500 |
commit | 57763f2737b6920d09e4f3fec5792a2c59ad2b21 (patch) | |
tree | 39950688279346bf80940af61bb1dc91f140755b /docs | |
parent | 91c9dc2464b76217b2ac907861c4347c08cc7d80 (diff) | |
parent | 572fb60392f2bdbea0b738ab9cc4eca2aefe6585 (diff) |
Merge branch 'master' into harden
Conflicts:
toxcore/DHT.c
Diffstat (limited to 'docs')
-rw-r--r-- | docs/Hardening.txt | 14 | ||||
-rw-r--r-- | docs/av_api.md | 78 |
2 files changed, 71 insertions, 21 deletions
diff --git a/docs/Hardening.txt b/docs/Hardening.txt index 838b3566..d95b2cda 100644 --- a/docs/Hardening.txt +++ b/docs/Hardening.txt | |||
@@ -45,4 +45,16 @@ to us then it is good. | |||
45 | 45 | ||
46 | Problems with this: People don't always have at least one online friend. | 46 | Problems with this: People don't always have at least one online friend. |
47 | 47 | ||
48 | 2. ... | 48 | 2. Pick random nodes (add ourselves some random (fake) friends to increase the |
49 | pool of available nodes) and make then send requests to other nodes, the | ||
50 | response is then relayed back to us and compared to how the node should have | ||
51 | behaved. If the node is found to be behaving correctly, it is set as trusted. | ||
52 | Only trusted nodes are sent in send node packets, that is unless the exact node | ||
53 | being queried for in the getnode packet is present, it will be sent in the | ||
54 | sendnode packet even if it is not trusted. | ||
55 | |||
56 | The hypothesis is that if to be part of the network nodes have to behave | ||
57 | correctly it should prevent disruption from nodes that behave incorrectly. | ||
58 | |||
59 | (This idea is currently being implemented in the harden branch.) | ||
60 | ... | ||
diff --git a/docs/av_api.md b/docs/av_api.md index 08e05a6d..17930144 100644 --- a/docs/av_api.md +++ b/docs/av_api.md | |||
@@ -1,10 +1,13 @@ | |||
1 | A/V API reference | 1 | #A/V API reference |
2 | 2 | ||
3 | Take toxmsi/phone.c as a reference | 3 | ##Take toxmsi/phone.c as a reference |
4 | 4 | ||
5 | Initialization: | 5 | ###Initialization: |
6 | 6 | ||
7 | ``` | ||
7 | phone_t* initPhone(uint16_t _listen_port, uint16_t _send_port); | 8 | phone_t* initPhone(uint16_t _listen_port, uint16_t _send_port); |
9 | ``` | ||
10 | |||
8 | function initializes sample phone. _listen_port and _send_port are variables only meant | 11 | 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 | 12 | for local testing. You will not have to do anything regarding to that since |
10 | everything will be started within a mesenger. | 13 | everything will be started within a mesenger. |
@@ -13,17 +16,22 @@ everything will be started within a mesenger. | |||
13 | Phone requires one msi session and two rtp sessions ( one for audio and one for | 16 | Phone requires one msi session and two rtp sessions ( one for audio and one for |
14 | video ). | 17 | video ). |
15 | 18 | ||
19 | ``` | ||
16 | msi_session_t* msi_init_session( void* _core_handler, const uint8_t* _user_agent ); | 20 | msi_session_t* msi_init_session( void* _core_handler, const uint8_t* _user_agent ); |
21 | ``` | ||
17 | 22 | ||
18 | initializes msi session. | 23 | initializes msi session. |
19 | Params: | 24 | Params: |
25 | |||
26 | ``` | ||
20 | void* _core_handler - pointer to an object handling networking, | 27 | void* _core_handler - pointer to an object handling networking, |
21 | const uint8_t* _user_agent - string describing phone client version. | 28 | const uint8_t* _user_agent - string describing phone client version. |
29 | ``` | ||
22 | 30 | ||
23 | Return value: | 31 | Return value: |
24 | msi_session_t* - pointer to a newly created msi session handler. | 32 | msi_session_t* - pointer to a newly created msi session handler. |
25 | 33 | ||
26 | msi_session_t reference: | 34 | ###msi_session_t reference: |
27 | 35 | ||
28 | How to handle msi session: | 36 | How to handle msi session: |
29 | Controling is done via callbacks and action handlers. | 37 | Controling is done via callbacks and action handlers. |
@@ -32,6 +40,7 @@ NOT TO PLACE SOMETHING LIKE LOOPS THAT TAKES A LOT OF TIME TO EXECUTE; every cal | |||
32 | directly from event loop. You can find examples in phone.c. | 40 | directly from event loop. You can find examples in phone.c. |
33 | 41 | ||
34 | Register callbacks: | 42 | Register callbacks: |
43 | ``` | ||
35 | void msi_register_callback_call_started ( MCALLBACK ); | 44 | void msi_register_callback_call_started ( MCALLBACK ); |
36 | void msi_register_callback_call_canceled ( MCALLBACK ); | 45 | void msi_register_callback_call_canceled ( MCALLBACK ); |
37 | void msi_register_callback_call_rejected ( MCALLBACK ); | 46 | void msi_register_callback_call_rejected ( MCALLBACK ); |
@@ -44,52 +53,72 @@ void msi_register_callback_recv_ending ( MCALLBACK ); | |||
44 | void msi_register_callback_recv_error ( MCALLBACK ); | 53 | void msi_register_callback_recv_error ( MCALLBACK ); |
45 | 54 | ||
46 | void msi_register_callback_requ_timeout ( MCALLBACK ); | 55 | void msi_register_callback_requ_timeout ( MCALLBACK ); |
56 | ``` | ||
47 | 57 | ||
48 | MCALLBACK is defined as: void (*callback) (void* _arg) | 58 | 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 | 59 | 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. | 60 | directly from callback. |
51 | 61 | ||
52 | 62 | ||
53 | Actions: | 63 | Actions: |
64 | |||
65 | ``` | ||
54 | int msi_invite ( msi_session_t* _session, call_type _call_type, uint32_t _timeoutms ); | 66 | int msi_invite ( msi_session_t* _session, call_type _call_type, uint32_t _timeoutms ); |
67 | ``` | ||
68 | |||
55 | Sends call invite. Before calling/sending invite msi_session_t::_friend_id is needed to be set or else | 69 | 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 | 70 | 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. | 71 | will poll wait until request is terminated. |
58 | 72 | ||
73 | ``` | ||
59 | int msi_hangup ( msi_session_t* _session ); | 74 | int msi_hangup ( msi_session_t* _session ); |
75 | ``` | ||
60 | Hangs up active call | 76 | Hangs up active call |
61 | 77 | ||
78 | ``` | ||
62 | int msi_answer ( msi_session_t* _session, call_type _call_type ); | 79 | int msi_answer ( msi_session_t* _session, call_type _call_type ); |
80 | ``` | ||
63 | Answer incomming call. _call_type set's callee call type. | 81 | Answer incomming call. _call_type set's callee call type. |
64 | 82 | ||
83 | ``` | ||
65 | int msi_cancel ( msi_session_t* _session ); | 84 | int msi_cancel ( msi_session_t* _session ); |
85 | ``` | ||
66 | Cancel current request. | 86 | Cancel current request. |
67 | 87 | ||
88 | ``` | ||
68 | int msi_reject ( msi_session_t* _session ); | 89 | int msi_reject ( msi_session_t* _session ); |
90 | ``` | ||
69 | Reject incomming call. | 91 | Reject incomming call. |
70 | 92 | ||
71 | 93 | ||
94 | ###Now for rtp: | ||
72 | 95 | ||
73 | |||
74 | Now for rtp: | ||
75 | You will need 2 sessions; one for audio one for video. | 96 | You will need 2 sessions; one for audio one for video. |
76 | You start them with: | 97 | You start them with: |
77 | 98 | ``` | |
78 | rtp_session_t* rtp_init_session ( int _max_users, int _multi_session ); | 99 | rtp_session_t* rtp_init_session ( int _max_users, int _multi_session ); |
100 | ``` | ||
79 | 101 | ||
80 | Params: | 102 | Params: |
103 | ``` | ||
81 | int _max_users - max users. -1 if undefined | 104 | int _max_users - max users. -1 if undefined |
82 | int _multi_session - any positive number means uses multi session; -1 if not. | 105 | int _multi_session - any positive number means uses multi session; -1 if not. |
106 | ``` | ||
83 | 107 | ||
84 | Return value: | 108 | Return value: |
109 | ``` | ||
85 | rtp_session_t* - pointer to a newly created rtp session handler. | 110 | rtp_session_t* - pointer to a newly created rtp session handler. |
111 | ``` | ||
86 | 112 | ||
87 | How to handle rtp session: | 113 | ###How to handle rtp session: |
88 | Take a look at | 114 | Take a look at |
115 | ``` | ||
89 | void* phone_handle_media_transport_poll ( void* _hmtc_args_p ) in phone.c | 116 | void* phone_handle_media_transport_poll ( void* _hmtc_args_p ) in phone.c |
117 | ``` | ||
90 | on example. Basically what you do is just receive a message via: | 118 | on example. Basically what you do is just receive a message via: |
91 | 119 | ``` | |
92 | struct rtp_msg_s* rtp_recv_msg ( rtp_session_t* _session ); | 120 | struct rtp_msg_s* rtp_recv_msg ( rtp_session_t* _session ); |
121 | ``` | ||
93 | 122 | ||
94 | and then you use payload within the rtp_msg_s struct. Don't forget to deallocate it with: | 123 | 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 ); | 124 | void rtp_free_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg ); |
@@ -98,17 +127,20 @@ Receiving should be thread safe so don't worry about that. | |||
98 | When you capture and encode a payload you want to send it ( obviously ). | 127 | When you capture and encode a payload you want to send it ( obviously ). |
99 | 128 | ||
100 | first create a new message with: | 129 | first create a new message with: |
130 | ``` | ||
101 | struct rtp_msg_s* rtp_msg_new ( rtp_session_t* _session, const uint8_t* _data, uint32_t _length ); | 131 | struct rtp_msg_s* rtp_msg_new ( rtp_session_t* _session, const uint8_t* _data, uint32_t _length ); |
132 | ``` | ||
102 | 133 | ||
103 | and then send it with: | 134 | and then send it with: |
135 | ``` | ||
104 | int rtp_send_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg, void* _core_handler ); | 136 | int rtp_send_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg, void* _core_handler ); |
137 | ``` | ||
105 | 138 | ||
106 | _core_handler is the same network handler as in msi_session_s struct. | 139 | _core_handler is the same network handler as in msi_session_s struct. |
107 | 140 | ||
108 | 141 | ||
109 | 142 | ##A/V initialization: | |
110 | A/V initialization: | 143 | ``` |
111 | |||
112 | int init_receive_audio(codec_state *cs); | 144 | int init_receive_audio(codec_state *cs); |
113 | int init_receive_video(codec_state *cs); | 145 | 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. | 146 | Initialises the A/V decoders. On failure it will print the reason and return 0. On success it will return 1. |
@@ -122,30 +154,36 @@ 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. | 154 | 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. | 155 | 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. | 156 | The variable bps is the required bitrate in bits per second. |
157 | ``` | ||
125 | 158 | ||
126 | 159 | ||
127 | 160 | ###A/V encoding/decoding: | |
128 | A/V encoding/decoding: | 161 | ``` |
129 | |||
130 | void *encode_video_thread(void *arg); | 162 | void *encode_video_thread(void *arg); |
163 | ``` | ||
131 | Spawns the video encoding thread. The argument should hold a pointer to a codec_state. | 164 | 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). | 165 | 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. | 166 | Each video frame gets encoded into a packet, which is sent via RTP. Every 60 frames a new bidirectional interframe is encoded. |
134 | 167 | ``` | |
135 | void *encode_audio_thread(void *arg); | 168 | void *encode_audio_thread(void *arg); |
169 | ``` | ||
136 | Spawns the audio encoding thread. The argument should hold a pointer to a codec_state. | 170 | 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). | 171 | 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. | 172 | 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. | 173 | 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 | 174 | ``` | |
141 | int video_decoder_refresh(codec_state *cs, int width, int height); | 175 | int video_decoder_refresh(codec_state *cs, int width, int height); |
176 | ``` | ||
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. | 177 | 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 | 178 | ||
179 | ``` | ||
144 | void *decode_video_thread(void *arg); | 180 | void *decode_video_thread(void *arg); |
181 | ``` | ||
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. | 182 | 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. | 183 | 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 | 184 | ``` | |
148 | void *decode_audio_thread(void *arg); | 185 | void *decode_audio_thread(void *arg); |
186 | ``` | ||
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. | 187 | 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. | 188 | 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. | 189 | Audio is played on the default OpenAL output device. |
@@ -153,4 +191,4 @@ Audio is played on the default OpenAL output device. | |||
153 | 191 | ||
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: | 192 | 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 | 193 | For RTP and MSI: mannol |
156 | For audio and video: Martijnvdc \ No newline at end of file | 194 | For audio and video: Martijnvdc |