Implement handling capability change on rtp level

This commit is contained in:
mannol 2015-06-30 01:41:38 +02:00
parent 13148d7d7c
commit 6c126e34e6
5 changed files with 107 additions and 10 deletions

View File

@ -35,6 +35,7 @@
#define TEST_CANCEL 1 #define TEST_CANCEL 1
#define TEST_MUTE_UNMUTE 1 #define TEST_MUTE_UNMUTE 1
#define TEST_STOP_RESUME_PAYLOAD 1 #define TEST_STOP_RESUME_PAYLOAD 1
#define TEST_PAUSE_RESUME_SEND 1
typedef struct { typedef struct {
@ -82,6 +83,7 @@ void t_toxav_receive_video_frame_cb(ToxAV *av, uint32_t friend_number,
(void) ustride; (void) ustride;
(void) vstride; (void) vstride;
(void) user_data; (void) user_data;
printf("Received video payload\n");
} }
void t_toxav_receive_audio_frame_cb(ToxAV *av, uint32_t friend_number, void t_toxav_receive_audio_frame_cb(ToxAV *av, uint32_t friend_number,
int16_t const *pcm, int16_t const *pcm,
@ -97,6 +99,7 @@ void t_toxav_receive_audio_frame_cb(ToxAV *av, uint32_t friend_number,
(void) channels; (void) channels;
(void) sampling_rate; (void) sampling_rate;
(void) user_data; (void) user_data;
printf("Received audio payload\n");
} }
void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t *data, size_t length, void *userdata) void t_accept_friend_request_cb(Tox *m, const uint8_t *public_key, const uint8_t *data, size_t length, void *userdata)
{ {
@ -475,6 +478,80 @@ START_TEST(test_AV_flows)
iterate_tox(bootstrap, Alice, Bob); iterate_tox(bootstrap, Alice, Bob);
ck_assert(!(BobCC.state & TOXAV_FRIEND_CALL_STATE_SENDING_A)); ck_assert(!(BobCC.state & TOXAV_FRIEND_CALL_STATE_SENDING_A));
{
TOXAV_ERR_CALL_CONTROL rc;
toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_CANCEL, &rc);
if (rc != TOXAV_ERR_CALL_CONTROL_OK) {
printf("toxav_call_control failed: %d\n", rc);
ck_assert(0);
}
}
iterate_tox(bootstrap, Alice, Bob);
ck_assert(BobCC.state == TOXAV_FRIEND_CALL_STATE_FINISHED);
printf("Success!\n");
}
if (TEST_PAUSE_RESUME_SEND) { /* Stop and resume audio/video payload and test send options */
printf("\nTrying stop/resume functionality...\n");
memset(&AliceCC, 0, sizeof(CallControl));
memset(&BobCC, 0, sizeof(CallControl));
/* Assume sending audio and video */
{
TOXAV_ERR_CALL rc;
toxav_call(AliceAV, 0, 48, 0, &rc);
if (rc != TOXAV_ERR_CALL_OK) {
printf("toxav_call failed: %d\n", rc);
ck_assert(0);
}
}
while (!BobCC.incoming)
iterate_tox(bootstrap, Alice, Bob);
{
TOXAV_ERR_ANSWER rc;
toxav_answer(BobAV, 0, 48, 0, &rc);
if (rc != TOXAV_ERR_ANSWER_OK) {
printf("toxav_answer failed: %d\n", rc);
ck_assert(0);
}
}
int16_t PCM[5670];
iterate_tox(bootstrap, Alice, Bob);
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_PAUSE, NULL));
iterate_tox(bootstrap, Alice, Bob);
ck_assert(!toxav_audio_send_frame(AliceAV, 0, PCM, 960, 1, 48000, NULL));
ck_assert(!toxav_audio_send_frame(BobAV, 0, PCM, 960, 1, 48000, NULL));
ck_assert(toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_RESUME, NULL));
iterate_tox(bootstrap, Alice, Bob);
ck_assert(toxav_audio_send_frame(AliceAV, 0, PCM, 960, 1, 48000, NULL));
ck_assert(toxav_audio_send_frame(BobAV, 0, PCM, 960, 1, 48000, NULL));
iterate_tox(bootstrap, Alice, Bob);
{
TOXAV_ERR_CALL_CONTROL rc;
toxav_call_control(AliceAV, 0, TOXAV_CALL_CONTROL_CANCEL, &rc);
if (rc != TOXAV_ERR_CALL_CONTROL_OK) {
printf("toxav_call_control failed: %d\n", rc);
ck_assert(0);
}
}
iterate_tox(bootstrap, Alice, Bob);
ck_assert(BobCC.state == TOXAV_FRIEND_CALL_STATE_FINISHED);
printf("Success!\n");
} }
toxav_kill(BobAV); toxav_kill(BobAV);

View File

