annotate rtsp.c @ 587:fe24632a577b libavformat

allocate a few bytes more for extradata so the bitstream reader if its used by the codec for parsing extardata, doesnt read over the end
author michael
date Sat, 13 Nov 2004 01:27:35 +0000
parents 89bd76208427
children fc254f396f15
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);
587
fe24632a577b allocate a few bytes more for extradata so the bitstream reader if its used by the codec for parsing extardata, doesnt read over the end
michael
parents: 558
diff changeset
214 codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
0
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 */
511
056991ab9f10 HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents: 391
diff changeset
342 url_split(proto, sizeof(proto), NULL, 0, NULL, 0, NULL, NULL, 0, p);
0
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
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
565 static int url_readbuf(URLContext *h, unsigned char *buf, int size)
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
566 {
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
567 int ret, len;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
568
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
569 len = 0;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
570 while (len < size) {
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
571 ret = url_read(h, buf+len, size-len);
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
572 if (ret < 1)
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
573 return ret;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
574 len += ret;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
575 }
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
576 return len;
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
577 }
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
578
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
579 /* skip a RTP/TCP interleaved packet */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
580 static void rtsp_skip_packet(AVFormatContext *s)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
581 {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
582 RTSPState *rt = s->priv_data;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
583 int ret, len, len1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
584 uint8_t buf[1024];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
585
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
586 ret = url_readbuf(rt->rtsp_hd, buf, 3);
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
587 if (ret != 3)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
588 return;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
589 len = (buf[1] << 8) | buf[2];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
590 #ifdef DEBUG
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
591 printf("skipping RTP packet len=%d\n", len);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
592 #endif
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
593 /* skip payload */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
594 while (len > 0) {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
595 len1 = len;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
596 if (len1 > sizeof(buf))
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
597 len1 = sizeof(buf);
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
598 ret = url_readbuf(rt->rtsp_hd, buf, len1);
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
599 if (ret != len1)
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
600 return;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
601 len -= len1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
602 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
603 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 static void rtsp_send_cmd(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
606 const char *cmd, RTSPHeader *reply,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
607 unsigned char **content_ptr)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
609 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
610 char buf[4096], buf1[1024], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
611 unsigned char ch;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
612 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
613 int content_length, line_count;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
614 unsigned char *content = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
615
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
616 memset(reply, 0, sizeof(RTSPHeader));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
617
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
618 rt->seq++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
619 pstrcpy(buf, sizeof(buf), cmd);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
620 snprintf(buf1, sizeof(buf1), "CSeq: %d\r\n", rt->seq);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
621 pstrcat(buf, sizeof(buf), buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
622 if (rt->session_id[0] != '\0' && !strstr(cmd, "\nIf-Match:")) {
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
623 snprintf(buf1, sizeof(buf1), "Session: %s\r\n", rt->session_id);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
624 pstrcat(buf, sizeof(buf), buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
626 pstrcat(buf, sizeof(buf), "\r\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
627 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
628 printf("Sending:\n%s--\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
629 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
630 url_write(rt->rtsp_hd, buf, strlen(buf));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
631
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
632 /* parse reply (XXX: use buffers) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
633 line_count = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
634 rt->last_reply[0] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
635 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
637 for(;;) {
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
638 if (url_readbuf(rt->rtsp_hd, &ch, 1) != 1)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
639 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
640 if (ch == '\n')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
641 break;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
642 if (ch == '$') {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
643 /* XXX: only parse it if first char on line ? */
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
644 rtsp_skip_packet(s);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
645 } else if (ch != '\r') {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
646 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 *q++ = ch;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
649 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
652 printf("line='%s'\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654 /* test if last line */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 if (buf[0] == '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 p = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 if (line_count == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659 /* get reply code */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 get_word(buf1, sizeof(buf1), &p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 reply->status_code = atoi(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
663 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 rtsp_parse_line(reply, p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 pstrcat(rt->last_reply, sizeof(rt->last_reply), p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666 pstrcat(rt->last_reply, sizeof(rt->last_reply), "\n");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
668 line_count++;
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 if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672 pstrcpy(rt->session_id, sizeof(rt->session_id), reply->session_id);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
673
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
674 content_length = reply->content_length;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
675 if (content_length > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 /* leave some room for a trailing '\0' (useful for simple parsing) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
677 content = av_malloc(content_length + 1);
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
678 (void)url_readbuf(rt->rtsp_hd, content, content_length);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
679 content[content_length] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
680 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
681 if (content_ptr)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
682 *content_ptr = content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
683 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
684
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
685 /* useful for modules: set RTSP callback function */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
686
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
687 void rtsp_set_callback(FFRTSPCallback *rtsp_cb)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
688 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
689 ff_rtsp_callback = rtsp_cb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
690 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
691
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
692
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
693 /* 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
694 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
695 {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
696 int i;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
697 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
698
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
699 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
700 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
701 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
702 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
703 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
704 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
705 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
706 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
707 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
708 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
709 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
710 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
711
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
712 static int rtsp_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
714 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
715 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716 char host[1024], path[1024], tcpname[1024], cmd[2048];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 URLContext *rtsp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
718 int port, i, ret, err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
719 RTSPHeader reply1, *reply = &reply1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
720 unsigned char *content = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
722 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
723 AVStream *st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
724
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
725 /* extract hostname and port */
511
056991ab9f10 HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents: 391
diff changeset
726 url_split(NULL, 0, NULL, 0,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
727 host, sizeof(host), &port, path, sizeof(path), s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
728 if (port < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
729 port = RTSP_DEFAULT_PORT;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
730
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
731 /* open the tcp connexion */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
732 snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
733 if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
734 return AVERROR_IO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
735 rt->rtsp_hd = rtsp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
736 rt->seq = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
737
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
738 /* describe the stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
739 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
740 "DESCRIBE %s RTSP/1.0\r\n"
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
741 "Accept: application/sdp\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
742 s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
743 rtsp_send_cmd(s, cmd, reply, &content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 if (!content) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
746 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
747 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
748 if (reply->status_code != RTSP_STATUS_OK) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
749 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
750 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 /* now we got the SDP description, we parse it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754 ret = sdp_parse(s, (const char *)content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
755 av_freep(&content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756 if (ret < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
757 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
758 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
759 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
761 protocol_mask = rtsp_default_protocols;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 /* for each stream, make the setup request */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764 /* XXX: we assume the same server is used for the control of each
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
765 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
766 for(i=0;i<rt->nb_rtsp_streams;i++) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 char transport[2048];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
769 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 /* compute available transports */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 transport[0] = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 /* RTP/UDP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
775 if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
776 char buf[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 int j;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 /* first try in specified port range */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 if (rtsp_rtp_port_min != 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 for(j=rtsp_rtp_port_min;j<=rtsp_rtp_port_max;j++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 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
783 if (url_open(&rtsp_st->rtp_handle, buf, URL_RDONLY) == 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
784 goto rtp_opened;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
785 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
786 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
788 /* 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
789 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
790 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
791 goto fail;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 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
795 port = rtp_get_local_port(rtsp_st->rtp_handle);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
796 if (transport[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
797 pstrcat(transport, sizeof(transport), ",");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
798 snprintf(transport + strlen(transport), sizeof(transport) - strlen(transport) - 1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
799 "RTP/AVP/UDP;unicast;client_port=%d-%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
800 port, port + 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
801 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
802
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
803 /* RTP/TCP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
804 if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_TCP)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
805 if (transport[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
806 pstrcat(transport, sizeof(transport), ",");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
807 snprintf(transport + strlen(transport), sizeof(transport) - strlen(transport) - 1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
808 "RTP/AVP/TCP");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
809 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
810
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
811 if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP_MULTICAST)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
812 if (transport[0] != '\0')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
813 pstrcat(transport, sizeof(transport), ",");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
814 snprintf(transport + strlen(transport),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
815 sizeof(transport) - strlen(transport) - 1,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
816 "RTP/AVP/UDP;multicast");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
817 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
818 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
819 "SETUP %s RTSP/1.0\r\n"
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
820 "Transport: %s\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
821 rtsp_st->control_url, transport);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
822 rtsp_send_cmd(s, cmd, reply, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
823 if (reply->status_code != RTSP_STATUS_OK ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
824 reply->nb_transports != 1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
825 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
826 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
827 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
828
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
829 /* XXX: same protocol for all streams is required */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
830 if (i > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
831 if (reply->transports[0].protocol != rt->protocol) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
832 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
833 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
834 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
835 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
836 rt->protocol = reply->transports[0].protocol;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
837 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
838
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
839 /* close RTP connection if not choosen */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
840 if (reply->transports[0].protocol != RTSP_PROTOCOL_RTP_UDP &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
841 (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
842 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
843 rtsp_st->rtp_handle = NULL;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
844 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
845
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
846 switch(reply->transports[0].protocol) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
847 case RTSP_PROTOCOL_RTP_TCP:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
848 rtsp_st->interleaved_min = reply->transports[0].interleaved_min;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
849 rtsp_st->interleaved_max = reply->transports[0].interleaved_max;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
850 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
851
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
852 case RTSP_PROTOCOL_RTP_UDP:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
853 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
854 char url[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
855
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
856 /* XXX: also use address if specified */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
857 snprintf(url, sizeof(url), "rtp://%s:%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
858 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
859 if (rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
860 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
861 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
862 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
863 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
864 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
865 case RTSP_PROTOCOL_RTP_UDP_MULTICAST:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
866 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
867 char url[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
868 int ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
869
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
870 ttl = reply->transports[0].ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
871 if (!ttl)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
872 ttl = 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
873 snprintf(url, sizeof(url), "rtp://%s:%d?multicast=1&ttl=%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
874 host,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
875 reply->transports[0].server_port_min,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
876 ttl);
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
877 if (url_open(&rtsp_st->rtp_handle, url, URL_RDONLY) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
878 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
879 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
880 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
881 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
882 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
883 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
884 /* 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
885 st = NULL;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
886 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
887 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
888 if (!st)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
889 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
890 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
891 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
892 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
893 goto fail;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
894 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
895 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
896
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
897 /* use callback if available to extend setup */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
898 if (ff_rtsp_callback) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
899 if (ff_rtsp_callback(RTSP_ACTION_CLIENT_SETUP, rt->session_id,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
900 NULL, 0, rt->last_reply) < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
901 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
902 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
903 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
904 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
905
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
906
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
907 rt->state = RTSP_STATE_IDLE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
908 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
909 zero */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
910 if (ap && ap->initial_pause) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
911 /* do not start immediately */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
912 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
913 if (rtsp_read_play(s) < 0) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
914 err = AVERROR_INVALIDDATA;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
915 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
916 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
917 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
918 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
919 fail:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
920 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
921 av_freep(&content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
922 url_close(rt->rtsp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
923 return err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
924 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
925
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
926 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
927 uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
928 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
929 RTSPState *rt = s->priv_data;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
930 int id, len, i, ret;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
931 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
932
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
933 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
934 printf("tcp_read_packet:\n");
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
935 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
936 redo:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
937 for(;;) {
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
938 ret = url_readbuf(rt->rtsp_hd, buf, 1);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
939 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
940 printf("ret=%d c=%02x [%c]\n", ret, buf[0], buf[0]);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
941 #endif
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
942 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
943 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
944 if (buf[0] == '$')
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
945 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
946 }
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
947 ret = url_readbuf(rt->rtsp_hd, buf, 3);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
948 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
949 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
950 id = buf[0];
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
951 len = (buf[1] << 8) | buf[2];
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
952 #ifdef DEBUG_RTP_TCP
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
953 printf("id=%d len=%d\n", id, len);
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
954 #endif
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
955 if (len > buf_size || len < 12)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
956 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
957 /* get the data */
391
1cf22651d33b support url_read which reads less then requested patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents: 370
diff changeset
958 ret = url_readbuf(rt->rtsp_hd, buf, len);
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
959 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
960 return -1;
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
961
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
962 /* 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
963 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
964 rtsp_st = rt->rtsp_streams[i];
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
965 if (id >= rtsp_st->interleaved_min &&
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
966 id <= rtsp_st->interleaved_max)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
967 goto found;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
968 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
969 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
970 found:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
971 *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
972 return len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
973 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
974
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
975 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
976 uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
977 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
978 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
979 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
980 fd_set rfds;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
981 int fd1, fd2, fd_max, n, i, ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
982 struct timeval tv;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
983
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
984 for(;;) {
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
985 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
986 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
987 FD_ZERO(&rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
988 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
989 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
990 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
991 /* 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
992 rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
993 if (fd1 > fd_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
994 fd_max = fd1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
995 FD_SET(fd1, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
996 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
997 tv.tv_sec = 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
998 tv.tv_usec = 100 * 1000;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
999 n = select(fd_max + 1, &rfds, NULL, NULL, &tv);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1000 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
1001 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
1002 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
1003 rtp_get_file_handles(rtsp_st->rtp_handle, &fd1, &fd2);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1004 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
1005 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
1006 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
1007 *prtsp_st = rtsp_st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1008 return ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1009 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1010 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1011 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1012 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1013 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1014 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1015
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1016 static int rtsp_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1017 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1018 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1019 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
1020 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
1021 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
1022 uint8_t buf[RTP_MAX_PACKET_LENGTH];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1023
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1024 /* 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
1025 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
1026 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
1027 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
1028 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
1029 return 0;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1030 } 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
1031 return 0;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1032 } else {
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1033 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
1034 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1035 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1036
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1037 /* 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
1038 redo:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1039 switch(rt->protocol) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1040 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1041 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
1042 len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1043 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1044 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
1045 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
1046 len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1047 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1048 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1049 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
1050 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
1051 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
1052 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
1053 goto redo;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1054 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
1055 /* 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
1056 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
1057 }
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1058 return 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1059 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1060
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1061 static int rtsp_read_play(AVFormatContext *s)
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1062 {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1063 RTSPState *rt = s->priv_data;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1064 RTSPHeader reply1, *reply = &reply1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1065 char cmd[1024];
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1066
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 304
diff changeset
1067 av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state);
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1068
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1069 if (rt->state == RTSP_STATE_PAUSED) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1070 snprintf(cmd, sizeof(cmd),
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1071 "PLAY %s RTSP/1.0\r\n",
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1072 s->filename);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1073 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1074 snprintf(cmd, sizeof(cmd),
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1075 "PLAY %s RTSP/1.0\r\n"
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1076 "Range: npt=%0.3f-\r\n",
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1077 s->filename,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1078 (double)rt->seek_timestamp / AV_TIME_BASE);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1079 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1080 rtsp_send_cmd(s, cmd, reply, NULL);
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1081 if (reply->status_code != RTSP_STATUS_OK) {
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1082 return -1;
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1083 } else {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1084 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 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1087 }
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1088
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1089 /* pause the stream */
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1090 static int rtsp_read_pause(AVFormatContext *s)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1091 {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1092 RTSPState *rt = s->priv_data;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1093 RTSPHeader reply1, *reply = &reply1;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1094 char cmd[1024];
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1095
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1096 rt = s->priv_data;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1097
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1098 if (rt->state != RTSP_STATE_PLAYING)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1099 return 0;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1100
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1101 snprintf(cmd, sizeof(cmd),
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1102 "PAUSE %s RTSP/1.0\r\n",
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1103 s->filename);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1104 rtsp_send_cmd(s, cmd, reply, NULL);
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1105 if (reply->status_code != RTSP_STATUS_OK) {
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1106 return -1;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1107 } else {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1108 rt->state = RTSP_STATE_PAUSED;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1109 return 0;
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1110 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1111 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1112
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1113 static int rtsp_read_seek(AVFormatContext *s, int stream_index,
558
89bd76208427 100l (forgoten seeking functions)
michael
parents: 511
diff changeset
1114 int64_t timestamp, int flags)
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1115 {
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1116 RTSPState *rt = s->priv_data;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1117
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1118 rt->seek_timestamp = timestamp;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1119 switch(rt->state) {
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1120 default:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1121 case RTSP_STATE_IDLE:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1122 break;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1123 case RTSP_STATE_PLAYING:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1124 if (rtsp_read_play(s) != 0)
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1125 return -1;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1126 break;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1127 case RTSP_STATE_PAUSED:
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1128 rt->state = RTSP_STATE_IDLE;
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1129 break;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1130 }
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1131 return 0;
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1132 }
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1133
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1134 static int rtsp_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1135 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1136 RTSPState *rt = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1137 RTSPHeader reply1, *reply = &reply1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1138 char cmd[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1139
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1140 #if 0
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1141 /* NOTE: it is valid to flush the buffer here */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1142 if (rt->protocol == RTSP_PROTOCOL_RTP_TCP) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1143 url_fclose(&rt->rtsp_gb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1144 }
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1145 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1146 snprintf(cmd, sizeof(cmd),
172
9a0ab557b159 fixed RTP/TCP client support
bellard
parents: 64
diff changeset
1147 "TEARDOWN %s RTSP/1.0\r\n",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1148 s->filename);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1149 rtsp_send_cmd(s, cmd, reply, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1150
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1151 if (ff_rtsp_callback) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1152 ff_rtsp_callback(RTSP_ACTION_CLIENT_TEARDOWN, rt->session_id,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1153 NULL, 0, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1154 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1155
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1156 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1157 url_close(rt->rtsp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1158 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1159 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1160
179
43ac45200138 suppressed RTSP abort hack - added PLAY/PAUSE
bellard
parents: 172
diff changeset
1161 AVInputFormat rtsp_demux = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1162 "rtsp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1163 "RTSP input format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1164 sizeof(RTSPState),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1165 rtsp_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1166 rtsp_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1167 rtsp_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1168 rtsp_read_close,
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1169 rtsp_read_seek,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1170 .flags = AVFMT_NOFILE,
304
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1171 .read_play = rtsp_read_play,
d58c8859ff8c initial seek support - more generic play/pause support
bellard
parents: 294
diff changeset
1172 .read_pause = rtsp_read_pause,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1173 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1174
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1175 static int sdp_probe(AVProbeData *p1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1176 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1177 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1178
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1179 /* we look for a line beginning "c=IN IP4" */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1180 p = p1->buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1181 while (*p != '\0') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1182 if (strstart(p, "c=IN IP4", NULL))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1183 return AVPROBE_SCORE_MAX / 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1184 p = strchr(p, '\n');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1185 if (!p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1186 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1187 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1188 if (*p == '\r')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1189 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1190 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1191 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1192 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1193
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1194 #define SDP_MAX_SIZE 8192
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1195
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1196 static int sdp_read_header(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1197 AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1198 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1199 RTSPState *rt = s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1200 RTSPStream *rtsp_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1201 int size, i, err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1202 char *content;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1203 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
1204 AVStream *st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1205
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1206 /* read the whole sdp file */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1207 /* XXX: better loading */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1208 content = av_malloc(SDP_MAX_SIZE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1209 size = get_buffer(&s->pb, content, SDP_MAX_SIZE - 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1210 if (size <= 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1211 av_free(content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1212 return AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1213 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1214 content[size] ='\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1215
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1216 sdp_parse(s, content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1217 av_free(content);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1218
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1219 /* 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
1220 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
1221 rtsp_st = rt->rtsp_streams[i];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1222
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1223 snprintf(url, sizeof(url), "rtp://%s:%d?multicast=1&ttl=%d",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1224 inet_ntoa(rtsp_st->sdp_ip),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1225 rtsp_st->sdp_port,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1226 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
1227 if (url_open(&rtsp_st->rtp_handle, url, URL_RDONLY) < 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1228 err = AVERROR_INVALIDDATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1229 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1230 }
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1231 /* 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
1232 st = NULL;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1233 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
1234 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
1235 if (!st)
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1236 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
1237 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
1238 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
1239 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
1240 goto fail;
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1241 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1242 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1243 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1244 fail:
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1245 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1246 return err;
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 int sdp_read_packet(AVFormatContext *s,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1250 AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1251 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1252 return rtsp_read_packet(s, pkt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1253 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1254
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1255 static int sdp_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1256 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 229
diff changeset
1257 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
1258 rtsp_close_streams(rt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1259 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1260 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1261
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1262
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1263 static AVInputFormat sdp_demux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1264 "sdp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1265 "SDP",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1266 sizeof(RTSPState),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1267 sdp_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1268 sdp_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1269 sdp_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1270 sdp_read_close,
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1274 /* dummy redirector format (used directly in av_open_input_file now) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1275 static int redir_probe(AVProbeData *pd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1276 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1277 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1278 p = pd->buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1279 while (redir_isspace(*p))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1280 p++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1281 if (strstart(p, "http://", NULL) ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1282 strstart(p, "rtsp://", NULL))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1283 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1284 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1285 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1286
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1287 /* called from utils.c */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1288 int redir_open(AVFormatContext **ic_ptr, ByteIOContext *f)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1289 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1290 char buf[4096], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1291 int c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1292 AVFormatContext *ic = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1293
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1294 /* parse each URL and try to open it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1295 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1296 while (c != URL_EOF) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1297 /* skip spaces */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1298 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1299 if (!redir_isspace(c))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1300 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1301 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1302 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1303 if (c == URL_EOF)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1304 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1305 /* record url */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1306 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1307 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1308 if (c == URL_EOF || redir_isspace(c))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1309 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1310 if ((q - buf) < sizeof(buf) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1311 *q++ = c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1312 c = url_fgetc(f);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1313 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1314 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1315 //printf("URL='%s'\n", buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1316 /* try to open the media file */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1317 if (av_open_input_file(&ic, buf, NULL, 0, NULL) == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1318 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1319 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1320 *ic_ptr = ic;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1321 if (!ic)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1322 return AVERROR_IO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1323 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1324 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1325 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1326
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1327 AVInputFormat redir_demux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1328 "redir",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1329 "Redirector format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1330 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1331 redir_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1332 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1333 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1334 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1335 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1336
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1337 int rtsp_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1338 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1339 av_register_input_format(&rtsp_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1340 av_register_input_format(&redir_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1341 av_register_input_format(&sdp_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1342 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1343 }