static gboolean test_setup_response_461 (GstRTSPClient * client, GstRTSPMessage * response, gboolean close, gpointer user_data) { GstRTSPStatusCode code; const gchar *reason; GstRTSPVersion version; gchar *str; fail_unless (expected_transport == NULL); fail_unless (gst_rtsp_message_get_type (response) == GST_RTSP_MESSAGE_RESPONSE); fail_unless (gst_rtsp_message_parse_response (response, &code, &reason, &version) == GST_RTSP_OK); fail_unless (code == GST_RTSP_STS_UNSUPPORTED_TRANSPORT); fail_unless (g_str_equal (reason, "Unsupported transport")); fail_unless (version == GST_RTSP_VERSION_1_0); fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_CSEQ, &str, 0) == GST_RTSP_OK); fail_unless (atoi (str) == cseq++); return TRUE; }
static gboolean test_response_454 (GstRTSPClient * client, GstRTSPMessage * response, gboolean close, gpointer user_data) { GstRTSPStatusCode code; const gchar *reason; GstRTSPVersion version; fail_unless (gst_rtsp_message_get_type (response) == GST_RTSP_MESSAGE_RESPONSE); fail_unless (gst_rtsp_message_parse_response (response, &code, &reason, &version) == GST_RTSP_OK); fail_unless (code == GST_RTSP_STS_SESSION_NOT_FOUND); fail_unless (g_str_equal (reason, "Session Not Found")); fail_unless (version == GST_RTSP_VERSION_1_0); return TRUE; }
static int isServerReturnOkResponse(GstRTSPMessage *msg ) { GstRTSPResult res; GstRTSPStatusCode code; const gchar *reason; GstRTSPVersion version; res = gst_rtsp_message_parse_response(msg, &code, &reason, &version); if (code == GST_RTSP_STS_UNAUTHORIZED) { return -ERR_UNAUTHORIZED; } // check if server talks with us if (res != GST_RTSP_OK || code != GST_RTSP_STS_OK ) { return -ERR_CONNECTION; } return GST_RTSP_OK; }
static gboolean test_option_response_200 (GstRTSPClient * client, GstRTSPMessage * response, gboolean close, gpointer user_data) { GstRTSPStatusCode code; const gchar *reason; GstRTSPVersion version; gchar *str; GstRTSPMethod methods; fail_unless (gst_rtsp_message_get_type (response) == GST_RTSP_MESSAGE_RESPONSE); fail_unless (gst_rtsp_message_parse_response (response, &code, &reason, &version) == GST_RTSP_OK); fail_unless (code == GST_RTSP_STS_OK); fail_unless (g_str_equal (reason, "OK")); fail_unless (version == GST_RTSP_VERSION_1_0); fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_CSEQ, &str, 0) == GST_RTSP_OK); fail_unless (atoi (str) == cseq++); fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_PUBLIC, &str, 0) == GST_RTSP_OK); methods = gst_rtsp_options_from_text (str); fail_if (methods == 0); fail_unless (methods == (GST_RTSP_DESCRIBE | GST_RTSP_OPTIONS | GST_RTSP_PAUSE | GST_RTSP_PLAY | GST_RTSP_SETUP | GST_RTSP_GET_PARAMETER | GST_RTSP_SET_PARAMETER | GST_RTSP_TEARDOWN)); return TRUE; }
static gboolean test_setup_response_200_multicast (GstRTSPClient * client, GstRTSPMessage * response, gboolean close, gpointer user_data) { GstRTSPStatusCode code; const gchar *reason; GstRTSPVersion version; gchar *str; GstRTSPSessionPool *session_pool; GstRTSPSession *session; gchar **session_hdr_params; fail_unless (expected_transport != NULL); fail_unless (gst_rtsp_message_get_type (response) == GST_RTSP_MESSAGE_RESPONSE); fail_unless (gst_rtsp_message_parse_response (response, &code, &reason, &version) == GST_RTSP_OK); fail_unless (code == GST_RTSP_STS_OK); fail_unless (g_str_equal (reason, "OK")); fail_unless (version == GST_RTSP_VERSION_1_0); fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_CSEQ, &str, 0) == GST_RTSP_OK); fail_unless (atoi (str) == cseq++); fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_TRANSPORT, &str, 0) == GST_RTSP_OK); fail_unless (!strcmp (str, expected_transport)); fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_SESSION, &str, 0) == GST_RTSP_OK); session_hdr_params = g_strsplit (str, ";", -1); /* session-id value */ fail_unless (session_hdr_params[0] != NULL); if (expected_session_timeout != 60) { /* session timeout param */ gchar *timeout_str = g_strdup_printf ("timeout=%u", expected_session_timeout); fail_unless (session_hdr_params[1] != NULL); g_strstrip (session_hdr_params[1]); fail_unless (g_strcmp0 (session_hdr_params[1], timeout_str) == 0); g_free (timeout_str); } session_pool = gst_rtsp_client_get_session_pool (client); fail_unless (session_pool != NULL); fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 1); session = gst_rtsp_session_pool_find (session_pool, session_hdr_params[0]); g_strfreev (session_hdr_params); fail_unless (session != NULL); g_object_unref (session); g_object_unref (session_pool); return TRUE; }
static GstRTSPStatusCode nmp_rtsp_handle_response(NmpMediaDevice *device, GstRTSPMessage *response) { GstRTSPStatusCode res_code; GstRTSPVersion version; const gchar *reason = NULL; gchar *sessid = NULL, *cseq = NULL, *content_base = NULL; GstRTSPResult ret; NmpRtspMedia *media = NULL; NmpSessionState s_state; GstSDPMessage *sdp = NULL; guint8 *sdp_body = NULL; guint sdp_size, seq; gst_rtsp_message_parse_response(response, &res_code, &reason, &version); if (version != GST_RTSP_VERSION_1_0) { nmp_warning("Device RTSP response version mismatch"); return GST_RTSP_STS_RTSP_VERSION_NOT_SUPPORTED; } ret = gst_rtsp_message_get_header(response, GST_RTSP_HDR_CSEQ, &cseq, 0); if (ret != GST_RTSP_OK) { nmp_warning("Device RTSP response, No 'CSeq:' field"); return GST_RTSP_STS_INVALID; } seq = atoi(cseq); if (!seq) return GST_RTSP_OK; media = nmp_rtsp_device_get_media(device, seq); if (!media) { //TEARDOWN或者SET_PARAMETER响应 nmp_print( "Drop device response(TEARDOWN|SET_PARAMETER), seq:'%s'.", cseq ); return GST_RTSP_OK; } s_state = nmp_rtsp_media_get_session_state(media); if (s_state == NMP_SESSION_TEARDOWN) { nmp_print( "Response _After_ TEARDOWN ?? seq:'%s'", cseq ); goto handle_teardown_ok; } if (res_code != GST_RTSP_STS_OK) { nmp_warning("Device RTSP res-code: %d", res_code); goto handle_response_failed; } ret = gst_rtsp_message_get_header(response, GST_RTSP_HDR_SESSION, &sessid, 0); if (ret != GST_RTSP_OK) { //只有DESCRIBE消息没有SESSION域 if (s_state != NMP_SESSION_DESCRIBE) { nmp_warning("Device RTSP response, No 'Session:' field"); goto handle_response_failed; } ret = gst_rtsp_message_get_header(response, GST_RTSP_HDR_CONTENT_BASE, &content_base, 0); if (ret != GST_RTSP_OK) { nmp_warning("Device RTSP response, No 'Content-Base:' field"); goto handle_response_failed; } //处理DESCRIBE消息 if (gst_sdp_message_new(&sdp) != GST_SDP_OK) { nmp_warning("Create SDP message failed"); goto handle_response_failed; } gst_rtsp_message_get_body(response, &sdp_body, &sdp_size); if (gst_sdp_message_parse_buffer(sdp_body, sdp_size, sdp) != GST_SDP_OK) { nmp_warning("Device DESCRIBE response, invalid SDP info"); gst_sdp_message_free(sdp); goto handle_response_failed; } nmp_rtsp_media_set_sdp_info(media, sdp); } else { if (s_state == NMP_SESSION_SETUP) nmp_rtsp_media_set_session_id(media, sessid); } if (nmp_rtsp_media_session_state_next(media) == NMP_SESSION_PLAY) nmp_rtsp_media_deal_pending_request(media); if (nmp_rtsp_device_request(device, media)) { nmp_warning("Device RTSP Request failed"); goto handle_response_failed; } handle_teardown_ok: nmp_rtsp_media_unref(media); return GST_RTSP_OK; handle_response_failed: nmp_rtsp_media_die_announce(media, device); // nmp_rtsp_media_deal_pending_request(media); /* nmp_rtsp_media_kill_unref() can do this */ nmp_rtsp_device_remove_media(device, media); nmp_rtsp_media_kill_unref(media); return GST_RTSP_OK; }