annotate libmpdemux/asf_mmst_streaming.c @ 10737:af906af4cf18

1000l
author rfelker
date Sun, 31 Aug 2003 19:18:21 +0000
parents 620cc649f519
children 48bb1fd37d2a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
1 // mmst implementation taken from the xine-mms plugin made by majormms (http://geocities.com/majormms/)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
2 //
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
3 // ported to mplayer by Abhijeet Phatak <abhijeetphatak@yahoo.com>
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
4 // date : 16 April 2002
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
5 //
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
6 // information about the mms protocol can be find at http://get.to/sdp
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
7 //
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
8
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
9
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
10 #include <stdio.h>
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
11 #include <stdlib.h>
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
12 #include <string.h>
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
13 #include <unistd.h>
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
14 #include <errno.h>
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
15 #include <inttypes.h>
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
16
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
17 #include "config.h"
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
18
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
19 #ifndef HAVE_WINSOCK2
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
20 #define closesocket close
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
21 #else
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
22 #include <winsock2.h>
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
23 #endif
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
24
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
25 #include "url.h"
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
26 #include "asf.h"
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
27
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
28 #include "stream.h"
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
29
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
30 #include "network.h"
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
31
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
32 #define BUF_SIZE 102400
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
33
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
34 typedef struct
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
35 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
36 uint8_t buf[BUF_SIZE];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
37 int num_bytes;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
38
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
39 } command_t;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
40
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
41 static int seq_num;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
42 static int num_stream_ids;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
43 static int stream_ids[20];
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
44
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
45 static int get_data (int s, char *buf, size_t count);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
46
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
47 static void put_32 (command_t *cmd, uint32_t value)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
48 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
49 cmd->buf[cmd->num_bytes ] = value % 256;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
50 value = value >> 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
51 cmd->buf[cmd->num_bytes+1] = value % 256 ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
52 value = value >> 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
53 cmd->buf[cmd->num_bytes+2] = value % 256 ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
54 value = value >> 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
55 cmd->buf[cmd->num_bytes+3] = value % 256 ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
56
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
57 cmd->num_bytes += 4;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
58 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
59
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
60 static uint32_t get_32 (unsigned char *cmd, int offset)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
61 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
62 uint32_t ret;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
63
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
64 ret = cmd[offset] ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
65 ret |= cmd[offset+1]<<8 ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
66 ret |= cmd[offset+2]<<16 ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
67 ret |= cmd[offset+3]<<24 ;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
68
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
69 return ret;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
70 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
71
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
72 static void send_command (int s, int command, uint32_t switches,
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
73 uint32_t extra, int length,
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
74 char *data)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
75 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
76 command_t cmd;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
77 int len8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
78
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
79 len8 = (length + (length%8)) / 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
80
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
81 cmd.num_bytes = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
82
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
83 put_32 (&cmd, 0x00000001); /* start sequence */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
84 put_32 (&cmd, 0xB00BFACE); /* #-)) */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
85 put_32 (&cmd, length + 32);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
86 put_32 (&cmd, 0x20534d4d); /* protocol type "MMS " */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
87 put_32 (&cmd, len8 + 4);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
88 put_32 (&cmd, seq_num);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
89 seq_num++;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
90 put_32 (&cmd, 0x0); /* unknown */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
91 put_32 (&cmd, 0x0);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
92 put_32 (&cmd, len8+2);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
93 put_32 (&cmd, 0x00030000 | command); /* dir | command */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
94 put_32 (&cmd, switches);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
95 put_32 (&cmd, extra);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
96
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
97 memcpy (&cmd.buf[48], data, length);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
98
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
99 if (send (s, cmd.buf, length+48, 0) != (length+48)) {
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
100 printf ("write error\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
101 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
102 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
103
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
104 static void string_utf16(char *dest, char *src, int len)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
105 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
106 int i;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
107
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
108 memset (dest, 0, 1000);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
109
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
110 for (i=0; i<len; i++) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
111 dest[i*2] = src[i];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
112 dest[i*2+1] = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
113 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
114
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
115 dest[i*2] = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
116 dest[i*2+1] = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
117 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
118
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
119 static void get_answer (int s)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
120 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
121 char data[BUF_SIZE];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
122 int command = 0x1b;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
123
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
124 while (command == 0x1b) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
125 int len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
126
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
127 len = recv (s, data, BUF_SIZE, 0) ;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
128 if (!len) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
129 printf ("\nalert! eof\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
130 return;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
131 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
132
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
133 command = get_32 (data, 36) & 0xFFFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
134
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
135 if (command == 0x1b)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
136 send_command (s, 0x1b, 0, 0, 0, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
137 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
138 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
139
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
140 static int get_data (int s, char *buf, size_t count)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
141 {
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
142 ssize_t len;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
143 size_t total = 0;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
144
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
145 while (total < count) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
146
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
147 len = recv (s, &buf[total], count-total, 0);
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
148
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
149 if (len<0) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
150 perror ("read error:");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
151 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
152 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
153
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
154 total += len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
155
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
156 if (len != 0) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
157 // printf ("[%d/%d]", total, count);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
158 fflush (stdout);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
159 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
160
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
161 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
162
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
163 return 1;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
164
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
165 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
166
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
167 static int get_header (int s, uint8_t *header, streaming_ctrl_t *streaming_ctrl)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
168 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
169 unsigned char pre_header[8];
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
170 int header_len;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
171
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
172 header_len = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
173
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
174 while (1) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
175 if (!get_data (s, pre_header, 8)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
176 printf ("pre-header read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
177 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
178 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
179 if (pre_header[4] == 0x02) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
180
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
181 int packet_len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
182
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
183 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
184
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
185 // printf ("asf header packet detected, len=%d\n", packet_len);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
186
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
187 if (!get_data (s, &header[header_len], packet_len)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
188 printf ("header data read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
189 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
190 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
191
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
192 header_len += packet_len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
193
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
194 if ( (header[header_len-1] == 1) && (header[header_len-2]==1)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
195
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
196
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
197 if( streaming_bufferize( streaming_ctrl, header, header_len )<0 ) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
198 return -1;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
199 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
200
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
201 // printf ("get header packet finished\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
202
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
203 return (header_len);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
204
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
205 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
206
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
207 } else {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
208
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
209 int32_t packet_len;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
210 int command;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
211 char data[BUF_SIZE];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
212
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
213 if (!get_data (s, (char*)&packet_len, 4)) {
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
214 printf ("packet_len read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
215 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
216 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
217
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
218 packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
219
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
220 // printf ("command packet detected, len=%d\n", packet_len);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
221
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
222 if (!get_data (s, data, packet_len)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
223 printf ("command data read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
224 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
225 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
226
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
227 command = get_32 (data, 24) & 0xFFFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
228
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
229 // printf ("command: %02x\n", command);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
230
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
231 if (command == 0x1b)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
232 send_command (s, 0x1b, 0, 0, 0, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
233
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
234 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
235
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
236 // printf ("get header packet succ\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
237 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
238 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
239
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
240 static int interp_header (uint8_t *header, int header_len)
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
241 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
242 int i;
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7309
diff changeset
243 int packet_length=-1;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
244
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
245 /*
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
246 * parse header
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
247 */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
248
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
249 i = 30;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
250 while (i<header_len) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
251
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
252 uint64_t guid_1, guid_2, length;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
253
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
254 guid_2 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
255 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
256 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
257 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
258 i += 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
259
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
260 guid_1 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
261 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
262 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
263 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
264 i += 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
265
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
266 // printf ("guid found: %016llx%016llx\n", guid_1, guid_2);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
267
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
268 length = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
269 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
270 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
271 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
272
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
273 i += 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
274
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
275 if ( (guid_1 == 0x6cce6200aa00d9a6) && (guid_2 == 0x11cf668e75b22630) ) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
276 printf ("header object\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
277 } else if ((guid_1 == 0x6cce6200aa00d9a6) && (guid_2 == 0x11cf668e75b22636)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
278 printf ("data object\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
279 } else if ((guid_1 == 0x6553200cc000e48e) && (guid_2 == 0x11cfa9478cabdca1)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
280
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
281 packet_length = get_32(header, i+92-24);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
282
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
283 printf ("file object, packet length = %d (%d)\n",
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
284 packet_length, get_32(header, i+96-24));
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
285
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
286
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
287 } else if ((guid_1 == 0x6553200cc000e68e) && (guid_2 == 0x11cfa9b7b7dc0791)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
288
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
289 int stream_id = header[i+48] | header[i+49] << 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
290
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
291 printf ("stream object, stream id: %d\n", stream_id);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
292
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
293 stream_ids[num_stream_ids] = stream_id;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
294 num_stream_ids++;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
295
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
296 } else {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
297 printf ("unknown object\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
298 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
299
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
300 // printf ("length : %lld\n", length);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
301
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
302 i += length-24;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
303
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
304 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
305
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
306 return packet_length;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
307
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
308 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
309
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
310
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
311 static int get_media_packet (int s, int padding, streaming_ctrl_t *stream_ctrl) {
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
312 unsigned char pre_header[8];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
313 char data[BUF_SIZE];
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
314
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
315 if (!get_data (s, pre_header, 8)) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
316 printf ("pre-header read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
317 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
318 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
319
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
320 // for (i=0; i<8; i++)
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
321 // printf ("pre_header[%d] = %02x (%d)\n",
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
322 // i, pre_header[i], pre_header[i]);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
323
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
324 if (pre_header[4] == 0x04) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
325
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
326 int packet_len;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
327
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
328 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
329
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
330 // printf ("asf media packet detected, len=%d\n", packet_len);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
331
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
332 if (!get_data (s, data, packet_len)) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
333 printf ("media data read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
334 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
335 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
336
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
337 streaming_bufferize(stream_ctrl, data, padding);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
338
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
339 } else {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
340
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
341 int32_t packet_len;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
342 int command;
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
343
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
344 if (!get_data (s, (char*)&packet_len, 4)) {
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
345 printf ("packet_len read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
346 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
347 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
348
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
349 packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
350
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
351 if (!get_data (s, data, packet_len)) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
352 printf ("command data read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
353 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
354 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
355
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
356 if ( (pre_header[7] != 0xb0) || (pre_header[6] != 0x0b)
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
357 || (pre_header[5] != 0xfa) || (pre_header[4] != 0xce) ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
358
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
359 printf ("missing signature\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
360 return -1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
361 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
362
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
363 command = get_32 (data, 24) & 0xFFFF;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
364
7977
0c660f21e0e4 debug printf
arpi
parents: 7953
diff changeset
365 // printf ("\ncommand packet detected, len=%d cmd=0x%X\n", packet_len, command);
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
366
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
367 if (command == 0x1b)
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
368 send_command (s, 0x1b, 0, 0, 0, data);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
369 else if (command == 0x1e) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
370 printf ("everything done. Thank you for downloading a media file containing proprietary and patentend technology.\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
371 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
372 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
373 else if (command == 0x21 ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
374 // Looks like it's new in WMS9
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
375 // Unknown command, but ignoring it seems to work.
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
376 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
377 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
378 else if (command != 0x05) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
379 printf ("unknown command %02x\n", command);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
380 return -1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
381 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
382 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
383
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
384 // printf ("get media packet succ\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
385
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
386 return 1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
387 }
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
388
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
389
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
390 static int packet_length1;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
391
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
392 int
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
393 asf_mmst_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl )
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
394 {
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
395 int len;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
396
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
397 while( stream_ctrl->buffer_size==0 ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
398 // buffer is empty - fill it!
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
399 int ret = get_media_packet( fd, packet_length1, stream_ctrl);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
400 if( ret<0 ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
401 printf("get_media_packet error : %s\n",strerror(errno));
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
402 return -1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
403 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
404 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
405
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
406 len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
407 if(len>size) len=size;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
408 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len );
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
409 stream_ctrl->buffer_pos += len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
410 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
411 free( stream_ctrl->buffer );
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
412 stream_ctrl->buffer = NULL;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
413 stream_ctrl->buffer_size = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
414 stream_ctrl->buffer_pos = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
415 }
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
416 return len;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
417
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
418 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
419
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
420 int
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
421 asf_mmst_streaming_seek( int fd, off_t pos, streaming_ctrl_t *streaming_ctrl )
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
422 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
423 return -1;
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
424 // Shut up gcc warning
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
425 fd++;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
426 pos++;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
427 streaming_ctrl=NULL;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
428 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
429
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
430 int asf_mmst_streaming_start(stream_t *stream)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
431 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
432 char str[1024];
10183
2ffb9a8b0428 10l found by yepyep
alex
parents: 7977
diff changeset
433 char data[BUF_SIZE];
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
434 uint8_t asf_header[8192];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
435 int asf_header_len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
436 int len, i, packet_length;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
437 char *path;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
438 URL_t *url1 = stream->streaming_ctrl->url;
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
439 int s = stream->fd;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
440
7250
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
441 if( s>0 ) {
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
442 closesocket( stream->fd );
7250
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
443 stream->fd = -1;
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
444 }
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
445
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
446 /* parse url */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
447 path = strchr(url1->file,'/') + 1;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
448
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
449 url1->port=1755;
10625
620cc649f519 ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents: 10281
diff changeset
450 s = connect2Server( url1->hostname, url1->port, 1);
7250
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
451 if( s<0 ) {
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
452 return s;
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
453 }
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
454 printf ("connected\n");
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
455
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
456 seq_num=0;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
457
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
458 /*
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
459 * Send the initial connect info including player version no. Client GUID (random) and the host address being connected to.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
460 * This command is sent at the very start of protocol initiation. It sends local information to the serve
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
461 * cmd 1 0x01
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
462 * */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
463
10183
2ffb9a8b0428 10l found by yepyep
alex
parents: 7977
diff changeset
464 snprintf (str, 1023, "\034\003NSPlayer/7.0.0.1956; {33715801-BAB3-9D85-24E9-03B90328270A}; Host: %s", url1->hostname);
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
465 string_utf16 (data, str, strlen(str)+2);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
466 // send_command(s, commandno ....)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
467 send_command (s, 1, 0, 0x0004000b, strlen(str) * 2+8, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
468
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
469 len = recv (s, data, BUF_SIZE, 0) ;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
470
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
471 /*This sends details of the local machine IP address to a Funnel system at the server.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
472 * Also, the TCP or UDP transport selection is sent.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
473 *
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
474 * here 192.168.0.129 is local ip address TCP/UDP states the tronsport we r using
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
475 * and 1037 is the local TCP or UDP socket number
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
476 * cmd 2 0x02
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
477 * */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
478
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
479 string_utf16 (&data[8], "\002\000\\\\192.168.0.1\\TCP\\1037\0000",
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
480 28);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
481 memset (data, 0, 8);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
482 send_command (s, 2, 0, 0, 28*2+8, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
483
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
484 len = recv (s, data, BUF_SIZE, 0) ;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
485
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
486 /* This command sends file path (at server) and file name request to the server.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
487 * 0x5 */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
488
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
489 string_utf16 (&data[8], path, strlen(path));
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
490 memset (data, 0, 8);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
491 send_command (s, 5, 0, 0, strlen(path)*2+12, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
492
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
493 get_answer (s);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
494
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
495 /* The ASF header chunk request. Includes ?session' variable for pre header value.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
496 * After this command is sent,
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
497 * the server replies with 0x11 command and then the header chunk with header data follows.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
498 * 0x15 */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
499
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
500 memset (data, 0, 40);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
501 data[32] = 2;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
502
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
503 send_command (s, 0x15, 1, 0, 40, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
504
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
505 num_stream_ids = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
506 /* get_headers(s, asf_header); */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
507
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
508 asf_header_len = get_header (s, asf_header, stream->streaming_ctrl);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
509 // printf("---------------------------------- asf_header %d\n",asf_header);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
510 packet_length = interp_header (asf_header, asf_header_len);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
511
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
512
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
513 /*
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
514 * This command is the media stream MBR selector. Switches are always 6 bytes in length.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
515 * After all switch elements, data ends with bytes [00 00] 00 20 ac 40 [02].
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
516 * Where:
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
517 * [00 00] shows 0x61 0x00 (on the first 33 sent) or 0xff 0xff for ASF files, and with no ending data for WMV files.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
518 * It is not yet understood what all this means.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
519 * And the last [02] byte is probably the header ?session' value.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
520 *
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
521 * 0x33 */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
522
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
523 memset (data, 0, 40);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
524
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
525 for (i=1; i<num_stream_ids; i++) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
526 data [ (i-1) * 6 + 2 ] = 0xFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
527 data [ (i-1) * 6 + 3 ] = 0xFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
528 data [ (i-1) * 6 + 4 ] = stream_ids[i];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
529 data [ (i-1) * 6 + 5 ] = 0x00;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
530 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
531
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
532 send_command (s, 0x33, num_stream_ids, 0xFFFF | stream_ids[0] << 16, (num_stream_ids-1)*6+2 , data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
533
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
534 get_answer (s);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
535
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
536 /* Start sending file from packet xx.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
537 * This command is also used for resume downloads or requesting a lost packet.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
538 * Also used for seeking by sending a play point value which seeks to the media time point.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
539 * Includes ?session' value in pre header and the maximum media stream time.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
540 * 0x07 */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
541
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
542 memset (data, 0, 40);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
543
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
544 for (i=8; i<16; i++)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
545 data[i] = 0xFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
546
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
547 data[20] = 0x04;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
548
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
549 send_command (s, 0x07, 1, 0xFFFF | stream_ids[0] << 16, 24, data);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
550
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
551 stream->fd = s;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
552 stream->streaming_ctrl->streaming_read = asf_mmst_streaming_read;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
553 stream->streaming_ctrl->streaming_seek = asf_mmst_streaming_seek;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
554 stream->streaming_ctrl->buffering = 1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
555 stream->streaming_ctrl->status = streaming_playing_e;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
556
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
557 packet_length1 = packet_length;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
558 printf("mmst packet_length = %d\n",packet_length);
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
559
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
560 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
561 }