summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--auto_tests/toxav_basic_test.c77
-rw-r--r--auto_tests/toxav_many_test.c36
-rw-r--r--toxav/toxav.c48
-rw-r--r--toxav/toxav.h62
-rw-r--r--toxav/video.c5
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
82struct toxAV { 82struct 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);
116void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); 116void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state);
117ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); 117ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error);
118ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); 118ToxAVCall* call_get(ToxAV* av, uint32_t friend_number);
119void call_remove(ToxAVCall* call); 119ToxAVCall* call_remove(ToxAVCall* call);
120bool call_prepare_transmission(ToxAVCall* call); 120bool call_prepare_transmission(ToxAVCall* call);
121void call_kill_transmission(ToxAVCall* call); 121void call_kill_transmission(ToxAVCall* call);
122void ba_set(ToxAvBitrateAdapter* ba, uint32_t bit_rate); 122void 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
319bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error) 319bool 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
1160void call_remove(ToxAVCall* call) 1182ToxAVCall* 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
1188CLEAR: 1210CLEAR:
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
1194bool call_prepare_transmission(ToxAVCall* call) 1218bool 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 */
40typedef struct toxAV ToxAV; 40typedef 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);
92uint32_t toxav_iteration_interval(ToxAV const *av); 92uint32_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 */
98void toxav_iterate(ToxAV *av); 98void toxav_iterate(ToxAV *av);
99/******************************************************************************* 99/*******************************************************************************
@@ -153,10 +153,11 @@ void toxav_callback_call(ToxAV *av, toxav_call_cb *function, void *user_data);
153typedef enum TOXAV_ERR_ANSWER { 153typedef 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;
274typedef enum TOXAV_ERR_CALL_CONTROL { 276typedef 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 */
352void toxav_callback_audio_bit_rate_status(ToxAV *av, toxav_audio_bit_rate_status_cb *function, void *user_data); 345void 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 */
381void toxav_callback_video_bit_rate_status(ToxAV *av, toxav_video_bit_rate_status_cb *function, void *user_data); 379void 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;