|
@@ -1256,6 +1256,45 @@ static int rtsp_read_play(AVFormatContext *s)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int rtsp_setup_input_streams(AVFormatContext *s)
|
|
|
+{
|
|
|
+ RTSPState *rt = s->priv_data;
|
|
|
+ RTSPMessageHeader reply1, *reply = &reply1;
|
|
|
+ char cmd[1024];
|
|
|
+ unsigned char *content = NULL;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* describe the stream */
|
|
|
+ snprintf(cmd, sizeof(cmd),
|
|
|
+ "DESCRIBE %s RTSP/1.0\r\n"
|
|
|
+ "Accept: application/sdp\r\n",
|
|
|
+ s->filename);
|
|
|
+ if (rt->server_type == RTSP_SERVER_REAL) {
|
|
|
+ /**
|
|
|
+ * The Require: attribute is needed for proper streaming from
|
|
|
+ * Realmedia servers.
|
|
|
+ */
|
|
|
+ av_strlcat(cmd,
|
|
|
+ "Require: com.real.retain-entity-for-setup\r\n",
|
|
|
+ sizeof(cmd));
|
|
|
+ }
|
|
|
+ rtsp_send_cmd(s, cmd, reply, &content);
|
|
|
+ if (!content)
|
|
|
+ return AVERROR_INVALIDDATA;
|
|
|
+ if (reply->status_code != RTSP_STATUS_OK) {
|
|
|
+ av_freep(&content);
|
|
|
+ return AVERROR_INVALIDDATA;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* now we got the SDP description, we parse it */
|
|
|
+ ret = sdp_parse(s, (const char *)content);
|
|
|
+ av_freep(&content);
|
|
|
+ if (ret < 0)
|
|
|
+ return AVERROR_INVALIDDATA;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int rtsp_read_header(AVFormatContext *s,
|
|
|
AVFormatParameters *ap)
|
|
|
{
|
|
@@ -1263,9 +1302,8 @@ static int rtsp_read_header(AVFormatContext *s,
|
|
|
char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128];
|
|
|
char *option_list, *option, *filename;
|
|
|
URLContext *rtsp_hd;
|
|
|
- int port, ret, err;
|
|
|
+ int port, err;
|
|
|
RTSPMessageHeader reply1, *reply = &reply1;
|
|
|
- unsigned char *content = NULL;
|
|
|
int lower_transport_mask = 0;
|
|
|
char real_challenge[64];
|
|
|
redirect:
|
|
@@ -1364,37 +1402,9 @@ redirect:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- /* describe the stream */
|
|
|
- snprintf(cmd, sizeof(cmd),
|
|
|
- "DESCRIBE %s RTSP/1.0\r\n"
|
|
|
- "Accept: application/sdp\r\n",
|
|
|
- s->filename);
|
|
|
- if (rt->server_type == RTSP_SERVER_REAL) {
|
|
|
- /**
|
|
|
- * The Require: attribute is needed for proper streaming from
|
|
|
- * Realmedia servers.
|
|
|
- */
|
|
|
- av_strlcat(cmd,
|
|
|
- "Require: com.real.retain-entity-for-setup\r\n",
|
|
|
- sizeof(cmd));
|
|
|
- }
|
|
|
- rtsp_send_cmd(s, cmd, reply, &content);
|
|
|
- if (!content) {
|
|
|
- err = AVERROR_INVALIDDATA;
|
|
|
+ err = rtsp_setup_input_streams(s);
|
|
|
+ if (err)
|
|
|
goto fail;
|
|
|
- }
|
|
|
- if (reply->status_code != RTSP_STATUS_OK) {
|
|
|
- err = AVERROR_INVALIDDATA;
|
|
|
- goto fail;
|
|
|
- }
|
|
|
-
|
|
|
- /* now we got the SDP description, we parse it */
|
|
|
- ret = sdp_parse(s, (const char *)content);
|
|
|
- av_freep(&content);
|
|
|
- if (ret < 0) {
|
|
|
- err = AVERROR_INVALIDDATA;
|
|
|
- goto fail;
|
|
|
- }
|
|
|
|
|
|
do {
|
|
|
int lower_transport = ff_log2_tab[lower_transport_mask &
|
|
@@ -1425,7 +1435,6 @@ redirect:
|
|
|
return 0;
|
|
|
fail:
|
|
|
rtsp_close_streams(s);
|
|
|
- av_freep(&content);
|
|
|
url_close(rt->rtsp_hd);
|
|
|
if (reply->status_code >=300 && reply->status_code < 400) {
|
|
|
av_strlcpy(s->filename, reply->location, sizeof(s->filename));
|