annotate libmpdemux/asf_mmst_streaming.c @ 11269:669e67c3d6b3

Red Hat support added by Dominik, README updated.
author diego
date Sun, 26 Oct 2003 13:43:26 +0000
parents db6627275cf7
children 007ec48cf146
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
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
79 len8 = (length + 7) / 8;
6092
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); /* #-)) */
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
85 put_32 (&cmd, len8*8 + 32);
6092
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);
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
98 if (length & 7)
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
99 memset(&cmd.buf[48 + length], 0, 8 - (length & 7));
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
100
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
101 if (send (s, cmd.buf, len8*8+48, 0) != (len8*8+48)) {
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
102 printf ("write error\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
103 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
104 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
105
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
106 static void string_utf16(char *dest, char *src, int len)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
107 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
108 int i;
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
11226
alex
parents: 11225
diff changeset
115 /* trailing zeroes */
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
116 dest[i*2] = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
117 dest[i*2+1] = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
118 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
119
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
120 static void get_answer (int s)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
121 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
122 char data[BUF_SIZE];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
123 int command = 0x1b;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
124
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
125 while (command == 0x1b) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
126 int len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
127
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
128 len = recv (s, data, BUF_SIZE, 0) ;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
129 if (!len) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
130 printf ("\nalert! eof\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
131 return;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
132 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
133
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
134 command = get_32 (data, 36) & 0xFFFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
135
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
136 if (command == 0x1b)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
137 send_command (s, 0x1b, 0, 0, 0, data);
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
141 static int get_data (int s, char *buf, size_t count)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
142 {
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
143 ssize_t len;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
144 size_t total = 0;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
145
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
146 while (total < count) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
147
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
148 len = recv (s, &buf[total], count-total, 0);
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
149
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
150 if (len<0) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
151 perror ("read error:");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
152 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
153 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
154
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
155 total += len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
156
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
157 if (len != 0) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
158 // printf ("[%d/%d]", total, count);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
159 fflush (stdout);
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
164 return 1;
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
168 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
169 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
170 unsigned char pre_header[8];
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
171 int header_len;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
172
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
173 header_len = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
174
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
175 while (1) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
176 if (!get_data (s, pre_header, 8)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
177 printf ("pre-header read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
178 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
179 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
180 if (pre_header[4] == 0x02) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
181
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
182 int packet_len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
183
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
184 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
185
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
186 // printf ("asf header packet detected, len=%d\n", packet_len);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
187
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
188 if (!get_data (s, &header[header_len], packet_len)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
189 printf ("header data read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
190 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
191 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
192
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
193 header_len += packet_len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
194
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
195 if ( (header[header_len-1] == 1) && (header[header_len-2]==1)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
196
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
197
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
198 if( streaming_bufferize( streaming_ctrl, header, header_len )<0 ) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
199 return -1;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
200 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
201
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
202 // printf ("get header packet finished\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
203
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
204 return (header_len);
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
208 } else {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
209
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
210 int32_t packet_len;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
211 int command;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
212 char data[BUF_SIZE];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
213
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
214 if (!get_data (s, (char*)&packet_len, 4)) {
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
215 printf ("packet_len read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
216 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
217 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
218
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
219 packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
220
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
221 // printf ("command packet detected, len=%d\n", packet_len);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
222
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
223 if (!get_data (s, data, packet_len)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
224 printf ("command data read failed\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
225 return 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
226 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
227
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
228 command = get_32 (data, 24) & 0xFFFF;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
229
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
230 // printf ("command: %02x\n", command);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
231
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
232 if (command == 0x1b)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
233 send_command (s, 0x1b, 0, 0, 0, data);
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
237 // printf ("get header packet succ\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
238 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
239 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
240
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
241 static int interp_header (uint8_t *header, int header_len)
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
242 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
243 int i;
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7309
diff changeset
244 int packet_length=-1;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
245
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
246 /*
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
247 * parse header
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
248 */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
249
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
250 i = 30;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
251 while (i<header_len) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
252
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
253 uint64_t guid_1, guid_2, length;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
254
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
255 guid_2 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
256 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
257 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
258 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
259 i += 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
260
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
261 guid_1 = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
262 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
263 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
264 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
265 i += 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
266
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
267 // printf ("guid found: %016llx%016llx\n", guid_1, guid_2);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
268
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
269 length = (uint64_t)header[i] | ((uint64_t)header[i+1]<<8)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
270 | ((uint64_t)header[i+2]<<16) | ((uint64_t)header[i+3]<<24)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
271 | ((uint64_t)header[i+4]<<32) | ((uint64_t)header[i+5]<<40)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
272 | ((uint64_t)header[i+6]<<48) | ((uint64_t)header[i+7]<<56);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
273
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
274 i += 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
275
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
276 if ( (guid_1 == 0x6cce6200aa00d9a6) && (guid_2 == 0x11cf668e75b22630) ) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
277 printf ("header object\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
278 } else if ((guid_1 == 0x6cce6200aa00d9a6) && (guid_2 == 0x11cf668e75b22636)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
279 printf ("data object\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
280 } else if ((guid_1 == 0x6553200cc000e48e) && (guid_2 == 0x11cfa9478cabdca1)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
281
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
282 packet_length = get_32(header, i+92-24);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
283
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
284 printf ("file object, packet length = %d (%d)\n",
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
285 packet_length, get_32(header, i+96-24));
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
286
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
287
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
288 } else if ((guid_1 == 0x6553200cc000e68e) && (guid_2 == 0x11cfa9b7b7dc0791)) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
289
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
290 int stream_id = header[i+48] | header[i+49] << 8;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
291
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
292 printf ("stream object, stream id: %d\n", stream_id);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
293
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
294 stream_ids[num_stream_ids] = stream_id;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
295 num_stream_ids++;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
296
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
297 } else {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
298 printf ("unknown object\n");
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
299 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
300
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
301 // printf ("length : %lld\n", length);
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
302
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
303 i += length-24;
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
307 return packet_length;
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
311
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
312 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
313 unsigned char pre_header[8];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
314 char data[BUF_SIZE];
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
315
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
316 if (!get_data (s, pre_header, 8)) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
317 printf ("pre-header read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
318 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
319 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
320
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
321 // for (i=0; i<8; i++)
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
322 // printf ("pre_header[%d] = %02x (%d)\n",
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
323 // i, pre_header[i], pre_header[i]);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
324
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
325 if (pre_header[4] == 0x04) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
326
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
327 int packet_len;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
328
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
329 packet_len = (pre_header[7] << 8 | pre_header[6]) - 8;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
330
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
331 // printf ("asf media packet detected, len=%d\n", packet_len);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
332
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
333 if (!get_data (s, data, packet_len)) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
334 printf ("media data read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
335 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
336 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
337
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
338 streaming_bufferize(stream_ctrl, data, padding);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
339
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
340 } else {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
341
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
342 int32_t packet_len;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
343 int command;
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
344
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
345 if (!get_data (s, (char*)&packet_len, 4)) {
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
346 printf ("packet_len read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
347 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
348 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
349
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
350 packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
351
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
352 if (!get_data (s, data, packet_len)) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
353 printf ("command data read failed\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
354 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
355 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
356
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
357 if ( (pre_header[7] != 0xb0) || (pre_header[6] != 0x0b)
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
358 || (pre_header[5] != 0xfa) || (pre_header[4] != 0xce) ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
359
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
360 printf ("missing signature\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
361 return -1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
362 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
363
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
364 command = get_32 (data, 24) & 0xFFFF;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
365
7977
0c660f21e0e4 debug printf
arpi
parents: 7953
diff changeset
366 // printf ("\ncommand packet detected, len=%d cmd=0x%X\n", packet_len, command);
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
367
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
368 if (command == 0x1b)
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
369 send_command (s, 0x1b, 0, 0, 0, data);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
370 else if (command == 0x1e) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
371 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
372 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
373 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
374 else if (command == 0x21 ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
375 // Looks like it's new in WMS9
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
376 // Unknown command, but ignoring it seems to work.
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
377 return 0;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
378 }
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
379 else if (command != 0x05) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
380 printf ("unknown command %02x\n", command);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
381 return -1;
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
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
385 // printf ("get media packet succ\n");
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
386
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
387 return 1;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
388 }
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
389
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
390
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
391 static int packet_length1;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
392
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
393 int
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
394 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
395 {
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
396 int len;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
397
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
398 while( stream_ctrl->buffer_size==0 ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
399 // buffer is empty - fill it!
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
400 int ret = get_media_packet( fd, packet_length1, stream_ctrl);
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
401 if( ret<0 ) {
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
402 printf("get_media_packet error : %s\n",strerror(errno));
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
403 return -1;
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
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
407 len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos;
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
408 if(len>size) len=size;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
409 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len );
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
410 stream_ctrl->buffer_pos += len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
411 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
412 free( stream_ctrl->buffer );
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
413 stream_ctrl->buffer = NULL;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
414 stream_ctrl->buffer_size = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
415 stream_ctrl->buffer_pos = 0;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
416 }
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
417 return len;
6092
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
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
421 int
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
422 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
423 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
424 return -1;
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
425 // Shut up gcc warning
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
426 fd++;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
427 pos++;
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
428 streaming_ctrl=NULL;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
429 }
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
430
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
431 int asf_mmst_streaming_start(stream_t *stream)
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
432 {
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
433 char str[1024];
10183
2ffb9a8b0428 10l found by yepyep
alex
parents: 7977
diff changeset
434 char data[BUF_SIZE];
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
435 uint8_t asf_header[8192];
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
436 int asf_header_len;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
437 int len, i, packet_length;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
438 char *path;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
439 URL_t *url1 = stream->streaming_ctrl->url;
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7880
diff changeset
440 int s = stream->fd;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
441
7250
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
442 if( s>0 ) {
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10206
diff changeset
443 closesocket( stream->fd );
7250
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
444 stream->fd = -1;
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
445 }
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
446
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
447 /* parse url */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
448 path = strchr(url1->file,'/') + 1;
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
449
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
450 url1->port=1755;
10625
620cc649f519 ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents: 10281
diff changeset
451 s = connect2Server( url1->hostname, url1->port, 1);
7250
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
452 if( s<0 ) {
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
453 return s;
27a1315d6af4 Checked if the connection succeeded before writing in the socket.
bertrand
parents: 6092
diff changeset
454 }
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
455 printf ("connected\n");
7880
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
456
5bb4d8801a2c - fixed several 10l bugs
arpi
parents: 7472
diff changeset
457 seq_num=0;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
458
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
459 /*
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
460 * 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
461 * 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
462 * cmd 1 0x01
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
463 * */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
464
10183
2ffb9a8b0428 10l found by yepyep
alex
parents: 7977
diff changeset
465 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
466 string_utf16 (data, str, strlen(str));
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
467 // send_command(s, commandno ....)
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
468 send_command (s, 1, 0, 0x0004000b, strlen(str)*2+2, data);
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
469
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
470 len = recv (s, data, BUF_SIZE, 0) ;
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
471
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
472 /*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
473 * Also, the TCP or UDP transport selection is sent.
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
474 *
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
475 * here 192.168.0.1 is local ip address TCP/UDP states the tronsport we r using
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
476 * and 1037 is the local TCP or UDP socket number
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
477 * cmd 2 0x02
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
478 * */
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
479
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
480 string_utf16 (&data[8], "\002\000\\\\192.168.0.1\\TCP\\1037", 24);
6092
1529f01e8108 Added support for asf mmst protocol.
bertrand
parents:
diff changeset
481 memset (data, 0, 8);
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
482 send_command (s, 2, 0, 0, 24*2+10, data);
6092
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);
11225
48bb1fd37d2a Fixing tons of 10ls. Patch by rgselk <rgselknospam@yahoo.com>
alex
parents: 10625
diff changeset
491 send_command (s, 5, 0, 0, strlen(path)*2+10, data);
6092
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 }