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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
1 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
2 * This file was ported to MPlayer from xine CVS real.c,v 1.8 2003/03/30 17:11:50
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
3 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
4
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
5 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
6 * Copyright (C) 2002 the xine project
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
7 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
8 * This file is part of xine, a free video player.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
9 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
10 * xine is free software; you can redistribute it and/or modify
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
11 * it under the terms of the GNU General Public License as published by
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
13 * (at your option) any later version.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
14 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
15 * xine is distributed in the hope that it will be useful,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
18 * GNU General Public License for more details.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
19 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
21 * along with this program; if not, write to the Free Software
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
23 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
24 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
25 * special functions for real streams.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
26 * adopted from joschkas real tools.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
27 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
28 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
29
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
30 #include <stdio.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
31 #include <string.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
32
26544
f20a11161e62 Use consistent #include paths without "../".
diego
parents: 26069
diff changeset
33 #include "config.h"
21372
1767c271d710 Remove bswap.h, use libavutil/bswap.h instead.
diego
parents: 20530
diff changeset
34 #include "libavutil/common.h"
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
35 #include "real.h"
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
36 #include "asmrp.h"
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
37 #include "sdpplin.h"
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
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
be61988fb5c4 Drop MPlayer base64_encode for av_base64_encode.
cboesch
parents: 32537
diff changeset
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
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
43 #include "mp_msg.h"
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
44
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
45 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
46 #define LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
47 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
48
22942
8258605fb3b2 10000000l learn to count
rtogni
parents: 22941
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
52 0x05, 0x18, 0x74, 0xd0, 0x0d, 0x09, 0x02, 0x53,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
53 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
54 0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
57
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
61 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
62 static void hexdump (const char *buf, int length) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
63
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
64 int i;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
65
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
66 printf (" hexdump> ");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
67 for (i = 0; i < length; i++) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
68 unsigned char c = buf[i];
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
69
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
70 printf ("%02x", c);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
71
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
72 if ((i % 16) == 15)
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
73 printf ("\n ");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
74
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
75 if ((i % 2) == 1)
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
76 printf (" ");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
77
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
78 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
79 printf ("\n");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
80 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
81 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
82
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
83
19266
240318c2460f Make some more function static
rtogni
parents: 19263
diff changeset
84 static void real_calc_response_and_checksum (char *response, char *chksum, char *challenge) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
85
22941
0f247134050e Size of response is known, no need to calculate it
rtogni
parents: 22940
diff changeset
86 int ch_len;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
87 int i;
25721
c0e76b0bb543 Don't oversize realchallenge buffers
rtogni
parents: 25035
diff changeset
88 unsigned char zres[16], buf[64];
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
89
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
90 /* initialize buffer */
22945
6ddd36457941 Cleanup real_calc_response_and_checksum()
rtogni
parents: 22944
diff changeset
91 AV_WB32(buf, 0xa1e9149d);
6ddd36457941 Cleanup real_calc_response_and_checksum()
rtogni
parents: 22944
diff changeset
92 AV_WB32(buf+4, 0x0e6b3b59);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
93
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
94 /* some (length) checks */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
95 if (challenge != NULL)
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
96 {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
97 ch_len = strlen (challenge);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
98
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
99 if (ch_len == 40) /* what a hack... */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
100 ch_len=32;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
101 if ( ch_len > 56 ) ch_len=56;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
102
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
103 /* copy challenge to buf */
22945
6ddd36457941 Cleanup real_calc_response_and_checksum()
rtogni
parents: 22944
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
106 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
107
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6ddd36457941 Cleanup real_calc_response_and_checksum()
rtogni
parents: 22944
diff changeset
110 buf[8+i] ^= xor_table[i];
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
117
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
120
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
125 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
126
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
127
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
128 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
129 * takes a MLTI-Chunk and a rule number got from match_asm_rule,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
130 * returns a pointer to selected data and number of bytes in that.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
131 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
132
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
133 static int select_mlti_data(const char *mlti_chunk, int mlti_size, int selection, char **out) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
134
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
135 int numrules, codec, size;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
136 int i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
137
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
138 /* MLTI chunk should begin with MLTI */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
139
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
140 if ((mlti_chunk[0] != 'M')
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
141 ||(mlti_chunk[1] != 'L')
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
142 ||(mlti_chunk[2] != 'T')
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
143 ||(mlti_chunk[3] != 'I'))
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
144 {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
145 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
146 printf("libreal: MLTI tag not detected, copying data\n");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
147 #endif
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
148 *out = xbuffer_copyin(*out, 0, mlti_chunk, mlti_size);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
149 return mlti_size;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
150 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
151
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
152 mlti_chunk+=4;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
153
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
156 if (selection >= numrules) return 0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
157
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
158 /* now <numrules> indices of codecs follows */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
159 /* we skip to selection */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
160 mlti_chunk+=(selection+1)*2;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
161
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
164
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
165 /* skip to number of codecs */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
166 mlti_chunk+=(numrules-selection)*2;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
167
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
170
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
171 if (codec >= numrules) {
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
172 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: codec index >= number of codecs. %i %i\n",
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
173 codec, numrules);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
174 return 0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
175 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
176
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
177 mlti_chunk+=2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
178
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
179 /* now seek to selected codec */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
182 mlti_chunk+=size+4;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
186
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
187 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
188 hexdump(mlti_chunk+4, size);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
189 #endif
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
190 *out = xbuffer_copyin(*out, 0, mlti_chunk+4, size);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
191 return size;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
192 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
193
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
194 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
195 * looking at stream description.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
196 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
197
19266
240318c2460f Make some more function static
rtogni
parents: 19263
diff changeset
198 static rmff_header_t *real_parse_sdp(char *data, char **stream_rules, uint32_t bandwidth) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
199
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
200 sdpplin_t *desc;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
201 rmff_header_t *header;
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
202 char *buf;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
203 int len, i;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
204 int max_bit_rate=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
205 int avg_bit_rate=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
206 int max_packet_size=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
207 int avg_packet_size=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
208 int duration=0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
209
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
210
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
211 if (!data) return NULL;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
212
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
213 desc=sdpplin_parse(data);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
214
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
215 if (!desc) return NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
216
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
217 buf = xbuffer_init(2048);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
218 header=calloc(1,sizeof(rmff_header_t));
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
219
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
220 header->fileheader=rmff_new_fileheader(4+desc->stream_count);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
221 header->cont=rmff_new_cont(
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
222 desc->title,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
223 desc->author,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
224 desc->copyright,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
225 desc->abstract);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
226 header->data=rmff_new_dataheader(0,0);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
227 header->streams=calloc(1,sizeof(rmff_mdpr_t*)*(desc->stream_count+1));
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
228 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
229 printf("number of streams: %u\n", desc->stream_count);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
230 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
231
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
232 for (i=0; i<desc->stream_count; i++) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
233
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
234 int j=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
235 int n;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
241 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
242 printf("calling asmrp_match with:\n%s\n%u\n", desc->stream[i]->asm_rule_book, bandwidth);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
243 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
244 n=asmrp_match(desc->stream[i]->asm_rule_book, bandwidth, rulematches);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
245 for (j=0; j<n; j++) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
246 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
247 printf("asmrp rule match: %u for stream %u\n", rulematches[j], desc->stream[i]->stream_id);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
248 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
249 sprintf(b,"stream=%u;rule=%u,", desc->stream[i]->stream_id, rulematches[j]);
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
250 *stream_rules = xbuffer_strcat(*stream_rules, b);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
251 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
c990a2cbfa8d Fix several more rtsp-related memleaks.
reimar
parents: 29579
diff changeset
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
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
259 header->streams[i]=rmff_new_mdpr(
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
260 desc->stream[i]->stream_id,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
261 desc->stream[i]->max_bit_rate,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
262 desc->stream[i]->avg_bit_rate,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
263 desc->stream[i]->max_packet_size,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
264 desc->stream[i]->avg_packet_size,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
265 desc->stream[i]->start_time,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
266 desc->stream[i]->preroll,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
267 desc->stream[i]->duration,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
268 desc->stream[i]->stream_name,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
269 desc->stream[i]->mime_type,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
270 len,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
271 buf);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
274 max_bit_rate+=desc->stream[i]->max_bit_rate;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
277 if (avg_packet_size)
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
278 avg_packet_size=(avg_packet_size + desc->stream[i]->avg_packet_size) / 2;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
279 else
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
280 avg_packet_size=desc->stream[i]->avg_packet_size;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
281 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
282
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
283 if (*stream_rules && strlen(*stream_rules) && (*stream_rules)[strlen(*stream_rules)-1] == ',')
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
284 (*stream_rules)[strlen(*stream_rules)-1]=0; /* delete last ',' in stream_rules */
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
285
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
286 header->prop=rmff_new_prop(
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
287 max_bit_rate,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
288 avg_bit_rate,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
289 max_packet_size,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
290 avg_packet_size,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
291 0,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
292 duration,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
293 0,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
294 0,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
295 0,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
296 desc->stream_count,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
297 desc->flags);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
298
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
299 rmff_fix_header(header);
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
300 buf = xbuffer_free(buf);
21788
04281be4fbdd Memleak fix (implement sdpplin_free() and use it)
rtogni
parents: 21783
diff changeset
301 sdpplin_free(desc);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
302
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
303 return header;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
304 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
307
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
308 int n=1;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
309 uint8_t header[8];
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
310 rmff_pheader_t ph;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
311 int size;
11595
95413c6d76a0 keyframe detection support by rgselk <rgselknospam@yahoo.com>
alex
parents: 11506
diff changeset
312 int flags1, flags2;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
313 int unknown1;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
317
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
318 n=rtsp_read_data(rtsp_session, header, 8);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
319 if (n<8) return 0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
320 if (header[0] != 0x24)
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
321 {
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
322 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: rdt chunk not recognized: got 0x%02x\n",
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
323 header[0]);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
324 return 0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
328 flags1=header[4];
25035
bcc90b2bc09f Ignore stream id when checking rdt packet flags
rtogni
parents: 23641
diff changeset
329 if ((flags1 & 0xc0) != 0x40)
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
330 {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
331 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
332 printf("got flags1: 0x%02x\n",flags1);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
333 #endif
22750
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
334 if(header[6] == 0x06) { // eof packet
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
335 rtsp_read_data(rtsp_session, header, 7); // Skip the rest of the eof packet
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
336 /* Some files have short auxiliary streams, we must ignore eof packets
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
337 * for these streams to avoid premature eof.
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
338 * Now the code declares eof only if the stream with id == 0 gets eof
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
339 * (old code was: eof on the first eof packet received).
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
340 */
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
341 if(flags1 & 0x7c) // ignore eof for streams with id != 0
8e7b3260e985 Declare eof only when stream 0 gets eof
rtogni
parents: 22749
diff changeset
342 return 0;
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
343 mp_msg(MSGT_STREAM, MSGL_INFO, "realrtsp: Stream EOF detected\n");
13676
929af3b49c8e EOF detection (fix hanging at end of stream)
rtognimp
parents: 13289
diff changeset
344 return -1;
929af3b49c8e EOF detection (fix hanging at end of stream)
rtognimp
parents: 13289
diff changeset
345 }
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
346 header[0]=header[5];
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
347 header[1]=header[6];
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
348 header[2]=header[7];
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
349 n=rtsp_read_data(rtsp_session, header+3, 5);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
350 if (n<5) return 0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
351 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
352 printf("ignoring bytes:\n");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
353 hexdump(header, 8);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
354 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
355 n=rtsp_read_data(rtsp_session, header+4, 4);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
356 if (n<4) return 0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
357 flags1=header[4];
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
358 size-=9;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
363 n=rtsp_read_data(rtsp_session, header, 6);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
369 ts, size, flags1, unknown1, header[4], header[5]);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
370 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
371 size+=2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
372
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
373 ph.object_version=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
374 ph.length=size;
22749
f088d69b1667 Fix for realrtsp urls with more than 2 streams:
rtogni
parents: 22376
diff changeset
375 ph.stream_number=(flags1>>1)&0x1f;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
376 ph.timestamp=ts;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
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
cecb20da409e stream/realrtsp/real.c: Fix another integer overflow
uau
parents: 29405
diff changeset
388 if (size < 12)
cecb20da409e stream/realrtsp/real.c: Fix another integer overflow
uau
parents: 29405
diff changeset
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
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
393 rmff_dump_pheader(&ph, *buffer);
29405
5edbab3df93b stream/realrtsp/real.c: Fix integer overflow
uau
parents: 29263
diff changeset
394 if (size < 12)
5edbab3df93b stream/realrtsp/real.c: Fix integer overflow
uau
parents: 29263
diff changeset
395 return 0;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
396 size-=12;
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
400 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
401
19266
240318c2460f Make some more function static
rtogni
parents: 19263
diff changeset
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
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
426 //! maximum size of the rtsp description, must be < INT_MAX
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
427 #define MAX_DESC_BUF (20 * 1024 * 1024)
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
428 rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth,
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
429 char *username, char *password) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
430
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
431 char *description=NULL;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
b0ee310c2216 Fix several memleaks in real_setup_and_get_header
reimar
parents: 29577
diff changeset
434 char *challenge1 = NULL;
25721
c0e76b0bb543 Don't oversize realchallenge buffers
rtogni
parents: 25035
diff changeset
435 char challenge2[41];
c0e76b0bb543 Don't oversize realchallenge buffers
rtogni
parents: 25035
diff changeset
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
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
438 char *buf = xbuffer_init(256);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
439 char *mrl=rtsp_get_mrl(rtsp_session);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
440 unsigned int size;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
443 char* authfield = NULL;
22749
f088d69b1667 Fix for realrtsp urls with more than 2 streams:
rtogni
parents: 22376
diff changeset
444 int i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
445
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
451 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
452 printf("real: Challenge1: %s\n", challenge1);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
459 /* request stream description */
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
460 rtsp_send_describe:
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
461 rtsp_schedule_field(rtsp_session, "Accept: application/sdp");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
462 sprintf(buf, "Bandwidth: %u", bandwidth);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
463 rtsp_schedule_field(rtsp_session, buf);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
464 rtsp_schedule_field(rtsp_session, "GUID: 00000000-0000-0000-0000-000000000000");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
465 rtsp_schedule_field(rtsp_session, "RegionData: 0");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
466 rtsp_schedule_field(rtsp_session, "ClientID: Linux_2.4_6.0.9.1235_play32_RN01_EN_586");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
467 rtsp_schedule_field(rtsp_session, "SupportsMaximumASMBandwidth: 1");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
468 rtsp_schedule_field(rtsp_session, "Language: en-US");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
469 rtsp_schedule_field(rtsp_session, "Require: com.real.retain-entity-for-setup");
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
470 if(authfield)
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
471 rtsp_schedule_field(rtsp_session, authfield);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
472 status=rtsp_request_describe(rtsp_session,NULL);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
473
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
474 if (status == 401) {
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
475 int authlen, b64_authlen;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
476 char *authreq;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
477 char* authstr = NULL;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
478
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
479 if (authfield) {
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
480 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: authorization failed, check your credentials\n");
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
481 goto autherr;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
482 }
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
483 if (!(authreq = rtsp_search_answers(rtsp_session,"WWW-Authenticate"))) {
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
484 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: 401 but no auth request, aborting\n");
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
485 goto autherr;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
486 }
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
487 if (!username) {
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
488 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: auth required but no username supplied\n");
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
489 goto autherr;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
490 }
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
491 if (!strstr(authreq, "Basic")) {
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
492 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: authenticator not supported (%s)\n", authreq);
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
493 goto autherr;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
494 }
32585
be61988fb5c4 Drop MPlayer base64_encode for av_base64_encode.
cboesch
parents: 32537
diff changeset
495 authlen = strlen(username) + 1 + (password ? strlen(password) : 0);
be61988fb5c4 Drop MPlayer base64_encode for av_base64_encode.
cboesch
parents: 32537
diff changeset
496 authstr = malloc(authlen + 1);
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
497 sprintf(authstr, "%s:%s", username, password ? password : "");
32585
be61988fb5c4 Drop MPlayer base64_encode for av_base64_encode.
cboesch
parents: 32537
diff changeset
498 b64_authlen = AV_BASE64_SIZE(authlen);
be61988fb5c4 Drop MPlayer base64_encode for av_base64_encode.
cboesch
parents: 32537
diff changeset
499 authfield = malloc(21 + b64_authlen);
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
500 strcpy(authfield, "Authorization: Basic ");
32585
be61988fb5c4 Drop MPlayer base64_encode for av_base64_encode.
cboesch
parents: 32537
diff changeset
501 av_base64_encode(authfield + 21, b64_authlen, authstr, authlen);
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
502 free(authstr);
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
503 goto rtsp_send_describe;
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
504 }
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
505 autherr:
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
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
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19271
diff changeset
508
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
509 if ( status<200 || status>299 )
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
510 {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
511 char *alert=rtsp_search_answers(rtsp_session,"Alert");
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
512 if (alert) {
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
513 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: got message from server:\n%s\n",
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
514 alert);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
515 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
518 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
519
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
520 /* receive description */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
521 size=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
522 if (!rtsp_search_answers(rtsp_session,"Content-length"))
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
523 mp_msg(MSGT_STREAM, MSGL_WARN, "real: got no Content-length!\n");
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
524 else
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
525 size=atoi(rtsp_search_answers(rtsp_session,"Content-length"));
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
526
14159
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
527 // as size is unsigned this also catches the case (size < 0)
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
528 if (size > MAX_DESC_BUF) {
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
529 mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: Content-length for description too big (> %uMB)!\n",
14159
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
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
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
532 }
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
533
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
534 if (!rtsp_search_answers(rtsp_session,"ETag"))
20530
42d58e583110 printf -> mp_msg
rtogni
parents: 20527
diff changeset
535 mp_msg(MSGT_STREAM, MSGL_WARN, "realrtsp: got no ETag!\n");
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
536 else
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
539 #ifdef LOG
14159
88a58f2dda55 fix security vulnerability reported by iDEFENSE
reimar
parents: 14144
diff changeset
540 printf("real: Stream description size: %u\n", size);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
541 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
548 description[size]=0;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
549
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
550 /* parse sdp (sdpplin) and create a header and a subscribe string */
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
551 subscribe = xbuffer_init(256);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
552 strcpy(subscribe, "Subscribe: ");
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
553 h=real_parse_sdp(description, &subscribe, bandwidth);
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
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
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
556 }
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
557 rmff_fix_header(h);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
558
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
559 #ifdef LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
560 printf("Title: %s\nCopyright: %s\nAuthor: %s\nStreams: %i\n",
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
561 h->cont->title, h->cont->copyright, h->cont->author, h->prop->num_streams);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
562 #endif
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27463
diff changeset
563
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
564 /* setup our streams */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
565 real_calc_response_and_checksum (challenge2, checksum, challenge1);
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
566 buf = xbuffer_ensure_size(buf, strlen(challenge2) + strlen(checksum) + 32);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
567 sprintf(buf, "RealChallenge2: %s, sd=%s", challenge2, checksum);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
568 rtsp_schedule_field(rtsp_session, buf);
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
569 buf = xbuffer_ensure_size(buf, strlen(session_id) + 32);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
570 sprintf(buf, "If-Match: %s", session_id);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
571 rtsp_schedule_field(rtsp_session, buf);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
572 rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
573 buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
576
22749
f088d69b1667 Fix for realrtsp urls with more than 2 streams:
rtogni
parents: 22376
diff changeset
577 /* Do setup for all the other streams we subscribed to */
f088d69b1667 Fix for realrtsp urls with more than 2 streams:
rtogni
parents: 22376
diff changeset
578 for (i = 1; i < h->prop->num_streams; i++) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
579 rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
580 buf = xbuffer_ensure_size(buf, strlen(session_id) + 32);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
581 sprintf(buf, "If-Match: %s", session_id);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
582 rtsp_schedule_field(rtsp_session, buf);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
583
12266
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
584 buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
22749
f088d69b1667 Fix for realrtsp urls with more than 2 streams:
rtogni
parents: 22376
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
587 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
588 /* set stream parameter (bandwidth) with our subscribe string */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
589 rtsp_schedule_field(rtsp_session, subscribe);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
590 rtsp_request_setparameter(rtsp_session,NULL);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
615 /* and finally send a play request */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
616 rtsp_request_play(rtsp_session,NULL);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
619 subscribe = xbuffer_free(subscribe);
096072d234c6 Some sanity and bound checking
rtognimp
parents: 11595
diff changeset
620 buf = xbuffer_free(buf);
29578
b0ee310c2216 Fix several memleaks in real_setup_and_get_header
reimar
parents: 29577
diff changeset
621 free(description);
b0ee310c2216 Fix several memleaks in real_setup_and_get_header
reimar
parents: 29577
diff changeset
622 free(session_id);
b0ee310c2216 Fix several memleaks in real_setup_and_get_header
reimar
parents: 29577
diff changeset
623 free(challenge1);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
624 return h;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
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
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21788
diff changeset
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 }