From eb6e8aa290a7423b666d037981fb453a6f897861 Mon Sep 17 00:00:00 2001 From: mannol Date: Fri, 1 May 2015 22:15:12 +0200 Subject: [PATCH] Fixed* api comments and some bugs --- auto_tests/toxav_basic_test.c | 77 +++++++++++++++++------------------ auto_tests/toxav_many_test.c | 36 ++++++++-------- toxav/toxav.c | 48 ++++++++++++++++------ toxav/toxav.h | 62 ++++++++++++---------------- toxav/video.c | 5 ++- 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 @@ #include #include #include -#include #include @@ -103,7 +102,7 @@ void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t (void) userdata; if (length == 7 && memcmp("gentoo", data, 7) == 0) { - assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); + ck_assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); } } @@ -133,13 +132,13 @@ START_TEST(test_AV_flows) TOX_ERR_NEW error; bootstrap = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); Alice = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); Bob = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); } printf("Created 3 instances of Tox\n"); @@ -153,7 +152,7 @@ START_TEST(test_AV_flows) tox_self_get_address(Alice, address); - assert(tox_friend_add(Bob, address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + ck_assert(tox_friend_add(Bob, address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); uint8_t off = 1; @@ -178,10 +177,10 @@ START_TEST(test_AV_flows) { TOXAV_ERR_NEW error; AliceAV = toxav_new(Alice, &error); - assert(error == TOXAV_ERR_NEW_OK); + ck_assert(error == TOXAV_ERR_NEW_OK); BobAV = toxav_new(Bob, &error); - assert(error == TOXAV_ERR_NEW_OK); + ck_assert(error == TOXAV_ERR_NEW_OK); } toxav_callback_call(AliceAV, t_toxav_call_cb, &AliceCC); @@ -208,7 +207,7 @@ START_TEST(test_AV_flows) \ if (rc != TOXAV_ERR_CALL_OK) { \ printf("toxav_call failed: %d\n", rc); \ - exit(1); \ + ck_assert(0); \ } \ \ \ @@ -223,7 +222,7 @@ START_TEST(test_AV_flows) \ if (rc != TOXAV_ERR_ANSWER_OK) { \ printf("toxav_answer failed: %d\n", rc); \ - exit(1); \ + ck_assert(0); \ } \ BobCC.incoming = false; \ } else { \ @@ -236,7 +235,7 @@ START_TEST(test_AV_flows) \ if (rc != TOXAV_ERR_CALL_CONTROL_OK) { \ printf("toxav_call_control failed: %d\n", rc); \ - exit(1); \ + ck_assert(0); \ } \ } \ } \ @@ -275,7 +274,7 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_CALL_OK) { printf("toxav_call failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -289,7 +288,7 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_CALL_CONTROL_OK) { printf("toxav_call_control failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -311,7 +310,7 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_CALL_OK) { printf("toxav_call failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -325,7 +324,7 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_CALL_CONTROL_OK) { printf("toxav_call_control failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -349,7 +348,7 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_CALL_OK) { printf("toxav_call failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -357,10 +356,10 @@ START_TEST(test_AV_flows) iterate_tox(bootstrap, Alice, Bob); /* At first try all stuff while in invalid state */ - assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); - assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); - assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); - assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL)); + ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); + ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); + ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); + ck_assert(!toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL)); { TOXAV_ERR_ANSWER rc; @@ -368,7 +367,7 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_ANSWER_OK) { printf("toxav_answer failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -376,36 +375,36 @@ START_TEST(test_AV_flows) /* Pause and Resume */ printf("Pause and Resume\n"); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state == TOXAV_CALL_STATE_PAUSED); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); + ck_assert(BobCC.state == TOXAV_CALL_STATE_PAUSED); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state & (TOXAV_CALL_STATE_SENDING_A | TOXAV_CALL_STATE_SENDING_V)); + ck_assert(BobCC.state & (TOXAV_CALL_STATE_SENDING_A | TOXAV_CALL_STATE_SENDING_V)); /* Mute/Unmute single */ printf("Mute/Unmute single\n"); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); + ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); + ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); /* Mute/Unmute both */ printf("Mute/Unmute both\n"); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL)); + ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_A); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_V); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); + ck_assert(BobCC.state ^ TOXAV_CALL_STATE_RECEIVING_V); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_AUDIO, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); - assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, NULL)); + ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_A); + ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO, NULL)); iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_V); + ck_assert(BobCC.state & TOXAV_CALL_STATE_RECEIVING_V); { TOXAV_ERR_CALL_CONTROL rc; @@ -413,12 +412,12 @@ START_TEST(test_AV_flows) if (rc != TOXAV_ERR_CALL_CONTROL_OK) { printf("toxav_call_control failed: %d\n", rc); - exit(1); + ck_assert(0); } } iterate_tox(bootstrap, Alice, Bob); - assert(BobCC.state == TOXAV_CALL_STATE_END); + ck_assert(BobCC.state == TOXAV_CALL_STATE_END); printf("Success!\n"); } 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 @@ #include #include #include -#include #include +#include "helpers.h" + #include "../toxcore/tox.h" #include "../toxcore/util.h" #include "../toxcore/logger.h" @@ -97,7 +98,7 @@ void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t { (void) userdata; if (length == 7 && memcmp("gentoo", data, 7) == 0) { - assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); + ck_assert(tox_friend_add_norequest(m, public_key, NULL) != (uint32_t) ~0); } } @@ -110,7 +111,7 @@ ToxAV* setup_av_instance(Tox* tox, CallControl *CC) TOXAV_ERR_NEW error; ToxAV* av = toxav_new(tox, &error); - assert(error == TOXAV_ERR_NEW_OK); + ck_assert(error == TOXAV_ERR_NEW_OK); toxav_callback_call(av, t_toxav_call_cb, CC); toxav_callback_call_state(av, t_toxav_call_state_cb, CC); @@ -137,7 +138,7 @@ void* call_thread(void* pd) if (rc != TOXAV_ERR_CALL_OK) { printf("toxav_call failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -150,7 +151,7 @@ void* call_thread(void* pd) if (rc != TOXAV_ERR_ANSWER_OK) { printf("toxav_answer failed: %d\n", rc); - exit(1); + ck_assert(0); } } @@ -167,7 +168,7 @@ void* call_thread(void* pd) memset(video_v, 0, sizeof(video_v)); time_t start_time = time(NULL); - while(time(NULL) - start_time < 9) { + while(time(NULL) - start_time < 4) { toxav_iterate(AliceAV); toxav_iterate(BobAV); @@ -186,11 +187,13 @@ void* call_thread(void* pd) if (rc != TOXAV_ERR_CALL_CONTROL_OK) { printf("toxav_call_control failed: %d\n", rc); - exit(1); + ck_assert(0); } } c_sleep(30); + + printf ("Closing thread\n"); pthread_exit(NULL); } @@ -206,19 +209,19 @@ START_TEST(test_AV_three_calls) TOX_ERR_NEW error; bootstrap = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); Alice = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); Bobs[0] = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); Bobs[1] = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); Bobs[2] = tox_new(NULL, NULL, 0, &error); - assert(error == TOX_ERR_NEW_OK); + ck_assert(error == TOX_ERR_NEW_OK); } printf("Created 5 instances of Tox\n"); @@ -232,9 +235,9 @@ START_TEST(test_AV_three_calls) tox_self_get_address(Alice, address); - assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); - assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); - assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + ck_assert(tox_friend_add(Bobs[0], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + ck_assert(tox_friend_add(Bobs[1], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); + ck_assert(tox_friend_add(Bobs[2], address, (uint8_t *)"gentoo", 7, NULL) != (uint32_t) ~0); uint8_t off = 1; @@ -302,7 +305,7 @@ START_TEST(test_AV_three_calls) (void) pthread_detach(tids[2]); time_t start_time = time(NULL); - while (time(NULL) - start_time < 10) { + while (time(NULL) - start_time < 5) { tox_iterate(Alice); tox_iterate(Bobs[0]); tox_iterate(Bobs[1]); @@ -314,6 +317,7 @@ START_TEST(test_AV_three_calls) (void) pthread_join(tids[1], NULL); (void) pthread_join(tids[2], NULL); + printf ("Killing all instances\n"); toxav_kill(BobsAV[0]); toxav_kill(BobsAV[1]); 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 { struct ToxAVCall_s *next; } ToxAVCall; -struct toxAV { +struct ToxAV { Messenger* m; MSISession* msi; @@ -116,7 +116,7 @@ bool video_bit_rate_invalid(uint32_t bit_rate); void invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); -void call_remove(ToxAVCall* call); +ToxAVCall* call_remove(ToxAVCall* call); bool call_prepare_transmission(ToxAVCall* call); void call_kill_transmission(ToxAVCall* call); void ba_set(ToxAvBitrateAdapter* ba, uint32_t bit_rate); @@ -193,9 +193,9 @@ void toxav_kill(ToxAV* av) /* Msi kill will hang up all calls so just clean these calls */ if (av->calls) { ToxAVCall* it = call_get(av, av->calls_head); - for (; it; it = it->next) { + while (it) { call_kill_transmission(it); - call_remove(it); /* This will eventually free av->calls */ + it = call_remove(it); /* This will eventually free av->calls */ } } @@ -318,6 +318,14 @@ void toxav_iterate(ToxAV* av) bool toxav_call(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, uint32_t video_bit_rate, TOXAV_ERR_CALL* error) { + if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate)) + ||(video_bit_rate && video_bit_rate_invalid(video_bit_rate)) + ) { + if (error) + *error = TOXAV_ERR_CALL_INVALID_BIT_RATE; + return false; + } + pthread_mutex_lock(av->mutex); ToxAVCall* call = call_new(av, friend_number, error); if (call == NULL) { @@ -368,7 +376,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui if ((audio_bit_rate && audio_bit_rate_invalid(audio_bit_rate)) ||(video_bit_rate && video_bit_rate_invalid(video_bit_rate)) ) { - rc = TOXAV_ERR_CALL_INVALID_BIT_RATE; + rc = TOXAV_ERR_ANSWER_INVALID_BIT_RATE; goto END; } @@ -379,7 +387,7 @@ bool toxav_answer(ToxAV* av, uint32_t friend_number, uint32_t audio_bit_rate, ui } if (!call_prepare_transmission(call)) { - rc = TOXAV_ERR_ANSWER_MALLOC; + rc = TOXAV_ERR_ANSWER_CODEC_INITIALIZATION; goto END; } @@ -450,6 +458,9 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co rtp_start_receiving(call->audio.first); rtp_start_receiving(call->video.first); + } else { + rc = TOXAV_ERR_CALL_CONTROL_NOT_PAUSED; + goto END; } } break; @@ -472,6 +483,9 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co rtp_stop_receiving(call->audio.first); rtp_stop_receiving(call->video.first); + } else { + rc = TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED; + goto END; } } break; @@ -516,7 +530,7 @@ bool toxav_call_control(ToxAV* av, uint32_t friend_number, TOXAV_CALL_CONTROL co } } break; - case TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO: { + case TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO: { if (!call->active) { rc = TOXAV_ERR_CALL_CONTROL_FRIEND_NOT_IN_CALL; goto END; @@ -589,7 +603,7 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_ goto END; } - if (call->video_bit_rate == video_bit_rate || call->vba.active || call->vba.bit_rate == video_bit_rate) { + if (call->video_bit_rate == video_bit_rate || (call->vba.active && call->vba.bit_rate == video_bit_rate)) { pthread_mutex_unlock(av->mutex); goto END; } @@ -599,6 +613,8 @@ bool toxav_set_video_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t video_ if (video_bit_rate > call->video_bit_rate && !force) ba_set(&call->vba, video_bit_rate); else { + /* Cancel any previous non forceful bitrate change request */ + memset(&call->vba, 0, sizeof(call->vba)); call->video_bit_rate = video_bit_rate; if (!force && av->vbcb.first) @@ -646,16 +662,19 @@ bool toxav_set_audio_bit_rate(ToxAV* av, uint32_t friend_number, uint32_t audio_ goto END; } - if (call->audio_bit_rate == audio_bit_rate || call->aba.active || call->aba.bit_rate == audio_bit_rate) { + if (call->audio_bit_rate == audio_bit_rate || (call->aba.active && call->aba.bit_rate == audio_bit_rate)) { pthread_mutex_unlock(av->mutex); goto END; } + pthread_mutex_lock(call->mutex); if (audio_bit_rate > call->audio_bit_rate && !force) ba_set(&call->aba, audio_bit_rate); else { + /* Cancel any previous non forceful bitrate change request */ + memset(&call->aba, 0, sizeof(call->aba)); call->audio_bit_rate = audio_bit_rate; if (!force && av->abcb.first) @@ -755,6 +774,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u if (rtp_send_data(call->video.first, iter, part_size, false) < 0) { pthread_mutex_unlock(call->mutex_video); LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); + rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED; goto END; } } @@ -807,6 +827,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u if (rtp_send_data(call->video.first, pkt->data.frame.buf + i * 1300, 1300, true) < 0) { pthread_mutex_unlock(call->mutex_video); LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); + rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED; goto END; } } @@ -815,6 +836,7 @@ bool toxav_send_video_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u if (rtp_send_data(call->video.first, pkt->data.frame.buf + parts * 1300, pkt->data.frame.sz % 1300, true) < 0) { pthread_mutex_unlock(call->mutex_video); LOGGER_WARNING("Could not send video frame: %s\n", strerror(errno)); + rc = TOXAV_ERR_SEND_FRAME_RTP_FAILED; goto END; } } @@ -1157,10 +1179,10 @@ ToxAVCall* call_get(ToxAV* av, uint32_t friend_number) return av->calls[friend_number]; } -void call_remove(ToxAVCall* call) +ToxAVCall* call_remove(ToxAVCall* call) { if (call == NULL) - return; + return NULL; uint32_t friend_number = call->friend_number; ToxAV* av = call->av; @@ -1183,12 +1205,14 @@ void call_remove(ToxAVCall* call) else goto CLEAR; av->calls[friend_number] = NULL; - return; + return next; CLEAR: av->calls_head = av->calls_tail = 0; free(av->calls); av->calls = NULL; + + return NULL; } bool 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" { /** * The type of the Tox Audio/Video subsystem object. */ -typedef struct toxAV ToxAV; +typedef struct ToxAV ToxAV; #ifndef TOX_DEFINED #define TOX_DEFINED /** @@ -92,8 +92,8 @@ Tox *toxav_get_tox(ToxAV *av); uint32_t toxav_iteration_interval(ToxAV const *av); /** * Main loop for the session. This function needs to be called in intervals of - * toxav_iteration_interval() milliseconds. It is best called in the same loop - * as tox_iterate. + * toxav_iteration_interval() milliseconds. It is best called in the separate + * thread from tox_iterate. */ void toxav_iterate(ToxAV *av); /******************************************************************************* @@ -153,10 +153,11 @@ void toxav_callback_call(ToxAV *av, toxav_call_cb *function, void *user_data); typedef enum TOXAV_ERR_ANSWER { TOXAV_ERR_ANSWER_OK, /** - * A resource allocation error occurred while trying to create the structures - * required for the call. + * Failed to initialize codecs for call session. Note that codec initiation + * will fail if there is no receive callback registered for either audio or + * video. */ - TOXAV_ERR_ANSWER_MALLOC, + TOXAV_ERR_ANSWER_CODEC_INITIALIZATION, /** * The friend number did not designate a valid friend. */ @@ -174,8 +175,8 @@ typedef enum TOXAV_ERR_ANSWER { /** * Accept an incoming call. * - * If an allocation error occurs while answering a call, both participants will - * receive TOXAV_CALL_STATE_ERROR and the call will end. + * If answering fails for any reason, the call will still be pending and it is + * possible to try and answer it later. * * @param friend_number The friend number of the friend that is calling. * @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 { */ TOXAV_CALL_STATE_END = 16, /** - * Set by the AV core if an error occurred on the remote end. + * Set by the AV core if an error occurred on the remote end. This call + * state will never be triggered in combination with other call states. */ TOXAV_CALL_STATE_ERROR = 32768 } TOXAV_CALL_STATE; @@ -266,10 +268,10 @@ typedef enum TOXAV_CALL_CONTROL { * Request that the friend stops sending video. Regardless of the friend's * compliance, this will cause the `receive_video_frame` event to stop being * triggered on receiving an video frame from the friend. If the video was - * already muted, calling this control will notify client to start sending + * already hidden, calling this control will notify client to start sending * video again. */ - TOXAV_CALL_CONTROL_TOGGLE_MUTE_VIDEO, + TOXAV_CALL_CONTROL_TOGGLE_HIDE_VIDEO } TOXAV_CALL_CONTROL; typedef enum TOXAV_ERR_CALL_CONTROL { TOXAV_ERR_CALL_CONTROL_OK, @@ -286,21 +288,12 @@ typedef enum TOXAV_ERR_CALL_CONTROL { * Attempted to resume a call that was not paused. */ TOXAV_ERR_CALL_CONTROL_NOT_PAUSED, - /** - * Attempted to resume a call that was paused by the other party. Also set if - * the client attempted to send a system-only control. - */ - TOXAV_ERR_CALL_CONTROL_DENIED, /** * The call was already paused on this client. It is valid to pause if the * other party paused the call. The call will resume after both parties sent * the RESUME control. */ - TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED, - /** - * Tried to unmute a call that was not already muted. - */ - TOXAV_ERR_CALL_CONTROL_NOT_MUTED + TOXAV_ERR_CALL_CONTROL_ALREADY_PAUSED } TOXAV_ERR_CALL_CONTROL; /** * 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 */ void toxav_callback_audio_bit_rate_status(ToxAV *av, toxav_audio_bit_rate_status_cb *function, void *user_data); /** - * Set the audio bit rate to be used in subsequent audio frames. + * Set the audio bit rate to be used in subsequent audio frames. If the passed + * bit rate is the same as the current bit rate this function will return true + * without calling a callback. If there is an active non forceful setup with the + * passed audio bit rate and the new set request is forceful, the bit rate is + * forcefully set and the previous non forceful request is cancelled. The active + * non forceful setup will be canceled in favour of new non forceful setup. * * @param friend_number The friend number of the friend for which to set the * audio bit rate. @@ -380,7 +378,12 @@ typedef void toxav_video_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, b */ void toxav_callback_video_bit_rate_status(ToxAV *av, toxav_video_bit_rate_status_cb *function, void *user_data); /** - * Set the video bit rate to be used in subsequent video frames. + * Set the video bit rate to be used in subsequent video frames. If the passed + * bit rate is the same as the current bit rate this function will return true + * without calling a callback. If there is an active non forceful setup with the + * passed bit rate and the new set request is forceful, the bit rate is + * forcefully set and the previous non forceful request is cancelled. The active + * non forceful setup will be canceled in favour of new non forceful setup. * * @param friend_number The friend number of the friend for which to set the * video bit rate. @@ -413,11 +416,6 @@ typedef enum TOXAV_ERR_SEND_FRAME { * This client is currently not in a call with the friend. */ TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL, - /** - * No video frame had been requested through the `video_frame_request` event, - * but the client tried to send one, anyway. - */ - TOXAV_ERR_SEND_FRAME_NOT_REQUESTED, /** * One of the frame parameters was invalid. E.g. the resolution may be too * small or too large, or the audio sampling rate may be unsupported. @@ -431,8 +429,6 @@ typedef enum TOXAV_ERR_SEND_FRAME { /** * Send a video frame to a friend. * - * This is called in response to receiving the `video_frame_request` event. - * * Y - plane should be of size: height * width * U - plane should be of size: (height/2) * (width/2) * 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, /** * Send an audio frame to a friend. * - * This is called in response to receiving the `audio_frame_request` event. - * * The expected format of the PCM data is: [s1c1][s1c2][...][s2c1][s2c2][...]... * Meaning: sample 1 for channel 1, sample 1 for channel 2, ... * 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, * @param sample_count Number of samples in this frame. Valid numbers here are * ((sample rate) * (audio length) / 1000), where audio length can be * 2.5, 5, 10, 20, 40 or 60 millseconds. - * @param channels Number of audio channels. Must be at least 1 for mono. - * For voice over IP, more than 2 channels (stereo) typically doesn't make - * sense, but up to 255 channels are supported. + * @param channels Number of audio channels. Supported values are 1 and 2. * @param sampling_rate Audio sampling rate used in this frame. Valid sampling * rates are 8000, 12000, 16000, 24000, or 48000. */ 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 vc->vcb.second = cb_data; vc->friend_number = friend_number; vc->peer_video_frame_piece_size = mvfpsz; + vc->av = av; return vc; @@ -294,7 +295,7 @@ int vc_reconfigure_encoder(VCSession* vc, int32_t bit_rate, uint16_t width, uint return -1; vpx_codec_enc_cfg_t cfg = *vc->encoder->config.enc; - if (cfg.rc_target_bitrate == bit_rate && cfg.g_w == width && cfg.g_h == height) + if (cfg.rc_target_bitrate == (uint32_t) bit_rate && cfg.g_w == width && cfg.g_h == height) return 0; /* Nothing changed */ cfg.rc_target_bitrate = bit_rate; @@ -315,7 +316,7 @@ int vc_reconfigure_test_encoder(VCSession* vc, int32_t bit_rate, uint16_t width, return -1; vpx_codec_enc_cfg_t cfg = *vc->test_encoder->config.enc; - if (cfg.rc_target_bitrate == bit_rate && cfg.g_w == width && cfg.g_h == height) + if (cfg.rc_target_bitrate == (uint32_t) bit_rate && cfg.g_w == width && cfg.g_h == height) return 0; /* Nothing changed */ cfg.rc_target_bitrate = bit_rate;