diff options
-rw-r--r-- | auto_tests/toxav_basic_test.c | 77 | ||||
-rw-r--r-- | auto_tests/toxav_many_test.c | 36 | ||||
-rw-r--r-- | toxav/toxav.c | 48 | ||||
-rw-r--r-- | toxav/toxav.h | 62 | ||||
-rw-r--r-- | toxav/video.c | 5 |
5 files changed, 124 insertions, 104 deletions
diff --git a/auto_tests/toxav_basic_test.c b/auto_tests/toxav_basic_test.c index 423cd03d..bdf6c920 100644 --- a/auto_tests/toxav_basic_test.c +++ b/auto_tests/toxav_basic_test.c | |||
@@ -9,7 +9,6 @@ | |||
9 | #include <check.h> | 9 | #include <check.h> |
10 | #include <stdlib.h> | 10 | #include <stdlib.h> |
11 | #include <time.h> | 11 | #include <time.h> |
12 | #include <assert.h> | ||
13 | 12 | ||
14 | #include <vpx/vpx_image.h> | 13 | #include <vpx/vpx_image.h> |
15 | 14 | ||
@@ -103,7 +102,7 @@ void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t | |||
103 | (void) userdata; | 102 | (void) userdata; |
104 | 103 | ||
105 | if (length == 7 && memcmp("gentoo", data, 7) == 0) { | 104 | if (length == 7 && memcmp("gentoo", data, 7) == 0) { |
106 | assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); | 105 | ck_assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); |
107 | } | 106 | } |
108 | } | 107 | } |
109 | 108 | ||
@@ -133,13 +132,13 @@ START_TEST(test_AV_flows) | |||
133 | TOX_ERR_NEW error; | 132 | TOX_ERR_NEW error; |
134 | 133 | ||
135 | bootstrap = tox_new(NULL, NULL, 0, &error); | 134 | bootstrap = tox_new(NULL, NULL, 0, &error); |
136 | assert(error == TOX_ERR_NEW_OK); | 135 | ck_assert(error == TOX_ERR_NEW_OK); |
137 | 136 | ||
138 | Alice = tox_new(NULL, NULL, 0, &error); | 137 | Alice = tox_new(NULL, NULL, 0, &error); |
139 | assert(error == TOX_ERR_NEW_OK); | 138 | ck_assert(error == TOX_ERR_NEW_OK); |
140 | 139 | ||
141 | Bob = tox_new(NULL, NULL, 0, &error); | 140 | Bob = tox_new(NULL, NULL, 0, &error); |
142 | assert(error == TOX_ERR_NEW_OK); | 141 | ck_assert(error == TOX_ERR_NEW_OK); |
143 | } | 142 | } |
144 | 143 | ||
145 | printf("Created 3 instances of Tox\n"); | 144 | printf("Created 3 instances of Tox\n"); |
@@ -153,7 +152,7 @@ START_TEST(test_AV_flows) | |||
153 | tox_self_get_address(Alice, address); | 152 | tox_self_get_address(Alice, address); |
154 | 153 | ||
155 | 154 | ||
156 | assert(tox_friend_add(Bob, address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); | 155 | ck_assert(tox_friend_add(Bob, address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); |
157 | 156 | ||
158 | uint8_t off = 1; | 157 | uint8_t off = 1; |
159 | 158 | ||
@@ -178,10 +177,10 @@ START_TEST(test_AV_flows) | |||
178 | { | 177 | { |
179 | TOXAV_ERR_NEW error; | 178 | TOXAV_ERR_NEW error; |
180 | AliceAV = toxav_new(Alice, &error); | 179 | AliceAV = toxav_new(Alice, &error); |
181 | assert(error == TOXAV_ERR_NEW_OK); | 180 | ck_assert(error == TOXAV_ERR_NEW_OK); |
182 | 181 | ||
183 | BobAV = toxav_new(Bob, &error); | 182 | BobAV = toxav_new(Bob, &error); |
184 | assert(error == TOXAV_ERR_NEW_OK); | 183 | ck_assert(error == TOXAV_ERR_NEW_OK); |
185 | } | 184 | } |
186 | 185 | ||
187 | toxav_callback_call(AliceAV, t_toxav_call_cb, &AliceCC); | 186 | toxav_callback_call(AliceAV, t_toxav_call_cb, &AliceCC); |
@@ -208,7 +207,7 @@ START_TEST(test_AV_flows) | |||
208 | \ | 207 | \ |
209 | if (rc != TOXAV_ERR_CALL_OK) { \ | 208 | if (rc != TOXAV_ERR_CALL_OK) { \ |
210 | printf("toxav_call failed: %d\n", rc); \ | 209 | printf("toxav_call failed: %d\n", rc); \ |
211 | exit(1); \ | 210 | ck_assert(0); \ |
212 | } \ | 211 | } \ |
213 | \ | 212 | \ |
214 | \ | 213 | \ |
@@ -223,7 +222,7 @@ START_TEST(test_AV_flows) | |||
223 | \ | 222 | \ |
224 | if (rc != TOXAV_ERR_ANSWER_OK) { \ | 223 | if (rc != TOXAV_ERR_ANSWER_OK) { \ |
225 | printf("toxav_answer failed: %d\n", rc); \ | 224 | printf("toxav_answer failed: %d\n", rc); \ |
226 | exit(1); \ | 225 | ck_assert(0); \ |
227 | } \ | 226 | } \ |
228 | BobCC.incoming = false; \ | 227 | BobCC.incoming = false; \ |
229 | } else { \ | 228 | } else { \ |
@@ -236,7 +235,7 @@ START_TEST(test_AV_flows) | |||
236 | \ | 235 | \ |
237 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { \ | 236 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { \ |
238 | printf("toxav_call_control failed: %d\n", rc); \ | 237 | printf("toxav_call_control failed: %d\n", rc); \ |
239 | exit(1); \ | 238 | ck_assert(0); \ |
240 | } \ | 239 | } \ |
241 | } \ | 240 | } \ |
242 | } \ | 241 | } \ |
@@ -275,7 +274,7 @@ START_TEST(test_AV_flows) | |||
275 | 274 | ||
276 | if (rc != TOXAV_ERR_CALL_OK) { | 275 | if (rc != TOXAV_ERR_CALL_OK) { |
277 | printf("toxav_call failed: %d\n", rc); | 276 | printf("toxav_call failed: %d\n", rc); |
278 | exit(1); | 277 | ck_assert(0); |
279 | } | 278 | } |
280 | } | 279 | } |
281 | 280 | ||
@@ -289,7 +288,7 @@ START_TEST(test_AV_flows) | |||
289 | 288 | ||
290 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { | 289 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { |
291 | printf("toxav_call_control failed: %d\n", rc); | 290 | printf("toxav_call_control failed: %d\n", rc); |
292 | exit(1); | 291 | ck_assert(0); |
293 | } | 292 | } |
294 | } | 293 | } |
295 | 294 | ||
@@ -311,7 +310,7 @@ START_TEST(test_AV_flows) | |||
311 | 310 | ||
312 | if (rc != TOXAV_ERR_CALL_OK) { | 311 | if (rc != TOXAV_ERR_CALL_OK) { |
313 | printf("toxav_call failed: %d\n", rc); | 312 | printf("toxav_call failed: %d\n", rc); |
314 | exit(1); | 313 | ck_assert(0); |
315 | } | 314 | } |
316 | } | 315 | } |
317 | 316 | ||
@@ -325,7 +324,7 @@ START_TEST(test_AV_flows) | |||
325 | 324 | ||
326 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { | 325 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { |
327 | printf("toxav_call_control failed: %d\n", rc); | 326 | printf("toxav_call_control failed: %d\n", rc); |
328 | exit(1); | 327 | ck_assert(0); |
329 | } | 328 | } |
330 | } | 329 | } |
331 | 330 | ||
@@ -349,7 +348,7 @@ START_TEST(test_AV_flows) | |||
349 | 348 | ||
350 | if (rc != TOXAV_ERR_CALL_OK) { | 349 | if (rc != TOXAV_ERR_CALL_OK) { |
351 | printf("toxav_call failed: %d\n", rc); | 350 | printf("toxav_call failed: %d\n", rc); |
352 | exit(1); | 351 | ck_assert(0); |
353 | } | 352 | } |
354 | } | 353 | } |
355 | 354 | ||
@@ -357,10 +356,10 @@ START_TEST(test_AV_flows) | |||
357 | iterate_tox(bootstrap, Alice, Bob); | 356 | iterate_tox(bootstrap, Alice, Bob); |
358 | 357 | ||
359 | /* At first try all stuff while in invalid state */ | 358 | /* At first try all stuff while in invalid state */ |
360 | assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); | 359 | ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); |
361 | assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); | 360 | ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); |
362 | assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); | 361 | ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); |
363 | assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL)); | 362 | ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL)); |
364 | 363 | ||
365 | { | 364 | { |
366 | TOXAV_ERR_ANSWER rc; | 365 | TOXAV_ERR_ANSWER rc; |
@@ -368,7 +367,7 @@ START_TEST(test_AV_flows) | |||
368 | 367 | ||
369 | if (rc != TOXAV_ERR_ANSWER_OK) { | 368 | if (rc != TOXAV_ERR_ANSWER_OK) { |
370 | printf("toxav_answer failed: %d\n", rc); | 369 | printf("toxav_answer failed: %d\n", rc); |
371 | exit(1); | 370 | ck_assert(0); |
372 | } | 371 | } |
373 | } | 372 | } |
374 | 373 | ||
@@ -376,36 +375,36 @@ START_TEST(test_AV_flows) | |||
376 | 375 | ||
377 | /* Pause and Resume */ | 376 | /* Pause and Resume */ |
378 | printf("Pause and Resume\n"); | 377 | printf("Pause and Resume\n"); |
379 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); | 378 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); |
380 | iterate_tox(bootstrap, Alice, Bob); | 379 | iterate_tox(bootstrap, Alice, Bob); |
381 | assert(BobCC.state == TOXAV_CALL_STATE_PAUSED); | 380 | ck_assert(BobCC.state == TOXAV_CALL_STATE_PAUSED); |
382 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); | 381 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); |
383 | iterate_tox(bootstrap, Alice, Bob); | 382 | iterate_tox(bootstrap, Alice, Bob); |
384 | assert(BobCC.state & (TOXAV_CALL_STATE_SENDING_A | TOXAV_CALL_STATE_SENDING_V)); | 383 | ck_assert(BobCC.state & (TOXAV_CALL_STATE_SENDING_A | TOXAV_CALL_STATE_SENDING_V)); |
385 | 384 | ||
386 | /* Mute/Unmute single */ | 385 | /* Mute/Unmute single */ |
387 | printf("Mute/Unmute single\n"); | 386 | printf("Mute/Unmute single\n"); |
388 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); | 387 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); |
389 | iterate_tox(bootstrap, Alice, Bob); | 388 | iterate_tox(bootstrap, Alice, Bob); |
390 | assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); | 389 | ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); |
391 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); | 390 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); |
392 | iterate_tox(bootstrap, Alice, Bob); | 391 | iterate_tox(bootstrap, Alice, Bob); |
393 | assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); | 392 | ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); |
394 | 393 | ||
395 | /* Mute/Unmute both */ | 394 | /* Mute/Unmute both */ |
396 | printf("Mute/Unmute both\n"); | 395 | printf("Mute/Unmute both\n"); |
397 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); | 396 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); |
398 | iterate_tox(bootstrap, Alice, Bob); | 397 | iterate_tox(bootstrap, Alice, Bob); |
399 | assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); | 398 | ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); |
400 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL)); | 399 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL)); |
401 | iterate_tox(bootstrap, Alice, Bob); | 400 | iterate_tox(bootstrap, Alice, Bob); |
402 | assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_V); | 401 | ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_V); |
403 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); | 402 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); |
404 | iterate_tox(bootstrap, Alice, Bob); | 403 | iterate_tox(bootstrap, Alice, Bob); |
405 | assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); | 404 | ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); |
406 | assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL)); | 405 | ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL)); |
407 | iterate_tox(bootstrap, Alice, Bob); | 406 | iterate_tox(bootstrap, Alice, Bob); |
408 | assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_V); | 407 | ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_V); |
409 | 408 | ||
410 | { | 409 | { |
411 | TOXAV_ERR_CALL_CONTROL rc; | 410 | TOXAV_ERR_CALL_CONTROL rc; |
@@ -413,12 +412,12 @@ START_TEST(test_AV_flows) | |||
413 | 412 | ||
414 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { | 413 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { |
415 | printf("toxav_call_control failed: %d\n", rc); | 414 | printf("toxav_call_control failed: %d\n", rc); |
416 | exit(1); | 415 | ck_assert(0); |
417 | } | 416 | } |
418 | } | 417 | } |
419 | 418 | ||
420 | iterate_tox(bootstrap, Alice, Bob); | 419 | iterate_tox(bootstrap, Alice, Bob); |
421 | assert(BobCC.state == TOXAV_CALL_STATE_END); | 420 | ck_assert(BobCC.state == TOXAV_CALL_STATE_END); |
422 | 421 | ||
423 | printf("Success!\n"); | 422 | printf("Success!\n"); |
424 | } | 423 | } |
diff --git a/auto_tests/toxav_many_test.c b/auto_tests/toxav_many_test.c index 84f94e96..f913c9d3 100644 --- a/auto_tests/toxav_many_test.c +++ b/auto_tests/toxav_many_test.c | |||
@@ -9,10 +9,11 @@ | |||
9 | #include <check.h> | 9 | #include <check.h> |
10 | #include <stdlib.h> | 10 | #include <stdlib.h> |
11 | #include <time.h> | 11 | #include <time.h> |
12 | #include <assert.h> | ||
13 | 12 | ||
14 | #include <vpx/vpx_image.h> | 13 | #include <vpx/vpx_image.h> |
15 | 14 | ||
15 | #include "helpers.h" | ||
16 | |||
16 | #include "../toxcore/tox.h" | 17 | #include "../toxcore/tox.h" |
17 | #include "../toxcore/util.h" | 18 | #include "../toxcore/util.h" |
18 | #include "../toxcore/logger.h" | 19 | #include "../toxcore/logger.h" |
@@ -97,7 +98,7 @@ void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t | |||
97 | { | 98 | { |
98 | (void) userdata; | 99 | (void) userdata; |
99 | if (length == 7 && memcmp("gentoo", data, 7) == 0) { | 100 | if (length == 7 && memcmp("gentoo", data, 7) == 0) { |
100 | assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); | 101 | ck_assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); |
101 | } | 102 | } |
102 | } | 103 | } |
103 | 104 | ||
@@ -110,7 +111,7 @@ ToxAV* setup_av_instance(Tox* tox, CallControl *CC) | |||
110 | TOXAV_ERR_NEW error; | 111 | TOXAV_ERR_NEW error; |
111 | 112 | ||
112 | ToxAV* av = toxav_new(tox, &error); | 113 | ToxAV* av = toxav_new(tox, &error); |
113 | assert(error == TOXAV_ERR_NEW_OK); | 114 | ck_assert(error == TOXAV_ERR_NEW_OK); |
114 | 115 | ||
115 | toxav_callback_call(av, t_toxav_call_cb, CC); | 116 | toxav_callback_call(av, t_toxav_call_cb, CC); |
116 | toxav_callback_call_state(av, t_toxav_call_state_cb, CC); | 117 | toxav_callback_call_state(av, t_toxav_call_state_cb, CC); |
@@ -137,7 +138,7 @@ void* call_thread(void* pd) | |||
137 | 138 | ||
138 | if (rc != TOXAV_ERR_CALL_OK) { | 139 | if (rc != TOXAV_ERR_CALL_OK) { |
139 | printf("toxav_call failed: %d\n", rc); | 140 | printf("toxav_call failed: %d\n", rc); |
140 | exit(1); | 141 | ck_assert(0); |
141 | } | 142 | } |
142 | } | 143 | } |
143 | 144 | ||
@@ -150,7 +151,7 @@ void* call_thread(void* pd) | |||
150 | 151 | ||
151 | if (rc != TOXAV_ERR_ANSWER_OK) { | 152 | if (rc != TOXAV_ERR_ANSWER_OK) { |
152 | printf("toxav_answer failed: %d\n", rc); | 153 | printf("toxav_answer failed: %d\n", rc); |
153 | exit(1); | 154 | ck_assert(0); |
154 | } | 155 | } |
155 | } | 156 | } |
156 | 157 | ||
@@ -167,7 +168,7 @@ void* call_thread(void* pd) | |||
167 | memset(video_v, 0, sizeof(video_v)); | 168 | memset(video_v, 0, sizeof(video_v)); |
168 | 169 | ||
169 | time_t start_time = time(NULL); | 170 | time_t start_time = time(NULL); |
170 | while(time(NULL) - start_time < 9) { | 171 | while(time(NULL) - start_time < 4) { |
171 | toxav_iterate(AliceAV); | 172 | toxav_iterate(AliceAV); |
172 | toxav_iterate(BobAV); | 173 | toxav_iterate(BobAV); |
173 | 174 | ||
@@ -186,11 +187,13 @@ void* call_thread(void* pd) | |||
186 | 187 | ||
187 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { | 188 | if (rc != TOXAV_ERR_CALL_CONTROL_OK) { |
188 | printf("toxav_call_control failed: %d\n", rc); | 189 | printf("toxav_call_control failed: %d\n", rc); |
189 | exit(1); | 190 | ck_assert(0); |
190 | } | 191 | } |
191 | } | 192 | } |
192 | 193 | ||
193 | c_sleep(30); | 194 | c_sleep(30); |
195 | |||
196 | printf ("Closing thread\n"); | ||
194 | pthread_exit(NULL); | 197 | pthread_exit(NULL); |
195 | } | 198 | } |
196 | 199 | ||
@@ -206,19 +209,19 @@ START_TEST(test_AV_three_calls) | |||
206 | TOX_ERR_NEW error; | 209 | TOX_ERR_NEW error; |
207 | 210 | ||
208 | bootstrap = tox_new(NULL, NULL, 0, &error); | 211 | bootstrap = tox_new(NULL, NULL, 0, &error); |
209 | assert(error == TOX_ERR_NEW_OK); | 212 | ck_assert(error == TOX_ERR_NEW_OK); |
210 | 213 | ||
211 | Alice = tox_new(NULL, NULL, 0, &error); | 214 | Alice = tox_new(NULL, NULL, 0, &error); |
212 | assert(error == TOX_ERR_NEW_OK); | 215 | ck_assert(error == TOX_ERR_NEW_OK); |
213 | 216 | ||
214 | Bobs[0] = tox_new(NULL, NULL, 0, &error); | 217 | Bobs[0] = tox_new(NULL, NULL, 0, &error); |
215 | assert(error == TOX_ERR_NEW_OK); | 218 | ck_assert(error == TOX_ERR_NEW_OK); |
216 | 219 | ||
217 | Bobs[1] = tox_new(NULL, NULL, 0, &error); | 220 | Bobs[1] = tox_new(NULL, NULL, 0, &error); |
218 | assert(error == TOX_ERR_NEW_OK); | 221 | ck_assert(error == TOX_ERR_NEW_OK); |
219 | 222 | ||
220 | Bobs[2] = tox_new(NULL, NULL, 0, &error); | 223 | Bobs[2] = tox_new(NULL, NULL, 0, &error); |
221 | assert(error == TOX_ERR_NEW_OK); | 224 | ck_assert(error == TOX_ERR_NEW_OK); |
222 | } | 225 | } |
223 | 226 | ||
224 | printf("Created 5 instances of Tox\n"); | 227 | printf("Created 5 instances of Tox\n"); |
@@ -232,9 +235,9 @@ START_TEST(test_AV_three_calls) | |||
232 | tox_self_get_address(Alice, address); | 235 | tox_self_get_address(Alice, address); |
233 | 236 | ||
234 | 237 | ||
235 | assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); | 238 | ck_assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); |
236 | assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); | 239 | ck_assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); |
237 | assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); | 240 | ck_assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); |
238 | 241 | ||
239 | uint8_t off = 1; | 242 | uint8_t off = 1; |
240 | 243 | ||
@@ -302,7 +305,7 @@ START_TEST(test_AV_three_calls) | |||
302 | (void) pthread_detach(tids[2]); | 305 | (void) pthread_detach(tids[2]); |
303 | 306 | ||
304 | time_t start_time = time(NULL); | 307 | time_t start_time = time(NULL); |
305 | while (time(NULL) - start_time < 10) { | 308 | while (time(NULL) - start_time < 5) { |
306 | tox_iterate(Alice); | 309 | tox_iterate(Alice); |
307 | tox_iterate(Bobs[0]); | 310 | tox_iterate(Bobs[0]); |
308 | tox_iterate(Bobs[1]); | 311 | tox_iterate(Bobs[1]); |
@@ -314,6 +317,7 @@ START_TEST(test_AV_three_calls) | |||
314 | (void) pthread_join(tids[1], NULL); | 317 | (void) pthread_join(tids[1], NULL); |
315 | (void) pthread_join(tids[2], NULL); | 318 | (void) pthread_join(tids[2], NULL); |
316 | 319 | ||
320 | printf ("Killing all instances\n"); | ||
317 | toxav_kill(BobsAV[0]); | 321 | toxav_kill(BobsAV[0]); |
318 | toxav_kill(BobsAV[1]); | 322 | toxav_kill(BobsAV[1]); |
319 | toxav_kill(BobsAV[2]); | 323 | toxav_kill(BobsAV[2]); |
diff --git a/toxav/toxav.c b/toxav/toxav.c index e7807592..1817916b 100644 --- a/toxav/toxav.c +++ b/toxav/toxav.c | |||
@@ -79,7 +79,7 @@ typedef struct ToxAVCall_s { | |||
79 | struct ToxAVCall_s *next; | 79 | struct ToxAVCall_s *next; |
80 | } ToxAVCall; | 80 | } ToxAVCall; |
81 | 81 | ||
82 | struct toxAV { | 82 | struct ToxAV { |
83 | Messenger* m; | 83 | Messenger* m; |
84 | MSISession* msi; | 84 | MSISession* msi; |
85 | 85 | ||
@@ -116,7 +116,7 @@ bool video_bit_rate_invalid(uint32_t bit_rate); | |||
116 | void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); | 116 | void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); |
117 | ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); | 117 | ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); |
118 | ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); | 118 | ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); |
119 | void call_remove(ToxAVCall* call); | 119 | ToxAVCall* call_remove(ToxAVCall* call); |
120 | bool call_prepare_transmission(ToxAVCall* call); | 120 | bool call_prepare_transmission(ToxAVCall* call); |
121 | void call_kill_transmission(ToxAVCall* call); | 121 | void call_kill_transmission(ToxAVCall* call); |
122 | void ba_set(ToxAvBitrateAdapter* ba, uint32_t bit_rate); | 122 | void ba_set(ToxAvBitrateAdapter* ba, uint32_t bit_rate); |
@@ -193,9 +193,9 @@ void toxav_kill(ToxAV* av) | |||
193 | /* Msi kill will hang up all calls so just clean these calls */ | 193 | /* Msi kill will hang up all calls so just clean these calls */ |
194 | if (av->calls) { | 194 | if (av->calls) { |
195 | ToxAVCall* it = call_get(av, av->calls_head); | 195 | ToxAVCall* it = call_get(av, av->calls_head); |
196 | for (; it; it = it->next) { | 196 | while (it) { |
197 | call_kill_transmission(it); | 197 | call_kill_transmission(it); |
198 | call_remove(it); /* This will eventually free av->calls */ | 198 | it = call_remove(it); /* This will eventually free av->calls */ |
199 | } | 199 | } |
200 | } | 200 | } |
201 | 201 | ||
@@ -318,6 +318,14 @@ void toxav_iterate(ToxAV* av) | |||
318 | 318 | ||
319 | bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error) | 319 | bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error) |
320 | { | 320 | { |
321 | if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate)) | ||
322 | ||(video_bit_rate && video_bit_rate_invalid(video_bit_rate)) | ||
323 | ) { | ||
324 | if (error) | ||
325 | *error = TOXAV_ERR_CALL_INVALID_BIT_RATE; | ||
326 | return false; | ||
327 | } | ||
328 | |||
321 | pthread_mutex_lock(av->mutex); | 329 | pthread_mutex_lock(av->mutex); |
322 | ToxAVCall* call = call_new(av, friend_number, error); | 330 | ToxAVCall* call = call_new(av, friend_number, error); |
323 | if (call == NULL) { | 331 | if (call == NULL) { |
@@ -368,7 +376,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui | |||
368 | if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate)) | 376 | if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate)) |
369 | ||(video_bit_rate && video_bit_rate_invalid(video_bit_rate)) | 377 | ||(video_bit_rate && video_bit_rate_invalid(video_bit_rate)) |
370 | ) { | 378 | ) { |
371 | rc = TOXAV_ERR_CALL_INVALID_BIT_RATE; | 379 | rc = TOXAV_ERR_ANSWER_INVALID_BIT_RATE; |
372 | goto END; | 380 | goto END; |
373 | } | 381 | } |
374 | 382 | ||
@@ -379,7 +387,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui | |||
379 | } | 387 | } |
380 | 388 | ||
381 | if (!call_prepare_transmission(call)) { | 389 | if (!call_prepare_transmission(call)) { |
382 | rc = TOXAV_ERR_ANSWER_MALLOC; | 390 | rc = TOXAV_ERR_ANSWER_CODEC_INITIALIZATION; |
383 | goto END; | 391 | goto END; |
384 | } | 392 | } |
385 | 393 | ||
@@ -450,6 +458,9 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co | |||
450 | 458 | ||
451 | rtp_start_receiving(call->audio.first); | 459 | rtp_start_receiving(call->audio.first); |
452 | rtp_start_receiving(call->video.first); | 460 | rtp_start_receiving(call->video.first); |
461 | } else { | ||
462 | rc = TOXAV_ERR_CALL_CONTROL_NOT_PAUSED; | ||
463 | goto END; | ||
453 | } | 464 | } |
454 | } break; | 465 | } break; |
455 | 466 | ||
@@ -472,6 +483,9 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co | |||
472 | 483 | ||
473 | rtp_stop_receiving(call->audio.first); | 484 | rtp_stop_receiving(call->audio.first); |
474 | rtp_stop_receiving(call->video.first); | 485 | rtp_stop_receiving(call->video.first); |
486 | } else { | ||
487 | rc = TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED; | ||
488 | goto END; | ||
475 | } | 489 | } |
476 | } break; | 490 | } break; |
477 | 491 | ||
@@ -516,7 +530,7 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co | |||
516 | } | 530 | } |
517 | } break; | 531 | } break; |
518 | 532 | ||
519 | case TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO: { | 533 | case TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO: { |
520 | if (!call->active) { | 534 | if (!call->active) { |
521 | rc = TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_IN_CALL; | 535 | rc = TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_IN_CALL; |
522 | goto END; | 536 | goto END; |
@@ -589,7 +603,7 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_ | |||
589 | goto END; | 603 | goto END; |
590 | } | 604 | } |
591 | 605 | ||
592 | if (call->video_bit_rate == video_bit_rate || call->vba.active || call->vba.bit_rate == video_bit_rate) { | 606 | if (call->video_bit_rate == video_bit_rate || (call->vba.active && call->vba.bit_rate == video_bit_rate)) { |
593 | pthread_mutex_unlock(av->mutex); | 607 | pthread_mutex_unlock(av->mutex); |
594 | goto END; | 608 | goto END; |
595 | } | 609 | } |
@@ -599,6 +613,8 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_ | |||
599 | if (video_bit_rate > call->video_bit_rate && !force) | 613 | if (video_bit_rate > call->video_bit_rate && !force) |
600 | ba_set(&call->vba, video_bit_rate); | 614 | ba_set(&call->vba, video_bit_rate); |
601 | else { | 615 | else { |
616 | /* Cancel any previous non forceful bitrate change request */ | ||
617 | memset(&call->vba, 0, sizeof(call->vba)); | ||
602 | call->video_bit_rate = video_bit_rate; | 618 | call->video_bit_rate = video_bit_rate; |
603 | 619 | ||
604 | if (!force && av->vbcb.first) | 620 | if (!force && av->vbcb.first) |
@@ -646,16 +662,19 @@ bool toxav_set_audio_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t audio_ | |||
646 | goto END; | 662 | goto END; |
647 | } | 663 | } |
648 | 664 | ||
649 | if (call->audio_bit_rate == audio_bit_rate || call->aba.active || call->aba.bit_rate == audio_bit_rate) { | 665 | if (call->audio_bit_rate == audio_bit_rate || (call->aba.active && call->aba.bit_rate == audio_bit_rate)) { |
650 | pthread_mutex_unlock(av->mutex); | 666 | pthread_mutex_unlock(av->mutex); |
651 | goto END; | 667 | goto END; |
652 | } | 668 | } |
653 | 669 | ||
670 | |||
654 | pthread_mutex_lock(call->mutex); | 671 | pthread_mutex_lock(call->mutex); |
655 | 672 | ||
656 | if (audio_bit_rate > call->audio_bit_rate && !force) | 673 | if (audio_bit_rate > call->audio_bit_rate && !force) |
657 | ba_set(&call->aba, audio_bit_rate); | 674 | ba_set(&call->aba, audio_bit_rate); |
658 | else { | 675 | else { |
676 | /* Cancel any previous non forceful bitrate change request */ | ||
677 | memset(&call->aba, 0, sizeof(call->aba)); | ||
659 | call->audio_bit_rate = audio_bit_rate; | 678 | call->audio_bit_rate = audio_bit_rate; |
660 | 679 | ||
661 | if (!force && av->abcb.first) | 680 | if (!force && av->abcb.first) |
@@ -755,6 +774,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u | |||
755 | if (rtp_send_data(call->video.first, iter, part_size, false) < 0) { | 774 | if (rtp_send_data(call->video.first, iter, part_size, false) < 0) { |
756 | pthread_mutex_unlock(call->mutex_video); | 775 | pthread_mutex_unlock(call->mutex_video); |
757 | LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); | 776 | LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); |
777 | rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED; | ||
758 | goto END; | 778 | goto END; |
759 | } | 779 | } |
760 | } | 780 | } |
@@ -807,6 +827,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u | |||
807 | if (rtp_send_data(call->video.first, pkt->data.frame.buf + i * 1300, 1300, true) < 0) { | 827 | if (rtp_send_data(call->video.first, pkt->data.frame.buf + i * 1300, 1300, true) < 0) { |
808 | pthread_mutex_unlock(call->mutex_video); | 828 | pthread_mutex_unlock(call->mutex_video); |
809 | LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); | 829 | LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); |
830 | rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED; | ||
810 | goto END; | 831 | goto END; |
811 | } | 832 | } |
812 | } | 833 | } |
@@ -815,6 +836,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u | |||
815 | if (rtp_send_data(call->video.first, pkt->data.frame.buf + parts * 1300, pkt->data.frame.sz % 1300, true) < 0) { | 836 | if (rtp_send_data(call->video.first, pkt->data.frame.buf + parts * 1300, pkt->data.frame.sz % 1300, true) < 0) { |
816 | pthread_mutex_unlock(call->mutex_video); | 837 | pthread_mutex_unlock(call->mutex_video); |
817 | LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); | 838 | LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); |
839 | rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED; | ||
818 | goto END; | 840 | goto END; |
819 | } | 841 | } |
820 | } | 842 | } |
@@ -1157,10 +1179,10 @@ ToxAVCall* call_get(ToxAV* av, uint32_t friend_number) | |||
1157 | return av->calls[friend_number]; | 1179 | return av->calls[friend_number]; |
1158 | } | 1180 | } |
1159 | 1181 | ||
1160 | void call_remove(ToxAVCall* call) | 1182 | ToxAVCall* call_remove(ToxAVCall* call) |
1161 | { | 1183 | { |
1162 | if (call == NULL) | 1184 | if (call == NULL) |
1163 | return; | 1185 | return NULL; |
1164 | 1186 | ||
1165 | uint32_t friend_number = call->friend_number; | 1187 | uint32_t friend_number = call->friend_number; |
1166 | ToxAV* av = call->av; | 1188 | ToxAV* av = call->av; |
@@ -1183,12 +1205,14 @@ void call_remove(ToxAVCall* call) | |||
1183 | else goto CLEAR; | 1205 | else goto CLEAR; |
1184 | 1206 | ||
1185 | av->calls[friend_number] = NULL; | 1207 | av->calls[friend_number] = NULL; |
1186 | return; | 1208 | return next; |
1187 | 1209 | ||
1188 | CLEAR: | 1210 | CLEAR: |
1189 | av->calls_head = av->calls_tail = 0; | 1211 | av->calls_head = av->calls_tail = 0; |
1190 | free(av->calls); | 1212 | free(av->calls); |
1191 | av->calls = NULL; | 1213 | av->calls = NULL; |
1214 | |||
1215 | return NULL; | ||
1192 | } | 1216 | } |
1193 | 1217 | ||
1194 | bool call_prepare_transmission(ToxAVCall* call) | 1218 | bool call_prepare_transmission(ToxAVCall* call) |
diff --git a/toxav/toxav.h b/toxav/toxav.h index 67e5496e..125422eb 100644 --- a/toxav/toxav.h +++ b/toxav/toxav.h | |||
@@ -37,7 +37,7 @@ extern "C" { | |||
37 | /** | 37 | /** |
38 | * The type of the Tox Audio/Video subsystem object. | 38 | * The type of the Tox Audio/Video subsystem object. |
39 | */ | 39 | */ |
40 | typedef struct toxAV ToxAV; | 40 | typedef struct ToxAV ToxAV; |
41 | #ifndef TOX_DEFINED | 41 | #ifndef TOX_DEFINED |
42 | #define TOX_DEFINED | 42 | #define TOX_DEFINED |
43 | /** | 43 | /** |
@@ -92,8 +92,8 @@ Tox *toxav_get_tox(ToxAV *av); | |||
92 | uint32_t toxav_iteration_interval(ToxAV const *av); | 92 | uint32_t toxav_iteration_interval(ToxAV const *av); |
93 | /** | 93 | /** |
94 | * Main loop for the session. This function needs to be called in intervals of | 94 | * Main loop for the session. This function needs to be called in intervals of |
95 | * toxav_iteration_interval() milliseconds. It is best called in the same loop | 95 | * toxav_iteration_interval() milliseconds. It is best called in the separate |
96 | * as tox_iterate. | 96 | * thread from tox_iterate. |
97 | */ | 97 | */ |
98 | void toxav_iterate(ToxAV *av); | 98 | void toxav_iterate(ToxAV *av); |
99 | /******************************************************************************* | 99 | /******************************************************************************* |
@@ -153,10 +153,11 @@ void toxav_callback_call(ToxAV *av, toxav_call_cb *function, void *user_data); | |||
153 | typedef enum TOXAV_ERR_ANSWER { | 153 | typedef enum TOXAV_ERR_ANSWER { |
154 | TOXAV_ERR_ANSWER_OK, | 154 | TOXAV_ERR_ANSWER_OK, |
155 | /** | 155 | /** |
156 | * A resource allocation error occurred while trying to create the structures | 156 | * Failed to initialize codecs for call session. Note that codec initiation |
157 | * required for the call. | 157 | * will fail if there is no receive callback registered for either audio or |
158 | * video. | ||
158 | */ | 159 | */ |
159 | TOXAV_ERR_ANSWER_MALLOC, | 160 | TOXAV_ERR_ANSWER_CODEC_INITIALIZATION, |
160 | /** | 161 | /** |
161 | * The friend number did not designate a valid friend. | 162 | * The friend number did not designate a valid friend. |
162 | */ | 163 | */ |
@@ -174,8 +175,8 @@ typedef enum TOXAV_ERR_ANSWER { | |||
174 | /** | 175 | /** |
175 | * Accept an incoming call. | 176 | * Accept an incoming call. |
176 | * | 177 | * |
177 | * If an allocation error occurs while answering a call, both participants will | 178 | * If answering fails for any reason, the call will still be pending and it is |
178 | * receive TOXAV_CALL_STATE_ERROR and the call will end. | 179 | * possible to try and answer it later. |
179 | * | 180 | * |
180 | * @param friend_number The friend number of the friend that is calling. | 181 | * @param friend_number The friend number of the friend that is calling. |
181 | * @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable | 182 | * @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable |
@@ -217,7 +218,8 @@ typedef enum TOXAV_CALL_STATE { | |||
217 | */ | 218 | */ |
218 | TOXAV_CALL_STATE_END = 16, | 219 | TOXAV_CALL_STATE_END = 16, |
219 | /** | 220 | /** |
220 | * Set by the AV core if an error occurred on the remote end. | 221 | * Set by the AV core if an error occurred on the remote end. This call |
222 | * state will never be triggered in combination with other call states. | ||
221 | */ | 223 | */ |
222 | TOXAV_CALL_STATE_ERROR = 32768 | 224 | TOXAV_CALL_STATE_ERROR = 32768 |
223 | } TOXAV_CALL_STATE; | 225 | } TOXAV_CALL_STATE; |
@@ -266,10 +268,10 @@ typedef enum TOXAV_CALL_CONTROL { | |||
266 | * Request that the friend stops sending video. Regardless of the friend's | 268 | * Request that the friend stops sending video. Regardless of the friend's |
267 | * compliance, this will cause the `receive_video_frame` event to stop being | 269 | * compliance, this will cause the `receive_video_frame` event to stop being |
268 | * triggered on receiving an video frame from the friend. If the video was | 270 | * triggered on receiving an video frame from the friend. If the video was |
269 | * already muted, calling this control will notify client to start sending | 271 | * already hidden, calling this control will notify client to start sending |
270 | * video again. | 272 | * video again. |
271 | */ | 273 | */ |
272 | TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, | 274 | TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO |
273 | } TOXAV_CALL_CONTROL; | 275 | } TOXAV_CALL_CONTROL; |
274 | typedef enum TOXAV_ERR_CALL_CONTROL { | 276 | typedef enum TOXAV_ERR_CALL_CONTROL { |
275 | TOXAV_ERR_CALL_CONTROL_OK, | 277 | TOXAV_ERR_CALL_CONTROL_OK, |
@@ -287,20 +289,11 @@ typedef enum TOXAV_ERR_CALL_CONTROL { | |||
287 | */ | 289 | */ |
288 | TOXAV_ERR_CALL_CONTROL_NOT_PAUSED, | 290 | TOXAV_ERR_CALL_CONTROL_NOT_PAUSED, |
289 | /** | 291 | /** |
290 | * Attempted to resume a call that was paused by the other party. Also set if | ||
291 | * the client attempted to send a system-only control. | ||
292 | */ | ||
293 | TOXAV_ERR_CALL_CONTROL_DENIED, | ||
294 | /** | ||
295 | * The call was already paused on this client. It is valid to pause if the | 292 | * The call was already paused on this client. It is valid to pause if the |
296 | * other party paused the call. The call will resume after both parties sent | 293 | * other party paused the call. The call will resume after both parties sent |
297 | * the RESUME control. | 294 | * the RESUME control. |
298 | */ | 295 | */ |
299 | TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED, | 296 | TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED |
300 | /** | ||
301 | * Tried to unmute a call that was not already muted. | ||
302 | */ | ||
303 | TOXAV_ERR_CALL_CONTROL_NOT_MUTED | ||
304 | } TOXAV_ERR_CALL_CONTROL; | 297 | } TOXAV_ERR_CALL_CONTROL; |
305 | /** | 298 | /** |
306 | * Sends a call control command to a friend. | 299 | * Sends a call control command to a friend. |
@@ -351,7 +344,12 @@ typedef void toxav_audio_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, b | |||
351 | */ | 344 | */ |
352 | void toxav_callback_audio_bit_rate_status(ToxAV *av, toxav_audio_bit_rate_status_cb *function, void *user_data); | 345 | void toxav_callback_audio_bit_rate_status(ToxAV *av, toxav_audio_bit_rate_status_cb *function, void *user_data); |
353 | /** | 346 | /** |
354 | * Set the audio bit rate to be used in subsequent audio frames. | 347 | * Set the audio bit rate to be used in subsequent audio frames. If the passed |
348 | * bit rate is the same as the current bit rate this function will return true | ||
349 | * without calling a callback. If there is an active non forceful setup with the | ||
350 | * passed audio bit rate and the new set request is forceful, the bit rate is | ||
351 | * forcefully set and the previous non forceful request is cancelled. The active | ||
352 | * non forceful setup will be canceled in favour of new non forceful setup. | ||
355 | * | 353 | * |
356 | * @param friend_number The friend number of the friend for which to set the | 354 | * @param friend_number The friend number of the friend for which to set the |
357 | * audio bit rate. | 355 | * audio bit rate. |
@@ -380,7 +378,12 @@ typedef void toxav_video_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, b | |||
380 | */ | 378 | */ |
381 | void toxav_callback_video_bit_rate_status(ToxAV *av, toxav_video_bit_rate_status_cb *function, void *user_data); | 379 | void toxav_callback_video_bit_rate_status(ToxAV *av, toxav_video_bit_rate_status_cb *function, void *user_data); |
382 | /** | 380 | /** |
383 | * Set the video bit rate to be used in subsequent video frames. | 381 | * Set the video bit rate to be used in subsequent video frames. If the passed |
382 | * bit rate is the same as the current bit rate this function will return true | ||
383 | * without calling a callback. If there is an active non forceful setup with the | ||
384 | * passed bit rate and the new set request is forceful, the bit rate is | ||
385 | * forcefully set and the previous non forceful request is cancelled. The active | ||
386 | * non forceful setup will be canceled in favour of new non forceful setup. | ||
384 | * | 387 | * |
385 | * @param friend_number The friend number of the friend for which to set the | 388 | * @param friend_number The friend number of the friend for which to set the |
386 | * video bit rate. | 389 | * video bit rate. |
@@ -414,11 +417,6 @@ typedef enum TOXAV_ERR_SEND_FRAME { | |||
414 | */ | 417 | */ |
415 | TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL, | 418 | TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL, |
416 | /** | 419 | /** |
417 | * No video frame had been requested through the `video_frame_request` event, | ||
418 | * but the client tried to send one, anyway. | ||
419 | */ | ||
420 | TOXAV_ERR_SEND_FRAME_NOT_REQUESTED, | ||
421 | /** | ||
422 | * One of the frame parameters was invalid. E.g. the resolution may be too | 420 | * One of the frame parameters was invalid. E.g. the resolution may be too |
423 | * small or too large, or the audio sampling rate may be unsupported. | 421 | * small or too large, or the audio sampling rate may be unsupported. |
424 | */ | 422 | */ |
@@ -431,8 +429,6 @@ typedef enum TOXAV_ERR_SEND_FRAME { | |||
431 | /** | 429 | /** |
432 | * Send a video frame to a friend. | 430 | * Send a video frame to a friend. |
433 | * | 431 | * |
434 | * This is called in response to receiving the `video_frame_request` event. | ||
435 | * | ||
436 | * Y - plane should be of size: height * width | 432 | * Y - plane should be of size: height * width |
437 | * U - plane should be of size: (height/2) * (width/2) | 433 | * U - plane should be of size: (height/2) * (width/2) |
438 | * V - plane should be of size: (height/2) * (width/2) | 434 | * V - plane should be of size: (height/2) * (width/2) |
@@ -452,8 +448,6 @@ bool toxav_send_video_frame(ToxAV *av, uint32_t friend_number, | |||
452 | /** | 448 | /** |
453 | * Send an audio frame to a friend. | 449 | * Send an audio frame to a friend. |
454 | * | 450 | * |
455 | * This is called in response to receiving the `audio_frame_request` event. | ||
456 | * | ||
457 | * The expected format of the PCM data is: [s1c1][s1c2][...][s2c1][s2c2][...]... | 451 | * The expected format of the PCM data is: [s1c1][s1c2][...][s2c1][s2c2][...]... |
458 | * Meaning: sample 1 for channel 1, sample 1 for channel 2, ... | 452 | * Meaning: sample 1 for channel 1, sample 1 for channel 2, ... |
459 | * For mono audio, this has no meaning, every sample is subsequent. For stereo, | 453 | * For mono audio, this has no meaning, every sample is subsequent. For stereo, |
@@ -467,9 +461,7 @@ bool toxav_send_video_frame(ToxAV *av, uint32_t friend_number, | |||
467 | * @param sample_count Number of samples in this frame. Valid numbers here are | 461 | * @param sample_count Number of samples in this frame. Valid numbers here are |
468 | * ((sample rate) * (audio length) / 1000), where audio length can be | 462 | * ((sample rate) * (audio length) / 1000), where audio length can be |
469 | * 2.5, 5, 10, 20, 40 or 60 millseconds. | 463 | * 2.5, 5, 10, 20, 40 or 60 millseconds. |
470 | * @param channels Number of audio channels. Must be at least 1 for mono. | 464 | * @param channels Number of audio channels. Supported values are 1 and 2. |
471 | * For voice over IP, more than 2 channels (stereo) typically doesn't make | ||
472 | * sense, but up to 255 channels are supported. | ||
473 | * @param sampling_rate Audio sampling rate used in this frame. Valid sampling | 465 | * @param sampling_rate Audio sampling rate used in this frame. Valid sampling |
474 | * rates are 8000, 12000, 16000, 24000, or 48000. | 466 | * rates are 8000, 12000, 16000, 24000, or 48000. |
475 | */ | 467 | */ |
diff --git a/toxav/video.c b/toxav/video.c index 22ca2bee..fe57387f 100644 --- a/toxav/video.c +++ b/toxav/video.c | |||
@@ -87,6 +87,7 @@ VCSession* vc_new(ToxAV* av, uint32_t friend_number, toxav_receive_video_frame_c | |||
87 | vc->vcb.second = cb_data; | 87 | vc->vcb.second = cb_data; |
88 | vc->friend_number = friend_number; | 88 | vc->friend_number = friend_number; |
89 | vc->peer_video_frame_piece_size = mvfpsz; | 89 | vc->peer_video_frame_piece_size = mvfpsz; |
90 | vc->av = av; | ||
90 | 91 | ||
91 | return vc; | 92 | return vc; |
92 | 93 | ||
@@ -294,7 +295,7 @@ int vc_reconfigure_encoder(VCSession* vc, int32_t bit_rate, uint16_t width, uint | |||
294 | return -1; | 295 | return -1; |
295 | 296 | ||
296 | vpx_codec_enc_cfg_t cfg = *vc->encoder->config.enc; | 297 | vpx_codec_enc_cfg_t cfg = *vc->encoder->config.enc; |
297 | if (cfg.rc_target_bitrate == bit_rate && cfg.g_w == width && cfg.g_h == height) | 298 | if (cfg.rc_target_bitrate == (uint32_t) bit_rate && cfg.g_w == width && cfg.g_h == height) |
298 | return 0; /* Nothing changed */ | 299 | return 0; /* Nothing changed */ |
299 | 300 | ||
300 | cfg.rc_target_bitrate = bit_rate; | 301 | cfg.rc_target_bitrate = bit_rate; |
@@ -315,7 +316,7 @@ int vc_reconfigure_test_encoder(VCSession* vc, int32_t bit_rate, uint16_t width, | |||
315 | return -1; | 316 | return -1; |
316 | 317 | ||
317 | vpx_codec_enc_cfg_t cfg = *vc->test_encoder->config.enc; | 318 | vpx_codec_enc_cfg_t cfg = *vc->test_encoder->config.enc; |
318 | if (cfg.rc_target_bitrate == bit_rate && cfg.g_w == width && cfg.g_h == height) | 319 | if (cfg.rc_target_bitrate == (uint32_t) bit_rate && cfg.g_w == width && cfg.g_h == height) |
319 | return 0; /* Nothing changed */ | 320 | return 0; /* Nothing changed */ |
320 | 321 | ||
321 | cfg.rc_target_bitrate = bit_rate; | 322 | cfg.rc_target_bitrate = bit_rate; |