annotate rtsp.c @ 355:46029c682234 libavformat

seeking stuff adaptively change middle position selection algo for seeking, this avoids some ugly worstcases of the interpolated variant avoid backward search for mpeg where possible, its 17 times slower then forward according to my benchmark
author michael
date Sat, 17 Jan 2004 20:26:44 +0000
parents d58c8859ff8c
children 845f9de2c883
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 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20
182
82fea3fec65b OSX and BeOS networking fix (socklen_t)
mmu_man
parents: 179
diff changeset
21 #include <unistd.h> /* for select() prototype */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #include <sys/time.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include <netinet/in.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #include <sys/socket.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #ifndef __BEOS__
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 # include <arpa/inet.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 # include "barpainet.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 //#define DEBUG
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
32 //#define DEBUG_RTP_TCP
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
34 enum RTSPClientState {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
35 RTSP_STATE_IDLE,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
36 RTSP_STATE_PLAYING,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
37 RTSP_STATE_PAUSED,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
38 };
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
39
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 typedef struct RTSPState {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 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
42 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
43 struct RTSPStream **rtsp_streams;
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
44
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
45 enum RTSPClientState state;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
46 int64_t seek_timestamp;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
47
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
48 /* XXX: currently we use unbuffered input */
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
49 // ByteIOContext rtsp_gb;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 int seq; /* RTSP command sequence number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 char session_id[512];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 enum RTSPProtocol protocol;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 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
54 RTPDemuxContext *cur_rtp;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 } RTSPState;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 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
58 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
59 RTPDemuxContext *rtp_ctx; /* RTP parse context */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
60
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
61 int stream_index; /* corresponding stream index, if any. -1 if none (MPEG2TS case) */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 int interleaved_min, interleaved_max; /* interleave ids, if TCP transport */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 char control_url[1024]; /* url for this stream (from SDP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 int sdp_port; /* port (from SDP content - not used in RTSP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 struct in_addr sdp_ip; /* IP address (from SDP content - not used in RTSP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 int sdp_ttl; /* IP TTL (from SDP content - not used in RTSP) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 int sdp_payload_type; /* payload type - only used in SDP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 } RTSPStream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
71 static int rtsp_read_play(AVFormatContext *s);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
72
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 /* XXX: currently, the only way to change the protocols consists in
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 changing this variable */
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
75 #if 0
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 int rtsp_default_protocols = (1 << RTSP_PROTOCOL_RTP_TCP) | (1 << RTSP_PROTOCOL_RTP_UDP) | (1 << RTSP_PROTOCOL_RTP_UDP_MULTICAST);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
77 #else
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
78 /* try it if a proxy is used */
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
79 int rtsp_default_protocols = (1 << RTSP_PROTOCOL_RTP_TCP);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
80 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 /* if non zero, then set a range for RTP ports */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 int rtsp_rtp_port_min = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 int rtsp_rtp_port_max = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 FFRTSPCallback *ff_rtsp_callback = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 static int rtsp_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 if (strstart(p->filename, "rtsp:", NULL))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 static int redir_isspace(int c)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 return (c == ' ' || c == '\t' || c == '\n' || c == '\r');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 static void skip_spaces(const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 while (redir_isspace(*p))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 static void get_word_sep(char *buf, int buf_size, const char *sep,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 while (!strchr(sep, *p) && *p != '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 if ((q - buf) < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 *q++ = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 if (buf_size > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 static void get_word(char *buf, int buf_size, const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 while (!redir_isspace(*p) && *p != '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 if ((q - buf) < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 *q++ = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 if (buf_size > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 params>] */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 static int sdp_parse_rtpmap(AVCodecContext *codec, const char *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 char buf[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 /* codec name */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 get_word_sep(buf, sizeof(buf), "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 if (!strcmp(buf, "MP4V-ES")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 codec->codec_id = CODEC_ID_MPEG4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 /* return the length and optionnaly the data */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 static int hex_to_data(uint8_t *data, const char *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 int c, len, v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 len = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 v = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 if (p == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 c = toupper((unsigned char)*p++);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174 if (c >= '0' && c <= '9')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175 c = c - '0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 else if (c >= 'A' && c <= 'F')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 c = c - 'A' + 10;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 v = (v << 4) | c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 if (v & 0x100) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 if (data)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 data[len] = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 len++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 v = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
188 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 static void sdp_parse_fmtp(AVCodecContext *codec, const char *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 char attr[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 char value[4096];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 int len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 /* loop on each attribute */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 if (*p == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 get_word_sep(attr, sizeof(attr), "=", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 if (*p == '=')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 get_word_sep(value, sizeof(value), ";", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 if (*p == ';')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 /* handle MPEG4 video */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 switch(codec->codec_id) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 case CODEC_ID_MPEG4:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 if (!strcmp(attr, "config")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 /* decode the hexa encoded parameter */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 len = hex_to_data(NULL, value);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 codec->extradata = av_mallocz(len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 if (!codec->extradata)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 codec->extradata_size = len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 hex_to_data(codec->extradata, value);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 /* ignore data for other codecs */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 fail: ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 // printf("'%s' = '%s'\n", attr, value);
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 typedef struct SDPParseState {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 /* SDP only */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 struct in_addr default_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 int default_ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 } SDPParseState;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 int letter, const char *buf)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
239 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 char buf1[64], st_type[64];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 int codec_type, payload_type, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
243 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 struct in_addr sdp_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 int ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 printf("sdp: %c='%s'\n", letter, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 p = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 switch(letter) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 case 'c':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 if (strcmp(buf1, "IN") != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 if (strcmp(buf1, "IP4") != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 get_word_sep(buf1, sizeof(buf1), "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 if (inet_aton(buf1, &sdp_ip) == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 ttl = 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 if (*p == '/') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 get_word_sep(buf1, sizeof(buf1), "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 ttl = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270 if (s->nb_streams == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271 s1->default_ip = sdp_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 s1->default_ttl = ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274 st = s->streams[s->nb_streams - 1];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 rtsp_st->sdp_ip = sdp_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 rtsp_st->sdp_ttl = ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 case 's':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 pstrcpy(s->title, sizeof(s->title), p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 case 'i':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 if (s->nb_streams == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 pstrcpy(s->comment, sizeof(s->comment), p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 case 'm':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 /* new stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 get_word(st_type, sizeof(st_type), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 if (!strcmp(st_type, "audio")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 codec_type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 } else if (!strcmp(st_type, "video")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 codec_type = CODEC_TYPE_VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 return;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299 rtsp_st = av_mallocz(sizeof(RTSPStream));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 if (!rtsp_st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 return;
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
302 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
303 dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 rtsp_st->sdp_ip = s1->default_ip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 rtsp_st->sdp_ttl = s1->default_ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 get_word(buf1, sizeof(buf1), &p); /* port */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 rtsp_st->sdp_port = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 get_word(buf1, sizeof(buf1), &p); /* protocol (ignored) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 /* XXX: handle list of formats */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 get_word(buf1, sizeof(buf1), &p); /* format list */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 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
316
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
317 if (rtsp_st->sdp_payload_type == RTP_PT_MPEG2TS) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
318 /* 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
319 } else {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
320 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
321 if (!st)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
322 return;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
323 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
324 rtsp_st->stream_index = st->index;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
325 st->codec.codec_type = codec_type;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
326 if (rtsp_st->sdp_payload_type < 96) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
327 /* if standard payload type, we can find the codec right now */
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
328 rtp_get_codec_info(&st->codec, rtsp_st->sdp_payload_type);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
329 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 /* put a default control url */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 pstrcpy(rtsp_st->control_url, sizeof(rtsp_st->control_url), s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 case 'a':
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 if (strstart(p, "control:", &p) && s->nb_streams > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 char proto[32];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 /* get the control url */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 st = s->streams[s->nb_streams - 1];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 /* XXX: may need to add full url resolution */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 url_split(proto, sizeof(proto), NULL, 0, NULL, NULL, 0, p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 if (proto[0] == '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 /* relative control URL */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 pstrcat(rtsp_st->control_url, sizeof(rtsp_st->control_url), "/");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 pstrcat(rtsp_st->control_url, sizeof(rtsp_st->control_url), p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 pstrcpy(rtsp_st->control_url, sizeof(rtsp_st->control_url), p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 } else if (strstart(p, "rtpmap:", &p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 /* NOTE: rtpmap is only supported AFTER the 'm=' tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 payload_type = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 for(i = 0; i < s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
356 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357 if (rtsp_st->sdp_payload_type == payload_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358 sdp_parse_rtpmap(&st->codec, p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
359 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 } else if (strstart(p, "fmtp:", &p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364 payload_type = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 for(i = 0; i < s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367 rtsp_st = st->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368 if (rtsp_st->sdp_payload_type == payload_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 sdp_parse_fmtp(&st->codec, p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
371 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
373 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
377 static int sdp_parse(AVFormatContext *s, const char *content)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 int letter;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 char buf[1024], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 SDPParseState sdp_parse_state, *s1 = &sdp_parse_state;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 memset(s1, 0, sizeof(SDPParseState));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385 p = content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 letter = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 if (letter == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392 if (*p != '=')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 goto next_line;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 /* get the content */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 q = buf;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
397 while (*p != '\n' && *p != '\r' && *p != '\0') {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 *q++ = *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403 sdp_parse_line(s, s1, letter, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 next_line:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 while (*p != '\n' && *p != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 if (*p == '\n')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
408 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
412
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 static void rtsp_parse_range(int *min_ptr, int *max_ptr, const char **pp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 int v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 p = *pp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 v = strtol(p, (char **)&p, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 if (*p == '-') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 *min_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 v = strtol(p, (char **)&p, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 *max_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 *min_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
428 *max_ptr = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 *pp = p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 /* XXX: only one transport specification is parsed */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 static void rtsp_parse_transport(RTSPHeader *reply, const char *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 char transport_protocol[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 char profile[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 char lower_transport[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
439 char parameter[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
440 RTSPTransportField *th;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
441 char buf[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 reply->nb_transports = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 skip_spaces(&p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 if (*p == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 th = &reply->transports[reply->nb_transports];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 get_word_sep(transport_protocol, sizeof(transport_protocol),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 "/", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 if (*p == '/')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 get_word_sep(profile, sizeof(profile), "/;,", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457 lower_transport[0] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 if (*p == '/') {
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
459 p++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460 get_word_sep(lower_transport, sizeof(lower_transport),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 ";,", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
463 if (!strcasecmp(lower_transport, "TCP"))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 th->protocol = RTSP_PROTOCOL_RTP_TCP;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 th->protocol = RTSP_PROTOCOL_RTP_UDP;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 if (*p == ';')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
470 /* get each parameter */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471 while (*p != '\0' && *p != ',') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472 get_word_sep(parameter, sizeof(parameter), "=;,", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 if (!strcmp(parameter, "port")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476 rtsp_parse_range(&th->port_min, &th->port_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 } else if (!strcmp(parameter, "client_port")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481 rtsp_parse_range(&th->client_port_min,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 &th->client_port_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
484 } else if (!strcmp(parameter, "server_port")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
485 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
486 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
487 rtsp_parse_range(&th->server_port_min,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
488 &th->server_port_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
489 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490 } else if (!strcmp(parameter, "interleaved")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
491 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
492 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
493 rtsp_parse_range(&th->interleaved_min,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
494 &th->interleaved_max, &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
495 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
496 } else if (!strcmp(parameter, "multicast")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
497 if (th->protocol == RTSP_PROTOCOL_RTP_UDP)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
498 th->protocol = RTSP_PROTOCOL_RTP_UDP_MULTICAST;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
499 } else if (!strcmp(parameter, "ttl")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
500 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
501 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
502 th->ttl = strtol(p, (char **)&p, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
503 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
504 } else if (!strcmp(parameter, "destination")) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
505 struct in_addr ipaddr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
506
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
507 if (*p == '=') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
508 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
509 get_word_sep(buf, sizeof(buf), ";,", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
510 if (inet_aton(buf, &ipaddr))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
511 th->destination = ntohl(ipaddr.s_addr);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
512 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
513 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
514 while (*p != ';' && *p != '\0' && *p != ',')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
515 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
516 if (*p == ';')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
517 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
518 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
519 if (*p == ',')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
520 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
521
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
522 reply->nb_transports++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
523 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
524 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
525
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
526 static void rtsp_parse_range_npt(RTSPHeader *reply, const char *p)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
527 {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
528 char buf[256];
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
529
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
530 skip_spaces(&p);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
531 if (!stristart(p, "npt=", &p))
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
532 return;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
533
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
534 reply->range_start = AV_NOPTS_VALUE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
535 reply->range_end = AV_NOPTS_VALUE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
536
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
537 get_word_sep(buf, sizeof(buf), "-", &p);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
538 reply->range_start = parse_date(buf, 1);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
539 if (*p == '-') {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
540 p++;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
541 get_word_sep(buf, sizeof(buf), "-", &p);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
542 reply->range_end = parse_date(buf, 1);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
543 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
544 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
545
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
546 void rtsp_parse_line(RTSPHeader *reply, const char *buf)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
547 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
548 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
549
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
550 /* NOTE: we do case independent match for broken servers */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
551 p = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
552 if (stristart(p, "Session:", &p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
553 get_word_sep(reply->session_id, sizeof(reply->session_id), ";", &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
554 } else if (stristart(p, "Content-Length:", &p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
555 reply->content_length = strtol(p, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
556 } else if (stristart(p, "Transport:", &p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
557 rtsp_parse_transport(reply, p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
558 } else if (stristart(p, "CSeq:", &p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
559 reply->seq = strtol(p, NULL, 10);
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
560 } else if (stristart(p, "Range:", &p)) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
561 rtsp_parse_range_npt(reply, p);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
562 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
563 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
564
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
565 /* skip a RTP/TCP interleaved packet */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
566 static void rtsp_skip_packet(AVFormatContext *s)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
567 {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
568 RTSPState *rt = s->priv_data;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
569 int ret, len, len1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
570 uint8_t buf[1024];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
571
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
572 ret = url_read(rt->rtsp_hd, buf, 3);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
573 if (ret != 3)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
574 return;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
575 len = (buf[1] << 8) | buf[2];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
576 #ifdef DEBUG
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
577 printf("skipping RTP packet len=%d\n", len);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
578 #endif
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
579 /* skip payload */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
580 while (len > 0) {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
581 len1 = len;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
582 if (len1 > sizeof(buf))
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
583 len1 = sizeof(buf);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
584 ret = url_read(rt->rtsp_hd, buf, len1);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
585 if (ret != len1)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
586 return;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
587 len -= len1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
588 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
589 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
590
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
591 static void rtsp_send_cmd(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
592 const char *cmd, RTSPHeader *reply,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
593 unsigned char **content_ptr)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
594 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
595 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
596 char buf[4096], buf1[1024], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
597 unsigned char ch;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
598 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
599 int content_length, line_count;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
600 unsigned char *content = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
601
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
602 memset(reply, 0, sizeof(RTSPHeader));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
603
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604 rt->seq++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 pstrcpy(buf, sizeof(buf), cmd);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
606 snprintf(buf1, sizeof(buf1), "CSeq: %d\r\n", rt->seq);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
607 pstrcat(buf, sizeof(buf), buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 if (rt->session_id[0] != '\0' && !strstr(cmd, "\nIf-Match:")) {
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
609 snprintf(buf1, sizeof(buf1), "Session: %s\r\n", rt->session_id);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
610 pstrcat(buf, sizeof(buf), buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
611 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
612 pstrcat(buf, sizeof(buf), "\r\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
613 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
614 printf("Sending:\n%s--\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
615 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
616 url_write(rt->rtsp_hd, buf, strlen(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
617
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
618 /* parse reply (XXX: use buffers) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
619 line_count = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
620 rt->last_reply[0] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
621 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
622 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
623 for(;;) {
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
624 if (url_read(rt->rtsp_hd, &ch, 1) != 1)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
626 if (ch == '\n')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
627 break;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
628 if (ch == '$') {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
629 /* XXX: only parse it if first char on line ? */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
630 rtsp_skip_packet(s);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
631 } else if (ch != '\r') {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
632 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
633 *q++ = ch;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
634 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
635 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
637 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
638 printf("line='%s'\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
639 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
640 /* test if last line */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
641 if (buf[0] == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
642 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
643 p = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
644 if (line_count == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
645 /* get reply code */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
646 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648 reply->status_code = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
649 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 rtsp_parse_line(reply, p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 pstrcat(rt->last_reply, sizeof(rt->last_reply), p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
652 pstrcat(rt->last_reply, sizeof(rt->last_reply), "\n");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654 line_count++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 pstrcpy(rt->session_id, sizeof(rt->session_id), reply->session_id);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 content_length = reply->content_length;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 if (content_length > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 /* leave some room for a trailing '\0' (useful for simple parsing) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
663 content = av_malloc(content_length + 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 url_read(rt->rtsp_hd, content, content_length);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 content[content_length] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 if (content_ptr)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
668 *content_ptr = content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
669 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
670
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
671 /* useful for modules: set RTSP callback function */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
673 void rtsp_set_callback(FFRTSPCallback *rtsp_cb)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
674 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
675 ff_rtsp_callback = rtsp_cb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
677
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
678
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
679 /* 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
680 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
681 {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
682 int i;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
683 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
684
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
685 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
686 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
687 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
688 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
689 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
690 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
691 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
692 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
693 av_free(rtsp_st);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
694 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
695 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
696 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
697
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
698 static int rtsp_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
699 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
700 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
701 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
702 char host[1024], path[1024], tcpname[1024], cmd[2048];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
703 URLContext *rtsp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
704 int port, i, ret, err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
705 RTSPHeader reply1, *reply = &reply1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
706 unsigned char *content = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
707 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708 int protocol_mask;
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
709 AVStream *st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
710
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
711 /* extract hostname and port */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
712 url_split(NULL, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 host, sizeof(host), &port, path, sizeof(path), s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
714 if (port < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
715 port = RTSP_DEFAULT_PORT;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 /* open the tcp connexion */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
718 snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
719 if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
720 return AVERROR_IO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 rt->rtsp_hd = rtsp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
722 rt->seq = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
723
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
724 /* describe the stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
725 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
726 "DESCRIBE %s RTSP/1.0\r\n"
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
727 "Accept: application/sdp\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
728 s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
729 rtsp_send_cmd(s, cmd, reply, &content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
730 if (!content) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
731 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
732 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
733 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
734 if (reply->status_code != RTSP_STATUS_OK) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
735 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
736 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
737 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
738
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
739 /* now we got the SDP description, we parse it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
740 ret = sdp_parse(s, (const char *)content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
741 av_freep(&content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
742 if (ret < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
743 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
746
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
747 protocol_mask = rtsp_default_protocols;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
748
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
749 /* for each stream, make the setup request */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
750 /* XXX: we assume the same server is used for the control of each
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 RTSP stream */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
752 for(i=0;i<rt->nb_rtsp_streams;i++) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 char transport[2048];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
755 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
757 /* compute available transports */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
758 transport[0] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
759
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760 /* RTP/UDP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
761 if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762 char buf[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 int j;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
765 /* first try in specified port range */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 if (rtsp_rtp_port_min != 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 for(j=rtsp_rtp_port_min;j<=rtsp_rtp_port_max;j++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 snprintf(buf, sizeof(buf), "rtp://?localport=%d", j);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
769 if (url_open(&rtsp_st->rtp_handle, buf, URL_RDONLY) == 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 goto rtp_opened;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 /* then try on any port */
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
775 if (url_open(&rtsp_st->rtp_handle, "rtp://", URL_RDONLY) < 0) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
776 err = AVERROR_INVALIDDATA;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
777 goto fail;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 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
781 port = rtp_get_local_port(rtsp_st->rtp_handle);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 if (transport[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
783 pstrcat(transport, sizeof(transport), ",");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
784 snprintf(transport + strlen(transport), sizeof(transport) - strlen(transport) - 1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
785 "RTP/AVP/UDP;unicast;client_port=%d-%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
786 port, port + 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
788
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
789 /* RTP/TCP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
790 if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_TCP)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
791 if (transport[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 pstrcat(transport, sizeof(transport), ",");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793 snprintf(transport + strlen(transport), sizeof(transport) - strlen(transport) - 1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 "RTP/AVP/TCP");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
795 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
796
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
797 if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP_MULTICAST)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
798 if (transport[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
799 pstrcat(transport, sizeof(transport), ",");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
800 snprintf(transport + strlen(transport),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
801 sizeof(transport) - strlen(transport) - 1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
802 "RTP/AVP/UDP;multicast");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
803 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
804 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
805 "SETUP %s RTSP/1.0\r\n"
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
806 "Transport: %s\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
807 rtsp_st->control_url, transport);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
808 rtsp_send_cmd(s, cmd, reply, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
809 if (reply->status_code != RTSP_STATUS_OK ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
810 reply->nb_transports != 1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
811 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
812 goto fail;
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 /* XXX: same protocol for all streams is required */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
816 if (i > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
817 if (reply->transports[0].protocol != rt->protocol) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
818 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
819 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
820 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
821 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
822 rt->protocol = reply->transports[0].protocol;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
823 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
824
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
825 /* close RTP connection if not choosen */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
826 if (reply->transports[0].protocol != RTSP_PROTOCOL_RTP_UDP &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
827 (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP))) {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
828 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
829 rtsp_st->rtp_handle = NULL;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
830 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
831
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
832 switch(reply->transports[0].protocol) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
833 case RTSP_PROTOCOL_RTP_TCP:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
834 rtsp_st->interleaved_min = reply->transports[0].interleaved_min;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
835 rtsp_st->interleaved_max = reply->transports[0].interleaved_max;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
836 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
837
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
838 case RTSP_PROTOCOL_RTP_UDP:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
839 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
840 char url[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
841
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
842 /* XXX: also use address if specified */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
843 snprintf(url, sizeof(url), "rtp://%s:%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
844 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
845 if (rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
846 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
847 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
848 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
849 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
850 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
851 case RTSP_PROTOCOL_RTP_UDP_MULTICAST:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
852 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
853 char url[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
854 int ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
855
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
856 ttl = reply->transports[0].ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
857 if (!ttl)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
858 ttl = 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
859 snprintf(url, sizeof(url), "rtp://%s:%d?multicast=1&ttl=%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
860 host,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
861 reply->transports[0].server_port_min,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
862 ttl);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
863 if (url_open(&rtsp_st->rtp_handle, url, URL_RDONLY) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
864 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
865 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
866 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
867 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
868 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
869 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
870 /* open 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
871 st = NULL;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
872 if (rtsp_st->stream_index >= 0)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
873 st = s->streams[rtsp_st->stream_index];
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
874 if (!st)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
875 s->ctx_flags |= AVFMTCTX_NOHEADER;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
876 rtsp_st->rtp_ctx = rtp_parse_open(s, st, rtsp_st->sdp_payload_type);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
877 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
878 err = AVERROR_NOMEM;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
879 goto fail;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
880 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
881 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
882
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
883 /* use callback if available to extend setup */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
884 if (ff_rtsp_callback) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
885 if (ff_rtsp_callback(RTSP_ACTION_CLIENT_SETUP, rt->session_id,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
886 NULL, 0, rt->last_reply) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
887 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
888 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
889 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
890 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
891
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
892
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
893 rt->state = RTSP_STATE_IDLE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
894 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
895 zero */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
896 if (ap && ap->initial_pause) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
897 /* do not start immediately */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
898 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
899 if (rtsp_read_play(s) < 0) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
900 err = AVERROR_INVALIDDATA;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
901 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
902 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
903 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
904 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
905 fail:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
906 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
907 av_freep(&content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
908 url_close(rt->rtsp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
909 return err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
910 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
911
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
912 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
913 uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
914 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
915 RTSPState *rt = s->priv_data;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
916 int id, len, i, ret;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
917 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
918
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
919 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
920 printf("tcp_read_packet:\n");
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
921 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
922 redo:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
923 for(;;) {
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
924 ret = url_read(rt->rtsp_hd, buf, 1);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
925 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
926 printf("ret=%d c=%02x [%c]\n", ret, buf[0], buf[0]);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
927 #endif
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
928 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
929 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
930 if (buf[0] == '$')
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
931 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
932 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
933 ret = url_read(rt->rtsp_hd, buf, 3);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
934 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
935 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
936 id = buf[0];
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
937 len = (buf[1] << 8) | buf[2];
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
938 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
939 printf("id=%d len=%d\n", id, len);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
940 #endif
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
941 if (len > buf_size || len < 12)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
942 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
943 /* get the data */
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
944 ret = url_read(rt->rtsp_hd, buf, len);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
945 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
946 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
947
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
948 /* 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
949 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
950 rtsp_st = rt->rtsp_streams[i];
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
951 if (id >= rtsp_st->interleaved_min &&
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
952 id <= rtsp_st->interleaved_max)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
953 goto found;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
954 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
955 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
956 found:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
957 *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
958 return len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
959 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
960
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
961 static int udp_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
962 uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
963 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
964 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
965 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
966 fd_set rfds;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
967 int fd1, fd2, fd_max, n, i, ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
968 struct timeval tv;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
969
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
970 for(;;) {
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
971 if (url_interrupt_cb())
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
972 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
973 FD_ZERO(&rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
974 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
975 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
976 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
977 /* 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
978 rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
979 if (fd1 > fd_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
980 fd_max = fd1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
981 FD_SET(fd1, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
982 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
983 tv.tv_sec = 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
984 tv.tv_usec = 100 * 1000;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
985 n = select(fd_max + 1, &rfds, NULL, NULL, &tv);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
986 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
987 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
988 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
989 rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
990 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
991 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
992 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
993 *prtsp_st = rtsp_st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
994 return ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
995 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
996 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
997 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
998 }
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1002 static int rtsp_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1003 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1004 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1005 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
1006 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
1007 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
1008 uint8_t buf[RTP_MAX_PACKET_LENGTH];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1009
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1010 /* 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
1011 if (rt->cur_rtp) {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1012 ret = rtp_parse_packet(rt->cur_rtp, pkt, NULL, 0);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1013 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
1014 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
1015 return 0;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1016 } 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
1017 return 0;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1018 } else {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1019 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
1020 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1021 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1022
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1023 /* 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
1024 redo:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1025 switch(rt->protocol) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1026 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1027 case RTSP_PROTOCOL_RTP_TCP:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1028 len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1029 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1030 case RTSP_PROTOCOL_RTP_UDP:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1031 case RTSP_PROTOCOL_RTP_UDP_MULTICAST:
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1032 len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1033 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1034 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1035 if (len < 0)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1036 return AVERROR_IO;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1037 ret = rtp_parse_packet(rtsp_st->rtp_ctx, pkt, buf, len);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1038 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
1039 goto redo;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1040 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
1041 /* 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
1042 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
1043 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1044 return 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1045 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1046
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1047 static int rtsp_read_play(AVFormatContext *s)
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1048 {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1049 RTSPState *rt = s->priv_data;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1050 RTSPHeader reply1, *reply = &reply1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1051 char cmd[1024];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1052
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1053 printf("hello state=%d\n", rt->state);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1054
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1055 if (rt->state == RTSP_STATE_PAUSED) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1056 snprintf(cmd, sizeof(cmd),
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1057 "PLAY %s RTSP/1.0\r\n",
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1058 s->filename);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1059 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1060 snprintf(cmd, sizeof(cmd),
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1061 "PLAY %s RTSP/1.0\r\n"
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1062 "Range: npt=%0.3f-\r\n",
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1063 s->filename,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1064 (double)rt->seek_timestamp / AV_TIME_BASE);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1065 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1066 rtsp_send_cmd(s, cmd, reply, NULL);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1067 if (reply->status_code != RTSP_STATUS_OK) {
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1068 return -1;
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1069 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1070 rt->state = RTSP_STATE_PLAYING;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1071 return 0;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1072 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1073 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1074
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1075 /* pause the stream */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1076 static int rtsp_read_pause(AVFormatContext *s)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1077 {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1078 RTSPState *rt = s->priv_data;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1079 RTSPHeader reply1, *reply = &reply1;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1080 char cmd[1024];
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1081
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1082 rt = s->priv_data;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1083
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1084 if (rt->state != RTSP_STATE_PLAYING)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1085 return 0;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1086
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1087 snprintf(cmd, sizeof(cmd),
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1088 "PAUSE %s RTSP/1.0\r\n",
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1089 s->filename);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1090 rtsp_send_cmd(s, cmd, reply, NULL);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1091 if (reply->status_code != RTSP_STATUS_OK) {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1092 return -1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1093 } else {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1094 rt->state = RTSP_STATE_PAUSED;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1095 return 0;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1096 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1097 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1098
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1099 static int rtsp_read_seek(AVFormatContext *s, int stream_index,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1100 int64_t timestamp)
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1101 {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1102 RTSPState *rt = s->priv_data;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1103
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1104 rt->seek_timestamp = timestamp;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1105 switch(rt->state) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1106 default:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1107 case RTSP_STATE_IDLE:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1108 break;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1109 case RTSP_STATE_PLAYING:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1110 if (rtsp_read_play(s) != 0)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1111 return -1;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1112 break;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1113 case RTSP_STATE_PAUSED:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1114 rt->state = RTSP_STATE_IDLE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1115 break;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1116 }
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1117 return 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1118 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1119
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1120 static int rtsp_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1121 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1122 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1123 RTSPHeader reply1, *reply = &reply1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1124 char cmd[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1125
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1126 #if 0
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1127 /* NOTE: it is valid to flush the buffer here */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1128 if (rt->protocol == RTSP_PROTOCOL_RTP_TCP) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1129 url_fclose(&rt->rtsp_gb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1130 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1131 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1132 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1133 "TEARDOWN %s RTSP/1.0\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1134 s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1135 rtsp_send_cmd(s, cmd, reply, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1136
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1137 if (ff_rtsp_callback) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1138 ff_rtsp_callback(RTSP_ACTION_CLIENT_TEARDOWN, rt->session_id,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1139 NULL, 0, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1140 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1141
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1142 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1143 url_close(rt->rtsp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1144 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1145 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1146
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1147 AVInputFormat rtsp_demux = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1148 "rtsp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1149 "RTSP input format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1150 sizeof(RTSPState),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1151 rtsp_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1152 rtsp_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1153 rtsp_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1154 rtsp_read_close,
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1155 rtsp_read_seek,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1156 .flags = AVFMT_NOFILE,
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1157 .read_play = rtsp_read_play,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1158 .read_pause = rtsp_read_pause,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1159 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1160
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1161 static int sdp_probe(AVProbeData *p1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1162 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1163 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1164
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1165 /* we look for a line beginning "c=IN IP4" */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1166 p = p1->buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1167 while (*p != '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1168 if (strstart(p, "c=IN IP4", NULL))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1169 return AVPROBE_SCORE_MAX / 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1170 p = strchr(p, '\n');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1171 if (!p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1172 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1173 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1174 if (*p == '\r')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1175 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1176 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1177 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1178 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1179
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1180 #define SDP_MAX_SIZE 8192
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1181
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1182 static int sdp_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1183 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1184 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1185 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1186 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1187 int size, i, err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1188 char *content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1189 char url[1024];
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1190 AVStream *st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1191
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1192 /* read the whole sdp file */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1193 /* XXX: better loading */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1194 content = av_malloc(SDP_MAX_SIZE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1195 size = get_buffer(&s->pb, content, SDP_MAX_SIZE - 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1196 if (size <= 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1197 av_free(content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1198 return AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1199 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1200 content[size] ='\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1201
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1202 sdp_parse(s, content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1203 av_free(content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1204
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1205 /* 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
1206 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
1207 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1208
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1209 snprintf(url, sizeof(url), "rtp://%s:%d?multicast=1&ttl=%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1210 inet_ntoa(rtsp_st->sdp_ip),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1211 rtsp_st->sdp_port,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1212 rtsp_st->sdp_ttl);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1213 if (url_open(&rtsp_st->rtp_handle, url, URL_RDONLY) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1214 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1215 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1216 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1217 /* open 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
1218 st = NULL;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1219 if (rtsp_st->stream_index >= 0)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1220 st = s->streams[rtsp_st->stream_index];
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1221 if (!st)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1222 s->ctx_flags |= AVFMTCTX_NOHEADER;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1223 rtsp_st->rtp_ctx = rtp_parse_open(s, st, rtsp_st->sdp_payload_type);
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1224 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
1225 err = AVERROR_NOMEM;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1226 goto fail;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1227 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1228 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1229 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1230 fail:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1231 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1232 return err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1233 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1234
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1235 static int sdp_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1236 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1237 {
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 rtsp_read_packet(s, pkt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1239 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1240
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1241 static int sdp_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1242 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1243 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
1244 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1245 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1246 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1247
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1248
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1249 static AVInputFormat sdp_demux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1250 "sdp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1251 "SDP",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1252 sizeof(RTSPState),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1253 sdp_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1254 sdp_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1255 sdp_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1256 sdp_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1257 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1258
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1259
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1260 /* dummy redirector format (used directly in av_open_input_file now) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1261 static int redir_probe(AVProbeData *pd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1262 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1263 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1264 p = pd->buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1265 while (redir_isspace(*p))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1266 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1267 if (strstart(p, "http://", NULL) ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1268 strstart(p, "rtsp://", NULL))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1269 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1270 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1271 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1272
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1273 /* called from utils.c */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1274 int redir_open(AVFormatContext **ic_ptr, ByteIOContext *f)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1275 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1276 char buf[4096], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1277 int c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1278 AVFormatContext *ic = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1279
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1280 /* parse each URL and try to open it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1281 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1282 while (c != URL_EOF) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1283 /* skip spaces */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1284 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1285 if (!redir_isspace(c))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1286 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1287 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1288 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1289 if (c == URL_EOF)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1290 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1291 /* record url */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1292 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1293 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1294 if (c == URL_EOF || redir_isspace(c))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1295 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1296 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1297 *q++ = c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1298 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1299 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1300 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1301 //printf("URL='%s'\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1302 /* try to open the media file */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1303 if (av_open_input_file(&ic, buf, NULL, 0, NULL) == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1304 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1305 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1306 *ic_ptr = ic;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1307 if (!ic)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1308 return AVERROR_IO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1309 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1310 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1311 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1312
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1313 AVInputFormat redir_demux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1314 "redir",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1315 "Redirector format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1316 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1317 redir_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1318 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1319 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1320 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1321 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1322
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1323 int rtsp_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1324 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1325 av_register_input_format(&rtsp_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1326 av_register_input_format(&redir_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1327 av_register_input_format(&sdp_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1328 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1329 }