📄 test_soa.c
字号:
/* B will send an offer to A, but there is no change in O/A status */ TEST(soa_generate_offer(b, 1, test_completed), 0); TEST(soa_get_local_sdp(b, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "a=inactive")); /* printf("offer:\n%s", offer); */ TEST(soa_set_remote_sdp(a, 0, offer, offerlen), 1); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_generate_answer(a, test_completed), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_INACTIVE); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_INACTIVE); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_get_local_sdp(a, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(strstr(answer, "a=inactive")); /* printf("answer:\n%s", answer); */ TEST(soa_set_remote_sdp(b, 0, answer, -1), 1); TEST(soa_process_answer(b, test_completed), 0); TEST(soa_activate(b, NULL), 0); TEST(soa_is_audio_active(b), SOA_ACTIVE_INACTIVE); TEST(soa_is_remote_audio_active(b), SOA_ACTIVE_INACTIVE); /* 'A' will release hold. */ TEST(soa_set_params(a, SOATAG_HOLD(NULL), TAG_END()), 1); TEST(soa_generate_offer(a, 1, test_completed), 0); TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "a=sendonly") && !strstr(offer, "a=inactive")); TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(!strstr(answer, "a=recvonly") && !strstr(answer, "a=inactive")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); /* 'A' will put B on hold but this time with c=IN IP4 0.0.0.0 */ TEST(soa_set_params(a, SOATAG_HOLD("*"), TAG_END()), 1); TEST(soa_generate_offer(a, 1, test_completed), 0); { sdp_session_t const *o_sdp; sdp_session_t *sdp; sdp_printer_t *p; sdp_connection_t *c; TEST(soa_get_local_sdp(a, &o_sdp, NULL, NULL), 1); TEST_1(o_sdp != NULL && o_sdp != NONE); TEST_1(sdp = sdp_session_dup(home, o_sdp)); /* Remove mode, change c=, encode offer */ if (sdp->sdp_media->m_connections) c = sdp->sdp_media->m_connections; else c = sdp->sdp_connection; TEST_1(c); c->c_address = "0.0.0.0"; TEST_1(p = sdp_print(home, sdp, NULL, 0, sdp_f_realloc)); TEST_1(sdp_message(p)); offer = sdp_message(p); offerlen = strlen(offer); } TEST(soa_set_remote_sdp(b, 0, offer, -1), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(strstr(answer, "a=recvonly")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDONLY); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDONLY); TEST(soa_is_audio_active(b), SOA_ACTIVE_RECVONLY); TEST(soa_is_remote_audio_active(b), SOA_ACTIVE_RECVONLY); /* 'A' will propose adding video. */ /* 'B' will reject. */ TEST(soa_set_params(a, SOATAG_HOLD(NULL), /* 'A' will release hold. */ SOATAG_USER_SDP_STR("m=audio 5008 RTP/AVP 0 8\r\ni=x\r\n" "m=video 5006 RTP/AVP 34\r\n"), TAG_END()), 2); TEST(soa_generate_offer(a, 1, test_completed), 0); TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "a=sendonly")); TEST_1(strstr(offer, "m=video")); TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(!strstr(answer, "a=recvonly")); TEST_1(strstr(answer, "m=video")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_video_active(a), SOA_ACTIVE_REJECTED); { /* Test tags */ sdp_session_t const *l = NULL, *u = NULL, *r = NULL; sdp_media_t const *m; TEST(soa_get_params(b, SOATAG_LOCAL_SDP_REF(l), SOATAG_USER_SDP_REF(u), SOATAG_REMOTE_SDP_REF(r), TAG_END()), 3); TEST_1(l); TEST_1(u); TEST_1(r); TEST_1(m = l->sdp_media); TEST(m->m_type, sdp_media_audio); TEST_1(!m->m_rejected); TEST_1(m = m->m_next); TEST(m->m_type, sdp_media_video); TEST_1(m->m_rejected); } /* 'B' will now propose adding video. */ /* 'A' will accept. */ TEST(soa_set_params(b, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8\r\n" "m=video 5006 RTP/AVP 34\r\n"), TAG_END()), 1); TEST(soa_generate_offer(b, 1, test_completed), 0); TEST(soa_get_local_sdp(b, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "b=sendonly")); TEST_1(strstr(offer, "m=video")); TEST(soa_set_remote_sdp(a, 0, offer, offerlen), 1); TEST(soa_generate_answer(a, test_completed), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_get_local_sdp(a, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(!strstr(answer, "b=recvonly")); TEST_1(strstr(answer, "m=video")); TEST(soa_set_remote_sdp(b, 0, answer, -1), 1); TEST(soa_process_answer(b, test_completed), 0); TEST(soa_activate(b, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_video_active(a), SOA_ACTIVE_SENDRECV); TEST_VOID(soa_terminate(a, NULL)); TEST(soa_is_audio_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_DISABLED); TEST_VOID(soa_terminate(b, NULL)); TEST_VOID(soa_destroy(a)); TEST_VOID(soa_destroy(b)); su_home_deinit(home); END();}int test_codec_selection(struct context *ctx){ BEGIN(); int n; soa_session_t *a, *b; char const *offer = NONE, *answer = NONE; isize_t offerlen = (isize_t)-1, answerlen = (isize_t)-1; sdp_session_t const *a_sdp, *b_sdp; sdp_media_t const *m; sdp_rtpmap_t const *rm; char const a_caps[] = "v=0\r\n" "o=left 219498671 2 IN IP4 127.0.0.2\r\n" "c=IN IP4 127.0.0.2\r\n" "m=audio 5008 RTP/AVP 0 8 97\r\n" "a=rtpmap:97 GSM/8000\n" ; char const b_caps[] = "m=audio 5004 RTP/AVP 96 97\n" "a=rtpmap:96 G7231/8000\n" "a=rtpmap:97 G729/8000\n"; TEST_1(a = soa_create("static", ctx->root, ctx)); TEST_1(b = soa_create("static", ctx->root, ctx)); TEST(soa_set_user_sdp(a, 0, a_caps, strlen(a_caps)), 1); TEST(soa_set_user_sdp(b, 0, b_caps, strlen(b_caps)), 1); TEST(soa_set_params(a, SOATAG_AUDIO_AUX("cn telephone-event"), TAG_END()), 1); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, NULL, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_get_local_sdp(b, NULL, &answer, &answerlen); TEST(n, 0); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_REJECTED); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_REJECTED); TEST_1(m = b_sdp->sdp_media); TEST_1(m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G7231"); /* Not reusing payload type 97 from offer */ TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 98); TEST_S(rm->rm_encoding, "G729"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: A generates new SDP */ n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 0); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); /* Re-O/A: no-one regenerates new SDP */ n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 0); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 0); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); /* ---------------------------------------------------------------------- */ /* Re-O/A: accept media without common codecs */ /* Accept media without common codecs */ TEST_1(soa_set_params(a, SOATAG_RTP_MISMATCH(1), TAG_END())); TEST_1(soa_set_params(b, SOATAG_RTP_MISMATCH(1), TAG_END())); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST_1(m = b_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G7231"); /* Not using payload type 97 from offer */ TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 98); TEST_S(rm->rm_encoding, "G729"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: add a common codec */ /* Accept media without common codecs */ TEST_1(soa_set_params(a, SOATAG_RTP_MISMATCH(0), SOATAG_USER_SDP_STR( "v=0\r\n" "o=left 219498671 2 IN IP4 127.0.0.2\r\n" "c=IN IP4 127.0.0.2\r\n" "m=audio 5008 RTP/AVP 0 8 96 3 127\r\n" "a=rtpmap:96 G729/8000\n" "a=rtpmap:127 CN/8000\n" ), SOATAG_RTP_SORT(SOA_RTP_SORT_REMOTE), SOATAG_RTP_SELECT(SOA_RTP_SELECT_ALL), TAG_END())); TEST_1(soa_set_params(b, SOATAG_RTP_MISMATCH(0), SOATAG_USER_SDP_STR( "v=0\r\n" "o=left 219498671 2 IN IP4 127.0.0.2\r\n" "c=IN IP4 127.0.0.2\r\n" "m=audio 5004 RTP/AVP 96 3 97 111\r\n" "a=rtpmap:96 G7231/8000\n" "a=rtpmap:97 G729/8000\n" "a=rtpmap:111 telephone-event/8000\n" "a=fmtp:111 0-15\n" ), SOATAG_AUDIO_AUX("cn telephone-event"), SOATAG_RTP_SORT(SOA_RTP_SORT_LOCAL), SOATAG_RTP_SELECT(SOA_RTP_SELECT_COMMON), TAG_END())); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, NULL, NULL); TEST(n, 1); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST_1(m = a_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 3); TEST_S(rm->rm_encoding, "GSM"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G729"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 0); TEST_S(rm->rm_encoding, "PCMU"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 8); TEST_S(rm->rm_encoding, "PCMA"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 127); TEST_S(rm->rm_encoding, "CN"); TEST_1(!rm->rm_next); TEST_1(m = b_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 3); TEST_S(rm->rm_encoding, "GSM"); /* Using payload type 96 from offer */ TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G729"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 111); TEST_S(rm->rm_encoding, "telephone-event"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: prune down to single codec. */ TEST_1(soa_set_params(a, SOATAG_USER_SDP_STR( "v=0\r\n" "o=left 219498671 2 IN IP4 127.0.0.2\r\n" "c=IN IP4 127.0.0.2\r\n" "m=audio 5008 RTP/AVP 0 8 97 96 127\r\n" "a=rtpmap:96 G729/8000\n" "a=rtpmap:97 GSM/8000\n" "a=rtpmap:127 CN/8000\n" ), SOATAG_RTP_MISMATCH(0), SOATAG_RTP_SELECT(SOA_RTP_SELECT_COMMON), TAG_END())); TEST_1(soa_set_params(b, SOATAG_RTP_MISMATCH(0), SOATAG_RTP_SORT(SOA_RTP_SORT_LOCAL), SOATAG_RTP_SELECT(SOA_RTP_SELECT_SINGLE), TAG_END())); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST_1(m = a_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "GSM"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 127); TEST_S(rm->rm_encoding, "CN"); TEST_1(!rm->rm_next); /* Answering end matches payload types then sorts by local preference, then select best codec => GSM with pt 97 */ TEST_1(m = b_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "GSM"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 111); TEST_S(rm->rm_encoding, "telephone-event"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: A generates new SDP offer with single codec only */ n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); TEST_1(m = a_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "GSM"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 127); TEST_S(rm->rm_encoding, "CN"); TEST_1(!rm->rm_next); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); /* Answer from B is identical to previous one */ n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 0); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); /* ---------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -