summaryrefslogtreecommitdiff
path: root/toxav/toxav.c
diff options
context:
space:
mode:
authormannol <eniz_vukovic@hotmail.com>2015-04-08 01:00:19 +0200
committermannol <eniz_vukovic@hotmail.com>2015-04-08 01:00:19 +0200
commit9c003c9dd215d5f6bb2c1a0fbdc2c0f7fd9def7c (patch)
treead682cf784489259d6ccc65c2d116cb2bbd2ba6d /toxav/toxav.c
parentbf9f7e2ae8dc5f1b83c45e383ec70cb08c4caf5f (diff)
Video works now
Diffstat (limited to 'toxav/toxav.c')
-rw-r--r--toxav/toxav.c167
1 files changed, 87 insertions, 80 deletions
diff --git a/toxav/toxav.c b/toxav/toxav.c
index 54554918..0f16fde2 100644
--- a/toxav/toxav.c
+++ b/toxav/toxav.c
@@ -129,8 +129,7 @@ ToxAV* toxav_new(Tox* tox, TOXAV_ERR_NEW* error)
129 goto FAILURE; 129 goto FAILURE;
130 } 130 }
131 131
132// if (create_recursive_mutex(av->mutex) == -1) { 132 if (create_recursive_mutex(av->mutex) != 0) {
133 if (pthread_mutex_init(av->mutex, NULL) == -1) {
134 LOGGER_WARNING("Mutex creation failed!"); 133 LOGGER_WARNING("Mutex creation failed!");
135 rc = TOXAV_ERR_NEW_MALLOC; 134 rc = TOXAV_ERR_NEW_MALLOC;
136 goto FAILURE; 135 goto FAILURE;
@@ -174,7 +173,7 @@ void toxav_kill(ToxAV* av)
174{ 173{
175 if (av == NULL) 174 if (av == NULL)
176 return; 175 return;
177 pthread_mutex_lock(av->mutex); 176 LOGGED_LOCK(av->mutex);
178 177
179 msi_kill(av->msi); 178 msi_kill(av->msi);
180 179
@@ -187,7 +186,7 @@ void toxav_kill(ToxAV* av)
187 } 186 }
188 } 187 }
189 188
190 pthread_mutex_unlock(av->mutex); 189 LOGGED_UNLOCK(av->mutex);
191 pthread_mutex_destroy(av->mutex); 190 pthread_mutex_destroy(av->mutex);
192 free(av); 191 free(av);
193} 192}
@@ -205,9 +204,9 @@ uint32_t toxav_iteration_interval(const ToxAV* av)
205 204
206void toxav_iterate(ToxAV* av) 205void toxav_iterate(ToxAV* av)
207{ 206{
208 pthread_mutex_lock(av->mutex); 207 LOGGED_LOCK(av->mutex);
209 if (av->calls == NULL) { 208 if (av->calls == NULL) {
210 pthread_mutex_unlock(av->mutex); 209 LOGGED_UNLOCK(av->mutex);
211 return; 210 return;
212 } 211 }
213 212
@@ -215,20 +214,28 @@ void toxav_iterate(ToxAV* av)
215 uint32_t rc = 500; 214 uint32_t rc = 500;
216 215
217 ToxAVCall* i = av->calls[av->calls_head]; 216 ToxAVCall* i = av->calls[av->calls_head];
218 while (i) { 217 for (; i; i = i->next) {
219 if (i->active) { 218 if (i->active) {
220 pthread_mutex_lock(i->mutex_decoding); 219 LOGGED_LOCK(i->mutex_decoding);
221 pthread_mutex_unlock(av->mutex); 220 LOGGED_UNLOCK(av->mutex);
222 221
223 cs_do(i->cs); 222 cs_do(i->cs);
224 rc = MIN(i->cs->last_packet_frame_duration, rc); 223 if (i->last_self_capabilities & msi_CapRAudio) /* Receiving audio */
224 rc = MIN(i->cs->last_packet_frame_duration, rc);
225 if (i->last_self_capabilities & msi_CapRVideo) /* Receiving video */
226 rc = MIN(i->cs->lcfd, rc);
225 227
226 pthread_mutex_lock(av->mutex); 228 uint32_t fid = i->friend_id;
227 pthread_mutex_unlock(i->mutex_decoding); 229
228 i = i->next; 230 LOGGED_UNLOCK(i->mutex_decoding);
231 LOGGED_LOCK(av->mutex);
232
233 /* In case this call is popped from container stop iteration */
234 if (call_get(av, fid) != i)
235 break;
229 } 236 }
230 } 237 }
231 pthread_mutex_unlock(av->mutex); 238 LOGGED_UNLOCK(av->mutex);
232 239
233 av->interval = rc < av->dmssa ? 0 : (rc - av->dmssa); 240 av->interval = rc < av->dmssa ? 0 : (rc - av->dmssa);
234 av->dmsst += current_time_monotonic() - start; 241 av->dmsst += current_time_monotonic() - start;
@@ -242,10 +249,10 @@ void toxav_iterate(ToxAV* av)
242 249
243bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error) 250bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error)
244{ 251{
245 pthread_mutex_lock(av->mutex); 252 LOGGED_LOCK(av->mutex);
246 ToxAVCall* call = call_new(av, friend_number, error); 253 ToxAVCall* call = call_new(av, friend_number, error);
247 if (call == NULL) { 254 if (call == NULL) {
248 pthread_mutex_unlock(av->mutex); 255 LOGGED_UNLOCK(av->mutex);
249 return false; 256 return false;
250 } 257 }
251 258
@@ -261,27 +268,27 @@ bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint
261 call_remove(call); 268 call_remove(call);
262 if (error) 269 if (error)
263 *error = TOXAV_ERR_CALL_MALLOC; 270 *error = TOXAV_ERR_CALL_MALLOC;
264 pthread_mutex_unlock(av->mutex); 271 LOGGED_UNLOCK(av->mutex);
265 return false; 272 return false;
266 } 273 }
267 274
268 call->msi_call->av_call = call; 275 call->msi_call->av_call = call;
269 pthread_mutex_unlock(av->mutex); 276 LOGGED_UNLOCK(av->mutex);
270 277
271 return true; 278 return true;
272} 279}
273 280
274void toxav_callback_call(ToxAV* av, toxav_call_cb* function, void* user_data) 281void toxav_callback_call(ToxAV* av, toxav_call_cb* function, void* user_data)
275{ 282{
276 pthread_mutex_lock(av->mutex); 283 LOGGED_LOCK(av->mutex);
277 av->ccb.first = function; 284 av->ccb.first = function;
278 av->ccb.second = user_data; 285 av->ccb.second = user_data;
279 pthread_mutex_unlock(av->mutex); 286 LOGGED_UNLOCK(av->mutex);
280} 287}
281 288
282bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_ANSWER* error) 289bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_ANSWER* error)
283{ 290{
284 pthread_mutex_lock(av->mutex); 291 LOGGED_LOCK(av->mutex);
285 292
286 TOXAV_ERR_ANSWER rc = TOXAV_ERR_ANSWER_OK; 293 TOXAV_ERR_ANSWER rc = TOXAV_ERR_ANSWER_OK;
287 if (m_friend_exists(av->m, friend_number) == 0) { 294 if (m_friend_exists(av->m, friend_number) == 0) {
@@ -320,7 +327,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui
320 327
321 328
322END: 329END:
323 pthread_mutex_unlock(av->mutex); 330 LOGGED_UNLOCK(av->mutex);
324 331
325 if (error) 332 if (error)
326 *error = rc; 333 *error = rc;
@@ -330,15 +337,15 @@ END:
330 337
331void toxav_callback_call_state(ToxAV* av, toxav_call_state_cb* function, void* user_data) 338void toxav_callback_call_state(ToxAV* av, toxav_call_state_cb* function, void* user_data)
332{ 339{
333 pthread_mutex_lock(av->mutex); 340 LOGGED_LOCK(av->mutex);
334 av->scb.first = function; 341 av->scb.first = function;
335 av->scb.second = user_data; 342 av->scb.second = user_data;
336 pthread_mutex_unlock(av->mutex); 343 LOGGED_UNLOCK(av->mutex);
337} 344}
338 345
339bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL control, TOXAV_ERR_CALL_CONTROL* error) 346bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL control, TOXAV_ERR_CALL_CONTROL* error)
340{ 347{
341 pthread_mutex_lock(av->mutex); 348 LOGGED_LOCK(av->mutex);
342 TOXAV_ERR_CALL_CONTROL rc = TOXAV_ERR_CALL_CONTROL_OK; 349 TOXAV_ERR_CALL_CONTROL rc = TOXAV_ERR_CALL_CONTROL_OK;
343 350
344 if (m_friend_exists(av->m, friend_number) == 0) { 351 if (m_friend_exists(av->m, friend_number) == 0) {
@@ -474,7 +481,7 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co
474 } 481 }
475 482
476END: 483END:
477 pthread_mutex_unlock(av->mutex); 484 LOGGED_UNLOCK(av->mutex);
478 485
479 if (error) 486 if (error)
480 *error = rc; 487 *error = rc;
@@ -497,17 +504,17 @@ bool toxav_set_audio_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t audio_
497 goto END; 504 goto END;
498 } 505 }
499 506
500 pthread_mutex_lock(av->mutex); 507 LOGGED_LOCK(av->mutex);
501 call = call_get(av, friend_number); 508 call = call_get(av, friend_number);
502 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) { 509 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) {
503 pthread_mutex_unlock(av->mutex); 510 LOGGED_UNLOCK(av->mutex);
504 rc = TOXAV_ERR_BIT_RATE_FRIEND_NOT_IN_CALL; 511 rc = TOXAV_ERR_BIT_RATE_FRIEND_NOT_IN_CALL;
505 goto END; 512 goto END;
506 } 513 }
507 514
508 /* NOTE: no need to lock*/ 515 /* NOTE: no need to lock*/
509 call->audio_bit_rate = audio_bit_rate; 516 call->audio_bit_rate = audio_bit_rate;
510 pthread_mutex_unlock(av->mutex); 517 LOGGED_UNLOCK(av->mutex);
511 518
512END: 519END:
513 if (error) 520 if (error)
@@ -531,17 +538,17 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_
531 goto END; 538 goto END;
532 } 539 }
533 540
534 pthread_mutex_lock(av->mutex); 541 LOGGED_LOCK(av->mutex);
535 call = call_get(av, friend_number); 542 call = call_get(av, friend_number);
536 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) { 543 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) {
537 pthread_mutex_unlock(av->mutex); 544 LOGGED_UNLOCK(av->mutex);
538 rc = TOXAV_ERR_BIT_RATE_FRIEND_NOT_IN_CALL; 545 rc = TOXAV_ERR_BIT_RATE_FRIEND_NOT_IN_CALL;
539 goto END; 546 goto END;
540 } 547 }
541 548
542 /* NOTE: no need to lock*/ 549 /* NOTE: no need to lock*/
543 call->video_bit_rate = video_bit_rate; 550 call->video_bit_rate = video_bit_rate;
544 pthread_mutex_unlock(av->mutex); 551 LOGGED_UNLOCK(av->mutex);
545 552
546END: 553END:
547 if (error) 554 if (error)
@@ -552,10 +559,10 @@ END:
552 559
553void toxav_callback_video_frame_request(ToxAV* av, toxav_video_frame_request_cb* function, void* user_data) 560void toxav_callback_video_frame_request(ToxAV* av, toxav_video_frame_request_cb* function, void* user_data)
554{ 561{
555 pthread_mutex_lock(av->mutex); 562 LOGGED_LOCK(av->mutex);
556 av->rvcb.first = function; 563 av->rvcb.first = function;
557 av->rvcb.second = user_data; 564 av->rvcb.second = user_data;
558 pthread_mutex_unlock(av->mutex); 565 LOGGED_UNLOCK(av->mutex);
559} 566}
560 567
561bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, uint16_t height, const uint8_t* y, const uint8_t* u, const uint8_t* v, TOXAV_ERR_SEND_FRAME* error) 568bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, uint16_t height, const uint8_t* y, const uint8_t* u, const uint8_t* v, TOXAV_ERR_SEND_FRAME* error)
@@ -568,25 +575,25 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
568 goto END; 575 goto END;
569 } 576 }
570 577
571 pthread_mutex_lock(av->mutex); 578 LOGGED_LOCK(av->mutex);
572 call = call_get(av, friend_number); 579 call = call_get(av, friend_number);
573 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) { 580 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) {
574 pthread_mutex_unlock(av->mutex); 581 LOGGED_UNLOCK(av->mutex);
575 rc = TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL; 582 rc = TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL;
576 goto END; 583 goto END;
577 } 584 }
578 585
579 pthread_mutex_lock(call->mutex_video_sending); 586 LOGGED_LOCK(call->mutex_video_sending);
580 pthread_mutex_unlock(av->mutex); 587 LOGGED_UNLOCK(av->mutex);
581 588
582 if ( y == NULL || u == NULL || v == NULL ) { 589 if ( y == NULL || u == NULL || v == NULL ) {
583 pthread_mutex_unlock(call->mutex_video_sending); 590 LOGGED_UNLOCK(call->mutex_video_sending);
584 rc = TOXAV_ERR_SEND_FRAME_NULL; 591 rc = TOXAV_ERR_SEND_FRAME_NULL;
585 goto END; 592 goto END;
586 } 593 }
587 594
588 if ( cs_reconfigure_video_encoder(call->cs, call->video_bit_rate, width, height) != 0 ) { 595 if ( cs_reconfigure_video_encoder(call->cs, call->video_bit_rate, width, height) != 0 ) {
589 pthread_mutex_unlock(call->mutex_video_sending); 596 LOGGED_UNLOCK(call->mutex_video_sending);
590 rc = TOXAV_ERR_SEND_FRAME_INVALID; 597 rc = TOXAV_ERR_SEND_FRAME_INVALID;
591 goto END; 598 goto END;
592 } 599 }
@@ -608,7 +615,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
608 615
609 vpx_img_free(&img); 616 vpx_img_free(&img);
610 if ( vrc != VPX_CODEC_OK) { 617 if ( vrc != VPX_CODEC_OK) {
611 pthread_mutex_unlock(call->mutex_video_sending); 618 LOGGED_UNLOCK(call->mutex_video_sending);
612 LOGGER_ERROR("Could not encode video frame: %s\n", vpx_codec_err_to_string(vrc)); 619 LOGGER_ERROR("Could not encode video frame: %s\n", vpx_codec_err_to_string(vrc));
613 rc = TOXAV_ERR_SEND_FRAME_INVALID; 620 rc = TOXAV_ERR_SEND_FRAME_INVALID;
614 goto END; 621 goto END;
@@ -639,7 +646,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
639 iter = cs_iterate_split_video_frame(call->cs, &part_size); 646 iter = cs_iterate_split_video_frame(call->cs, &part_size);
640 647
641 if (rtp_send_msg(call->rtps[video_index], iter, part_size) < 0) { 648 if (rtp_send_msg(call->rtps[video_index], iter, part_size) < 0) {
642 pthread_mutex_unlock(call->mutex_video_sending); 649 LOGGED_UNLOCK(call->mutex_video_sending);
643 LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); 650 LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno));
644 goto END; 651 goto END;
645 } 652 }
@@ -648,7 +655,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
648 } 655 }
649 } 656 }
650 657
651 pthread_mutex_unlock(call->mutex_video_sending); 658 LOGGED_UNLOCK(call->mutex_video_sending);
652 659
653END: 660END:
654 if (error) 661 if (error)
@@ -659,10 +666,10 @@ END:
659 666
660void toxav_callback_audio_frame_request(ToxAV* av, toxav_audio_frame_request_cb* function, void* user_data) 667void toxav_callback_audio_frame_request(ToxAV* av, toxav_audio_frame_request_cb* function, void* user_data)
661{ 668{
662 pthread_mutex_lock(av->mutex); 669 LOGGED_LOCK(av->mutex);
663 av->racb.first = function; 670 av->racb.first = function;
664 av->racb.second = user_data; 671 av->racb.second = user_data;
665 pthread_mutex_unlock(av->mutex); 672 LOGGED_UNLOCK(av->mutex);
666} 673}
667 674
668bool toxav_send_audio_frame(ToxAV* av, uint32_t friend_number, const int16_t* pcm, size_t sample_count, uint8_t channels, uint32_t sampling_rate, TOXAV_ERR_SEND_FRAME* error) 675bool toxav_send_audio_frame(ToxAV* av, uint32_t friend_number, const int16_t* pcm, size_t sample_count, uint8_t channels, uint32_t sampling_rate, TOXAV_ERR_SEND_FRAME* error)
@@ -675,32 +682,32 @@ bool toxav_send_audio_frame(ToxAV* av, uint32_t friend_number, const int16_t* pc
675 goto END; 682 goto END;
676 } 683 }
677 684
678 pthread_mutex_lock(av->mutex); 685 LOGGED_LOCK(av->mutex);
679 call = call_get(av, friend_number); 686 call = call_get(av, friend_number);
680 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) { 687 if (call == NULL || !call->active || call->msi_call->state != msi_CallActive) {
681 pthread_mutex_unlock(av->mutex); 688 LOGGED_UNLOCK(av->mutex);
682 rc = TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL; 689 rc = TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL;
683 goto END; 690 goto END;
684 } 691 }
685 692
686 pthread_mutex_lock(call->mutex_audio_sending); 693 LOGGED_LOCK(call->mutex_audio_sending);
687 pthread_mutex_unlock(av->mutex); 694 LOGGED_UNLOCK(av->mutex);
688 695
689 if ( pcm == NULL ) { 696 if ( pcm == NULL ) {
690 pthread_mutex_unlock(call->mutex_audio_sending); 697 LOGGED_UNLOCK(call->mutex_audio_sending);
691 rc = TOXAV_ERR_SEND_FRAME_NULL; 698 rc = TOXAV_ERR_SEND_FRAME_NULL;
692 goto END; 699 goto END;
693 } 700 }
694 701
695 if ( channels > 2 ) { 702 if ( channels > 2 ) {
696 pthread_mutex_unlock(call->mutex_audio_sending); 703 LOGGED_UNLOCK(call->mutex_audio_sending);
697 rc = TOXAV_ERR_SEND_FRAME_INVALID; 704 rc = TOXAV_ERR_SEND_FRAME_INVALID;
698 goto END; 705 goto END;
699 } 706 }
700 707
701 { /* Encode and send */ 708 { /* Encode and send */
702 if (cs_reconfigure_audio_encoder(call->cs, call->audio_bit_rate * 1000, sampling_rate, channels) != 0) { 709 if (cs_reconfigure_audio_encoder(call->cs, call->audio_bit_rate * 1000, sampling_rate, channels) != 0) {
703 pthread_mutex_unlock(call->mutex_audio_sending); 710 LOGGED_UNLOCK(call->mutex_audio_sending);
704 rc = TOXAV_ERR_SEND_FRAME_INVALID; 711 rc = TOXAV_ERR_SEND_FRAME_INVALID;
705 goto END; 712 goto END;
706 } 713 }
@@ -711,7 +718,7 @@ bool toxav_send_audio_frame(ToxAV* av, uint32_t friend_number, const int16_t* pc
711 718
712 if (vrc < 0) { 719 if (vrc < 0) {
713 LOGGER_WARNING("Failed to encode frame"); 720 LOGGER_WARNING("Failed to encode frame");
714 pthread_mutex_unlock(call->mutex_audio_sending); 721 LOGGED_UNLOCK(call->mutex_audio_sending);
715 rc = TOXAV_ERR_SEND_FRAME_INVALID; 722 rc = TOXAV_ERR_SEND_FRAME_INVALID;
716 goto END; 723 goto END;
717 } 724 }
@@ -722,7 +729,7 @@ bool toxav_send_audio_frame(ToxAV* av, uint32_t friend_number, const int16_t* pc
722 } 729 }
723 } 730 }
724 731
725 pthread_mutex_unlock(call->mutex_audio_sending); 732 LOGGED_UNLOCK(call->mutex_audio_sending);
726 733
727END: 734END:
728 if (error) 735 if (error)
@@ -733,18 +740,18 @@ END:
733 740
734void toxav_callback_receive_video_frame(ToxAV* av, toxav_receive_video_frame_cb* function, void* user_data) 741void toxav_callback_receive_video_frame(ToxAV* av, toxav_receive_video_frame_cb* function, void* user_data)
735{ 742{
736 pthread_mutex_lock(av->mutex); 743 LOGGED_LOCK(av->mutex);
737 av->vcb.first = function; 744 av->vcb.first = function;
738 av->vcb.second = user_data; 745 av->vcb.second = user_data;
739 pthread_mutex_unlock(av->mutex); 746 LOGGED_UNLOCK(av->mutex);
740} 747}
741 748
742void toxav_callback_receive_audio_frame(ToxAV* av, toxav_receive_audio_frame_cb* function, void* user_data) 749void toxav_callback_receive_audio_frame(ToxAV* av, toxav_receive_audio_frame_cb* function, void* user_data)
743{ 750{
744 pthread_mutex_lock(av->mutex); 751 LOGGED_LOCK(av->mutex);
745 av->acb.first = function; 752 av->acb.first = function;
746 av->acb.second = user_data; 753 av->acb.second = user_data;
747 pthread_mutex_unlock(av->mutex); 754 LOGGED_UNLOCK(av->mutex);
748} 755}
749 756
750 757
@@ -756,12 +763,12 @@ void toxav_callback_receive_audio_frame(ToxAV* av, toxav_receive_audio_frame_cb*
756int callback_invite(void* toxav_inst, MSICall* call) 763int callback_invite(void* toxav_inst, MSICall* call)
757{ 764{
758 ToxAV* toxav = toxav_inst; 765 ToxAV* toxav = toxav_inst;
759 pthread_mutex_lock(toxav->mutex); 766 LOGGED_LOCK(toxav->mutex);
760 767
761 ToxAVCall* av_call = call_new(toxav, call->friend_id, NULL); 768 ToxAVCall* av_call = call_new(toxav, call->friend_id, NULL);
762 if (av_call == NULL) { 769 if (av_call == NULL) {
763 LOGGER_WARNING("Failed to initialize call..."); 770 LOGGER_WARNING("Failed to initialize call...");
764 pthread_mutex_unlock(toxav->mutex); 771 LOGGED_UNLOCK(toxav->mutex);
765 return -1; 772 return -1;
766 } 773 }
767 774
@@ -772,41 +779,41 @@ int callback_invite(void* toxav_inst, MSICall* call)
772 toxav->ccb.first(toxav, call->friend_id, call->peer_capabilities & msi_CapSAudio, 779 toxav->ccb.first(toxav, call->friend_id, call->peer_capabilities & msi_CapSAudio,
773 call->peer_capabilities & msi_CapSVideo, toxav->ccb.second); 780 call->peer_capabilities & msi_CapSVideo, toxav->ccb.second);
774 781
775 pthread_mutex_unlock(toxav->mutex); 782 LOGGED_UNLOCK(toxav->mutex);
776 return 0; 783 return 0;
777} 784}
778 785
779int callback_start(void* toxav_inst, MSICall* call) 786int callback_start(void* toxav_inst, MSICall* call)
780{ 787{
781 ToxAV* toxav = toxav_inst; 788 ToxAV* toxav = toxav_inst;
782 pthread_mutex_lock(toxav->mutex); 789 LOGGED_LOCK(toxav->mutex);
783 790
784 ToxAVCall* av_call = call_get(toxav, call->friend_id); 791 ToxAVCall* av_call = call_get(toxav, call->friend_id);
785 792
786 if (av_call == NULL) { 793 if (av_call == NULL) {
787 /* Should this ever happen? */ 794 /* Should this ever happen? */
788 pthread_mutex_unlock(toxav->mutex); 795 LOGGED_UNLOCK(toxav->mutex);
789 return -1; 796 return -1;
790 } 797 }
791 798
792 if (!call_prepare_transmission(av_call)) { 799 if (!call_prepare_transmission(av_call)) {
793 callback_error(toxav_inst, call); 800 callback_error(toxav_inst, call);
794 call_remove(av_call); 801 call_remove(av_call);
795 pthread_mutex_unlock(toxav->mutex); 802 LOGGED_UNLOCK(toxav->mutex);
796 return -1; 803 return -1;
797 } 804 }
798 805
799 if (toxav->scb.first) 806 if (toxav->scb.first)
800 toxav->scb.first(toxav, call->friend_id, call->peer_capabilities, toxav->scb.second); 807 toxav->scb.first(toxav, call->friend_id, call->peer_capabilities, toxav->scb.second);
801 808
802 pthread_mutex_unlock(toxav->mutex); 809 LOGGED_UNLOCK(toxav->mutex);
803 return 0; 810 return 0;
804} 811}
805 812
806int callback_end(void* toxav_inst, MSICall* call) 813int callback_end(void* toxav_inst, MSICall* call)
807{ 814{
808 ToxAV* toxav = toxav_inst; 815 ToxAV* toxav = toxav_inst;
809 pthread_mutex_lock(toxav->mutex); 816 LOGGED_LOCK(toxav->mutex);
810 817
811 if (toxav->scb.first) 818 if (toxav->scb.first)
812 toxav->scb.first(toxav, call->friend_id, TOXAV_CALL_STATE_END, toxav->scb.second); 819 toxav->scb.first(toxav, call->friend_id, TOXAV_CALL_STATE_END, toxav->scb.second);
@@ -814,14 +821,14 @@ int callback_end(void* toxav_inst, MSICall* call)
814 call_kill_transmission(call->av_call); 821 call_kill_transmission(call->av_call);
815 call_remove(call->av_call); 822 call_remove(call->av_call);
816 823
817 pthread_mutex_unlock(toxav->mutex); 824 LOGGED_UNLOCK(toxav->mutex);
818 return 0; 825 return 0;
819} 826}
820 827
821int callback_error(void* toxav_inst, MSICall* call) 828int callback_error(void* toxav_inst, MSICall* call)
822{ 829{
823 ToxAV* toxav = toxav_inst; 830 ToxAV* toxav = toxav_inst;
824 pthread_mutex_lock(toxav->mutex); 831 LOGGED_LOCK(toxav->mutex);
825 832
826 if (toxav->scb.first) 833 if (toxav->scb.first)
827 toxav->scb.first(toxav, call->friend_id, TOXAV_CALL_STATE_ERROR, toxav->scb.second); 834 toxav->scb.first(toxav, call->friend_id, TOXAV_CALL_STATE_ERROR, toxav->scb.second);
@@ -829,21 +836,21 @@ int callback_error(void* toxav_inst, MSICall* call)
829 call_kill_transmission(call->av_call); 836 call_kill_transmission(call->av_call);
830 call_remove(call->av_call); 837 call_remove(call->av_call);
831 838
832 pthread_mutex_unlock(toxav->mutex); 839 LOGGED_UNLOCK(toxav->mutex);
833 return 0; 840 return 0;
834} 841}
835 842
836int callback_capabilites(void* toxav_inst, MSICall* call) 843int callback_capabilites(void* toxav_inst, MSICall* call)
837{ 844{
838 ToxAV* toxav = toxav_inst; 845 ToxAV* toxav = toxav_inst;
839 pthread_mutex_lock(toxav->mutex); 846 LOGGED_LOCK(toxav->mutex);
840 847
841 /* TODO modify cs? */ 848 /* TODO modify cs? */
842 849
843 if (toxav->scb.first) 850 if (toxav->scb.first)
844 toxav->scb.first(toxav, call->friend_id, call->peer_capabilities, toxav->scb.second); 851 toxav->scb.first(toxav, call->friend_id, call->peer_capabilities, toxav->scb.second);
845 852
846 pthread_mutex_unlock(toxav->mutex); 853 LOGGED_UNLOCK(toxav->mutex);
847 return 0; 854 return 0;
848} 855}
849 856
@@ -969,14 +976,14 @@ bool call_prepare_transmission(ToxAVCall* call)
969 return true; 976 return true;
970 } 977 }
971 978
972 if (pthread_mutex_init(call->mutex_audio_sending, NULL) != 0) 979 if (create_recursive_mutex(call->mutex_audio_sending) != 0)
973 return false; 980 return false;
974 981
975 if (pthread_mutex_init(call->mutex_video_sending, NULL) != 0) { 982 if (create_recursive_mutex(call->mutex_video_sending) != 0) {
976 goto AUDIO_SENDING_MUTEX_CLEANUP; 983 goto AUDIO_SENDING_MUTEX_CLEANUP;
977 } 984 }
978 985
979 if (pthread_mutex_init(call->mutex_decoding, NULL) != 0) { 986 if (create_recursive_mutex(call->mutex_decoding) != 0) {
980 goto VIDEO_SENDING_MUTEX_CLEANUP; 987 goto VIDEO_SENDING_MUTEX_CLEANUP;
981 } 988 }
982 989
@@ -1058,12 +1065,12 @@ void call_kill_transmission(ToxAVCall* call)
1058 rtp_kill(call->rtps[video_index]); 1065 rtp_kill(call->rtps[video_index]);
1059 call->rtps[video_index] = NULL; 1066 call->rtps[video_index] = NULL;
1060 1067
1061 pthread_mutex_lock(call->mutex_audio_sending); 1068 LOGGED_LOCK(call->mutex_audio_sending);
1062 pthread_mutex_unlock(call->mutex_audio_sending); 1069 LOGGED_UNLOCK(call->mutex_audio_sending);
1063 pthread_mutex_lock(call->mutex_video_sending); 1070 LOGGED_LOCK(call->mutex_video_sending);
1064 pthread_mutex_unlock(call->mutex_video_sending); 1071 LOGGED_UNLOCK(call->mutex_video_sending);
1065 pthread_mutex_lock(call->mutex_decoding); 1072 LOGGED_LOCK(call->mutex_decoding);
1066 pthread_mutex_unlock(call->mutex_decoding); 1073 LOGGED_UNLOCK(call->mutex_decoding);
1067 1074
1068 cs_kill(call->cs); 1075 cs_kill(call->cs);
1069 call->cs = NULL; 1076 call->cs = NULL;