static void test_audio_sendrecv (const gchar * audio_enc_name, GstStaticCaps expected_caps, gchar * codec) { GArray *codecs_array; gchar *codecs[] = { codec, NULL }; HandOffData *hod; GMainLoop *loop = g_main_loop_new (NULL, TRUE); GstSDPMessage *offer, *answer; GstElement *pipeline = gst_pipeline_new (NULL); GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); GstElement *audiotestsrc_offerer = gst_element_factory_make ("audiotestsrc", NULL); GstElement *audiotestsrc_answerer = gst_element_factory_make ("audiotestsrc", NULL); GstElement *audio_enc_offerer = gst_element_factory_make (audio_enc_name, NULL); GstElement *audio_enc_answerer = gst_element_factory_make (audio_enc_name, NULL); GstElement *rtpendpoint_offerer = gst_element_factory_make ("rtpendpoint", NULL); GstElement *rtpendpoint_answerer = gst_element_factory_make ("rtpendpoint", NULL); GstElement *fakesink_offerer = gst_element_factory_make ("fakesink", NULL); GstElement *fakesink_answerer = gst_element_factory_make ("fakesink", NULL); gst_bus_add_signal_watch (bus); g_signal_connect (bus, "message", G_CALLBACK (bus_msg), pipeline); codecs_array = create_codecs_array (codecs); g_object_set (rtpendpoint_offerer, "num-audio-medias", 1, "audio-codecs", g_array_ref (codecs_array), NULL); g_object_set (rtpendpoint_answerer, "num-audio-medias", 1, "audio-codecs", g_array_ref (codecs_array), NULL); g_array_unref (codecs_array); hod = g_slice_new (HandOffData); hod->expected_caps = expected_caps; hod->loop = loop; g_object_set (G_OBJECT (fakesink_offerer), "signal-handoffs", TRUE, NULL); g_signal_connect (G_OBJECT (fakesink_offerer), "handoff", G_CALLBACK (sendrecv_offerer_fakesink_hand_off), hod); g_object_set (G_OBJECT (fakesink_answerer), "signal-handoffs", TRUE, NULL); g_signal_connect (G_OBJECT (fakesink_answerer), "handoff", G_CALLBACK (sendrecv_answerer_fakesink_hand_off), hod); /* Add elements */ gst_bin_add (GST_BIN (pipeline), rtpendpoint_offerer); connect_sink_async (rtpendpoint_offerer, audiotestsrc_offerer, audio_enc_offerer, NULL, pipeline, "sink_audio"); gst_bin_add (GST_BIN (pipeline), rtpendpoint_answerer); connect_sink_async (rtpendpoint_answerer, audiotestsrc_answerer, audio_enc_answerer, NULL, pipeline, "sink_audio"); gst_element_set_state (pipeline, GST_STATE_PLAYING); /* SDP negotiation */ mark_point (); g_signal_emit_by_name (rtpendpoint_offerer, "generate-offer", &offer); fail_unless (offer != NULL); mark_point (); g_signal_emit_by_name (rtpendpoint_answerer, "process-offer", offer, &answer); fail_unless (answer != NULL); mark_point (); g_signal_emit_by_name (rtpendpoint_offerer, "process-answer", answer); gst_sdp_message_free (offer); gst_sdp_message_free (answer); gst_bin_add (GST_BIN (pipeline), fakesink_offerer); g_object_set_data (G_OBJECT (rtpendpoint_offerer), AUDIO_SINK, fakesink_offerer); g_signal_connect (rtpendpoint_offerer, "pad-added", G_CALLBACK (connect_sink_on_srcpad_added), NULL); fail_unless (kms_element_request_srcpad (rtpendpoint_offerer, KMS_ELEMENT_PAD_TYPE_AUDIO)); gst_bin_add (GST_BIN (pipeline), fakesink_answerer); g_object_set_data (G_OBJECT (rtpendpoint_answerer), AUDIO_SINK, fakesink_answerer); g_signal_connect (rtpendpoint_answerer, "pad-added", G_CALLBACK (connect_sink_on_srcpad_added), NULL); fail_unless (kms_element_request_srcpad (rtpendpoint_answerer, KMS_ELEMENT_PAD_TYPE_AUDIO)); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "test_audio_sendrecv_before_entering_loop"); mark_point (); g_main_loop_run (loop); mark_point (); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "test_audio_sendrecv_end"); gst_element_set_state (pipeline, GST_STATE_NULL); gst_bus_remove_signal_watch (bus); g_object_unref (bus); g_main_loop_unref (loop); g_object_unref (pipeline); g_slice_free (HandOffData, hod); }
GST_END_TEST GST_START_TEST (negotiation_offerer) { GArray *audio_codecs_array, *video_codecs_array; gchar *audio_codecs[] = { "OPUS/48000/1", "AMR/8000/1", NULL }; gchar *video_codecs[] = { "H263-1998/90000", "VP8/90000", NULL }; GstElement *offerer = gst_element_factory_make ("rtpendpoint", NULL); GstElement *answerer = gst_element_factory_make ("rtpendpoint", NULL); GstSDPMessage *offer = NULL, *answer = NULL; GstSDPMessage *offerer_local_sdp = NULL, *offerer_remote_sdp = NULL; gchar *offerer_local_sdp_str, *offerer_remote_sdp_str; GstSDPMessage *answerer_local_sdp = NULL, *answerer_remote_sdp = NULL; gchar *answerer_local_sdp_str, *answerer_remote_sdp_str; gchar *sdp_str = NULL; audio_codecs_array = create_codecs_array (audio_codecs); video_codecs_array = create_codecs_array (video_codecs); g_object_set (offerer, "num-audio-medias", 1, "audio-codecs", g_array_ref (audio_codecs_array), "num-video-medias", 1, "video-codecs", g_array_ref (video_codecs_array), NULL); g_object_set (answerer, "num-audio-medias", 1, "audio-codecs", g_array_ref (audio_codecs_array), "num-video-medias", 1, "video-codecs", g_array_ref (video_codecs_array), NULL); g_array_unref (audio_codecs_array); g_array_unref (video_codecs_array); g_signal_emit_by_name (offerer, "generate-offer", &offer); fail_unless (offer != NULL); GST_DEBUG ("Offer:\n%s", (sdp_str = gst_sdp_message_as_text (offer))); g_free (sdp_str); sdp_str = NULL; g_signal_emit_by_name (answerer, "process-offer", offer, &answer); fail_unless (answer != NULL); GST_DEBUG ("Answer:\n%s", (sdp_str = gst_sdp_message_as_text (answer))); g_free (sdp_str); sdp_str = NULL; g_signal_emit_by_name (offerer, "process-answer", answer); gst_sdp_message_free (offer); gst_sdp_message_free (answer); g_object_get (offerer, "local-sdp", &offerer_local_sdp, NULL); fail_unless (offerer_local_sdp != NULL); g_object_get (offerer, "remote-sdp", &offerer_remote_sdp, NULL); fail_unless (offerer_remote_sdp != NULL); g_object_get (answerer, "local-sdp", &answerer_local_sdp, NULL); fail_unless (answerer_local_sdp != NULL); g_object_get (answerer, "remote-sdp", &answerer_remote_sdp, NULL); fail_unless (answerer_remote_sdp != NULL); offerer_local_sdp_str = gst_sdp_message_as_text (offerer_local_sdp); offerer_remote_sdp_str = gst_sdp_message_as_text (offerer_remote_sdp); answerer_local_sdp_str = gst_sdp_message_as_text (answerer_local_sdp); answerer_remote_sdp_str = gst_sdp_message_as_text (answerer_remote_sdp); GST_DEBUG ("Offerer local SDP\n%s", offerer_local_sdp_str); GST_DEBUG ("Offerer remote SDPr\n%s", offerer_remote_sdp_str); GST_DEBUG ("Answerer local SDP\n%s", answerer_local_sdp_str); GST_DEBUG ("Answerer remote SDP\n%s", answerer_remote_sdp_str); fail_unless (g_strcmp0 (offerer_local_sdp_str, answerer_remote_sdp_str) == 0); fail_unless (g_strcmp0 (offerer_remote_sdp_str, answerer_local_sdp_str) == 0); g_free (offerer_local_sdp_str); g_free (offerer_remote_sdp_str); g_free (answerer_local_sdp_str); g_free (answerer_remote_sdp_str); gst_sdp_message_free (offerer_local_sdp); gst_sdp_message_free (offerer_remote_sdp); gst_sdp_message_free (answerer_local_sdp); gst_sdp_message_free (answerer_remote_sdp); g_object_unref (offerer); g_object_unref (answerer); }
GST_END_TEST GST_START_TEST (negotiation_offerer) { GArray *audio_codecs_array, *video_codecs_array; gchar *audio_codecs[] = { "OPUS/48000/1", "AMR/8000/1", NULL }; gchar *video_codecs[] = { "H263-1998/90000", "VP8/90000", NULL }; gchar *offerer_sess_id, *answerer_sess_id; GstElement *offerer = gst_element_factory_make ("rtpendpoint", NULL); GstElement *answerer = gst_element_factory_make ("rtpendpoint", NULL); GstSDPMessage *offer = NULL, *answer = NULL; GstSDPMessage *offerer_local_sdp = NULL, *offerer_remote_sdp = NULL; gchar *offerer_local_sdp_str, *offerer_remote_sdp_str; GstSDPMessage *answerer_local_sdp = NULL, *answerer_remote_sdp = NULL; gchar *answerer_local_sdp_str, *answerer_remote_sdp_str; gchar *sdp_str = NULL; const GstSDPConnection *connection; gboolean answer_ok; audio_codecs_array = create_codecs_array (audio_codecs); video_codecs_array = create_codecs_array (video_codecs); g_object_set (offerer, "num-audio-medias", 1, "audio-codecs", g_array_ref (audio_codecs_array), "num-video-medias", 1, "video-codecs", g_array_ref (video_codecs_array), NULL); g_object_set (answerer, "num-audio-medias", 1, "audio-codecs", g_array_ref (audio_codecs_array), "num-video-medias", 1, "video-codecs", g_array_ref (video_codecs_array), NULL); g_array_unref (audio_codecs_array); g_array_unref (video_codecs_array); /* Session creation */ g_signal_emit_by_name (offerer, "create-session", &offerer_sess_id); GST_DEBUG_OBJECT (offerer, "Created session with id '%s'", offerer_sess_id); g_signal_emit_by_name (answerer, "create-session", &answerer_sess_id); GST_DEBUG_OBJECT (answerer, "Created session with id '%s'", answerer_sess_id); /* SDP negotiation */ g_signal_emit_by_name (offerer, "generate-offer", offerer_sess_id, &offer); fail_unless (offer != NULL); GST_DEBUG ("Offer:\n%s", (sdp_str = gst_sdp_message_as_text (offer))); g_free (sdp_str); sdp_str = NULL; connection = gst_sdp_message_get_connection (offer); fail_unless (g_strcmp0 (connection->address, "0.0.0.0")); fail_unless (g_strcmp0 (connection->address, "::")); g_signal_emit_by_name (answerer, "process-offer", answerer_sess_id, offer, &answer); fail_unless (answer != NULL); GST_DEBUG ("Answer:\n%s", (sdp_str = gst_sdp_message_as_text (answer))); g_free (sdp_str); sdp_str = NULL; g_signal_emit_by_name (offerer, "process-answer", offerer_sess_id, answer, &answer_ok); fail_unless (answer_ok); gst_sdp_message_free (offer); gst_sdp_message_free (answer); g_signal_emit_by_name (offerer, "get-local-sdp", offerer_sess_id, &offerer_local_sdp); fail_unless (offerer_local_sdp != NULL); g_signal_emit_by_name (offerer, "get-remote-sdp", offerer_sess_id, &offerer_remote_sdp); fail_unless (offerer_remote_sdp != NULL); g_signal_emit_by_name (answerer, "get-local-sdp", answerer_sess_id, &answerer_local_sdp); fail_unless (answerer_local_sdp != NULL); g_signal_emit_by_name (answerer, "get-remote-sdp", answerer_sess_id, &answerer_remote_sdp); fail_unless (answerer_remote_sdp != NULL); offerer_local_sdp_str = gst_sdp_message_as_text (offerer_local_sdp); offerer_remote_sdp_str = gst_sdp_message_as_text (offerer_remote_sdp); answerer_local_sdp_str = gst_sdp_message_as_text (answerer_local_sdp); answerer_remote_sdp_str = gst_sdp_message_as_text (answerer_remote_sdp); GST_DEBUG ("Offerer local SDP\n%s", offerer_local_sdp_str); GST_DEBUG ("Offerer remote SDPr\n%s", offerer_remote_sdp_str); GST_DEBUG ("Answerer local SDP\n%s", answerer_local_sdp_str); GST_DEBUG ("Answerer remote SDP\n%s", answerer_remote_sdp_str); fail_unless (g_strcmp0 (offerer_local_sdp_str, answerer_remote_sdp_str) == 0); fail_unless (g_strcmp0 (offerer_remote_sdp_str, answerer_local_sdp_str) == 0); g_free (offerer_local_sdp_str); g_free (offerer_remote_sdp_str); g_free (answerer_local_sdp_str); g_free (answerer_remote_sdp_str); gst_sdp_message_free (offerer_local_sdp); gst_sdp_message_free (offerer_remote_sdp); gst_sdp_message_free (answerer_local_sdp); gst_sdp_message_free (answerer_remote_sdp); g_object_unref (offerer); g_object_unref (answerer); g_free (offerer_sess_id); g_free (answerer_sess_id); }