annotate rtsp.c @ 3957:9f943bb755f9 libavformat

Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us that it only describes the lower-level transport (TCP vs. UDP) and not the actual data layout (e.g. RDT vs. RTP). See discussion in "Realmedia patch" thread on ML.
author rbultje
date Tue, 30 Sep 2008 13:18:41 +0000
parents 53c5b89b8dff
children ab2d2bc3a6e7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * RTSP/SDP client
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
21
3722
68749aaea50f ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents: 3714
diff changeset
22 /* needed by inet_aton() */
68749aaea50f ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents: 3714
diff changeset
23 #define _SVID_SOURCE
68749aaea50f ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents: 3714
diff changeset
24
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3278
diff changeset
25 #include "libavutil/avstring.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27
1808
572ce77d7333 Fix compilation on Mac OS X, patch by Marc Hoffman, mmh pleasantst com.
diego
parents: 1754
diff changeset
28 #include <sys/time.h>
3941
53c5b89b8dff only include sys/select.h if present, fix mingw compilation
bcoudurier
parents: 3936
diff changeset
29 #ifdef HAVE_SYS_SELECT_H
3936
6154f62ef652 include sys/select.h instead of unistd.h to get select,
bcoudurier
parents: 3924
diff changeset
30 #include <sys/select.h>
3941
53c5b89b8dff only include sys/select.h if present, fix mingw compilation
bcoudurier
parents: 3936
diff changeset
31 #endif
3714
3790cb6c893d strcasecmp() requires #include <strings.h>
aurel
parents: 3524
diff changeset
32 #include <strings.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1670
diff changeset
33 #include "network.h"
2681
6037eb4919fb Remove the inclusion of rtsp.h and rtp.h from avformat.h, and
lucabe
parents: 2408
diff changeset
34 #include "rtsp.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
36 #include "rtp_internal.h"
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
37 #include "rdt.h"
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
38
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 //#define DEBUG
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
40 //#define DEBUG_RTP_TCP
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
42 enum RTSPClientState {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
43 RTSP_STATE_IDLE,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
44 RTSP_STATE_PLAYING,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
45 RTSP_STATE_PAUSED,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
46 };
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
47
3854
8b2b84b5ef74 Implement RTSPServerType enum as a way to identify the flavour of RTSP that
rbultje
parents: 3853
diff changeset
48 enum RTSPServerType {
3924
0b02fd518909 Reindent after r15317.
rbultje
parents: 3923
diff changeset
49 RTSP_SERVER_RTP, /*< Standard-compliant RTP-server */
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
50 RTSP_SERVER_REAL, /*< Realmedia-style server */
3854
8b2b84b5ef74 Implement RTSPServerType enum as a way to identify the flavour of RTSP that
rbultje
parents: 3853
diff changeset
51 RTSP_SERVER_LAST
8b2b84b5ef74 Implement RTSPServerType enum as a way to identify the flavour of RTSP that
rbultje
parents: 3853
diff changeset
52 };
8b2b84b5ef74 Implement RTSPServerType enum as a way to identify the flavour of RTSP that
rbultje
parents: 3853
diff changeset
53
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 typedef struct RTSPState {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 URLContext *rtsp_hd; /* RTSP TCP connexion handle */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
56 int nb_rtsp_streams;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
57 struct RTSPStream **rtsp_streams;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
58
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
59 enum RTSPClientState state;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
60 int64_t seek_timestamp;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
61
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
62 /* XXX: currently we use unbuffered input */
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
63 // ByteIOContext rtsp_gb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 int seq; /* RTSP command sequence number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 char session_id[512];
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
66 enum RTSPLowerTransport lower_transport;
3854
8b2b84b5ef74 Implement RTSPServerType enum as a way to identify the flavour of RTSP that
rbultje
parents: 3853
diff changeset
67 enum RTSPServerType server_type;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 char last_reply[2048]; /* XXX: allocate ? */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
69 RTPDemuxContext *cur_rtp;
3903
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
70 int need_subscription;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 } RTSPState;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 typedef struct RTSPStream {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
74 URLContext *rtp_handle; /* RTP stream handle */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
75 RTPDemuxContext *rtp_ctx; /* RTP parse context */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
76
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
77 int stream_index; /* corresponding stream index, if any. -1 if none (MPEG2TS case) */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 int interleaved_min, interleaved_max; /* interleave ids, if TCP transport */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 char control_url[1024]; /* url for this stream (from SDP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 int sdp_port; /* port (from SDP content - not used in RTSP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 struct in_addr sdp_ip; /* IP address (from SDP content - not used in RTSP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 int sdp_ttl; /* IP TTL (from SDP content - not used in RTSP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 int sdp_payload_type; /* payload type - only used in SDP */
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
85 rtp_payload_data_t rtp_payload_data; /* rtp payload parsing infos from SDP */
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
86
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
87 RTPDynamicProtocolHandler *dynamic_handler; ///< Only valid if it's a dynamic protocol. (This is the handler structure)
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
88 void *dynamic_protocol_context; ///< Only valid if it's a dynamic protocol. (This is any private data associated with the dynamic protocol)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 } RTSPStream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
91 static int rtsp_read_play(AVFormatContext *s);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
92
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 /* XXX: currently, the only way to change the protocols consists in
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 changing this variable */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95
2884
e6e7ba123447 Drop RTSP default protocol.
diego
parents: 2866
diff changeset
96 #if LIBAVFORMAT_VERSION_INT < (53 << 16)
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
97 int rtsp_default_protocols = (1 << RTSP_LOWER_TRANSPORT_UDP);
2884
e6e7ba123447 Drop RTSP default protocol.
diego
parents: 2866
diff changeset
98 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 static int rtsp_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 {
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
102 if (av_strstart(p->filename, "rtsp:", NULL))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 static int redir_isspace(int c)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 {
3278
1de87c1b6a12 Remove unnecessary parentheses from return calls.
diego
parents: 3222
diff changeset
109 return c == ' ' || c == '\t' || c == '\n' || c == '\r';
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 static void skip_spaces(const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 while (redir_isspace(*p))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
121 static void get_word_sep(char *buf, int buf_size, const char *sep,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 p = *pp;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
128 if (*p == '/')
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
129 p++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 while (!strchr(sep, *p) && *p != '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 if ((q - buf) < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 *q++ = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 if (buf_size > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 static void get_word(char *buf, int buf_size, const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 while (!redir_isspace(*p) && *p != '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 if ((q - buf) < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 *q++ = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 if (buf_size > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 params>] */
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
162 static int sdp_parse_rtpmap(AVCodecContext *codec, RTSPStream *rtsp_st, int payload_type, const char *p)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 char buf[256];
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
165 int i;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
166 AVCodec *c;
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1003
diff changeset
167 const char *c_name;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
169 /* Loop into AVRtpDynamicPayloadTypes[] and AVRtpPayloadTypes[] and
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
170 see if we can handle this kind of payload */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 get_word_sep(buf, sizeof(buf), "/", &p);
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
172 if (payload_type >= RTP_PT_PRIVATE) {
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
173 RTPDynamicProtocolHandler *handler= RTPFirstDynamicPayloadHandler;
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
174 while(handler) {
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
175 if (!strcmp(buf, handler->enc_name) && (codec->codec_type == handler->codec_type)) {
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
176 codec->codec_id = handler->codec_id;
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
177 rtsp_st->dynamic_handler= handler;
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
178 if(handler->open) {
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
179 rtsp_st->dynamic_protocol_context= handler->open();
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
180 }
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
181 break;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
182 }
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
183 handler= handler->next;
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
184 }
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
185 } else {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
186 /* We are in a standard case ( from http://www.iana.org/assignments/rtp-parameters) */
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
187 /* search into AVRtpPayloadTypes[] */
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2711
diff changeset
188 codec->codec_id = ff_rtp_codec_id(buf, codec->codec_type);
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
189 }
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
190
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
191 c = avcodec_find_decoder(codec->codec_id);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
192 if (c && c->name)
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1003
diff changeset
193 c_name = c->name;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
194 else
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
195 c_name = (char *)NULL;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
196
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
197 if (c_name) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
198 get_word_sep(buf, sizeof(buf), "/", &p);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
199 i = atoi(buf);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
200 switch (codec->codec_type) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
201 case CODEC_TYPE_AUDIO:
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
202 av_log(codec, AV_LOG_DEBUG, " audio codec set to : %s\n", c_name);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
203 codec->sample_rate = RTSP_DEFAULT_AUDIO_SAMPLERATE;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
204 codec->channels = RTSP_DEFAULT_NB_AUDIO_CHANNELS;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
205 if (i > 0) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
206 codec->sample_rate = i;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
207 get_word_sep(buf, sizeof(buf), "/", &p);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
208 i = atoi(buf);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
209 if (i > 0)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
210 codec->channels = i;
1431
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
211 // TODO: there is a bug here; if it is a mono stream, and less than 22000Hz, faad upconverts to stereo and twice the
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
212 // frequency. No problem, but the sample rate is being set here by the sdp line. Upcoming patch forthcoming. (rdm)
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
213 }
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
214 av_log(codec, AV_LOG_DEBUG, " audio samplerate set to : %i\n", codec->sample_rate);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
215 av_log(codec, AV_LOG_DEBUG, " audio channels set to : %i\n", codec->channels);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
216 break;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
217 case CODEC_TYPE_VIDEO:
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
218 av_log(codec, AV_LOG_DEBUG, " video codec set to : %s\n", c_name);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
219 break;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
220 default:
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
221 break;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
222 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 }
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
225
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
226 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 /* return the length and optionnaly the data */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 static int hex_to_data(uint8_t *data, const char *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 int c, len, v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 len = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 v = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 if (p == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 c = toupper((unsigned char)*p++);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 if (c >= '0' && c <= '9')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 c = c - '0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
243 else if (c >= 'A' && c <= 'F')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 c = c - 'A' + 10;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 v = (v << 4) | c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 if (v & 0x100) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 if (data)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 data[len] = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 len++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 v = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
258 static void sdp_parse_fmtp_config(AVCodecContext *codec, char *attr, char *value)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
259 {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
260 switch (codec->codec_id) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
261 case CODEC_ID_MPEG4:
1472
49d5a5ca2987 get rid of CODEC_ID_MPEG4AAC after next version bump, and change it to CODEC_ID_AAC where used
bcoudurier
parents: 1453
diff changeset
262 case CODEC_ID_AAC:
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
263 if (!strcmp(attr, "config")) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
264 /* decode the hexa encoded parameter */
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
265 int len = hex_to_data(NULL, value);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
266 codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
267 if (!codec->extradata)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
268 return;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
269 codec->extradata_size = len;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
270 hex_to_data(codec->extradata, value);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
271 }
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
272 break;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
273 default:
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
274 break;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
275 }
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
276 return;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
277 }
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
278
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
279 typedef struct attrname_map
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
280 {
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 1003
diff changeset
281 const char *str;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
282 uint16_t type;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
283 uint32_t offset;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
284 } attrname_map_t;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
285
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
286 /* All known fmtp parmeters and the corresping RTPAttrTypeEnum */
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
287 #define ATTR_NAME_TYPE_INT 0
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
288 #define ATTR_NAME_TYPE_STR 1
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
289 static attrname_map_t attr_names[]=
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
290 {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
291 {"SizeLength", ATTR_NAME_TYPE_INT, offsetof(rtp_payload_data_t, sizelength)},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
292 {"IndexLength", ATTR_NAME_TYPE_INT, offsetof(rtp_payload_data_t, indexlength)},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
293 {"IndexDeltaLength", ATTR_NAME_TYPE_INT, offsetof(rtp_payload_data_t, indexdeltalength)},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
294 {"profile-level-id", ATTR_NAME_TYPE_INT, offsetof(rtp_payload_data_t, profile_level_id)},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
295 {"StreamType", ATTR_NAME_TYPE_INT, offsetof(rtp_payload_data_t, streamtype)},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
296 {"mode", ATTR_NAME_TYPE_STR, offsetof(rtp_payload_data_t, mode)},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
297 {NULL, -1, -1},
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
298 };
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
299
1431
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
300 /** parse the attribute line from the fmtp a line of an sdp resonse. This is broken out as a function
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
301 * because it is used in rtp_h264.c, which is forthcoming.
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
302 */
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
303 int rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
304 {
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
305 skip_spaces(p);
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
306 if(**p)
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
307 {
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
308 get_word_sep(attr, attr_size, "=", p);
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
309 if (**p == '=')
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
310 (*p)++;
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
311 get_word_sep(value, value_size, ";", p);
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
312 if (**p == ';')
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
313 (*p)++;
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
314 return 1;
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
315 }
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
316 return 0;
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
317 }
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
318
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
319 /* parse a SDP line and save stream attributes */
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
320 static void sdp_parse_fmtp(AVStream *st, const char *p)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 char attr[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323 char value[4096];
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
324 int i;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
325
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
326 RTSPStream *rtsp_st = st->priv_data;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 774
diff changeset
327 AVCodecContext *codec = st->codec;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
328 rtp_payload_data_t *rtp_payload_data = &rtsp_st->rtp_payload_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 /* loop on each attribute */
1514
958decd51c1f remove duplicate code, patch by Ryan Martell rdm4 A martellventures P com
gpoirier
parents: 1472
diff changeset
331 while(rtsp_next_attr_and_value(&p, attr, sizeof(attr), value, sizeof(value)))
958decd51c1f remove duplicate code, patch by Ryan Martell rdm4 A martellventures P com
gpoirier
parents: 1472
diff changeset
332 {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
333 /* grab the codec extra_data from the config parameter of the fmtp line */
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
334 sdp_parse_fmtp_config(codec, attr, value);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
335 /* Looking for a known attribute */
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
336 for (i = 0; attr_names[i].str; ++i) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
337 if (!strcasecmp(attr, attr_names[i].str)) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
338 if (attr_names[i].type == ATTR_NAME_TYPE_INT)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
339 *(int *)((char *)rtp_payload_data + attr_names[i].offset) = atoi(value);
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
340 else if (attr_names[i].type == ATTR_NAME_TYPE_STR)
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
341 *(char **)((char *)rtp_payload_data + attr_names[i].offset) = av_strdup(value);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
342 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346
1453
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
347 /** Parse a string \p in the form of Range:npt=xx-xx, and determine the start
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
348 * and end time.
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
349 * Used for seeking in the rtp stream.
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
350 */
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
351 static void rtsp_parse_range_npt(const char *p, int64_t *start, int64_t *end)
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
352 {
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
353 char buf[256];
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
354
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
355 skip_spaces(&p);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
356 if (!av_stristart(p, "npt=", &p))
1453
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
357 return;
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
358
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
359 *start = AV_NOPTS_VALUE;
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
360 *end = AV_NOPTS_VALUE;
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
361
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
362 get_word_sep(buf, sizeof(buf), "-", &p);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
363 *start = parse_date(buf, 1);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
364 if (*p == '-') {
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
365 p++;
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
366 get_word_sep(buf, sizeof(buf), "-", &p);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
367 *end = parse_date(buf, 1);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
368 }
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
369 // av_log(NULL, AV_LOG_DEBUG, "Range Start: %lld\n", *start);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
370 // av_log(NULL, AV_LOG_DEBUG, "Range End: %lld\n", *end);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
371 }
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
372
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
373 typedef struct SDPParseState {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 /* SDP only */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 struct in_addr default_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376 int default_ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 } SDPParseState;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 int letter, const char *buf)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
382 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 char buf1[64], st_type[64];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385 int codec_type, payload_type, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 struct in_addr sdp_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 int ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392 printf("sdp: %c='%s'\n", letter, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 p = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 switch(letter) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 case 'c':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 if (strcmp(buf1, "IN") != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 if (strcmp(buf1, "IP4") != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 get_word_sep(buf1, sizeof(buf1), "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 if (inet_aton(buf1, &sdp_ip) == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 ttl = 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
408 if (*p == '/') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410 get_word_sep(buf1, sizeof(buf1), "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 ttl = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
412 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 if (s->nb_streams == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 s1->default_ip = sdp_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 s1->default_ttl = ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 st = s->streams[s->nb_streams - 1];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 rtsp_st->sdp_ip = sdp_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 rtsp_st->sdp_ttl = ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 case 's':
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
424 av_strlcpy(s->title, p, sizeof(s->title));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 case 'i':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 if (s->nb_streams == 0) {
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
428 av_strlcpy(s->comment, p, sizeof(s->comment));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 case 'm':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 /* new stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 get_word(st_type, sizeof(st_type), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 if (!strcmp(st_type, "audio")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 codec_type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 } else if (!strcmp(st_type, "video")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 codec_type = CODEC_TYPE_VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
439 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
440 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
441 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442 rtsp_st = av_mallocz(sizeof(RTSPStream));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 if (!rtsp_st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444 return;
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
445 rtsp_st->stream_index = -1;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
446 dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 rtsp_st->sdp_ip = s1->default_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 rtsp_st->sdp_ttl = s1->default_ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 get_word(buf1, sizeof(buf1), &p); /* port */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 rtsp_st->sdp_port = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 get_word(buf1, sizeof(buf1), &p); /* protocol (ignored) */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
455
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 /* XXX: handle list of formats */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457 get_word(buf1, sizeof(buf1), &p); /* format list */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 rtsp_st->sdp_payload_type = atoi(buf1);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
459
2759
b252e318023a Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents: 2711
diff changeset
460 if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
461 /* no corresponding stream */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
462 } else {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
463 st = av_new_stream(s, 0);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
464 if (!st)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
465 return;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
466 st->priv_data = rtsp_st;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
467 rtsp_st->stream_index = st->index;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 774
diff changeset
468 st->codec->codec_type = codec_type;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
469 if (rtsp_st->sdp_payload_type < RTP_PT_PRIVATE) {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
470 /* if standard payload type, we can find the codec right now */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 774
diff changeset
471 rtp_get_codec_info(st->codec, rtsp_st->sdp_payload_type);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
472 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 /* put a default control url */
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
475 av_strlcpy(rtsp_st->control_url, s->filename, sizeof(rtsp_st->control_url));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 case 'a':
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
478 if (av_strstart(p, "control:", &p) && s->nb_streams > 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479 char proto[32];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 /* get the control url */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481 st = s->streams[s->nb_streams - 1];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 rtsp_st = st->priv_data;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
483
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
484 /* XXX: may need to add full url resolution */
511
056991ab9f10 HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents: 391
diff changeset
485 url_split(proto, sizeof(proto), NULL, 0, NULL, 0, NULL, NULL, 0, p);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
486 if (proto[0] == '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
487 /* relative control URL */
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
488 av_strlcat(rtsp_st->control_url, "/", sizeof(rtsp_st->control_url));
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
489 av_strlcat(rtsp_st->control_url, p, sizeof(rtsp_st->control_url));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490 } else {
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
491 av_strlcpy(rtsp_st->control_url, p, sizeof(rtsp_st->control_url));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
492 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
493 } else if (av_strstart(p, "rtpmap:", &p)) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
494 /* NOTE: rtpmap is only supported AFTER the 'm=' tag */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
495 get_word(buf1, sizeof(buf1), &p);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
496 payload_type = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
497 for(i = 0; i < s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
498 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
499 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
500 if (rtsp_st->sdp_payload_type == payload_type) {
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
501 sdp_parse_rtpmap(st->codec, rtsp_st, payload_type, p);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
502 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
503 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
504 } else if (av_strstart(p, "fmtp:", &p)) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
505 /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
506 get_word(buf1, sizeof(buf1), &p);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
507 payload_type = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
508 for(i = 0; i < s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
509 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
510 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
511 if (rtsp_st->sdp_payload_type == payload_type) {
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
512 if(rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->parse_sdp_a_line) {
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
513 if(!rtsp_st->dynamic_handler->parse_sdp_a_line(st, rtsp_st->dynamic_protocol_context, buf)) {
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
514 sdp_parse_fmtp(st, p);
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
515 }
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
516 } else {
1424
1c39ce5c6a5d indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents: 1419
diff changeset
517 sdp_parse_fmtp(st, p);
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
518 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
519 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
520 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
521 } else if(av_strstart(p, "framesize:", &p)) {
1431
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
522 // let dynamic protocol handlers have a stab at the line.
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
523 get_word(buf1, sizeof(buf1), &p);
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
524 payload_type = atoi(buf1);
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
525 for(i = 0; i < s->nb_streams;i++) {
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
526 st = s->streams[i];
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
527 rtsp_st = st->priv_data;
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
528 if (rtsp_st->sdp_payload_type == payload_type) {
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
529 if(rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->parse_sdp_a_line) {
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
530 rtsp_st->dynamic_handler->parse_sdp_a_line(st, rtsp_st->dynamic_protocol_context, buf);
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
531 }
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
532 }
2d8a17631520 fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents: 1425
diff changeset
533 }
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
534 } else if(av_strstart(p, "range:", &p)) {
1453
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
535 int64_t start, end;
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
536
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
537 // this is so that seeking on a streamed file can work.
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
538 rtsp_parse_range_npt(p, &start, &end);
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
539 s->start_time= start;
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
540 s->duration= (end==AV_NOPTS_VALUE)?AV_NOPTS_VALUE:end-start; // AV_NOPTS_VALUE means live broadcast (and can't seek)
3784
d370d80ad1df Use RTPDynamicProtocol parse_sdp_a_line() handlers in case of unknown SDP
rbultje
parents: 3722
diff changeset
541 } else if (s->nb_streams > 0) {
d370d80ad1df Use RTPDynamicProtocol parse_sdp_a_line() handlers in case of unknown SDP
rbultje
parents: 3722
diff changeset
542 rtsp_st = s->streams[s->nb_streams - 1]->priv_data;
d370d80ad1df Use RTPDynamicProtocol parse_sdp_a_line() handlers in case of unknown SDP
rbultje
parents: 3722
diff changeset
543 if (rtsp_st->dynamic_handler &&
d370d80ad1df Use RTPDynamicProtocol parse_sdp_a_line() handlers in case of unknown SDP
rbultje
parents: 3722
diff changeset
544 rtsp_st->dynamic_handler->parse_sdp_a_line)
d370d80ad1df Use RTPDynamicProtocol parse_sdp_a_line() handlers in case of unknown SDP
rbultje
parents: 3722
diff changeset
545 rtsp_st->dynamic_handler->parse_sdp_a_line(s->streams[s->nb_streams - 1],
d370d80ad1df Use RTPDynamicProtocol parse_sdp_a_line() handlers in case of unknown SDP
rbultje
parents: 3722
diff changeset
546 rtsp_st->dynamic_protocol_context, buf);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
547 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
548 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
549 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
550 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
551
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
552 static int sdp_parse(AVFormatContext *s, const char *content)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
553 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
554 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
555 int letter;
3860
d8fce96bb3ab Some RTSP streams use SDP lines longer than 1024 bytes, so the SDP line
rbultje
parents: 3859
diff changeset
556 char buf[2048], *q;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
557 SDPParseState sdp_parse_state, *s1 = &sdp_parse_state;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
558
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
559 memset(s1, 0, sizeof(SDPParseState));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
560 p = content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
561 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
562 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
563 letter = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
564 if (letter == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
565 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
566 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
567 if (*p != '=')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
568 goto next_line;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
569 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
570 /* get the content */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
571 q = buf;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
572 while (*p != '\n' && *p != '\r' && *p != '\0') {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
573 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
574 *q++ = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
575 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
576 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
577 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
578 sdp_parse_line(s, s1, letter, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
579 next_line:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
580 while (*p != '\n' && *p != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
581 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
582 if (*p == '\n')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
583 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
584 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
585 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
586 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
587
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
588 static void rtsp_parse_range(int *min_ptr, int *max_ptr, const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
589 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
590 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
591 int v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
592
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
593 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
594 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
595 v = strtol(p, (char **)&p, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
596 if (*p == '-') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
597 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
598 *min_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
599 v = strtol(p, (char **)&p, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
600 *max_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
601 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
602 *min_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
603 *max_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
606 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
607
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 /* XXX: only one transport specification is parsed */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
609 static void rtsp_parse_transport(RTSPHeader *reply, const char *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
610 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
611 char transport_protocol[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
612 char profile[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
613 char lower_transport[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
614 char parameter[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
615 RTSPTransportField *th;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
616 char buf[256];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
617
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
618 reply->nb_transports = 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
619
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
620 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
621 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
622 if (*p == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
623 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
624
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 th = &reply->transports[reply->nb_transports];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
626
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
627 get_word_sep(transport_protocol, sizeof(transport_protocol),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
628 "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
629 if (*p == '/')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
630 p++;
2865
51aa1054528c Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 2 x-pn-tng support
lu_zero
parents: 2864
diff changeset
631 if (!strcasecmp (transport_protocol, "rtp")) {
2866
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
632 get_word_sep(profile, sizeof(profile), "/;,", &p);
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
633 lower_transport[0] = '\0';
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
634 /* rtp/avp/<protocol> */
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
635 if (*p == '/') {
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
636 p++;
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
637 get_word_sep(lower_transport, sizeof(lower_transport),
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
638 ";,", &p);
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
639 }
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
640 } else if (!strcasecmp (transport_protocol, "x-pn-tng")) {
ccbca87ccd5e Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents: 2865
diff changeset
641 /* x-pn-tng/<protocol> */
2865
51aa1054528c Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 2 x-pn-tng support
lu_zero
parents: 2864
diff changeset
642 get_word_sep(lower_transport, sizeof(lower_transport), "/;,", &p);
51aa1054528c Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 2 x-pn-tng support
lu_zero
parents: 2864
diff changeset
643 profile[0] = '\0';
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
644 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
645 if (!strcasecmp(lower_transport, "TCP"))
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
646 th->lower_transport = RTSP_LOWER_TRANSPORT_TCP;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 else
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
648 th->lower_transport = RTSP_LOWER_TRANSPORT_UDP;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
649
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 if (*p == ';')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
652 /* get each parameter */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653 while (*p != '\0' && *p != ',') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654 get_word_sep(parameter, sizeof(parameter), "=;,", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 if (!strcmp(parameter, "port")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 rtsp_parse_range(&th->port_min, &th->port_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 } else if (!strcmp(parameter, "client_port")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 p++;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
663 rtsp_parse_range(&th->client_port_min,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 &th->client_port_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666 } else if (!strcmp(parameter, "server_port")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
668 p++;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
669 rtsp_parse_range(&th->server_port_min,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
670 &th->server_port_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
671 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672 } else if (!strcmp(parameter, "interleaved")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
673 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
674 p++;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
675 rtsp_parse_range(&th->interleaved_min,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 &th->interleaved_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
677 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
678 } else if (!strcmp(parameter, "multicast")) {
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
679 if (th->lower_transport == RTSP_LOWER_TRANSPORT_UDP)
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
680 th->lower_transport = RTSP_LOWER_TRANSPORT_UDP_MULTICAST;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
681 } else if (!strcmp(parameter, "ttl")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
682 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
683 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
684 th->ttl = strtol(p, (char **)&p, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
685 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
686 } else if (!strcmp(parameter, "destination")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
687 struct in_addr ipaddr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
688
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
689 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
690 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
691 get_word_sep(buf, sizeof(buf), ";,", &p);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
692 if (inet_aton(buf, &ipaddr))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
693 th->destination = ntohl(ipaddr.s_addr);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
694 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
695 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
696 while (*p != ';' && *p != '\0' && *p != ',')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
697 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
698 if (*p == ';')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
699 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
700 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
701 if (*p == ',')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
702 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
703
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
704 reply->nb_transports++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
705 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
706 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
707
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708 void rtsp_parse_line(RTSPHeader *reply, const char *buf)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
709 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
710 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
711
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
712 /* NOTE: we do case independent match for broken servers */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 p = buf;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
714 if (av_stristart(p, "Session:", &p)) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
715 get_word_sep(reply->session_id, sizeof(reply->session_id), ";", &p);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
716 } else if (av_stristart(p, "Content-Length:", &p)) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 reply->content_length = strtol(p, NULL, 10);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
718 } else if (av_stristart(p, "Transport:", &p)) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
719 rtsp_parse_transport(reply, p);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
720 } else if (av_stristart(p, "CSeq:", &p)) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 reply->seq = strtol(p, NULL, 10);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
722 } else if (av_stristart(p, "Range:", &p)) {
1453
c0235bab9e92 Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents: 1431
diff changeset
723 rtsp_parse_range_npt(p, &reply->range_start, &reply->range_end);
3855
c9550824fd1c Read RealChallenge1 field from the server.
rbultje
parents: 3854
diff changeset
724 } else if (av_stristart(p, "RealChallenge1:", &p)) {
c9550824fd1c Read RealChallenge1 field from the server.
rbultje
parents: 3854
diff changeset
725 skip_spaces(&p);
c9550824fd1c Read RealChallenge1 field from the server.
rbultje
parents: 3854
diff changeset
726 av_strlcpy(reply->real_challenge, p, sizeof(reply->real_challenge));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
727 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
728 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
729
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
730 static int url_readbuf(URLContext *h, unsigned char *buf, int size)
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
731 {
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
732 int ret, len;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
733
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
734 len = 0;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
735 while (len < size) {
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
736 ret = url_read(h, buf+len, size-len);
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
737 if (ret < 1)
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
738 return ret;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
739 len += ret;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
740 }
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
741 return len;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
742 }
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
743
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
744 /* skip a RTP/TCP interleaved packet */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
745 static void rtsp_skip_packet(AVFormatContext *s)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
746 {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
747 RTSPState *rt = s->priv_data;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
748 int ret, len, len1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
749 uint8_t buf[1024];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
750
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
751 ret = url_readbuf(rt->rtsp_hd, buf, 3);
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
752 if (ret != 3)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
753 return;
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2219
diff changeset
754 len = AV_RB16(buf + 1);
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
755 #ifdef DEBUG
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
756 printf("skipping RTP packet len=%d\n", len);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
757 #endif
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
758 /* skip payload */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
759 while (len > 0) {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
760 len1 = len;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
761 if (len1 > sizeof(buf))
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
762 len1 = sizeof(buf);
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
763 ret = url_readbuf(rt->rtsp_hd, buf, len1);
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
764 if (ret != len1)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
765 return;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
766 len -= len1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
767 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
768 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
770 static void rtsp_send_cmd(AVFormatContext *s,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
771 const char *cmd, RTSPHeader *reply,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 unsigned char **content_ptr)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
775 char buf[4096], buf1[1024], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
776 unsigned char ch;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 int content_length, line_count;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 unsigned char *content = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 memset(reply, 0, sizeof(RTSPHeader));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
783 rt->seq++;
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
784 av_strlcpy(buf, cmd, sizeof(buf));
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
785 snprintf(buf1, sizeof(buf1), "CSeq: %d\r\n", rt->seq);
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
786 av_strlcat(buf, buf1, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 if (rt->session_id[0] != '\0' && !strstr(cmd, "\nIf-Match:")) {
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
788 snprintf(buf1, sizeof(buf1), "Session: %s\r\n", rt->session_id);
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
789 av_strlcat(buf, buf1, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
790 }
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
791 av_strlcat(buf, "\r\n", sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793 printf("Sending:\n%s--\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
795 url_write(rt->rtsp_hd, buf, strlen(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
796
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
797 /* parse reply (XXX: use buffers) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
798 line_count = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
799 rt->last_reply[0] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
800 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
801 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
802 for(;;) {
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
803 if (url_readbuf(rt->rtsp_hd, &ch, 1) != 1)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
804 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
805 if (ch == '\n')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
806 break;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
807 if (ch == '$') {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
808 /* XXX: only parse it if first char on line ? */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
809 rtsp_skip_packet(s);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
810 } else if (ch != '\r') {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
811 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
812 *q++ = ch;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
813 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
814 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
815 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
816 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
817 printf("line='%s'\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
818 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
819 /* test if last line */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
820 if (buf[0] == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
821 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
822 p = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
823 if (line_count == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
824 /* get reply code */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
825 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
826 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
827 reply->status_code = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
828 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
829 rtsp_parse_line(reply, p);
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
830 av_strlcat(rt->last_reply, p, sizeof(rt->last_reply));
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
831 av_strlcat(rt->last_reply, "\n", sizeof(rt->last_reply));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
832 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
833 line_count++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
834 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
835
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
836 if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0')
2189
da71207a7cf1 use new string functions
mru
parents: 2095
diff changeset
837 av_strlcpy(rt->session_id, reply->session_id, sizeof(rt->session_id));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
838
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
839 content_length = reply->content_length;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
840 if (content_length > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
841 /* leave some room for a trailing '\0' (useful for simple parsing) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
842 content = av_malloc(content_length + 1);
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
843 (void)url_readbuf(rt->rtsp_hd, content, content_length);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
844 content[content_length] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
845 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
846 if (content_ptr)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
847 *content_ptr = content;
2263
f13dad8ba721 .memleak fix by Ronald Bultje. OK'd by Luca.
alex
parents: 2246
diff changeset
848 else
f13dad8ba721 .memleak fix by Ronald Bultje. OK'd by Luca.
alex
parents: 2246
diff changeset
849 av_free(content);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
850 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
851
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
852
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
853 /* close and free RTSP streams */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
854 static void rtsp_close_streams(RTSPState *rt)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
855 {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
856 int i;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
857 RTSPStream *rtsp_st;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
858
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
859 for(i=0;i<rt->nb_rtsp_streams;i++) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
860 rtsp_st = rt->rtsp_streams[i];
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
861 if (rtsp_st) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
862 if (rtsp_st->rtp_ctx)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
863 rtp_parse_close(rtsp_st->rtp_ctx);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
864 if (rtsp_st->rtp_handle)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
865 url_close(rtsp_st->rtp_handle);
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
866 if (rtsp_st->dynamic_handler && rtsp_st->dynamic_protocol_context)
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
867 rtsp_st->dynamic_handler->close(rtsp_st->dynamic_protocol_context);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
868 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
869 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
870 av_free(rt->rtsp_streams);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
871 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
872
3919
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
873 static int
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
874 rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
875 {
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
876 AVStream *st = NULL;
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
877
3920
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
878 /* open the RTP context */
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
879 if (rtsp_st->stream_index >= 0)
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
880 st = s->streams[rtsp_st->stream_index];
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
881 if (!st)
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
882 s->ctx_flags |= AVFMTCTX_NOHEADER;
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
883 rtsp_st->rtp_ctx = rtp_parse_open(s, st, rtsp_st->rtp_handle, rtsp_st->sdp_payload_type, &rtsp_st->rtp_payload_data);
3919
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
884
3920
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
885 if (!rtsp_st->rtp_ctx) {
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
886 return AVERROR(ENOMEM);
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
887 } else {
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
888 if(rtsp_st->dynamic_handler) {
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
889 rtsp_st->rtp_ctx->dynamic_protocol_context= rtsp_st->dynamic_protocol_context;
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
890 rtsp_st->rtp_ctx->parse_packet= rtsp_st->dynamic_handler->parse_packet;
3919
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
891 }
3920
ae2d4ee06a94 Reindent after r15927, see discussion in "[PATCH] rtsp cleanup part 1:
rbultje
parents: 3919
diff changeset
892 }
3919
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
893
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
894 return 0;
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
895 }
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
896
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
897 /**
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
898 * @returns 0 on success, <0 on error, 1 if protocol is unavailable.
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
899 */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
900 static int
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
901 make_setup_request (AVFormatContext *s, const char *host, int port,
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
902 int lower_transport, const char *real_challenge)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
903 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
904 RTSPState *rt = s->priv_data;
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
905 int j, i, err;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
906 RTSPStream *rtsp_st;
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
907 RTSPHeader reply1, *reply = &reply1;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
908 char cmd[2048];
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
909 const char *trans_pref;
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
910
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
911 if (rt->server_type == RTSP_SERVER_REAL)
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
912 trans_pref = "x-pn-tng";
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
913 else
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
914 trans_pref = "RTP/AVP";
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
915
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
916 /* for each stream, make the setup request */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
917 /* XXX: we assume the same server is used for the control of each
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
918 RTSP stream */
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
919
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
920 for(j = RTSP_RTP_PORT_MIN, i = 0; i < rt->nb_rtsp_streams; ++i) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
921 char transport[2048];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
922
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
923 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
924
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
925 /* RTP/UDP */
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
926 if (lower_transport == RTSP_LOWER_TRANSPORT_UDP) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
927 char buf[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
928
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
929 /* first try in specified port range */
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
930 if (RTSP_RTP_PORT_MIN != 0) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
931 while(j <= RTSP_RTP_PORT_MAX) {
2711
0ff7c5289e68 Specify the server address when opening an rtp:// URL in rtsp.c, so
lucabe
parents: 2684
diff changeset
932 snprintf(buf, sizeof(buf), "rtp://%s?localport=%d", host, j);
2684
3dd4b622f4e3 If local port n is not available, try n + 2 instead of continuing to bind
lucabe
parents: 2681
diff changeset
933 j += 2; /* we will use two port by rtp stream (rtp and rtcp) */
1425
00d9393a126f make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents: 1424
diff changeset
934 if (url_open(&rtsp_st->rtp_handle, buf, URL_RDWR) == 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
935 goto rtp_opened;
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
936 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
937 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
938 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
939
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
940 /* then try on any port
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
941 ** if (url_open(&rtsp_st->rtp_handle, "rtp://", URL_RDONLY) < 0) {
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
942 ** err = AVERROR_INVALIDDATA;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
943 ** goto fail;
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
944 ** }
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
945 */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
946
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
947 rtp_opened:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
948 port = rtp_get_local_port(rtsp_st->rtp_handle);
3877
3e0c7ad2a675 Remove unused code that used to handle protocol concatenation, i.e. trying
rbultje
parents: 3876
diff changeset
949 snprintf(transport, sizeof(transport) - 1,
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
950 "%s/UDP;unicast;client_port=%d",
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
951 trans_pref, port);
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
952 if (rt->server_type == RTSP_SERVER_RTP)
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
953 av_strlcatf(transport, sizeof(transport), "-%d", port + 1);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
954 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
955
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
956 /* RTP/TCP */
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
957 else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
3877
3e0c7ad2a675 Remove unused code that used to handle protocol concatenation, i.e. trying
rbultje
parents: 3876
diff changeset
958 snprintf(transport, sizeof(transport) - 1,
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
959 "%s/TCP", trans_pref);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
960 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
961
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
962 else if (lower_transport == RTSP_LOWER_TRANSPORT_UDP_MULTICAST) {
3877
3e0c7ad2a675 Remove unused code that used to handle protocol concatenation, i.e. trying
rbultje
parents: 3876
diff changeset
963 snprintf(transport, sizeof(transport) - 1,
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
964 "%s/UDP;multicast", trans_pref);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
965 }
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
966 if (rt->server_type == RTSP_SERVER_REAL)
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
967 av_strlcat(transport, ";mode=play", sizeof(transport));
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
968 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
969 "SETUP %s RTSP/1.0\r\n"
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
970 "Transport: %s\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
971 rtsp_st->control_url, transport);
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
972 if (i == 0 && rt->server_type == RTSP_SERVER_REAL) {
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
973 char real_res[41], real_csum[9];
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
974 ff_rdt_calc_response_and_checksum(real_res, real_csum,
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
975 real_challenge);
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
976 av_strlcatf(cmd, sizeof(cmd),
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
977 "If-Match: %s\r\n"
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
978 "RealChallenge2: %s, sd=%s\r\n",
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
979 rt->session_id, real_res, real_csum);
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
980 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
981 rtsp_send_cmd(s, cmd, reply, NULL);
3149
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
982 if (reply->status_code == 461 /* Unsupported protocol */ && i == 0) {
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
983 err = 1;
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
984 goto fail;
3151
65236eababe9 Reindent after rtsp-alternate-protocol* patches.
rbultje
parents: 3150
diff changeset
985 } else if (reply->status_code != RTSP_STATUS_OK ||
65236eababe9 Reindent after rtsp-alternate-protocol* patches.
rbultje
parents: 3150
diff changeset
986 reply->nb_transports != 1) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
987 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
988 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
989 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
990
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
991 /* XXX: same protocol for all streams is required */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
992 if (i > 0) {
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
993 if (reply->transports[0].lower_transport != rt->lower_transport) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
994 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
995 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
996 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
997 } else {
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
998 rt->lower_transport = reply->transports[0].lower_transport;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
999 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1000
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1001 /* close RTP connection if not choosen */
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1002 if (reply->transports[0].lower_transport != RTSP_LOWER_TRANSPORT_UDP &&
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1003 (lower_transport == RTSP_LOWER_TRANSPORT_UDP)) {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1004 url_close(rtsp_st->rtp_handle);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1005 rtsp_st->rtp_handle = NULL;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1006 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1007
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1008 switch(reply->transports[0].lower_transport) {
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1009 case RTSP_LOWER_TRANSPORT_TCP:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1010 rtsp_st->interleaved_min = reply->transports[0].interleaved_min;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1011 rtsp_st->interleaved_max = reply->transports[0].interleaved_max;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1012 break;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1013
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1014 case RTSP_LOWER_TRANSPORT_UDP:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1015 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1016 char url[1024];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1017
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1018 /* XXX: also use address if specified */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1019 snprintf(url, sizeof(url), "rtp://%s:%d",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1020 host, reply->transports[0].server_port_min);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1021 if (rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1022 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1023 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1024 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1025 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1026 break;
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1027 case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1028 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1029 char url[1024];
2246
6dade35dc9b3 rtsp multicast fix by Thijs Vermeir $1$2@gmail.com
lu_zero
parents: 2222
diff changeset
1030 struct in_addr in;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1031
2246
6dade35dc9b3 rtsp multicast fix by Thijs Vermeir $1$2@gmail.com
lu_zero
parents: 2222
diff changeset
1032 in.s_addr = htonl(reply->transports[0].destination);
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3202
diff changeset
1033 snprintf(url, sizeof(url), "rtp://%s:%d?ttl=%d",
2246
6dade35dc9b3 rtsp multicast fix by Thijs Vermeir $1$2@gmail.com
lu_zero
parents: 2222
diff changeset
1034 inet_ntoa(in),
6dade35dc9b3 rtsp multicast fix by Thijs Vermeir $1$2@gmail.com
lu_zero
parents: 2222
diff changeset
1035 reply->transports[0].port_min,
6dade35dc9b3 rtsp multicast fix by Thijs Vermeir $1$2@gmail.com
lu_zero
parents: 2222
diff changeset
1036 reply->transports[0].ttl);
1425
00d9393a126f make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents: 1424
diff changeset
1037 if (url_open(&rtsp_st->rtp_handle, url, URL_RDWR) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1038 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1039 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1040 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1041 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1042 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1043 }
774
820863425158 RTP/RTSP and MPEG4-AAC audio
michael
parents: 706
diff changeset
1044
3919
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
1045 if ((err = rtsp_open_transport_ctx(s, rtsp_st)))
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1046 goto fail;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1047 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1048
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1049 if (rt->server_type == RTSP_SERVER_REAL)
3903
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1050 rt->need_subscription = 1;
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1051
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1052 return 0;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1053
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1054 fail:
3149
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1055 for (i=0; i<rt->nb_rtsp_streams; i++) {
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1056 if (rt->rtsp_streams[i]->rtp_handle) {
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1057 url_close(rt->rtsp_streams[i]->rtp_handle);
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1058 rt->rtsp_streams[i]->rtp_handle = NULL;
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1059 }
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1060 }
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1061 return err;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1062 }
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1063
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1064 static int rtsp_read_header(AVFormatContext *s,
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1065 AVFormatParameters *ap)
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1066 {
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1067 RTSPState *rt = s->priv_data;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1068 char host[1024], path[1024], tcpname[1024], cmd[2048], *option_list, *option;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1069 URLContext *rtsp_hd;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1070 int port, ret, err;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1071 RTSPHeader reply1, *reply = &reply1;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1072 unsigned char *content = NULL;
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1073 int lower_transport_mask = 0;
3856
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1074 char real_challenge[64];
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1075
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1076 /* extract hostname and port */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1077 url_split(NULL, 0, NULL, 0,
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1078 host, sizeof(host), &port, path, sizeof(path), s->filename);
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1079 if (port < 0)
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1080 port = RTSP_DEFAULT_PORT;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1081
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1082 /* search for options */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1083 option_list = strchr(path, '?');
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1084 if (option_list) {
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1085 /* remove the options from the path */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1086 *option_list++ = 0;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1087 while(option_list) {
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1088 /* move the option pointer */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1089 option = option_list;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1090 option_list = strchr(option_list, '&');
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1091 if (option_list)
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1092 *(option_list++) = 0;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1093 /* handle the options */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1094 if (strcmp(option, "udp") == 0)
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1095 lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_UDP);
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1096 else if (strcmp(option, "multicast") == 0)
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1097 lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_UDP_MULTICAST);
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1098 else if (strcmp(option, "tcp") == 0)
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1099 lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_TCP);
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1100 }
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1101 }
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1102
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1103 if (!lower_transport_mask)
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1104 lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_LAST) - 1;
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1105
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1106 /* open the tcp connexion */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1107 snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port);
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1108 if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0)
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1109 return AVERROR(EIO);
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1110 rt->rtsp_hd = rtsp_hd;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1111 rt->seq = 0;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1112
3856
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1113 /* request options supported by the server; this also detects server type */
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1114 for (rt->server_type = RTSP_SERVER_RTP;;) {
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1115 snprintf(cmd, sizeof(cmd),
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1116 "OPTIONS %s RTSP/1.0\r\n", s->filename);
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1117 if (rt->server_type == RTSP_SERVER_REAL)
3856
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1118 av_strlcat(cmd,
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1119 /**
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1120 * The following entries are required for proper
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1121 * streaming from a Realmedia server. They are
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1122 * interdependent in some way although we currently
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1123 * don't quite understand how. Values were copied
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1124 * from mplayer SVN r23589.
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1125 * @param CompanyID is a 16-byte ID in base64
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1126 * @param ClientChallenge is a 16-byte ID in hex
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1127 */
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1128 "ClientChallenge: 9e26d33f2984236010ef6253fb1887f7\r\n"
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1129 "PlayerStarttime: [28/03/2003:22:50:23 00:00]\r\n"
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1130 "CompanyID: KnKV4M4I/B2FjJ1TToLycw==\r\n"
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1131 "GUID: 00000000-0000-0000-0000-000000000000\r\n",
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1132 sizeof(cmd));
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1133 rtsp_send_cmd(s, cmd, reply, NULL);
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1134 if (reply->status_code != RTSP_STATUS_OK) {
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1135 err = AVERROR_INVALIDDATA;
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1136 goto fail;
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1137 }
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1138
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1139 /* detect server type if not standard-compliant RTP */
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1140 if (rt->server_type != RTSP_SERVER_REAL && reply->real_challenge[0]) {
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1141 rt->server_type = RTSP_SERVER_REAL;
3856
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1142 continue;
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1143 } else if (rt->server_type == RTSP_SERVER_REAL) {
3856
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1144 strcpy(real_challenge, reply->real_challenge);
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1145 }
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1146 break;
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1147 }
055f8385670c Send RTSP OPTIONS command to detect server type.
rbultje
parents: 3855
diff changeset
1148
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1149 /* describe the stream */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1150 snprintf(cmd, sizeof(cmd),
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1151 "DESCRIBE %s RTSP/1.0\r\n"
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1152 "Accept: application/sdp\r\n",
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1153 s->filename);
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1154 if (rt->server_type == RTSP_SERVER_REAL) {
3859
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1155 /**
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1156 * The Require: attribute is needed for proper streaming from
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1157 * Realmedia servers.
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1158 */
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1159 av_strlcat(cmd,
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1160 "Require: com.real.retain-entity-for-setup\r\n",
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1161 sizeof(cmd));
8bde52c0934c Implement Realmedia-compatible DESCRIBE command.
rbultje
parents: 3856
diff changeset
1162 }
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1163 rtsp_send_cmd(s, cmd, reply, &content);
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1164 if (!content) {
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1165 err = AVERROR_INVALIDDATA;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1166 goto fail;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1167 }
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1168 if (reply->status_code != RTSP_STATUS_OK) {
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1169 err = AVERROR_INVALIDDATA;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1170 goto fail;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1171 }
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1172
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1173 /* now we got the SDP description, we parse it */
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1174 ret = sdp_parse(s, (const char *)content);
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1175 av_freep(&content);
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1176 if (ret < 0) {
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1177 err = AVERROR_INVALIDDATA;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1178 goto fail;
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1179 }
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1180
3149
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1181 do {
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1182 int lower_transport = ff_log2_tab[lower_transport_mask & ~(lower_transport_mask - 1)];
3149
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1183
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1184 err = make_setup_request(s, host, port, lower_transport,
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1185 rt->server_type == RTSP_SERVER_REAL ?
3876
1026953d4ffe Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents: 3861
diff changeset
1186 real_challenge : NULL);
3149
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1187 if (err < 0)
3151
65236eababe9 Reindent after rtsp-alternate-protocol* patches.
rbultje
parents: 3150
diff changeset
1188 goto fail;
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1189 lower_transport_mask &= ~(1 << lower_transport);
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1190 if (lower_transport_mask == 0 && err == 1) {
3202
98e633b72d38 use FF_NETERROR to make winsock happy, patch from prossATxvidDoTorg
lu_zero
parents: 3151
diff changeset
1191 err = AVERROR(FF_NETERROR(EPROTONOSUPPORT));
3149
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1192 goto fail;
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1193 }
5a7a7406ab1f Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents: 3147
diff changeset
1194 } while (err);
3147
91d65fdf91e1 Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents: 2884
diff changeset
1195
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1196 rt->state = RTSP_STATE_IDLE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1197 rt->seek_timestamp = 0; /* default is to start stream at position
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1198 zero */
1003
2d57ce58f576 simplify AVFormatParameters NULL checks
michael
parents: 896
diff changeset
1199 if (ap->initial_pause) {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1200 /* do not start immediately */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1201 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1202 if (rtsp_read_play(s) < 0) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1203 err = AVERROR_INVALIDDATA;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1204 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1205 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1206 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1207 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1208 fail:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1209 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1210 av_freep(&content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1211 url_close(rt->rtsp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1212 return err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1213 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1214
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1215 static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1216 uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1217 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1218 RTSPState *rt = s->priv_data;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1219 int id, len, i, ret;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1220 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1221
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1222 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1223 printf("tcp_read_packet:\n");
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1224 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1225 redo:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1226 for(;;) {
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
1227 ret = url_readbuf(rt->rtsp_hd, buf, 1);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1228 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1229 printf("ret=%d c=%02x [%c]\n", ret, buf[0], buf[0]);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1230 #endif
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1231 if (ret != 1)
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1232 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1233 if (buf[0] == '$')
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1234 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1235 }
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
1236 ret = url_readbuf(rt->rtsp_hd, buf, 3);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1237 if (ret != 3)
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1238 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1239 id = buf[0];
2222
3427d0c63a32 Use AV_RB* macros where appropriate.
diego
parents: 2219
diff changeset
1240 len = AV_RB16(buf + 1);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1241 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1242 printf("id=%d len=%d\n", id, len);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1243 #endif
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1244 if (len > buf_size || len < 12)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1245 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1246 /* get the data */
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
1247 ret = url_readbuf(rt->rtsp_hd, buf, len);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1248 if (ret != len)
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1249 return -1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1250
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1251 /* find the matching stream */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1252 for(i = 0; i < rt->nb_rtsp_streams; i++) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1253 rtsp_st = rt->rtsp_streams[i];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1254 if (id >= rtsp_st->interleaved_min &&
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1255 id <= rtsp_st->interleaved_max)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1256 goto found;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1257 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1258 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1259 found:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1260 *prtsp_st = rtsp_st;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1261 return len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1262 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1263
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1264 static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1265 uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1266 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1267 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1268 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1269 fd_set rfds;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1270 int fd1, fd2, fd_max, n, i, ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1271 struct timeval tv;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1272
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1273 for(;;) {
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1274 if (url_interrupt_cb())
2772
b43dc2901f83 Make av_read_frame with rtsp client return EINTR on interrupt
lu_zero
parents: 2771
diff changeset
1275 return AVERROR(EINTR);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1276 FD_ZERO(&rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1277 fd_max = -1;
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1278 for(i = 0; i < rt->nb_rtsp_streams; i++) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1279 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1280 /* currently, we cannot probe RTCP handle because of blocking restrictions */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1281 rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1282 if (fd1 > fd_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1283 fd_max = fd1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1284 FD_SET(fd1, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1285 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1286 tv.tv_sec = 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1287 tv.tv_usec = 100 * 1000;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1288 n = select(fd_max + 1, &rfds, NULL, NULL, &tv);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1289 if (n > 0) {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1290 for(i = 0; i < rt->nb_rtsp_streams; i++) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1291 rtsp_st = rt->rtsp_streams[i];
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1292 rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1293 if (FD_ISSET(fd1, &rfds)) {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1294 ret = url_read(rtsp_st->rtp_handle, buf, buf_size);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1295 if (ret > 0) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1296 *prtsp_st = rtsp_st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1297 return ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1298 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1299 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1300 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1301 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1302 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1303 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1304
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1305 static int rtsp_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1306 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1307 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1308 RTSPState *rt = s->priv_data;
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1309 RTSPStream *rtsp_st;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1310 int ret, len;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1311 uint8_t buf[RTP_MAX_PACKET_LENGTH];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1312
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1313 if (rt->server_type == RTSP_SERVER_REAL && rt->need_subscription) {
3903
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1314 int i;
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1315 RTSPHeader reply1, *reply = &reply1;
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1316 char cmd[1024];
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1317
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1318 snprintf(cmd, sizeof(cmd),
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1319 "SET_PARAMETER %s RTSP/1.0\r\n"
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1320 "Subscribe: ",
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1321 s->filename);
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1322 for (i = 0; i < rt->nb_rtsp_streams; i++) {
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1323 if (i != 0) av_strlcat(cmd, ",", sizeof(cmd));
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1324 ff_rdt_subscribe_rule(
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1325 rt->rtsp_streams[i]->rtp_ctx,
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1326 cmd, sizeof(cmd), i, 0);
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1327 }
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1328 av_strlcat(cmd, "\r\n", sizeof(cmd));
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1329 rtsp_send_cmd(s, cmd, reply, NULL);
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1330 if (reply->status_code != RTSP_STATUS_OK)
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1331 return AVERROR_INVALIDDATA;
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1332 rt->need_subscription = 0;
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1333
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1334 if (rt->state == RTSP_STATE_PLAYING)
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1335 rtsp_read_play (s);
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1336 }
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1337
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1338 /* get next frames from the same RTP packet */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1339 if (rt->cur_rtp) {
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1340 if (rt->server_type == RTSP_SERVER_REAL)
3905
91987686113d Implement RDT-specific data parsing routines. After these changes, simple
rbultje
parents: 3904
diff changeset
1341 ret = ff_rdt_parse_packet(rt->cur_rtp, pkt, NULL, 0);
91987686113d Implement RDT-specific data parsing routines. After these changes, simple
rbultje
parents: 3904
diff changeset
1342 else
91987686113d Implement RDT-specific data parsing routines. After these changes, simple
rbultje
parents: 3904
diff changeset
1343 ret = rtp_parse_packet(rt->cur_rtp, pkt, NULL, 0);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1344 if (ret == 0) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1345 rt->cur_rtp = NULL;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1346 return 0;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1347 } else if (ret == 1) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1348 return 0;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1349 } else {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1350 rt->cur_rtp = NULL;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1351 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1352 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1353
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1354 /* read next RTP packet */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1355 redo:
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1356 switch(rt->lower_transport) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1357 default:
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1358 case RTSP_LOWER_TRANSPORT_TCP:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1359 len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1360 break;
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1361 case RTSP_LOWER_TRANSPORT_UDP:
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1362 case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1363 len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf));
2219
fa6c59a5ab0d check udp_read_packet return value not to access uninitialized memory
benoit
parents: 2193
diff changeset
1364 if (len >=0 && rtsp_st->rtp_ctx)
1425
00d9393a126f make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents: 1424
diff changeset
1365 rtp_check_and_send_back_rr(rtsp_st->rtp_ctx, len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1366 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1367 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1368 if (len < 0)
2775
1301147d9450 Make av_read_frame with rtsp client return EINTR on interrupt
lu_zero
parents: 2772
diff changeset
1369 return len;
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1370 if (rt->server_type == RTSP_SERVER_REAL)
3905
91987686113d Implement RDT-specific data parsing routines. After these changes, simple
rbultje
parents: 3904
diff changeset
1371 ret = ff_rdt_parse_packet(rtsp_st->rtp_ctx, pkt, buf, len);
91987686113d Implement RDT-specific data parsing routines. After these changes, simple
rbultje
parents: 3904
diff changeset
1372 else
91987686113d Implement RDT-specific data parsing routines. After these changes, simple
rbultje
parents: 3904
diff changeset
1373 ret = rtp_parse_packet(rtsp_st->rtp_ctx, pkt, buf, len);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1374 if (ret < 0)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1375 goto redo;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1376 if (ret == 1) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1377 /* more packets may follow, so we save the RTP context */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1378 rt->cur_rtp = rtsp_st->rtp_ctx;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1379 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1380 return 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1381 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1382
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1383 static int rtsp_read_play(AVFormatContext *s)
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1384 {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1385 RTSPState *rt = s->priv_data;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1386 RTSPHeader reply1, *reply = &reply1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1387 char cmd[1024];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1388
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 304
diff changeset
1389 av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state);
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1390
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1391 if (!(rt->server_type == RTSP_SERVER_REAL && rt->need_subscription)) {
3904
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1392 if (rt->state == RTSP_STATE_PAUSED) {
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1393 snprintf(cmd, sizeof(cmd),
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1394 "PLAY %s RTSP/1.0\r\n",
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1395 s->filename);
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1396 } else {
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1397 snprintf(cmd, sizeof(cmd),
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1398 "PLAY %s RTSP/1.0\r\n"
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1399 "Range: npt=%0.3f-\r\n",
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1400 s->filename,
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1401 (double)rt->seek_timestamp / AV_TIME_BASE);
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1402 }
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1403 rtsp_send_cmd(s, cmd, reply, NULL);
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1404 if (reply->status_code != RTSP_STATUS_OK) {
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1405 return -1;
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1406 }
3903
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1407 }
3861
a0098594ab90 Remove useless "else" case in if X { A; return }; else { B }. See discussion
rbultje
parents: 3860
diff changeset
1408 rt->state = RTSP_STATE_PLAYING;
a0098594ab90 Remove useless "else" case in if X { A; return }; else { B }. See discussion
rbultje
parents: 3860
diff changeset
1409 return 0;
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1410 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1411
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1412 /* pause the stream */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1413 static int rtsp_read_pause(AVFormatContext *s)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1414 {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1415 RTSPState *rt = s->priv_data;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1416 RTSPHeader reply1, *reply = &reply1;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1417 char cmd[1024];
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1418
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1419 rt = s->priv_data;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1420
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1421 if (rt->state != RTSP_STATE_PLAYING)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1422 return 0;
3923
83e51bcb03c2 Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents: 3920
diff changeset
1423 else if (!(rt->server_type == RTSP_SERVER_REAL && rt->need_subscription)) {
3904
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1424 snprintf(cmd, sizeof(cmd),
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1425 "PAUSE %s RTSP/1.0\r\n",
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1426 s->filename);
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1427 rtsp_send_cmd(s, cmd, reply, NULL);
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1428 if (reply->status_code != RTSP_STATUS_OK) {
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1429 return -1;
52e586c04402 Reindent after previous patch.
rbultje
parents: 3903
diff changeset
1430 }
3903
aeb79f68ba7e Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents: 3877
diff changeset
1431 }
3861
a0098594ab90 Remove useless "else" case in if X { A; return }; else { B }. See discussion
rbultje
parents: 3860
diff changeset
1432 rt->state = RTSP_STATE_PAUSED;
a0098594ab90 Remove useless "else" case in if X { A; return }; else { B }. See discussion
rbultje
parents: 3860
diff changeset
1433 return 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1434 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1435
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1436 static int rtsp_read_seek(AVFormatContext *s, int stream_index,
558
89bd76208427 100l (forgoten seeking functions)
michael
parents: 511
diff changeset
1437 int64_t timestamp, int flags)
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1438 {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1439 RTSPState *rt = s->priv_data;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1440
2408
a32ac90d5d67 Use correct timescale in RTSP seeking
lucabe
parents: 2274
diff changeset
1441 rt->seek_timestamp = av_rescale_q(timestamp, s->streams[stream_index]->time_base, AV_TIME_BASE_Q);
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1442 switch(rt->state) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1443 default:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1444 case RTSP_STATE_IDLE:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1445 break;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1446 case RTSP_STATE_PLAYING:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1447 if (rtsp_read_play(s) != 0)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1448 return -1;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1449 break;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1450 case RTSP_STATE_PAUSED:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1451 rt->state = RTSP_STATE_IDLE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1452 break;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1453 }
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1454 return 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1455 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1456
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1457 static int rtsp_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1458 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1459 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1460 RTSPHeader reply1, *reply = &reply1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1461 char cmd[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1462
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1463 #if 0
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1464 /* NOTE: it is valid to flush the buffer here */
3957
9f943bb755f9 Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents: 3941
diff changeset
1465 if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1466 url_fclose(&rt->rtsp_gb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1467 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1468 #endif
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1469 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1470 "TEARDOWN %s RTSP/1.0\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1471 s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1472 rtsp_send_cmd(s, cmd, reply, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1473
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1474 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1475 url_close(rt->rtsp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1476 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1477 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1478
2054
9f93361c3dc2 Don't compile RTSP_DEMUXER if not requested
alex
parents: 2053
diff changeset
1479 #ifdef CONFIG_RTSP_DEMUXER
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1124
diff changeset
1480 AVInputFormat rtsp_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1481 "rtsp",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
1482 NULL_IF_CONFIG_SMALL("RTSP input format"),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1483 sizeof(RTSPState),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1484 rtsp_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1485 rtsp_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1486 rtsp_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1487 rtsp_read_close,
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1488 rtsp_read_seek,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1489 .flags = AVFMT_NOFILE,
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1490 .read_play = rtsp_read_play,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1491 .read_pause = rtsp_read_pause,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1492 };
2054
9f93361c3dc2 Don't compile RTSP_DEMUXER if not requested
alex
parents: 2053
diff changeset
1493 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1494
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1495 static int sdp_probe(AVProbeData *p1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1496 {
706
fc254f396f15 buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents: 587
diff changeset
1497 const char *p = p1->buf, *p_end = p1->buf + p1->buf_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1498
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1499 /* we look for a line beginning "c=IN IP4" */
706
fc254f396f15 buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents: 587
diff changeset
1500 while (p < p_end && *p != '\0') {
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
1501 if (p + sizeof("c=IN IP4") - 1 < p_end && av_strstart(p, "c=IN IP4", NULL))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1502 return AVPROBE_SCORE_MAX / 2;
706
fc254f396f15 buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents: 587
diff changeset
1503
fc254f396f15 buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents: 587
diff changeset
1504 while(p < p_end - 1 && *p != '\n') p++;
fc254f396f15 buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents: 587
diff changeset
1505 if (++p >= p_end)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1506 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1507 if (*p == '\r')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1508 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1509 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1510 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1511 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1512
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1513 #define SDP_MAX_SIZE 8192
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1514
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1515 static int sdp_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1516 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1517 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1518 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1519 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1520 int size, i, err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1521 char *content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1522 char url[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1523
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1524 /* read the whole sdp file */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1525 /* XXX: better loading */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1526 content = av_malloc(SDP_MAX_SIZE);
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2759
diff changeset
1527 size = get_buffer(s->pb, content, SDP_MAX_SIZE - 1);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1528 if (size <= 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1529 av_free(content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1530 return AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1531 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1532 content[size] ='\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1533
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1534 sdp_parse(s, content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1535 av_free(content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1536
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1537 /* open each RTP stream */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1538 for(i=0;i<rt->nb_rtsp_streams;i++) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1539 rtsp_st = rt->rtsp_streams[i];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1540
3222
47e0fbaba376 Fix receiving from SDP with unicast destinations
lucabe
parents: 3221
diff changeset
1541 snprintf(url, sizeof(url), "rtp://%s:%d?localport=%d&ttl=%d",
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
1542 inet_ntoa(rtsp_st->sdp_ip),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1543 rtsp_st->sdp_port,
3222
47e0fbaba376 Fix receiving from SDP with unicast destinations
lucabe
parents: 3221
diff changeset
1544 rtsp_st->sdp_port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1545 rtsp_st->sdp_ttl);
1425
00d9393a126f make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents: 1424
diff changeset
1546 if (url_open(&rtsp_st->rtp_handle, url, URL_RDWR) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1547 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1548 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1549 }
3919
1879eab34f88 Factorize out common code for opening of the RTP parsing context between
rbultje
parents: 3905
diff changeset
1550 if ((err = rtsp_open_transport_ctx(s, rtsp_st)))
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1551 goto fail;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1552 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1553 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1554 fail:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1555 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1556 return err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1557 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1558
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1559 static int sdp_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1560 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1561 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1562 return rtsp_read_packet(s, pkt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1563 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1564
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1565 static int sdp_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1566 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1567 RTSPState *rt = s->priv_data;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1568 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1569 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1570 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1571
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1572 #ifdef CONFIG_SDP_DEMUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1573 AVInputFormat sdp_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1574 "sdp",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
1575 NULL_IF_CONFIG_SMALL("SDP"),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1576 sizeof(RTSPState),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1577 sdp_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1578 sdp_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1579 sdp_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1580 sdp_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1581 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
1582 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1583
2053
4611fce2f394 properly compile code for REDIR_DEMUXER
alex
parents: 2048
diff changeset
1584 #ifdef CONFIG_REDIR_DEMUXER
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1585 /* dummy redirector format (used directly in av_open_input_file now) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1586 static int redir_probe(AVProbeData *pd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1587 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1588 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1589 p = pd->buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1590 while (redir_isspace(*p))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1591 p++;
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
1592 if (av_strstart(p, "http://", NULL) ||
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2189
diff changeset
1593 av_strstart(p, "rtsp://", NULL))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1594 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1595 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1596 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1597
2785
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1598 static int redir_read_header(AVFormatContext *s, AVFormatParameters *ap)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1599 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1600 char buf[4096], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1601 int c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1602 AVFormatContext *ic = NULL;
2785
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1603 ByteIOContext *f = s->pb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1604
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1605 /* parse each URL and try to open it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1606 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1607 while (c != URL_EOF) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1608 /* skip spaces */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1609 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1610 if (!redir_isspace(c))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1611 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1612 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1613 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1614 if (c == URL_EOF)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1615 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1616 /* record url */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1617 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1618 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1619 if (c == URL_EOF || redir_isspace(c))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1620 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1621 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1622 *q++ = c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1623 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1624 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1625 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1626 //printf("URL='%s'\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1627 /* try to open the media file */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1628 if (av_open_input_file(&ic, buf, NULL, 0, NULL) == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1629 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1630 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1631 if (!ic)
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
1632 return AVERROR(EIO);
2785
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1633
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1634 *s = *ic;
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1635 url_fclose(f);
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1636
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1637 return 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1638 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1639
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1124
diff changeset
1640 AVInputFormat redir_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1641 "redir",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3286
diff changeset
1642 NULL_IF_CONFIG_SMALL("Redirector format"),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1643 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1644 redir_probe,
2785
d3b3cfb538d8 Suppress the "redirector hack" from libavformat/utils.c:av_open_input_stream(),
lucabe
parents: 2775
diff changeset
1645 redir_read_header,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1646 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1647 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1648 };
2053
4611fce2f394 properly compile code for REDIR_DEMUXER
alex
parents: 2048
diff changeset
1649 #endif