diff options
author | mannol <eniz_vukovic@hotmail.com> | 2015-04-08 01:00:19 +0200 |
---|---|---|
committer | mannol <eniz_vukovic@hotmail.com> | 2015-04-08 01:00:19 +0200 |
commit | 9c003c9dd215d5f6bb2c1a0fbdc2c0f7fd9def7c (patch) | |
tree | ad682cf784489259d6ccc65c2d116cb2bbd2ba6d /toxav/toxav.c | |
parent | bf9f7e2ae8dc5f1b83c45e383ec70cb08c4caf5f (diff) |
Video works now
Diffstat (limited to 'toxav/toxav.c')
-rw-r--r-- | toxav/toxav.c | 167 |
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 | ||
206 | void toxav_iterate(ToxAV* av) | 205 | void 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 | ||
243 | bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error) | 250 | bool 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 | ||
274 | void toxav_callback_call(ToxAV* av, toxav_call_cb* function, void* user_data) | 281 | void 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 | ||
282 | bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_ANSWER* error) | 289 | bool 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 | ||
322 | END: | 329 | END: |
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 | ||
331 | void toxav_callback_call_state(ToxAV* av, toxav_call_state_cb* function, void* user_data) | 338 | void 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 | ||
339 | bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL control, TOXAV_ERR_CALL_CONTROL* error) | 346 | bool 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 | ||
476 | END: | 483 | END: |
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 | ||
512 | END: | 519 | END: |
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 | ||
546 | END: | 553 | END: |
547 | if (error) | 554 | if (error) |
@@ -552,10 +559,10 @@ END: | |||
552 | 559 | ||
553 | void toxav_callback_video_frame_request(ToxAV* av, toxav_video_frame_request_cb* function, void* user_data) | 560 | void 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 | ||
561 | bool 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 | bool 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 | ||
653 | END: | 660 | END: |
654 | if (error) | 661 | if (error) |
@@ -659,10 +666,10 @@ END: | |||
659 | 666 | ||
660 | void toxav_callback_audio_frame_request(ToxAV* av, toxav_audio_frame_request_cb* function, void* user_data) | 667 | void 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 | ||
668 | bool 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 | bool 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 | ||
727 | END: | 734 | END: |
728 | if (error) | 735 | if (error) |
@@ -733,18 +740,18 @@ END: | |||
733 | 740 | ||
734 | void toxav_callback_receive_video_frame(ToxAV* av, toxav_receive_video_frame_cb* function, void* user_data) | 741 | void 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 | ||
742 | void toxav_callback_receive_audio_frame(ToxAV* av, toxav_receive_audio_frame_cb* function, void* user_data) | 749 | void 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* | |||
756 | int callback_invite(void* toxav_inst, MSICall* call) | 763 | int 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 | ||
779 | int callback_start(void* toxav_inst, MSICall* call) | 786 | int 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 | ||
806 | int callback_end(void* toxav_inst, MSICall* call) | 813 | int 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 | ||
821 | int callback_error(void* toxav_inst, MSICall* call) | 828 | int 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 | ||
836 | int callback_capabilites(void* toxav_inst, MSICall* call) | 843 | int 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; |