static gint create_and_send_RECORD_message(GstRTSPsink* sink, GTimeVal *timeout, char *szSessionNumber) { GstRTSPMethod method; GstRTSPMessage msg = { 0 }; const gchar *url_server_str_full = g_strdup_printf("rtsp://%s:%d/%s", sink->host, sink->port, sink->stream_name); //"rtsp://192.168.2.108:1935/live/1"; GstRTSPResult res; method = GST_RTSP_RECORD; res = gst_rtsp_message_init_request(&msg, method, url_server_str_full); if (res < 0) return res; gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_RANGE, "npt=0.000-"); // start live. gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_SESSION, szSessionNumber); // Send our packet receive server answer and check some basic checks. if ((res = sendReceiveAndCheck(sink->conn, timeout, &msg, sink->debug)) != GST_RTSP_OK) { return res; } return res; }
/** * gst_rtsp_message_new_request: * @msg: a location for the new #GstRTSPMessage * @method: the request method to use * @uri: the uri of the request * * Create a new #GstRTSPMessage with @method and @uri and store the result * request message in @msg. * * Returns: a #GstRTSPResult. Free with gst_rtsp_message_free(). */ GstRTSPResult gst_rtsp_message_new_request (GstRTSPMessage ** msg, GstRTSPMethod method, const gchar * uri) { GstRTSPMessage *newmsg; g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL); g_return_val_if_fail (uri != NULL, GST_RTSP_EINVAL); newmsg = g_new0 (GstRTSPMessage, 1); *msg = newmsg; return gst_rtsp_message_init_request (newmsg, method, uri); }
static gint create_and_send_OPTION_message(GstRTSPsink* sink, GTimeVal *timeout) { GstRTSPResult res; const gchar *url_server_str = g_strdup_printf("rtsp://%s", sink->host); //"rtsp://192.168.2.108"; // TODO: get ip and port from parameters. const gchar *url_server_ip_str = sink->host;// "192.168.2.108"; //GstRTSPConnection *conn = sink->conn ; int port = sink->port; GstRTSPUrl * url; GstRTSPMessage msg = { 0 }; // set parameters res = gst_rtsp_url_parse((const guint8*)url_server_str, &url); res = gst_rtsp_url_set_port(url, port); // create connection res = gst_rtsp_connection_create(url, &sink->conn); res = gst_rtsp_connection_connect(sink->conn, timeout); if (res != GST_RTSP_OK) goto beach; GstRTSPMethod method = GST_RTSP_OPTIONS; res = gst_rtsp_message_init_request(&msg, method, url_server_str); if (res < 0) return res; /* set user-agent */ if (sink->user_agent) gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_USER_AGENT, sink->user_agent); // Send our packet receive server answer and check some basic checks. if ((res = sendReceiveAndCheck(sink->conn, timeout, &msg, sink->debug)) != GST_RTSP_OK) { return res; } // check if server supports RECORD. if (isServerSupportStreamPush(&msg) != GST_RTSP_OK) { return -ERR_CANNOT_PUSH_STREAM; } beach: return GST_RTSP_OK; }
static gint create_and_send_SETUP_message(GstRTSPsink* sink, GTimeVal *timeout, char *szSessionNumber) { GstRTSPMethod method; const gchar *url_server_str_full = g_strdup_printf("rtsp://%s:%d/%s", sink->host, sink->port, sink->stream_name); //"rtsp://192.168.2.108:1935/live/1"; GstRTSPResult res; GstRTSPMessage msg = { 0 }; gint video_start_port = 5002; gint video_end_port = video_start_port + 1; gchar *transfer_foramt; gchar *tmp; method = GST_RTSP_SETUP; tmp = g_strdup_printf("%s/streamid=0", url_server_str_full); res = gst_rtsp_message_init_request(&msg, method, tmp); if (res < 0) return res; transfer_foramt = g_strdup_printf("RTP/AVP/UDP;unicast;client_port=%d-%d;mode=record", video_start_port, video_end_port); gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_TRANSPORT, transfer_foramt); gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_SESSION, szSessionNumber); // TODO: Get the session id from the responce. gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_CONTENT_LENGTH, "0"); // TODO: Get the session id from the responce. // Send our packet receive server answer and check some basic checks. if ((res = sendReceiveAndCheck(sink->conn, timeout, &msg, sink->debug)) != GST_RTSP_OK) { return res; } GstRTSPTransport *transport; res = gst_rtsp_transport_new(&transport); res = extractTransportFromMessage(&msg, transport); g_print("Got server port %d", transport->server_port); sink->server_rtp_port = transport->server_port.min; if (res != GST_RTSP_OK) return -ERR_PARSING; return GST_RTSP_OK; }
static void test_client_sdp (const gchar * launch_line, guint * bandwidth_val) { GstRTSPClient *client; GstRTSPMessage request = { 0, }; gchar *str; /* simple DESCRIBE for an existing url */ client = setup_client (launch_line); fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_DESCRIBE, "rtsp://localhost/test") == GST_RTSP_OK); str = g_strdup_printf ("%d", cseq); gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str); g_free (str); gst_rtsp_client_set_send_func (client, test_response_sdp, (gpointer) bandwidth_val, NULL); fail_unless (gst_rtsp_client_handle_message (client, &request) == GST_RTSP_OK); gst_rtsp_message_unset (&request); teardown_client (client); }
static gint create_and_send_ANNOUNCE_message2(GstRTSPsink* sink, GTimeVal *timeout, char **szSessionNumber) { const gchar *url_client_ip_str = "0.0.0.0";//"192.168.2.104"; const gchar *url_server_str_full = g_strdup_printf("rtsp://%s:%d/%s", sink->host, sink->port, sink->stream_name); //"rtsp://192.168.2.108:1935/live/1"; //conn = sink->conn; GstRTSPMessage msg = { 0 }; GstSDPMessage *sdp; GstRTSPMethod method; GstRTSPResult res; guint num_ports = 1; guint rtp_port = 5006; char *szPayloadType = g_strdup_printf("%d", sink->payload); method = GST_RTSP_ANNOUNCE ; res = gst_rtsp_message_init_request(&msg, method, url_server_str_full); if (res < 0) return res; /* set user-agent */ if (sink->user_agent) gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_USER_AGENT, sink->user_agent); gst_rtsp_message_add_header(&msg, GST_RTSP_HDR_CONTENT_TYPE, "application/sdp"); // allocate sdp messege buffer... res = gst_sdp_message_new(&sdp); //v=.. res = gst_sdp_message_set_version(sdp, "0"); //o=... res = gst_sdp_message_set_origin(sdp, "-", "0", "0", "IN", "IP4", "0.0.0.0"); //s=.. if (sink->session_name) res = gst_sdp_message_set_session_name(sdp, "Unnamed"); //i=.. if (sink->information) res = gst_sdp_message_set_information(sdp, "N/A"); //c=... res = gst_sdp_message_set_connection(sdp, "IN", "IP4", url_client_ip_str, 0, 0); //a=... res = gst_sdp_message_add_attribute(sdp, "recvonly", NULL); // create media GstSDPMedia *media; res = gst_sdp_media_new(&media); res = gst_sdp_media_init(media); //m=... res = gst_sdp_media_set_media(media, "video"); res = gst_sdp_media_set_port_info(media, rtp_port, num_ports); res = gst_sdp_media_set_proto(media, "RTP/AVP"); res = gst_sdp_media_add_format(media, szPayloadType); //a=... char *rtpmap = g_strdup_printf("%s %s/%d", szPayloadType, sink->encoding_name, sink->clock_rate); res = gst_sdp_media_add_attribute(media, "rtpmap", rtpmap); res = gst_sdp_media_add_attribute(media, "fmtp", szPayloadType); res = gst_sdp_media_add_attribute(media, "control", "streamid=0"); // insert media into sdp res = gst_sdp_message_add_media(sdp, media); gchar * sdp_str = gst_sdp_message_as_text(sdp); int size = g_utf8_strlen(sdp_str, 500); gst_sdp_message_free(sdp); gst_sdp_media_free(media); res = gst_rtsp_message_set_body(&msg, sdp_str, size); sink->responce = &msg; // Send our packet receive server answer and check some basic checks. if ((res = sendReceiveAndCheck(sink->conn, timeout, &msg, sink->debug)) != GST_RTSP_OK) { return res; } // get session number *szSessionNumber = extractSessionNumberFromMessage(&msg); return GST_RTSP_OK; }