Mercurial > mplayer.hg
annotate stream/asf_mmst_streaming.c @ 35490:a5f5f61a7a35
Replace confusing guiInfoMediumClear() by MediumPrepare().
(It has been completely rewritten.)
Now call MediumPrepare() only once for all play events. Check for
current StreamType and clear stuff not being used for this stream
type (and only stuff that need to be cleared).
author | ib |
---|---|
date | Mon, 03 Dec 2012 16:26:39 +0000 |
parents | abf1b2360d4f |
children | b5abdfe9bc61 |
rev | line source |
---|---|
19882
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
1 /* |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
2 * MMST implementation taken from the xine-mms plugin made by |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
3 * Major MMS (http://geocities.com/majormms/). |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
4 * Ported to MPlayer by Abhijeet Phatak <abhijeetphatak@yahoo.com>. |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
5 * |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
6 * Information about the MMS protocol can be found at http://get.to/sdp |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
7 * |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
8 * copyright (C) 2002 Abhijeet Phatak <abhijeetphatak@yahoo.com> |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
9 * copyright (C) 2002 the xine project |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
10 * copyright (C) 2000-2001 major mms |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
11 * |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
12 * This file is part of MPlayer. |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
13 * |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
14 * MPlayer is free software; you can redistribute it and/or modify |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
15 * it under the terms of the GNU General Public License as published by |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
16 * the Free Software Foundation; either version 2 of the License, or |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
17 * (at your option) any later version. |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
18 * |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
19 * MPlayer is distributed in the hope that it will be useful, |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
22 * GNU General Public License for more details. |
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
23 * |
26737
a26e50cae389
Use standard license headers with standard formatting.
diego
parents:
22159
diff
changeset
|
24 * You should have received a copy of the GNU General Public License along |
a26e50cae389
Use standard license headers with standard formatting.
diego
parents:
22159
diff
changeset
|
25 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
a26e50cae389
Use standard license headers with standard formatting.
diego
parents:
22159
diff
changeset
|
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
19882
9ffae26c0add
Restore original copyright notice as found in xine and xine-mms where this
diego
parents:
19335
diff
changeset
|
27 */ |
6092 | 28 |
29 | |
30 #include <stdio.h> | |
31 #include <stdlib.h> | |
32 #include <string.h> | |
33 #include <unistd.h> | |
34 #include <errno.h> | |
7880 | 35 #include <inttypes.h> |
6092 | 36 |
37 #include "config.h" | |
38 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
39 #include "mp_msg.h" |
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
40 #include "help_mp.h" |
32053
abf1b2360d4f
Replace audio_id / video_id extern declarations by mpcommon.h #include.
diego
parents:
30648
diff
changeset
|
41 #include "mpcommon.h" |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
42 |
28402 | 43 #if HAVE_WINSOCK2_H |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
44 #include <winsock2.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
45 #endif |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
46 |
27393 | 47 #ifdef CONFIG_ICONV |
12674
0392f36045f4
user nl_langinfo if langinfo support present for proper chinese support, feature requested by Shixin Zheng <shixinzheng@sjtu.edu.cn>
alex
parents:
12545
diff
changeset
|
48 #include <iconv.h> |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
49 #endif |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
50 |
6092 | 51 #include "url.h" |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19271
diff
changeset
|
52 #include "libmpdemux/asf.h" |
6092 | 53 |
54 #include "stream.h" | |
30648
74d39bc2b2c4
Add header for asf_mmst_streaming_start() instead of forward declaring it.
diego
parents:
30607
diff
changeset
|
55 #include "asf_mmst_streaming.h" |
6092 | 56 #include "network.h" |
19335
2a9d669e5ff6
isolated tcp socket code from network.c to a dedicated file
ben
parents:
19312
diff
changeset
|
57 #include "tcp.h" |
6092 | 58 |
59 #define BUF_SIZE 102400 | |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
60 #define HDR_BUF_SIZE 8192 |
15181
ed74657f25b1
Use define instead of hardcodec value for max streams number
rtognimp
parents:
15173
diff
changeset
|
61 #define MAX_STREAMS 20 |
6092 | 62 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
63 typedef struct |
6092 | 64 { |
65 uint8_t buf[BUF_SIZE]; | |
66 int num_bytes; | |
67 | |
68 } command_t; | |
69 | |
7880 | 70 static int seq_num; |
71 static int num_stream_ids; | |
15181
ed74657f25b1
Use define instead of hardcodec value for max streams number
rtognimp
parents:
15173
diff
changeset
|
72 static int stream_ids[MAX_STREAMS]; |
6092 | 73 |
74 static int get_data (int s, char *buf, size_t count); | |
75 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
76 static void put_32 (command_t *cmd, uint32_t value) |
6092 | 77 { |
78 cmd->buf[cmd->num_bytes ] = value % 256; | |
79 value = value >> 8; | |
80 cmd->buf[cmd->num_bytes+1] = value % 256 ; | |
81 value = value >> 8; | |
82 cmd->buf[cmd->num_bytes+2] = value % 256 ; | |
83 value = value >> 8; | |
84 cmd->buf[cmd->num_bytes+3] = value % 256 ; | |
85 | |
86 cmd->num_bytes += 4; | |
87 } | |
88 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
89 static uint32_t get_32 (unsigned char *cmd, int offset) |
6092 | 90 { |
91 uint32_t ret; | |
92 | |
93 ret = cmd[offset] ; | |
94 ret |= cmd[offset+1]<<8 ; | |
95 ret |= cmd[offset+2]<<16 ; | |
96 ret |= cmd[offset+3]<<24 ; | |
97 | |
98 return ret; | |
99 } | |
100 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
101 static void send_command (int s, int command, uint32_t switches, |
6092 | 102 uint32_t extra, int length, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
103 char *data) |
6092 | 104 { |
105 command_t cmd; | |
106 int len8; | |
107 | |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
108 len8 = (length + 7) / 8; |
6092 | 109 |
110 cmd.num_bytes = 0; | |
111 | |
112 put_32 (&cmd, 0x00000001); /* start sequence */ | |
113 put_32 (&cmd, 0xB00BFACE); /* #-)) */ | |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
114 put_32 (&cmd, len8*8 + 32); |
6092 | 115 put_32 (&cmd, 0x20534d4d); /* protocol type "MMS " */ |
116 put_32 (&cmd, len8 + 4); | |
117 put_32 (&cmd, seq_num); | |
118 seq_num++; | |
119 put_32 (&cmd, 0x0); /* unknown */ | |
120 put_32 (&cmd, 0x0); | |
121 put_32 (&cmd, len8+2); | |
122 put_32 (&cmd, 0x00030000 | command); /* dir | command */ | |
123 put_32 (&cmd, switches); | |
124 put_32 (&cmd, extra); | |
125 | |
126 memcpy (&cmd.buf[48], data, length); | |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
127 if (length & 7) |
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
128 memset(&cmd.buf[48 + length], 0, 8 - (length & 7)); |
6092 | 129 |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
130 if (send (s, cmd.buf, len8*8+48, 0) != (len8*8+48)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
131 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_WriteError); |
6092 | 132 } |
133 } | |
134 | |
27393 | 135 #ifdef CONFIG_ICONV |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
136 static iconv_t url_conv; |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
137 #endif |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
138 |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
139 static void string_utf16(char *dest, char *src, int len) { |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
140 int i; |
27393 | 141 #ifdef CONFIG_ICONV |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
142 size_t len1, len2; |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
143 char *ip, *op; |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
144 |
11412 | 145 if (url_conv != (iconv_t)(-1)) |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
146 { |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
147 memset(dest, 0, 1000); |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
148 len1 = len; len2 = 1000; |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
149 ip = src; op = dest; |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
150 |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
151 iconv(url_conv, &ip, &len1, &op, &len2); |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
152 } |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
153 else |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
154 { |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
155 #endif |
15150
38ec64821910
Make string_utf16 code behave almost the same with or without iconv
rtognimp
parents:
14542
diff
changeset
|
156 if (len > 499) len = 499; |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
157 for (i=0; i<len; i++) { |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
158 dest[i*2] = src[i]; |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
159 dest[i*2+1] = 0; |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
160 } |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
161 /* trailing zeroes */ |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
162 dest[i*2] = 0; |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
163 dest[i*2+1] = 0; |
27393 | 164 #ifdef CONFIG_ICONV |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
165 } |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
166 #endif |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
167 } |
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
168 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
169 static void get_answer (int s) |
6092 | 170 { |
171 char data[BUF_SIZE]; | |
172 int command = 0x1b; | |
173 | |
174 while (command == 0x1b) { | |
175 int len; | |
176 | |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10183
diff
changeset
|
177 len = recv (s, data, BUF_SIZE, 0) ; |
6092 | 178 if (!len) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
179 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_EOFAlert); |
6092 | 180 return; |
181 } | |
182 | |
183 command = get_32 (data, 36) & 0xFFFF; | |
184 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
185 if (command == 0x1b) |
6092 | 186 send_command (s, 0x1b, 0, 0, 0, data); |
187 } | |
188 } | |
189 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
190 static int get_data (int s, char *buf, size_t count) |
6092 | 191 { |
7953 | 192 ssize_t len; |
193 size_t total = 0; | |
6092 | 194 |
195 while (total < count) { | |
196 | |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10183
diff
changeset
|
197 len = recv (s, &buf[total], count-total, 0); |
6092 | 198 |
12545 | 199 if (len<=0) { |
6092 | 200 perror ("read error:"); |
201 return 0; | |
202 } | |
203 | |
204 total += len; | |
205 | |
206 if (len != 0) { | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
207 // mp_msg(MSGT_NETWORK,MSGL_INFO,"[%d/%d]", total, count); |
6092 | 208 fflush (stdout); |
209 } | |
210 | |
211 } | |
212 | |
213 return 1; | |
214 | |
215 } | |
216 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
217 static int get_header (int s, uint8_t *header, streaming_ctrl_t *streaming_ctrl) |
6092 | 218 { |
219 unsigned char pre_header[8]; | |
7953 | 220 int header_len; |
6092 | 221 |
222 header_len = 0; | |
223 | |
224 while (1) { | |
225 if (!get_data (s, pre_header, 8)) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
226 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_PreHeaderReadFailed); |
6092 | 227 return 0; |
228 } | |
229 if (pre_header[4] == 0x02) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
230 |
6092 | 231 int packet_len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
232 |
6092 | 233 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8; |
234 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
235 // mp_msg(MSGT_NETWORK,MSGL_INFO,"asf header packet detected, len=%d\n", packet_len); |
6092 | 236 |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
237 if (packet_len < 0 || packet_len > HDR_BUF_SIZE - header_len) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
238 mp_msg(MSGT_NETWORK, MSGL_FATAL, MSGTR_MPDEMUX_MMST_InvalidHeaderSize); |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
239 return 0; |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
240 } |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
241 |
6092 | 242 if (!get_data (s, &header[header_len], packet_len)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
243 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_HeaderDataReadFailed); |
6092 | 244 return 0; |
245 } | |
246 | |
247 header_len += packet_len; | |
248 | |
249 if ( (header[header_len-1] == 1) && (header[header_len-2]==1)) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
250 |
6092 | 251 |
252 if( streaming_bufferize( streaming_ctrl, header, header_len )<0 ) { | |
253 return -1; | |
254 } | |
255 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
256 // mp_msg(MSGT_NETWORK,MSGL_INFO,"get header packet finished\n"); |
6092 | 257 |
26756
c43ce7268677
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26737
diff
changeset
|
258 return header_len; |
6092 | 259 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
260 } |
6092 | 261 |
262 } else { | |
263 | |
7953 | 264 int32_t packet_len; |
6092 | 265 int command; |
266 char data[BUF_SIZE]; | |
267 | |
7953 | 268 if (!get_data (s, (char*)&packet_len, 4)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
269 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_packet_lenReadFailed); |
6092 | 270 return 0; |
271 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
272 |
7953 | 273 packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
274 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
275 // mp_msg(MSGT_NETWORK,MSGL_INFO,"command packet detected, len=%d\n", packet_len); |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
276 |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
277 if (packet_len < 0 || packet_len > BUF_SIZE) { |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
278 mp_msg(MSGT_NETWORK, MSGL_FATAL, |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
279 MSGTR_MPDEMUX_MMST_InvalidRTSPPacketSize); |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
280 return 0; |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
281 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
282 |
6092 | 283 if (!get_data (s, data, packet_len)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
284 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_CmdDataReadFailed); |
6092 | 285 return 0; |
286 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
287 |
6092 | 288 command = get_32 (data, 24) & 0xFFFF; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
289 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
290 // mp_msg(MSGT_NETWORK,MSGL_INFO,"command: %02x\n", command); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
291 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
292 if (command == 0x1b) |
6092 | 293 send_command (s, 0x1b, 0, 0, 0, data); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
294 |
6092 | 295 } |
296 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
297 // mp_msg(MSGT_NETWORK,MSGL_INFO,"get header packet succ\n"); |
6092 | 298 } |
299 } | |
300 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
301 static int interp_header (uint8_t *header, int header_len) |
6092 | 302 { |
303 int i; | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7309
diff
changeset
|
304 int packet_length=-1; |
6092 | 305 |
306 /* | |
307 * parse header | |
308 */ | |
309 | |
310 i = 30; | |
311 while (i<header_len) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
312 |
6092 | 313 uint64_t guid_1, guid_2, length; |
314 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
315 guid_2 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8) |
6092 | 316 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24) |
317 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40) | |
318 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56); | |
319 i += 8; | |
320 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
321 guid_1 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8) |
6092 | 322 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24) |
323 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40) | |
324 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56); | |
325 i += 8; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
326 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
327 // mp_msg(MSGT_NETWORK,MSGL_INFO,"guid found: %016llx%016llx\n", guid_1, guid_2); |
6092 | 328 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
329 length = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8) |
6092 | 330 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24) |
331 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40) | |
332 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56); | |
333 | |
334 i += 8; | |
335 | |
12121 | 336 if ( (guid_1 == 0x6cce6200aa00d9a6ULL) && (guid_2 == 0x11cf668e75b22630ULL) ) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
337 mp_msg(MSGT_NETWORK,MSGL_INFO,MSGTR_MPDEMUX_MMST_HeaderObject); |
12121 | 338 } else if ((guid_1 == 0x6cce6200aa00d9a6ULL) && (guid_2 == 0x11cf668e75b22636ULL)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
339 mp_msg(MSGT_NETWORK,MSGL_INFO,MSGTR_MPDEMUX_MMST_DataObject); |
12121 | 340 } else if ((guid_1 == 0x6553200cc000e48eULL) && (guid_2 == 0x11cfa9478cabdca1ULL)) { |
6092 | 341 |
342 packet_length = get_32(header, i+92-24); | |
343 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
344 mp_msg(MSGT_NETWORK,MSGL_INFO,MSGTR_MPDEMUX_MMST_FileObjectPacketLen, |
6092 | 345 packet_length, get_32(header, i+96-24)); |
346 | |
347 | |
12121 | 348 } else if ((guid_1 == 0x6553200cc000e68eULL) && (guid_2 == 0x11cfa9b7b7dc0791ULL)) { |
6092 | 349 |
350 int stream_id = header[i+48] | header[i+49] << 8; | |
351 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
352 mp_msg(MSGT_NETWORK,MSGL_INFO,MSGTR_MPDEMUX_MMST_StreamObjectStreamID, stream_id); |
6092 | 353 |
15181
ed74657f25b1
Use define instead of hardcodec value for max streams number
rtognimp
parents:
15173
diff
changeset
|
354 if (num_stream_ids < MAX_STREAMS) { |
6092 | 355 stream_ids[num_stream_ids] = stream_id; |
356 num_stream_ids++; | |
15173
424386614ad5
Fix potential buffer overflow for urls with more than 20 streams
rtognimp
parents:
15150
diff
changeset
|
357 } else { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
358 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_2ManyStreamID); |
15173
424386614ad5
Fix potential buffer overflow for urls with more than 20 streams
rtognimp
parents:
15150
diff
changeset
|
359 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
360 |
6092 | 361 } else { |
15628 | 362 #if 0 |
363 int b = i; | |
364 printf ("unknown object (guid: %016llx, %016llx, len: %lld)\n", guid_1, guid_2, length); | |
365 for (; b < length; b++) | |
366 { | |
367 if (isascii(header[b]) || isalpha(header[b])) | |
368 printf("%c ", header[b]); | |
369 else | |
370 printf("%x ", header[b]); | |
371 } | |
372 printf("\n"); | |
373 #else | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
374 mp_msg(MSGT_NETWORK,MSGL_WARN,MSGTR_MPDEMUX_MMST_UnknownObject); |
15628 | 375 #endif |
6092 | 376 } |
377 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
378 // mp_msg(MSGT_NETWORK,MSGL_INFO,"length : %lld\n", length); |
6092 | 379 |
380 i += length-24; | |
381 | |
382 } | |
383 | |
384 return packet_length; | |
385 | |
386 } | |
387 | |
388 | |
7880 | 389 static int get_media_packet (int s, int padding, streaming_ctrl_t *stream_ctrl) { |
6092 | 390 unsigned char pre_header[8]; |
391 char data[BUF_SIZE]; | |
7880 | 392 |
393 if (!get_data (s, pre_header, 8)) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
394 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_PreHeaderReadFailed); |
7880 | 395 return 0; |
396 } | |
397 | |
398 // for (i=0; i<8; i++) | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
399 // mp_msg(MSGT_NETWORK,MSGL_INFO,"pre_header[%d] = %02x (%d)\n", |
7880 | 400 // i, pre_header[i], pre_header[i]); |
401 | |
402 if (pre_header[4] == 0x04) { | |
403 | |
404 int packet_len; | |
405 | |
406 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8; | |
407 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
408 // mp_msg(MSGT_NETWORK,MSGL_INFO,"asf media packet detected, len=%d\n", packet_len); |
7880 | 409 |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
410 if (packet_len < 0 || packet_len > BUF_SIZE) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
411 mp_msg(MSGT_NETWORK, MSGL_FATAL, MSGTR_MPDEMUX_MMST_InvalidRTSPPacketSize); |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
412 return 0; |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
413 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
414 |
7880 | 415 if (!get_data (s, data, packet_len)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
416 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_MediaDataReadFailed); |
7880 | 417 return 0; |
418 } | |
419 | |
420 streaming_bufferize(stream_ctrl, data, padding); | |
421 | |
422 } else { | |
423 | |
7953 | 424 int32_t packet_len; |
425 int command; | |
7880 | 426 |
7953 | 427 if (!get_data (s, (char*)&packet_len, 4)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
428 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_packet_lenReadFailed); |
7880 | 429 return 0; |
430 } | |
431 | |
7953 | 432 packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4; |
7880 | 433 |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
434 if (packet_len < 0 || packet_len > BUF_SIZE) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
435 mp_msg(MSGT_NETWORK,MSGL_FATAL,MSGTR_MPDEMUX_MMST_InvalidRTSPPacketSize); |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
436 return 0; |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
437 } |
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
438 |
7880 | 439 if (!get_data (s, data, packet_len)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
440 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_CmdDataReadFailed); |
7880 | 441 return 0; |
442 } | |
443 | |
444 if ( (pre_header[7] != 0xb0) || (pre_header[6] != 0x0b) | |
445 || (pre_header[5] != 0xfa) || (pre_header[4] != 0xce) ) { | |
446 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
447 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_MissingSignature); |
7880 | 448 return -1; |
449 } | |
450 | |
451 command = get_32 (data, 24) & 0xFFFF; | |
452 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
453 // mp_msg(MSGT_NETWORK,MSGL_INFO,"\ncommand packet detected, len=%d cmd=0x%X\n", packet_len, command); |
7880 | 454 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
455 if (command == 0x1b) |
7880 | 456 send_command (s, 0x1b, 0, 0, 0, data); |
457 else if (command == 0x1e) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
458 mp_msg(MSGT_NETWORK,MSGL_INFO,MSGTR_MPDEMUX_MMST_PatentedTechnologyJoke); |
7880 | 459 return 0; |
460 } | |
461 else if (command == 0x21 ) { | |
462 // Looks like it's new in WMS9 | |
463 // Unknown command, but ignoring it seems to work. | |
464 return 0; | |
465 } | |
466 else if (command != 0x05) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
467 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_UnknownCmd,command); |
7880 | 468 return -1; |
469 } | |
470 } | |
471 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
472 // mp_msg(MSGT_NETWORK,MSGL_INFO,"get media packet succ\n"); |
7880 | 473 |
474 return 1; | |
475 } | |
6092 | 476 |
477 | |
7880 | 478 static int packet_length1; |
6092 | 479 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
480 static int asf_mmst_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) |
6092 | 481 { |
7880 | 482 int len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
483 |
7880 | 484 while( stream_ctrl->buffer_size==0 ) { |
485 // buffer is empty - fill it! | |
486 int ret = get_media_packet( fd, packet_length1, stream_ctrl); | |
487 if( ret<0 ) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
488 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_MMST_GetMediaPacketErr,strerror(errno)); |
7880 | 489 return -1; |
12077 | 490 } else if (ret==0) //EOF? |
491 return ret; | |
7880 | 492 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
493 |
7880 | 494 len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos; |
495 if(len>size) len=size; | |
6092 | 496 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len ); |
497 stream_ctrl->buffer_pos += len; | |
498 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) { | |
499 free( stream_ctrl->buffer ); | |
500 stream_ctrl->buffer = NULL; | |
501 stream_ctrl->buffer_size = 0; | |
502 stream_ctrl->buffer_pos = 0; | |
503 } | |
7880 | 504 return len; |
6092 | 505 |
506 } | |
507 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
508 static int asf_mmst_streaming_seek( int fd, off_t pos, streaming_ctrl_t *streaming_ctrl ) |
6092 | 509 { |
510 return -1; | |
7953 | 511 // Shut up gcc warning |
512 fd++; | |
513 pos++; | |
514 streaming_ctrl=NULL; | |
6092 | 515 } |
516 | |
517 int asf_mmst_streaming_start(stream_t *stream) | |
518 { | |
519 char str[1024]; | |
10183 | 520 char data[BUF_SIZE]; |
14163
dd835e8f3698
fix a problem pointed out by iDEFENSE and several similar ones.
reimar
parents:
13600
diff
changeset
|
521 uint8_t asf_header[HDR_BUF_SIZE]; |
6092 | 522 int asf_header_len; |
523 int len, i, packet_length; | |
12751 | 524 char *path, *unescpath; |
6092 | 525 URL_t *url1 = stream->streaming_ctrl->url; |
7953 | 526 int s = stream->fd; |
6092 | 527 |
7250
27a1315d6af4
Checked if the connection succeeded before writing in the socket.
bertrand
parents:
6092
diff
changeset
|
528 if( s>0 ) { |
10281 | 529 closesocket( stream->fd ); |
7250
27a1315d6af4
Checked if the connection succeeded before writing in the socket.
bertrand
parents:
6092
diff
changeset
|
530 stream->fd = -1; |
27a1315d6af4
Checked if the connection succeeded before writing in the socket.
bertrand
parents:
6092
diff
changeset
|
531 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
532 |
6092 | 533 /* parse url */ |
534 path = strchr(url1->file,'/') + 1; | |
535 | |
12751 | 536 /* mmst filename are not url_escaped by MS MediaPlayer and are expected as |
537 * "plain text" by the server, so need to decode it here | |
538 */ | |
539 unescpath=malloc(strlen(path)+1); | |
540 if (!unescpath) { | |
16906
75ccba4bd84b
Changed MSGTR_MPDEMUX_MMST_MallocFailed to MSGTR_MemAllocFailed (msg defined two times inhelp_mp-en.h)
ptt
parents:
16882
diff
changeset
|
541 mp_msg(MSGT_NETWORK,MSGL_FATAL,MSGTR_MemAllocFailed); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
542 return -1; |
12751 | 543 } |
544 url_unescape_string(unescpath,path); | |
545 path=unescpath; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
546 |
12751 | 547 |
12968 | 548 if( url1->port==0 ) { |
549 url1->port=1755; | |
550 } | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10281
diff
changeset
|
551 s = connect2Server( url1->hostname, url1->port, 1); |
7250
27a1315d6af4
Checked if the connection succeeded before writing in the socket.
bertrand
parents:
6092
diff
changeset
|
552 if( s<0 ) { |
12751 | 553 free(path); |
7250
27a1315d6af4
Checked if the connection succeeded before writing in the socket.
bertrand
parents:
6092
diff
changeset
|
554 return s; |
27a1315d6af4
Checked if the connection succeeded before writing in the socket.
bertrand
parents:
6092
diff
changeset
|
555 } |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16330
diff
changeset
|
556 mp_msg(MSGT_NETWORK,MSGL_INFO,MSGTR_MPDEMUX_MMST_Connected); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
557 |
7880 | 558 seq_num=0; |
6092 | 559 |
560 /* | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
561 * Send the initial connect info including player version no. Client GUID (random) and the host address being connected to. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
562 * This command is sent at the very start of protocol initiation. It sends local information to the serve |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
563 * cmd 1 0x01 |
6092 | 564 * */ |
565 | |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
566 /* prepare for the url encoding conversion */ |
27393 | 567 #ifdef CONFIG_ICONV |
29291
79f3477b277e
Using nl_langinfo in the asf mmst implementation makes no sense since
reimar
parents:
29263
diff
changeset
|
568 url_conv = iconv_open("UTF-16LE", "UTF-8"); |
12674
0392f36045f4
user nl_langinfo if langinfo support present for proper chinese support, feature requested by Shixin Zheng <shixinzheng@sjtu.edu.cn>
alex
parents:
12545
diff
changeset
|
569 #endif |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
570 |
10183 | 571 snprintf (str, 1023, "\034\003NSPlayer/7.0.0.1956; {33715801-BAB3-9D85-24E9-03B90328270A}; Host: %s", url1->hostname); |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
572 string_utf16 (data, str, strlen(str)); |
6092 | 573 // send_command(s, commandno ....) |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
574 send_command (s, 1, 0, 0x0004000b, strlen(str)*2+2, data); |
6092 | 575 |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10183
diff
changeset
|
576 len = recv (s, data, BUF_SIZE, 0) ; |
6092 | 577 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
578 /*This sends details of the local machine IP address to a Funnel system at the server. |
6092 | 579 * Also, the TCP or UDP transport selection is sent. |
580 * | |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
581 * here 192.168.0.1 is local ip address TCP/UDP states the tronsport we r using |
6092 | 582 * and 1037 is the local TCP or UDP socket number |
583 * cmd 2 0x02 | |
584 * */ | |
585 | |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
586 string_utf16 (&data[8], "\002\000\\\\192.168.0.1\\TCP\\1037", 24); |
6092 | 587 memset (data, 0, 8); |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
588 send_command (s, 2, 0, 0, 24*2+10, data); |
6092 | 589 |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10183
diff
changeset
|
590 len = recv (s, data, BUF_SIZE, 0) ; |
6092 | 591 |
592 /* This command sends file path (at server) and file name request to the server. | |
593 * 0x5 */ | |
594 | |
595 string_utf16 (&data[8], path, strlen(path)); | |
596 memset (data, 0, 8); | |
11225
48bb1fd37d2a
Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents:
10625
diff
changeset
|
597 send_command (s, 5, 0, 0, strlen(path)*2+10, data); |
12751 | 598 free(path); |
6092 | 599 |
600 get_answer (s); | |
601 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
602 /* The ASF header chunk request. Includes ?session' variable for pre header value. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
603 * After this command is sent, |
6092 | 604 * the server replies with 0x11 command and then the header chunk with header data follows. |
605 * 0x15 */ | |
606 | |
607 memset (data, 0, 40); | |
608 data[32] = 2; | |
609 | |
610 send_command (s, 0x15, 1, 0, 40, data); | |
611 | |
612 num_stream_ids = 0; | |
613 /* get_headers(s, asf_header); */ | |
614 | |
615 asf_header_len = get_header (s, asf_header, stream->streaming_ctrl); | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15181
diff
changeset
|
616 // mp_msg(MSGT_NETWORK,MSGL_INFO,"---------------------------------- asf_header %d\n",asf_header); |
21536 | 617 if (asf_header_len==0) { //error reading header |
618 closesocket(s); | |
619 return -1; | |
620 } | |
6092 | 621 packet_length = interp_header (asf_header, asf_header_len); |
622 | |
623 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
624 /* |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
625 * This command is the media stream MBR selector. Switches are always 6 bytes in length. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
626 * After all switch elements, data ends with bytes [00 00] 00 20 ac 40 [02]. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
627 * Where: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
628 * [00 00] shows 0x61 0x00 (on the first 33 sent) or 0xff 0xff for ASF files, and with no ending data for WMV files. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
629 * It is not yet understood what all this means. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
630 * And the last [02] byte is probably the header ?session' value. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
631 * |
6092 | 632 * 0x33 */ |
633 | |
634 memset (data, 0, 40); | |
635 | |
22159
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
636 if (audio_id > 0) { |
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
637 data[2] = 0xFF; |
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
638 data[3] = 0xFF; |
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
639 data[4] = audio_id; |
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
640 send_command(s, 0x33, num_stream_ids, 0xFFFF | audio_id << 16, 8, data); |
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
641 } else { |
6092 | 642 for (i=1; i<num_stream_ids; i++) { |
643 data [ (i-1) * 6 + 2 ] = 0xFF; | |
644 data [ (i-1) * 6 + 3 ] = 0xFF; | |
645 data [ (i-1) * 6 + 4 ] = stream_ids[i]; | |
646 data [ (i-1) * 6 + 5 ] = 0x00; | |
647 } | |
648 | |
649 send_command (s, 0x33, num_stream_ids, 0xFFFF | stream_ids[0] << 16, (num_stream_ids-1)*6+2 , data); | |
22159
6d8f2be532d4
Quick hack mostly for documentation purposes to make -aid work with mms://
reimar
parents:
21536
diff
changeset
|
650 } |
6092 | 651 |
652 get_answer (s); | |
653 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
654 /* Start sending file from packet xx. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
655 * This command is also used for resume downloads or requesting a lost packet. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
656 * Also used for seeking by sending a play point value which seeks to the media time point. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
657 * Includes ?session' value in pre header and the maximum media stream time. |
6092 | 658 * 0x07 */ |
659 | |
660 memset (data, 0, 40); | |
661 | |
662 for (i=8; i<16; i++) | |
663 data[i] = 0xFF; | |
664 | |
665 data[20] = 0x04; | |
666 | |
667 send_command (s, 0x07, 1, 0xFFFF | stream_ids[0] << 16, 24, data); | |
668 | |
7880 | 669 stream->fd = s; |
670 stream->streaming_ctrl->streaming_read = asf_mmst_streaming_read; | |
671 stream->streaming_ctrl->streaming_seek = asf_mmst_streaming_seek; | |
672 stream->streaming_ctrl->buffering = 1; | |
673 stream->streaming_ctrl->status = streaming_playing_e; | |
6092 | 674 |
7880 | 675 packet_length1 = packet_length; |
16930 | 676 mp_msg(MSGT_NETWORK,MSGL_INFO,"mmst packet_length = %d\n", packet_length); |
6092 | 677 |
27393 | 678 #ifdef CONFIG_ICONV |
11412 | 679 if (url_conv != (iconv_t)(-1)) |
11403
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
680 iconv_close(url_conv); |
86ab7e0b2a65
fallback to non-iconv dummy utf16 conversion if iconv failed
alex
parents:
11402
diff
changeset
|
681 #endif |
11350
007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
attila
parents:
11226
diff
changeset
|
682 |
6092 | 683 return 0; |
684 } |