annotate rtsp.c @ 1407:fb4bf3858f77 libavformat

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