Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}