Mercurial > mplayer.hg
annotate stream/realrtsp/real.c @ 35332:d6b957072297
subreader: do not skip the first char of ASS fields.
Without this change, fields that can be sometimes empty and
sometimes not, such as the Effect field, are counted in an
inconsistent way. Since the number of fields is used to find
where the text starts, it leads to internal field arriving
on the video.
Bug reported anonymously on the users mailing list.
author | cigaes |
---|---|
date | Tue, 20 Nov 2012 19:43:53 +0000 |
parents | be61988fb5c4 |
children |
rev | line source |
---|---|
9922 | 1 /* |
2 * This file was ported to MPlayer from xine CVS real.c,v 1.8 2003/03/30 17:11:50 | |
3 */ | |
4 | |
5 /* | |
6 * Copyright (C) 2002 the xine project | |
7 * | |
8 * This file is part of xine, a free video player. | |
9 * | |
10 * xine is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * xine is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
23 * | |
24 * | |
25 * special functions for real streams. | |
26 * adopted from joschkas real tools. | |
27 * | |
28 */ | |
29 | |
30 #include <stdio.h> | |
31 #include <string.h> | |
32 | |
26544 | 33 #include "config.h" |
21372 | 34 #include "libavutil/common.h" |
9922 | 35 #include "real.h" |
36 #include "asmrp.h" | |
37 #include "sdpplin.h" | |
12266 | 38 #include "xbuffer.h" |
19256
ed6ca050bba5
The real hash function is just a md5, replace with lavu code
rtogni
parents:
19074
diff
changeset
|
39 #include "libavutil/md5.h" |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
40 #include "libavutil/intreadwrite.h" |
32585 | 41 #include "libavutil/base64.h" |
27463
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
26544
diff
changeset
|
42 #include "stream/http.h" |
20527 | 43 #include "mp_msg.h" |
9922 | 44 |
45 /* | |
46 #define LOG | |
47 */ | |
48 | |
22942 | 49 #define XOR_TABLE_SIZE 37 |
22940
38cb73f3fe04
The size of xor_table is known and fixed, no need to calculate it
rtogni
parents:
22894
diff
changeset
|
50 |
38cb73f3fe04
The size of xor_table is known and fixed, no need to calculate it
rtogni
parents:
22894
diff
changeset
|
51 static const unsigned char xor_table[XOR_TABLE_SIZE] = { |
9922 | 52 0x05, 0x18, 0x74, 0xd0, 0x0d, 0x09, 0x02, 0x53, |
53 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70, | |
54 0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09, | |
55 0x63, 0x11, 0x03, 0x71, 0x08, 0x08, 0x70, 0x02, | |
22940
38cb73f3fe04
The size of xor_table is known and fixed, no need to calculate it
rtogni
parents:
22894
diff
changeset
|
56 0x10, 0x57, 0x05, 0x18, 0x54 }; |
9922 | 57 |
58 | |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
59 #define BUF_SIZE 4096 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
60 |
9922 | 61 #ifdef LOG |
62 static void hexdump (const char *buf, int length) { | |
63 | |
64 int i; | |
65 | |
66 printf (" hexdump> "); | |
67 for (i = 0; i < length; i++) { | |
68 unsigned char c = buf[i]; | |
69 | |
70 printf ("%02x", c); | |
71 | |
72 if ((i % 16) == 15) | |
73 printf ("\n "); | |
74 | |
75 if ((i % 2) == 1) | |
76 printf (" "); | |
77 | |
78 } | |
79 printf ("\n"); | |
80 } | |
81 #endif | |
82 | |
83 | |
19266 | 84 static void real_calc_response_and_checksum (char *response, char *chksum, char *challenge) { |
9922 | 85 |
22941
0f247134050e
Size of response is known, no need to calculate it
rtogni
parents:
22940
diff
changeset
|
86 int ch_len; |
9922 | 87 int i; |
25721 | 88 unsigned char zres[16], buf[64]; |
9922 | 89 |
90 /* initialize buffer */ | |
22945 | 91 AV_WB32(buf, 0xa1e9149d); |
92 AV_WB32(buf+4, 0x0e6b3b59); | |
9922 | 93 |
94 /* some (length) checks */ | |
95 if (challenge != NULL) | |
96 { | |
97 ch_len = strlen (challenge); | |
98 | |
99 if (ch_len == 40) /* what a hack... */ | |
100 ch_len=32; | |
101 if ( ch_len > 56 ) ch_len=56; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
102 |
9922 | 103 /* copy challenge to buf */ |
22945 | 104 memcpy(buf+8, challenge, ch_len); |
25722
c9e200f1693d
Simplify/cleanup of real_calc_response_and_checksum()
rtogni
parents:
25721
diff
changeset
|
105 memset(buf+8+ch_len, 0, 56-ch_len); |
9922 | 106 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
107 |
9922 | 108 /* xor challenge bytewise with xor_table */ |
22940
38cb73f3fe04
The size of xor_table is known and fixed, no need to calculate it
rtogni
parents:
22894
diff
changeset
|
109 for (i=0; i<XOR_TABLE_SIZE; i++) |
22945 | 110 buf[8+i] ^= xor_table[i]; |
9922 | 111 |
22944
3ab5e609656a
Merge calc_response_string() into real_calc_response_and_checksum()
rtogni
parents:
22943
diff
changeset
|
112 av_md5_sum(zres, buf, 64); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
113 |
22944
3ab5e609656a
Merge calc_response_string() into real_calc_response_and_checksum()
rtogni
parents:
22943
diff
changeset
|
114 /* convert zres to ascii string */ |
3ab5e609656a
Merge calc_response_string() into real_calc_response_and_checksum()
rtogni
parents:
22943
diff
changeset
|
115 for (i=0; i<16; i++ ) |
3ab5e609656a
Merge calc_response_string() into real_calc_response_and_checksum()
rtogni
parents:
22943
diff
changeset
|
116 sprintf(response+i*2, "%02x", zres[i]); |
9922 | 117 |
118 /* add tail */ | |
22941
0f247134050e
Size of response is known, no need to calculate it
rtogni
parents:
22940
diff
changeset
|
119 strcpy (&response[32], "01d0a8e3"); |
9922 | 120 |
121 /* calculate checksum */ | |
22941
0f247134050e
Size of response is known, no need to calculate it
rtogni
parents:
22940
diff
changeset
|
122 for (i=0; i<8; i++) |
9922 | 123 chksum[i] = response[i*4]; |
25722
c9e200f1693d
Simplify/cleanup of real_calc_response_and_checksum()
rtogni
parents:
25721
diff
changeset
|
124 chksum[8] = 0; |
9922 | 125 } |
126 | |
127 | |
128 /* | |
129 * takes a MLTI-Chunk and a rule number got from match_asm_rule, | |
130 * returns a pointer to selected data and number of bytes in that. | |
131 */ | |
132 | |
12266 | 133 static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection, char **out) { |
9922 | 134 |
135 int numrules, codec, size; | |
136 int i; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
137 |
9922 | 138 /* MLTI chunk should begin with MLTI */ |
139 | |
140 if ((mlti_chunk[0] != 'M') | |
141 ||(mlti_chunk[1] != 'L') | |
142 ||(mlti_chunk[2] != 'T') | |
143 ||(mlti_chunk[3] != 'I')) | |
144 { | |
145 #ifdef LOG | |
146 printf("libreal: MLTI tag not detected, copying data\n"); | |
147 #endif | |
12266 | 148 *out = xbuffer_copyin(*out, 0, mlti_chunk, mlti_size); |
9922 | 149 return mlti_size; |
150 } | |
151 | |
152 mlti_chunk+=4; | |
153 | |
154 /* next 16 bits are the number of rules */ | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
155 numrules=AV_RB16(mlti_chunk); |
9922 | 156 if (selection >= numrules) return 0; |
157 | |
158 /* now <numrules> indices of codecs follows */ | |
159 /* we skip to selection */ | |
160 mlti_chunk+=(selection+1)*2; | |
161 | |
162 /* get our index */ | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
163 codec=AV_RB16(mlti_chunk); |
9922 | 164 |
165 /* skip to number of codecs */ | |
166 mlti_chunk+=(numrules-selection)*2; | |
167 | |
168 /* get number of codecs */ | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
169 numrules=AV_RB16(mlti_chunk); |
9922 | 170 |
171 if (codec >= numrules) { | |
20530 | 172 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: codec index >= number of codecs. %i %i\n", |
173 codec, numrules); | |
9922 | 174 return 0; |
175 } | |
176 | |
177 mlti_chunk+=2; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
178 |
9922 | 179 /* now seek to selected codec */ |
180 for (i=0; i<codec; i++) { | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
181 size=AV_RB32(mlti_chunk); |
9922 | 182 mlti_chunk+=size+4; |
183 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
184 |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
185 size=AV_RB32(mlti_chunk); |
9922 | 186 |
187 #ifdef LOG | |
188 hexdump(mlti_chunk+4, size); | |
189 #endif | |
12266 | 190 *out = xbuffer_copyin(*out, 0, mlti_chunk+4, size); |
9922 | 191 return size; |
192 } | |
193 | |
194 /* | |
195 * looking at stream description. | |
196 */ | |
197 | |
19266 | 198 static rmff_header_t *real_parse_sdp(char *data, char **stream_rules, uint32_t bandwidth) { |
9922 | 199 |
200 sdpplin_t *desc; | |
201 rmff_header_t *header; | |
12266 | 202 char *buf; |
9922 | 203 int len, i; |
204 int max_bit_rate=0; | |
205 int avg_bit_rate=0; | |
206 int max_packet_size=0; | |
207 int avg_packet_size=0; | |
208 int duration=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
209 |
9922 | 210 |
211 if (!data) return NULL; | |
212 | |
213 desc=sdpplin_parse(data); | |
214 | |
215 if (!desc) return NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
216 |
12266 | 217 buf = xbuffer_init(2048); |
9922 | 218 header=calloc(1,sizeof(rmff_header_t)); |
219 | |
220 header->fileheader=rmff_new_fileheader(4+desc->stream_count); | |
221 header->cont=rmff_new_cont( | |
222 desc->title, | |
223 desc->author, | |
224 desc->copyright, | |
225 desc->abstract); | |
226 header->data=rmff_new_dataheader(0,0); | |
227 header->streams=calloc(1,sizeof(rmff_mdpr_t*)*(desc->stream_count+1)); | |
228 #ifdef LOG | |
229 printf("number of streams: %u\n", desc->stream_count); | |
230 #endif | |
231 | |
232 for (i=0; i<desc->stream_count; i++) { | |
233 | |
234 int j=0; | |
235 int n; | |
236 char b[64]; | |
21783
4511c04bc4a0
Fix potential buffer overflow in asm rules matching code
rtogni
parents:
21507
diff
changeset
|
237 int rulematches[MAX_RULEMATCHES]; |
9922 | 238 |
29584
dc57d7bd98e1
Fix possible crashes with invalid SDPs that result in stream descriptions
reimar
parents:
29583
diff
changeset
|
239 if (!desc->stream[i]) |
dc57d7bd98e1
Fix possible crashes with invalid SDPs that result in stream descriptions
reimar
parents:
29583
diff
changeset
|
240 continue; |
9922 | 241 #ifdef LOG |
242 printf("calling asmrp_match with:\n%s\n%u\n", desc->stream[i]->asm_rule_book, bandwidth); | |
243 #endif | |
244 n=asmrp_match(desc->stream[i]->asm_rule_book, bandwidth, rulematches); | |
245 for (j=0; j<n; j++) { | |
246 #ifdef LOG | |
247 printf("asmrp rule match: %u for stream %u\n", rulematches[j], desc->stream[i]->stream_id); | |
248 #endif | |
249 sprintf(b,"stream=%u;rule=%u,", desc->stream[i]->stream_id, rulematches[j]); | |
12266 | 250 *stream_rules = xbuffer_strcat(*stream_rules, b); |
9922 | 251 } |
252 | |
14144
1fcb18e39ef9
Fix streaming if not mlti_data (for some non-multirate streams)
rtognimp
parents:
13676
diff
changeset
|
253 if (!desc->stream[i]->mlti_data) { |
1fcb18e39ef9
Fix streaming if not mlti_data (for some non-multirate streams)
rtognimp
parents:
13676
diff
changeset
|
254 len = 0; |
29583 | 255 buf = xbuffer_free(buf); |
14144
1fcb18e39ef9
Fix streaming if not mlti_data (for some non-multirate streams)
rtognimp
parents:
13676
diff
changeset
|
256 } else |
12266 | 257 len=select_mlti_data(desc->stream[i]->mlti_data, desc->stream[i]->mlti_data_size, rulematches[0], &buf); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
258 |
9922 | 259 header->streams[i]=rmff_new_mdpr( |
260 desc->stream[i]->stream_id, | |
261 desc->stream[i]->max_bit_rate, | |
262 desc->stream[i]->avg_bit_rate, | |
263 desc->stream[i]->max_packet_size, | |
264 desc->stream[i]->avg_packet_size, | |
265 desc->stream[i]->start_time, | |
266 desc->stream[i]->preroll, | |
267 desc->stream[i]->duration, | |
268 desc->stream[i]->stream_name, | |
269 desc->stream[i]->mime_type, | |
270 len, | |
271 buf); | |
272 | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
273 duration=FFMAX(duration,desc->stream[i]->duration); |
9922 | 274 max_bit_rate+=desc->stream[i]->max_bit_rate; |
275 avg_bit_rate+=desc->stream[i]->avg_bit_rate; | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
276 max_packet_size=FFMAX(max_packet_size, desc->stream[i]->max_packet_size); |
9922 | 277 if (avg_packet_size) |
278 avg_packet_size=(avg_packet_size + desc->stream[i]->avg_packet_size) / 2; | |
279 else | |
280 avg_packet_size=desc->stream[i]->avg_packet_size; | |
281 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
282 |
12266 | 283 if (*stream_rules && strlen(*stream_rules) && (*stream_rules)[strlen(*stream_rules)-1] == ',') |
284 (*stream_rules)[strlen(*stream_rules)-1]=0; /* delete last ',' in stream_rules */ | |
9922 | 285 |
286 header->prop=rmff_new_prop( | |
287 max_bit_rate, | |
288 avg_bit_rate, | |
289 max_packet_size, | |
290 avg_packet_size, | |
291 0, | |
292 duration, | |
293 0, | |
294 0, | |
295 0, | |
296 desc->stream_count, | |
297 desc->flags); | |
298 | |
299 rmff_fix_header(header); | |
12266 | 300 buf = xbuffer_free(buf); |
21788 | 301 sdpplin_free(desc); |
9922 | 302 |
303 return header; | |
304 } | |
305 | |
22242
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
22023
diff
changeset
|
306 int real_get_rdt_chunk(rtsp_t *rtsp_session, char **buffer, int rdt_rawdata) { |
9922 | 307 |
308 int n=1; | |
309 uint8_t header[8]; | |
310 rmff_pheader_t ph; | |
311 int size; | |
11595
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
312 int flags1, flags2; |
9922 | 313 int unknown1; |
314 uint32_t ts; | |
11595
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
315 static uint32_t prev_ts = -1; |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
316 static int prev_stream_number = -1; |
9922 | 317 |
318 n=rtsp_read_data(rtsp_session, header, 8); | |
319 if (n<8) return 0; | |
320 if (header[0] != 0x24) | |
321 { | |
20530 | 322 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: rdt chunk not recognized: got 0x%02x\n", |
323 header[0]); | |
9922 | 324 return 0; |
325 } | |
22894
8912a629ebb1
Length of interleaved RTSP frames (0x24) in only 16 bit, the other byte
rtogni
parents:
22750
diff
changeset
|
326 /* header[1] is channel, normally 0, ignored */ |
8912a629ebb1
Length of interleaved RTSP frames (0x24) in only 16 bit, the other byte
rtogni
parents:
22750
diff
changeset
|
327 size=(header[2]<<8)+header[3]; |
9922 | 328 flags1=header[4]; |
25035 | 329 if ((flags1 & 0xc0) != 0x40) |
9922 | 330 { |
331 #ifdef LOG | |
332 printf("got flags1: 0x%02x\n",flags1); | |
333 #endif | |
22750 | 334 if(header[6] == 0x06) { // eof packet |
335 rtsp_read_data(rtsp_session, header, 7); // Skip the rest of the eof packet | |
336 /* Some files have short auxiliary streams, we must ignore eof packets | |
337 * for these streams to avoid premature eof. | |
338 * Now the code declares eof only if the stream with id == 0 gets eof | |
339 * (old code was: eof on the first eof packet received). | |
340 */ | |
341 if(flags1 & 0x7c) // ignore eof for streams with id != 0 | |
342 return 0; | |
20530 | 343 mp_msg(MSGT_STREAM, MSGL_INFO, "realrtsp: Stream EOF detected\n"); |
13676 | 344 return -1; |
345 } | |
9922 | 346 header[0]=header[5]; |
347 header[1]=header[6]; | |
348 header[2]=header[7]; | |
349 n=rtsp_read_data(rtsp_session, header+3, 5); | |
350 if (n<5) return 0; | |
351 #ifdef LOG | |
352 printf("ignoring bytes:\n"); | |
353 hexdump(header, 8); | |
354 #endif | |
355 n=rtsp_read_data(rtsp_session, header+4, 4); | |
356 if (n<4) return 0; | |
357 flags1=header[4]; | |
358 size-=9; | |
359 } | |
11595
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
360 flags2=header[7]; |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
361 // header[5..6] == frame number in stream |
13289
2cb80075204c
chunk size fix from Ross Finlayson, ported from xine
diego
parents:
12845
diff
changeset
|
362 unknown1=(header[5]<<16)+(header[6]<<8)+(header[7]); |
9922 | 363 n=rtsp_read_data(rtsp_session, header, 6); |
364 if (n<6) return 0; | |
22376
6c1fe779b704
Use libavutil AV_RB/AV_WB macros instead of defining out own variants.
reimar
parents:
22242
diff
changeset
|
365 ts=AV_RB32(header); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
366 |
9922 | 367 #ifdef LOG |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
368 printf("ts: %u, size: %u, flags: 0x%02x, unknown values: 0x%06x 0x%02x 0x%02x\n", |
9922 | 369 ts, size, flags1, unknown1, header[4], header[5]); |
370 #endif | |
371 size+=2; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
372 |
9922 | 373 ph.object_version=0; |
374 ph.length=size; | |
22749 | 375 ph.stream_number=(flags1>>1)&0x1f; |
9922 | 376 ph.timestamp=ts; |
377 ph.reserved=0; | |
11595
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
378 if ((flags2&1) == 0 && (prev_ts != ts || prev_stream_number != ph.stream_number)) |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
379 { |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
380 prev_ts = ts; |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
381 prev_stream_number = ph.stream_number; |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
382 ph.flags=2; |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
383 } |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
384 else |
95413c6d76a0
keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents:
11506
diff
changeset
|
385 ph.flags=0; |
12266 | 386 *buffer = xbuffer_ensure_size(*buffer, 12+size); |
22242
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
22023
diff
changeset
|
387 if(rdt_rawdata) { |
29413 | 388 if (size < 12) |
389 return 0; | |
22242
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
22023
diff
changeset
|
390 n=rtsp_read_data(rtsp_session, *buffer, size-12); |
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
22023
diff
changeset
|
391 return (n <= 0) ? 0 : n; |
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
22023
diff
changeset
|
392 } |
12266 | 393 rmff_dump_pheader(&ph, *buffer); |
29405 | 394 if (size < 12) |
395 return 0; | |
9922 | 396 size-=12; |
12266 | 397 n=rtsp_read_data(rtsp_session, (*buffer)+12, size); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
398 |
12271
4adb4a3b52a2
More bounds checking fixes (thnaks to Miguel Freitas)
rtognimp
parents:
12266
diff
changeset
|
399 return (n <= 0) ? 0 : n+12; |
9922 | 400 } |
401 | |
19266 | 402 static int convert_timestamp(char *str, int *sec, int *msec) { |
11506
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
403 int hh, mm, ss, ms = 0; |
23641
1c5ab508b0e6
start= and end= parameters on realrtspurls may be optionally quoted with
rtogni
parents:
22945
diff
changeset
|
404 |
1c5ab508b0e6
start= and end= parameters on realrtspurls may be optionally quoted with
rtogni
parents:
22945
diff
changeset
|
405 // Timestamp may be optionally quoted with ", skip it |
1c5ab508b0e6
start= and end= parameters on realrtspurls may be optionally quoted with
rtogni
parents:
22945
diff
changeset
|
406 // Since the url is escaped when we get here, we skip the string "%22" |
1c5ab508b0e6
start= and end= parameters on realrtspurls may be optionally quoted with
rtogni
parents:
22945
diff
changeset
|
407 if (!strncmp(str, "%22", 3)) |
1c5ab508b0e6
start= and end= parameters on realrtspurls may be optionally quoted with
rtogni
parents:
22945
diff
changeset
|
408 str += 3; |
11506
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
409 if (sscanf(str, "%d:%d:%d.%d", &hh, &mm, &ss, &ms) < 3) { |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
410 hh = 0; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
411 if (sscanf(str, "%d:%d.%d", &mm, &ss, &ms) < 2) { |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
412 mm = 0; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
413 if (sscanf(str, "%d.%d", &ss, &ms) < 1) { |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
414 ss = 0; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
415 ms = 0; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
416 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
417 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
418 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
419 if (sec) |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
420 *sec = hh * 3600 + mm * 60 + ss; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
421 if (msec) |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
422 *msec = ms; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
423 return 1; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
424 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
425 |
14159 | 426 //! maximum size of the rtsp description, must be < INT_MAX |
427 #define MAX_DESC_BUF (20 * 1024 * 1024) | |
20527 | 428 rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth, |
429 char *username, char *password) { | |
9922 | 430 |
431 char *description=NULL; | |
432 char *session_id=NULL; | |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
433 rmff_header_t *h = NULL; |
29578 | 434 char *challenge1 = NULL; |
25721 | 435 char challenge2[41]; |
436 char checksum[9]; | |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
437 char *subscribe = NULL; |
12266 | 438 char *buf = xbuffer_init(256); |
9922 | 439 char *mrl=rtsp_get_mrl(rtsp_session); |
440 unsigned int size; | |
441 int status; | |
17332
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
442 uint32_t maxbandwidth = bandwidth; |
20527 | 443 char* authfield = NULL; |
22749 | 444 int i; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
445 |
9922 | 446 /* get challenge */ |
29579
26e0c6a16e57
Make sure we do not strdup(NULL), avoids a crash with non-real streams.
reimar
parents:
29578
diff
changeset
|
447 challenge1=rtsp_search_answers(rtsp_session,"RealChallenge1"); |
26e0c6a16e57
Make sure we do not strdup(NULL), avoids a crash with non-real streams.
reimar
parents:
29578
diff
changeset
|
448 if (!challenge1) |
26e0c6a16e57
Make sure we do not strdup(NULL), avoids a crash with non-real streams.
reimar
parents:
29578
diff
changeset
|
449 goto out; |
26e0c6a16e57
Make sure we do not strdup(NULL), avoids a crash with non-real streams.
reimar
parents:
29578
diff
changeset
|
450 challenge1=strdup(challenge1); |
9922 | 451 #ifdef LOG |
452 printf("real: Challenge1: %s\n", challenge1); | |
453 #endif | |
17332
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
454 |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
455 /* set a reasonable default to get the best stream, unless bandwidth given */ |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
456 if (!bandwidth) |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
457 bandwidth = 10485800; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
458 |
9922 | 459 /* request stream description */ |
20527 | 460 rtsp_send_describe: |
9922 | 461 rtsp_schedule_field(rtsp_session, "Accept: application/sdp"); |
462 sprintf(buf, "Bandwidth: %u", bandwidth); | |
463 rtsp_schedule_field(rtsp_session, buf); | |
464 rtsp_schedule_field(rtsp_session, "GUID: 00000000-0000-0000-0000-000000000000"); | |
465 rtsp_schedule_field(rtsp_session, "RegionData: 0"); | |
466 rtsp_schedule_field(rtsp_session, "ClientID: Linux_2.4_6.0.9.1235_play32_RN01_EN_586"); | |
467 rtsp_schedule_field(rtsp_session, "SupportsMaximumASMBandwidth: 1"); | |
468 rtsp_schedule_field(rtsp_session, "Language: en-US"); | |
469 rtsp_schedule_field(rtsp_session, "Require: com.real.retain-entity-for-setup"); | |
20527 | 470 if(authfield) |
471 rtsp_schedule_field(rtsp_session, authfield); | |
9922 | 472 status=rtsp_request_describe(rtsp_session,NULL); |
473 | |
20527 | 474 if (status == 401) { |
475 int authlen, b64_authlen; | |
476 char *authreq; | |
477 char* authstr = NULL; | |
478 | |
479 if (authfield) { | |
480 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: authorization failed, check your credentials\n"); | |
481 goto autherr; | |
482 } | |
483 if (!(authreq = rtsp_search_answers(rtsp_session,"WWW-Authenticate"))) { | |
484 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: 401 but no auth request, aborting\n"); | |
485 goto autherr; | |
486 } | |
487 if (!username) { | |
488 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: auth required but no username supplied\n"); | |
489 goto autherr; | |
490 } | |
491 if (!strstr(authreq, "Basic")) { | |
492 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: authenticator not supported (%s)\n", authreq); | |
493 goto autherr; | |
494 } | |
32585 | 495 authlen = strlen(username) + 1 + (password ? strlen(password) : 0); |
496 authstr = malloc(authlen + 1); | |
20527 | 497 sprintf(authstr, "%s:%s", username, password ? password : ""); |
32585 | 498 b64_authlen = AV_BASE64_SIZE(authlen); |
499 authfield = malloc(21 + b64_authlen); | |
20527 | 500 strcpy(authfield, "Authorization: Basic "); |
32585 | 501 av_base64_encode(authfield + 21, b64_authlen, authstr, authlen); |
20527 | 502 free(authstr); |
503 goto rtsp_send_describe; | |
504 } | |
505 autherr: | |
506 | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29584
diff
changeset
|
507 free(authfield); |
20527 | 508 |
9922 | 509 if ( status<200 || status>299 ) |
510 { | |
511 char *alert=rtsp_search_answers(rtsp_session,"Alert"); | |
512 if (alert) { | |
20530 | 513 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: got message from server:\n%s\n", |
514 alert); | |
9922 | 515 } |
516 rtsp_send_ok(rtsp_session); | |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
517 goto out; |
9922 | 518 } |
519 | |
520 /* receive description */ | |
521 size=0; | |
522 if (!rtsp_search_answers(rtsp_session,"Content-length")) | |
20530 | 523 mp_msg(MSGT_STREAM, MSGL_WARN, "real: got no Content-length!\n"); |
9922 | 524 else |
525 size=atoi(rtsp_search_answers(rtsp_session,"Content-length")); | |
526 | |
14159 | 527 // as size is unsigned this also catches the case (size < 0) |
528 if (size > MAX_DESC_BUF) { | |
20530 | 529 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: Content-length for description too big (> %uMB)!\n", |
14159 | 530 MAX_DESC_BUF/(1024*1024) ); |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
531 goto out; |
14159 | 532 } |
533 | |
9922 | 534 if (!rtsp_search_answers(rtsp_session,"ETag")) |
20530 | 535 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: got no ETag!\n"); |
9922 | 536 else |
537 session_id=strdup(rtsp_search_answers(rtsp_session,"ETag")); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
538 |
9922 | 539 #ifdef LOG |
14159 | 540 printf("real: Stream description size: %u\n", size); |
9922 | 541 #endif |
542 | |
19074
d385666efa27
removes unused parentheses lefted behind in the r19075 sizeof(char) cleanups, noticed by dalias
reynaldo
parents:
19070
diff
changeset
|
543 description=malloc(size+1); |
9922 | 544 |
12271
4adb4a3b52a2
More bounds checking fixes (thnaks to Miguel Freitas)
rtognimp
parents:
12266
diff
changeset
|
545 if( rtsp_read_data(rtsp_session, description, size) <= 0) { |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
546 goto out; |
12271
4adb4a3b52a2
More bounds checking fixes (thnaks to Miguel Freitas)
rtognimp
parents:
12266
diff
changeset
|
547 } |
9922 | 548 description[size]=0; |
549 | |
550 /* parse sdp (sdpplin) and create a header and a subscribe string */ | |
12266 | 551 subscribe = xbuffer_init(256); |
9922 | 552 strcpy(subscribe, "Subscribe: "); |
12266 | 553 h=real_parse_sdp(description, &subscribe, bandwidth); |
554 if (!h) { | |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
555 goto out; |
12266 | 556 } |
9922 | 557 rmff_fix_header(h); |
558 | |
559 #ifdef LOG | |
560 printf("Title: %s\nCopyright: %s\nAuthor: %s\nStreams: %i\n", | |
561 h->cont->title, h->cont->copyright, h->cont->author, h->prop->num_streams); | |
562 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
563 |
9922 | 564 /* setup our streams */ |
565 real_calc_response_and_checksum (challenge2, checksum, challenge1); | |
12266 | 566 buf = xbuffer_ensure_size(buf, strlen(challenge2) + strlen(checksum) + 32); |
9922 | 567 sprintf(buf, "RealChallenge2: %s, sd=%s", challenge2, checksum); |
568 rtsp_schedule_field(rtsp_session, buf); | |
12266 | 569 buf = xbuffer_ensure_size(buf, strlen(session_id) + 32); |
9922 | 570 sprintf(buf, "If-Match: %s", session_id); |
571 rtsp_schedule_field(rtsp_session, buf); | |
572 rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play"); | |
12266 | 573 buf = xbuffer_ensure_size(buf, strlen(mrl) + 32); |
9922 | 574 sprintf(buf, "%s/streamid=0", mrl); |
18772
eb60c209a117
better RTSP RFC compliance (fixes in CSeq and TEARDOWN handling)
ben
parents:
17332
diff
changeset
|
575 rtsp_request_setup(rtsp_session,buf,NULL); |
9922 | 576 |
22749 | 577 /* Do setup for all the other streams we subscribed to */ |
578 for (i = 1; i < h->prop->num_streams; i++) { | |
9922 | 579 rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play"); |
12266 | 580 buf = xbuffer_ensure_size(buf, strlen(session_id) + 32); |
9922 | 581 sprintf(buf, "If-Match: %s", session_id); |
582 rtsp_schedule_field(rtsp_session, buf); | |
583 | |
12266 | 584 buf = xbuffer_ensure_size(buf, strlen(mrl) + 32); |
22749 | 585 sprintf(buf, "%s/streamid=%d", mrl, i); |
18772
eb60c209a117
better RTSP RFC compliance (fixes in CSeq and TEARDOWN handling)
ben
parents:
17332
diff
changeset
|
586 rtsp_request_setup(rtsp_session,buf,NULL); |
9922 | 587 } |
588 /* set stream parameter (bandwidth) with our subscribe string */ | |
589 rtsp_schedule_field(rtsp_session, subscribe); | |
590 rtsp_request_setparameter(rtsp_session,NULL); | |
591 | |
17332
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
592 /* set delivery bandwidth */ |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
593 if (maxbandwidth) { |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
594 sprintf(buf, "SetDeliveryBandwidth: Bandwidth=%u;BackOff=0", maxbandwidth); |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
595 rtsp_schedule_field(rtsp_session, buf); |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
596 rtsp_request_setparameter(rtsp_session,NULL); |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
597 } |
88adbc28f60b
This patch makes real rtsp tell the server to deliver data at specified
rtognimp
parents:
14159
diff
changeset
|
598 |
11506
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
599 { |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
600 int s_ss = 0, s_ms = 0, e_ss = 0, e_ms = 0; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
601 char *str; |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
602 if ((str = rtsp_get_param(rtsp_session, "start"))) { |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
603 convert_timestamp(str, &s_ss, &s_ms); |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
604 free(str); |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
605 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
606 if ((str = rtsp_get_param(rtsp_session, "end"))) { |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
607 convert_timestamp(str, &e_ss, &e_ms); |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
608 free(str); |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
609 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
610 str = buf + sprintf(buf, s_ms ? "%s%d.%d-" : "%s%d-", "Range: npt=", s_ss, s_ms); |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
611 if (e_ss || e_ms) |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
612 sprintf(str, e_ms ? "%d.%d" : "%d", e_ss, e_ms); |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
613 } |
fff1b6f1a9cc
Real rtsp Range parameter (Start and End) support.
rtognimp
parents:
10115
diff
changeset
|
614 rtsp_schedule_field(rtsp_session, buf); |
9922 | 615 /* and finally send a play request */ |
616 rtsp_request_play(rtsp_session,NULL); | |
617 | |
29577
0ce49cb1b85b
Change real_setup_and_get_header to use goto a single exit path to simplify
reimar
parents:
29413
diff
changeset
|
618 out: |
12266 | 619 subscribe = xbuffer_free(subscribe); |
620 buf = xbuffer_free(buf); | |
29578 | 621 free(description); |
622 free(session_id); | |
623 free(challenge1); | |
9922 | 624 return h; |
625 } | |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
626 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
627 struct real_rtsp_session_t * |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
628 init_real_rtsp_session (void) |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
629 { |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
630 struct real_rtsp_session_t *real_rtsp_session = NULL; |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
631 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
632 real_rtsp_session = malloc (sizeof (struct real_rtsp_session_t)); |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
633 real_rtsp_session->recv = xbuffer_init (BUF_SIZE); |
21842 | 634 real_rtsp_session->rdteof = 0; |
22242
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
22023
diff
changeset
|
635 real_rtsp_session->rdt_rawdata = 0; |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
636 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
637 return real_rtsp_session; |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
638 } |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
639 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
640 void |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
641 free_real_rtsp_session (struct real_rtsp_session_t* real_session) |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
642 { |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
643 if (!real_session) |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
644 return; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
645 |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
646 xbuffer_free (real_session->recv); |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
647 free (real_session); |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
18772
diff
changeset
|
648 } |