summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--auto_tests/toxav_basic_test.c53
-rw-r--r--other/apidsl/toxav.in.h4
-rw-r--r--toxav/toxav.c83
-rw-r--r--toxav/toxav.h4
4 files changed, 132 insertions, 12 deletions
diff --git a/auto_tests/toxav_basic_test.c b/auto_tests/toxav_basic_test.c
index abe5d034..2735635f 100644
--- a/auto_tests/toxav_basic_test.c
+++ b/auto_tests/toxav_basic_test.c
@@ -34,6 +34,7 @@
34#define TEST_REJECT 1 34#define TEST_REJECT 1
35#define TEST_CANCEL 1 35#define TEST_CANCEL 1
36#define TEST_MUTE_UNMUTE 1 36#define TEST_MUTE_UNMUTE 1
37#define TEST_STOP_RESUME_PAYLOAD 1
37 38
38 39
39typedef struct { 40typedef struct {
@@ -424,6 +425,58 @@ START_TEST(test_AV_flows)
424 printf("Success!\n"); 425 printf("Success!\n");
425 } 426 }
426 427
428 if (TEST_STOP_RESUME_PAYLOAD) { /* Stop and resume audio/video payload */
429 printf("\nTrying stop/resume functionality...\n");
430
431 memset(&AliceCC, 0, sizeof(CallControl));
432 memset(&BobCC, 0, sizeof(CallControl));
433
434 /* Assume sending audio and video */
435 {
436 TOXAV_ERR_CALL rc;
437 toxav_call(AliceAV, 0, 48, 0, &rc);
438
439 if (rc != TOXAV_ERR_CALL_OK) {
440 printf("toxav_call failed: %d\n", rc);
441 ck_assert(0);
442 }
443 }
444
445 while (!BobCC.incoming)
446 iterate_tox(bootstrap, Alice, Bob);
447
448 {
449 TOXAV_ERR_ANSWER rc;
450 toxav_answer(BobAV, 0, 48, 0, &rc);
451
452 if (rc != TOXAV_ERR_ANSWER_OK) {
453 printf("toxav_answer failed: %d\n", rc);
454 ck_assert(0);
455 }
456 }
457
458 iterate_tox(bootstrap, Alice, Bob);
459
460 printf("Call started as audio only\n");
461 printf("Turning on video for Alice...\n");
462 ck_assert(toxav_video_bit_rate_set(AliceAV, 0, 1000, false, NULL));
463
464 iterate_tox(bootstrap, Alice, Bob);
465 ck_assert(BobCC.state & TOXAV_CALL_STATE_SENDING_V);
466
467 printf("Turning off video for Alice...\n");
468 ck_assert(toxav_video_bit_rate_set(AliceAV, 0, 0, false, NULL));
469
470 iterate_tox(bootstrap, Alice, Bob);
471 ck_assert(!(BobCC.state & TOXAV_CALL_STATE_SENDING_V));
472
473 printf("Turning off audio for Alice...\n");
474 ck_assert(toxav_audio_bit_rate_set(AliceAV, 0, 0, false, NULL));
475
476 iterate_tox(bootstrap, Alice, Bob);
477 ck_assert(!(BobCC.state & TOXAV_CALL_STATE_SENDING_A));
478 }
479
427 toxav_kill(BobAV); 480 toxav_kill(BobAV);
428 toxav_kill(AliceAV); 481 toxav_kill(AliceAV);
429 tox_kill(Bob); 482 tox_kill(Bob);
diff --git a/other/apidsl/toxav.in.h b/other/apidsl/toxav.in.h
index f3aa6f10..59a46612 100644
--- a/other/apidsl/toxav.in.h
+++ b/other/apidsl/toxav.in.h
@@ -519,6 +519,10 @@ error for send_frame {
519 */ 519 */
520 INVALID, 520 INVALID,
521 /** 521 /**
522 * Bit rate for this payload type was not set up.
523 */
524 BIT_RATE_NOT_SET,
525 /**
522 * Failed to push frame through rtp interface. 526 * Failed to push frame through rtp interface.
523 */ 527 */
524 RTP_FAILED, 528 RTP_FAILED,
diff --git a/toxav/toxav.c b/toxav/toxav.c
index c7012cb4..59afe654 100644
--- a/toxav/toxav.c
+++ b/toxav/toxav.c
@@ -596,6 +596,8 @@ void toxav_callback_audio_bit_rate_status(ToxAV* av, toxav_audio_bit_rate_status
596 596
597bool toxav_audio_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, bool force, TOXAV_ERR_SET_BIT_RATE* error) 597bool toxav_audio_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, bool force, TOXAV_ERR_SET_BIT_RATE* error)
598{ 598{
599 LOGGER_DEBUG("Setting new audio bitrate to: %d", audio_bit_rate);
600
599 TOXAV_ERR_SET_BIT_RATE rc = TOXAV_ERR_SET_BIT_RATE_OK; 601 TOXAV_ERR_SET_BIT_RATE rc = TOXAV_ERR_SET_BIT_RATE_OK;
600 ToxAVCall* call; 602 ToxAVCall* call;
601 603
@@ -604,7 +606,7 @@ bool toxav_audio_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t audio_
604 goto END; 606 goto END;
605 } 607 }
606 608
607 if (audio_bit_rate_invalid(audio_bit_rate)) { 609 if (audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate)) {
608 rc = TOXAV_ERR_SET_BIT_RATE_INVALID; 610 rc = TOXAV_ERR_SET_BIT_RATE_INVALID;
609 goto END; 611 goto END;
610 } 612 }
@@ -622,18 +624,39 @@ bool toxav_audio_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t audio_
622 goto END; 624 goto END;
623 } 625 }
624 626
627 /* Video sending is turned off; notify peer */
628 if (audio_bit_rate == 0) {
629 call->audio_bit_rate = 0;
630
631 msi_change_capabilities(call->msi_call, call->msi_call->
632 self_capabilities ^ msi_CapSAudio);
633 pthread_mutex_unlock(av->mutex);
634 goto END;
635 }
625 636
626 pthread_mutex_lock(call->mutex); 637 pthread_mutex_lock(call->mutex);
627 638
628 if (audio_bit_rate > call->audio_bit_rate && !force) 639 if (call->audio_bit_rate == 0) {
629 ba_set(&call->aba, audio_bit_rate); 640 /* The audio has been turned off before this */
630 else {
631 /* Cancel any previous non forceful bitrate change request */
632 memset(&call->aba, 0, sizeof(call->aba));
633 call->audio_bit_rate = audio_bit_rate; 641 call->audio_bit_rate = audio_bit_rate;
634 642
643 msi_change_capabilities(call->msi_call, call->
644 msi_call->self_capabilities | msi_CapSAudio);
645
635 if (!force && av->abcb.first) 646 if (!force && av->abcb.first)
636 av->abcb.first (av, call->friend_number, true, audio_bit_rate, av->abcb.second); 647 av->abcb.first (av, call->friend_number, true, audio_bit_rate, av->abcb.second);
648 } else {
649 /* The audio was active before this */
650 if (audio_bit_rate > call->audio_bit_rate && !force)
651 ba_set(&call->aba, audio_bit_rate);
652 else {
653 /* Cancel any previous non forceful bitrate change request */
654 memset(&call->aba, 0, sizeof(call->aba));
655 call->audio_bit_rate = audio_bit_rate;
656
657 if (!force && av->abcb.first)
658 av->abcb.first (av, call->friend_number, true, audio_bit_rate, av->abcb.second);
659 }
637 } 660 }
638 661
639 pthread_mutex_unlock(call->mutex); 662 pthread_mutex_unlock(call->mutex);
@@ -656,6 +679,8 @@ void toxav_callback_video_bit_rate_status(ToxAV* av, toxav_video_bit_rate_status
656 679
657bool toxav_video_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t video_bit_rate, bool force, TOXAV_ERR_SET_BIT_RATE* error) 680bool toxav_video_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t video_bit_rate, bool force, TOXAV_ERR_SET_BIT_RATE* error)
658{ 681{
682 LOGGER_DEBUG("Setting new video bitrate to: %d", video_bit_rate);
683
659 TOXAV_ERR_SET_BIT_RATE rc = TOXAV_ERR_SET_BIT_RATE_OK; 684 TOXAV_ERR_SET_BIT_RATE rc = TOXAV_ERR_SET_BIT_RATE_OK;
660 ToxAVCall* call; 685 ToxAVCall* call;
661 686
@@ -664,7 +689,7 @@ bool toxav_video_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t video_
664 goto END; 689 goto END;
665 } 690 }
666 691
667 if (video_bit_rate_invalid(video_bit_rate)) { 692 if (video_bit_rate && video_bit_rate_invalid(video_bit_rate)) {
668 rc = TOXAV_ERR_SET_BIT_RATE_INVALID; 693 rc = TOXAV_ERR_SET_BIT_RATE_INVALID;
669 goto END; 694 goto END;
670 } 695 }
@@ -682,17 +707,39 @@ bool toxav_video_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t video_
682 goto END; 707 goto END;
683 } 708 }
684 709
710 /* Video sending is turned off; notify peer */
711 if (video_bit_rate == 0) {
712 call->video_bit_rate = 0;
713
714 msi_change_capabilities(call->msi_call, call->msi_call->
715 self_capabilities ^ msi_CapSVideo);
716 pthread_mutex_unlock(av->mutex);
717 goto END;
718 }
719
685 pthread_mutex_lock(call->mutex); 720 pthread_mutex_lock(call->mutex);
686 721
687 if (video_bit_rate > call->video_bit_rate && !force) 722 if (call->video_bit_rate == 0) {
688 ba_set(&call->vba, video_bit_rate); 723 /* The video has been turned off before this */
689 else {
690 /* Cancel any previous non forceful bitrate change request */
691 memset(&call->vba, 0, sizeof(call->vba));
692 call->video_bit_rate = video_bit_rate; 724 call->video_bit_rate = video_bit_rate;
693 725
726 msi_change_capabilities(call->msi_call, call->
727 msi_call->self_capabilities | msi_CapSVideo);
728
694 if (!force && av->vbcb.first) 729 if (!force && av->vbcb.first)
695 av->vbcb.first (av, call->friend_number, true, video_bit_rate, av->vbcb.second); 730 av->vbcb.first (av, call->friend_number, true, video_bit_rate, av->vbcb.second);
731 } else {
732 /* The video was active before this */
733 if (video_bit_rate > call->video_bit_rate && !force)
734 ba_set(&call->vba, video_bit_rate);
735 else {
736 /* Cancel any previous non forceful bitrate change request */
737 memset(&call->vba, 0, sizeof(call->vba));
738 call->video_bit_rate = video_bit_rate;
739
740 if (!force && av->vbcb.first)
741 av->vbcb.first (av, call->friend_number, true, video_bit_rate, av->vbcb.second);
742 }
696 } 743 }
697 744
698 pthread_mutex_unlock(call->mutex); 745 pthread_mutex_unlock(call->mutex);
@@ -723,6 +770,12 @@ bool toxav_audio_send_frame(ToxAV* av, uint32_t friend_number, const int16_t* pc
723 goto END; 770 goto END;
724 } 771 }
725 772
773 if (call->audio_bit_rate == 0) {
774 pthread_mutex_unlock(av->mutex);
775 rc = TOXAV_ERR_SEND_FRAME_BIT_RATE_NOT_SET;
776 goto END;
777 }
778
726 pthread_mutex_lock(call->mutex_audio); 779 pthread_mutex_lock(call->mutex_audio);
727 pthread_mutex_unlock(av->mutex); 780 pthread_mutex_unlock(av->mutex);
728 781
@@ -825,6 +878,12 @@ bool toxav_video_send_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
825 goto END; 878 goto END;
826 } 879 }
827 880
881 if (call->video_bit_rate == 0) {
882 pthread_mutex_unlock(av->mutex);
883 rc = TOXAV_ERR_SEND_FRAME_BIT_RATE_NOT_SET;
884 goto END;
885 }
886
828 pthread_mutex_lock(call->mutex_video); 887 pthread_mutex_lock(call->mutex_video);
829 pthread_mutex_unlock(av->mutex); 888 pthread_mutex_unlock(av->mutex);
830 889
diff --git a/toxav/toxav.h b/toxav/toxav.h
index ffe9fbb9..2094f66c 100644
--- a/toxav/toxav.h
+++ b/toxav/toxav.h
@@ -541,6 +541,10 @@ typedef enum TOXAV_ERR_SEND_FRAME {
541 */ 541 */
542 TOXAV_ERR_SEND_FRAME_INVALID, 542 TOXAV_ERR_SEND_FRAME_INVALID,
543 /** 543 /**
544 * Bit rate for this payload type was not set up.
545 */
546 TOXAV_ERR_SEND_FRAME_BIT_RATE_NOT_SET,
547 /**
544 * Failed to push frame through rtp interface. 548 * Failed to push frame through rtp interface.
545 */ 549 */
546 TOXAV_ERR_SEND_FRAME_RTP_FAILED, 550 TOXAV_ERR_SEND_FRAME_RTP_FAILED,