@ -216,7 +216,8 @@ void iterate();
* *
* It is the client's responsibility to stop ringing after a certain timeout, * It is the client's responsibility to stop ringing after a certain timeout,
* if such behaviour is desired. If the client does not stop ringing, the * if such behaviour is desired. If the client does not stop ringing, the
* library will not stop until the friend is disconnected. * library will not stop until the friend is disconnected. Audio and video
* receiving are both enabled by default.
* *
* @param friend_number The friend number of the friend that should be called. * @param friend_number The friend number of the friend that should be called.
* @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable * @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable
@ -262,7 +263,8 @@ event call {
* Accept an incoming call. * Accept an incoming call.
* *
* If answering fails for any reason, the call will still be pending and it is * If answering fails for any reason, the call will still be pending and it is
* possible to try and answer it later. * possible to try and answer it later. Audio and video receiving are both
* enabled by default.
* *
* @param friend_number The friend number of the friend that is calling. * @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 * @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable
@ -519,9 +521,10 @@ error for send_frame {
*/ */
INVALID, INVALID,
/** /**
* Bit rate for this payload type was not set up. * Either friend turned off audio or video receiving or we turned off sending
* for the said payload.
*/ */
BIT_RATE_NOT_SET, PAYLOAD_TYPE_DISABLED,
/** /**
* Failed to push frame through rtp interface. * Failed to push frame through rtp interface.
*/ */

View File

@ -221,6 +221,7 @@ int rtp_start_receiving(RTPSession* session)
return -1; return -1;
} }
LOGGER_DEBUG("Started receiving on session: %p", session);
return 0; return 0;
} }
int rtp_stop_receiving(RTPSession* session) int rtp_stop_receiving(RTPSession* session)
@ -231,6 +232,7 @@ int rtp_stop_receiving(RTPSession* session)
m_callback_rtp_packet(session->m, session->friend_number, session->prefix, NULL, NULL); m_callback_rtp_packet(session->m, session->friend_number, session->prefix, NULL, NULL);
m_callback_rtp_packet(session->m, session->friend_number, session->rtcp_session->prefix, NULL, NULL); /* RTCP */ m_callback_rtp_packet(session->m, session->friend_number, session->rtcp_session->prefix, NULL, NULL); /* RTCP */
LOGGER_DEBUG("Stopped receiving on session: %p", session);
return 0; return 0;
} }
int rtp_send_data ( RTPSession *session, const uint8_t *data, uint16_t length, bool dummy ) int rtp_send_data ( RTPSession *session, const uint8_t *data, uint16_t length, bool dummy )

View File

@ -770,9 +770,11 @@ bool toxav_audio_send_frame(ToxAV* av, uint32_t friend_number, const int16_t* pc
goto END; goto END;
} }
if (call->audio_bit_rate == 0) { if (call->audio_bit_rate == 0 ||
!(call->msi_call->self_capabilities & msi_CapSAudio) ||
!(call->msi_call->peer_capabilities & msi_CapRAudio)) {
pthread_mutex_unlock(av->mutex); pthread_mutex_unlock(av->mutex);
rc = TOXAV_ERR_SEND_FRAME_BIT_RATE_NOT_SET; rc = TOXAV_ERR_SEND_FRAME_PAYLOAD_TYPE_DISABLED;
goto END; goto END;
} }
@ -878,9 +880,11 @@ bool toxav_video_send_frame(ToxAV* av, uint32_t friend_number, uint16_t width, u
goto END; goto END;
} }
if (call->video_bit_rate == 0) { if (call->video_bit_rate == 0 ||
!(call->msi_call->self_capabilities & msi_CapSVideo) ||
!(call->msi_call->peer_capabilities & msi_CapRVideo)) {
pthread_mutex_unlock(av->mutex); pthread_mutex_unlock(av->mutex);
rc = TOXAV_ERR_SEND_FRAME_BIT_RATE_NOT_SET; rc = TOXAV_ERR_SEND_FRAME_PAYLOAD_TYPE_DISABLED;
goto END; goto END;
} }
@ -1143,6 +1147,16 @@ int callback_capabilites(void* toxav_inst, MSICall* call)
ToxAV* toxav = toxav_inst; ToxAV* toxav = toxav_inst;
pthread_mutex_lock(toxav->mutex); pthread_mutex_lock(toxav->mutex);
if (call->peer_capabilities & msi_CapSAudio)
rtp_start_receiving(((ToxAVCall*)call->av_call)->audio.first);
else
rtp_stop_receiving(((ToxAVCall*)call->av_call)->audio.first);
if (call->peer_capabilities & msi_CapSVideo)
rtp_start_receiving(((ToxAVCall*)call->av_call)->video.first);
else
rtp_stop_receiving(((ToxAVCall*)call->av_call)->video.first);
invoke_call_state(toxav, call->friend_number, call->peer_capabilities); invoke_call_state(toxav, call->friend_number, call->peer_capabilities);
pthread_mutex_unlock(toxav->mutex); pthread_mutex_unlock(toxav->mutex);

View File

@ -543,9 +543,10 @@ typedef enum TOXAV_ERR_SEND_FRAME {
*/ */
TOXAV_ERR_SEND_FRAME_INVALID, TOXAV_ERR_SEND_FRAME_INVALID,
/** /**
* Bit rate for this payload type was not set up. * Either friend turned off audio or video receiving or we turned off sending
* for the said payload.
*/ */
TOXAV_ERR_SEND_FRAME_BIT_RATE_NOT_SET, TOXAV_ERR_SEND_FRAME_PAYLOAD_TYPE_DISABLED,
/** /**
* Failed to push frame through rtp interface. * Failed to push frame through rtp interface.
*/ */