summaryrefslogtreecommitdiff
path: root/libavformat/rtsp.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2010-02-19 23:21:44 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2010-02-19 23:21:44 +0000
commite23d195deb63df507a2ad98c3875e8c2a2f5bb9b (patch)
tree490edbd0ecedd2f29dc0e49b8bafe1dd362b03f2 /libavformat/rtsp.c
parent30ff7c5cbc12b692eca5c138c8a3d626c55364af (diff)
Split out input-specific parts of rtsp_read_header() into its own, new,
function (rtsp_setup_input_streams()), as preparation for the upcoming RTSP muxer. Patch by Martin Storsjö <$firstname $firstname st>. Originally committed as revision 21914 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c75
1 files changed, 42 insertions, 33 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 0bba88a8ea..152c2cc70d 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -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));