diff options
-rw-r--r-- | auto_tests/toxav_basic_test.c | 53 | ||||
-rw-r--r-- | other/apidsl/toxav.in.h | 4 | ||||
-rw-r--r-- | toxav/toxav.c | 83 | ||||
-rw-r--r-- | toxav/toxav.h | 4 |
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 | ||
39 | typedef struct { | 40 | typedef 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 | ||
597 | bool toxav_audio_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, bool force, TOXAV_ERR_SET_BIT_RATE* error) | 597 | bool 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 | ||
657 | bool toxav_video_bit_rate_set(ToxAV* av, uint32_t friend_number, uint32_t video_bit_rate, bool force, TOXAV_ERR_SET_BIT_RATE* error) | 680 | bool 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, |