Mercurial > mplayer.hg
annotate stream/asf_streaming.c @ 25194:e816d546c4fe
ao_null: Make duration of "buffered" audio constant
Choose the "buffer size" for the amount of audio the driver accepts so
that it corresponds to about 0.2 seconds of playback based on the
number of channels, sample size and samplerate.
author | uau |
---|---|
date | Sat, 01 Dec 2007 01:39:39 +0000 |
parents | d261f5109660 |
children | c1d17bd6683c |
rev | line source |
---|---|
871 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
833 | 3 #include <string.h> |
1430 | 4 #include <unistd.h> |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3475
diff
changeset
|
5 #include <errno.h> |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
6 #include <limits.h> |
833 | 7 |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2489
diff
changeset
|
8 #include "config.h" |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
9 #include "mp_msg.h" |
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
10 #include "help_mp.h" |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2489
diff
changeset
|
11 |
10281 | 12 #ifndef HAVE_WINSOCK2 |
13 #define closesocket close | |
14 #else | |
15 #include <winsock2.h> | |
16 #endif | |
17 | |
871 | 18 #include "url.h" |
19 #include "http.h" | |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19271
diff
changeset
|
20 #include "libmpdemux/asf.h" |
871 | 21 |
1001 | 22 #include "stream.h" |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19271
diff
changeset
|
23 #include "libmpdemux/demuxer.h" |
833 | 24 |
4315 | 25 #include "network.h" |
19335
2a9d669e5ff6
isolated tcp socket code from network.c to a dedicated file
ben
parents:
19312
diff
changeset
|
26 #include "tcp.h" |
4315 | 27 |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
28 #ifdef ARCH_X86 |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
29 #define ASF_LOAD_GUID_PREFIX(guid) (*(uint32_t *)(guid)) |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
30 #else |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
31 #define ASF_LOAD_GUID_PREFIX(guid) \ |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
32 ((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0]) |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
33 #endif |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
34 |
15585 | 35 extern int network_bandwidth; |
7953 | 36 |
37 int asf_mmst_streaming_start( stream_t *stream ); | |
15585 | 38 static int asf_http_streaming_start(stream_t *stream, int *demuxer_type); |
7953 | 39 |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
40 // We can try several protocol for asf streaming |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
41 // * first the UDP protcol, if there is a firewall, UDP |
15585 | 42 // packets will not come back, so the mmsu will fail. |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
43 // * Then we can try TCP, but if there is a proxy for |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
44 // internet connection, the TCP connection will not get |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
45 // through |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
46 // * Then we can try HTTP. |
6094
0f4dbbe57c08
Enable mmst support. MMST will be tried if the HTTP support failed.
bertrand
parents:
5915
diff
changeset
|
47 // |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
48 // Note: Using WMP sequence MMSU then MMST and then HTTP. |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
49 |
15585 | 50 static int asf_streaming_start( stream_t *stream, int *demuxer_type) { |
12879
542d1d2200c1
reduced code complexity, and also made consistent with other parts
alex
parents:
12878
diff
changeset
|
51 char *proto = stream->streaming_ctrl->url->protocol; |
542d1d2200c1
reduced code complexity, and also made consistent with other parts
alex
parents:
12878
diff
changeset
|
52 int fd = -1; |
14525 | 53 int port = stream->streaming_ctrl->url->port; |
6643 | 54 |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
55 // Is protocol mms or mmsu? |
16112
0aeb954fc11c
strncasecmp is not necessary and e.g. strncasecmp(prot, "mms", 3) will
reimar
parents:
15626
diff
changeset
|
56 if (!strcasecmp(proto, "mmsu") || !strcasecmp(proto, "mms")) |
12879
542d1d2200c1
reduced code complexity, and also made consistent with other parts
alex
parents:
12878
diff
changeset
|
57 { |
5915 | 58 mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/UDP...\n"); |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
59 //fd = asf_mmsu_streaming_start( stream ); |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
60 if( fd>-1 ) return fd; //mmsu support is not implemented yet - using this code |
5915 | 61 mp_msg(MSGT_NETWORK,MSGL_V," ===> ASF/UDP failed\n"); |
7252
0a0527c82560
- If fatal error while trying to connect to a WM server, skip other proto.
bertrand
parents:
6677
diff
changeset
|
62 if( fd==-2 ) return -1; |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
63 } |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
64 |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
65 //Is protocol mms or mmst? |
16112
0aeb954fc11c
strncasecmp is not necessary and e.g. strncasecmp(prot, "mms", 3) will
reimar
parents:
15626
diff
changeset
|
66 if (!strcasecmp(proto, "mmst") || !strcasecmp(proto, "mms")) |
12879
542d1d2200c1
reduced code complexity, and also made consistent with other parts
alex
parents:
12878
diff
changeset
|
67 { |
5915 | 68 mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/TCP...\n"); |
6094
0f4dbbe57c08
Enable mmst support. MMST will be tried if the HTTP support failed.
bertrand
parents:
5915
diff
changeset
|
69 fd = asf_mmst_streaming_start( stream ); |
14525 | 70 stream->streaming_ctrl->url->port = port; |
8823 | 71 if( fd>-1 ) return fd; |
5915 | 72 mp_msg(MSGT_NETWORK,MSGL_V," ===> ASF/TCP failed\n"); |
7252
0a0527c82560
- If fatal error while trying to connect to a WM server, skip other proto.
bertrand
parents:
6677
diff
changeset
|
73 if( fd==-2 ) return -1; |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
74 } |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
75 |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
76 //Is protocol http, http_proxy, or mms? |
16112
0aeb954fc11c
strncasecmp is not necessary and e.g. strncasecmp(prot, "mms", 3) will
reimar
parents:
15626
diff
changeset
|
77 if (!strcasecmp(proto, "http_proxy") || !strcasecmp(proto, "http") || |
0aeb954fc11c
strncasecmp is not necessary and e.g. strncasecmp(prot, "mms", 3) will
reimar
parents:
15626
diff
changeset
|
78 !strcasecmp(proto, "mms") || !strcasecmp(proto, "mmshttp")) |
12879
542d1d2200c1
reduced code complexity, and also made consistent with other parts
alex
parents:
12878
diff
changeset
|
79 { |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
80 mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/HTTP...\n"); |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
81 fd = asf_http_streaming_start( stream, demuxer_type ); |
14525 | 82 stream->streaming_ctrl->url->port = port; |
12535
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
83 if( fd>-1 ) return fd; |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
84 mp_msg(MSGT_NETWORK,MSGL_V," ===> ASF/HTTP failed\n"); |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
85 if( fd==-2 ) return -1; |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
86 } |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
87 |
48ae29c2298c
Use same order as WMP for mms protocols (MMSU, MMST, HTTP)
rtognimp
parents:
12396
diff
changeset
|
88 //everything failed |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
89 return -1; |
3042 | 90 } |
91 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
92 static int asf_streaming(ASF_stream_chunck_t *stream_chunck, int *drop_packet ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
93 /* |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
94 printf("ASF stream chunck size=%d\n", stream_chunck->size); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
95 printf("length: %d\n", length ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
96 printf("0x%02X\n", stream_chunck->type ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
97 */ |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
98 if( drop_packet!=NULL ) *drop_packet = 0; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
99 |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
100 if( stream_chunck->size<8 ) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
101 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_StreamChunkSize2Small, stream_chunck->size); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
102 return -1; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
103 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
104 if( stream_chunck->size!=stream_chunck->size_confirm ) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
105 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_SizeConfirmMismatch, stream_chunck->size, stream_chunck->size_confirm); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
106 return -1; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
107 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
108 /* |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
109 printf(" type: 0x%02X\n", stream_chunck->type ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
110 printf(" size: %d (0x%02X)\n", stream_chunck->size, stream_chunck->size ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
111 printf(" sequence_number: 0x%04X\n", stream_chunck->sequence_number ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
112 printf(" unknown: 0x%02X\n", stream_chunck->unknown ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
113 printf(" size_confirm: 0x%02X\n", stream_chunck->size_confirm ); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
114 */ |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
115 switch(stream_chunck->type) { |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
116 case ASF_STREAMING_CLEAR: // $C Clear ASF configuration |
5915 | 117 mp_msg(MSGT_NETWORK,MSGL_V,"=====> Clearing ASF stream configuration!\n"); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
118 if( drop_packet!=NULL ) *drop_packet = 1; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
119 return stream_chunck->size; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
120 break; |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
121 case ASF_STREAMING_DATA: // $D Data follows |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
122 // printf("=====> Data follows\n"); |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
123 break; |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
124 case ASF_STREAMING_END_TRANS: // $E Transfer complete |
5915 | 125 mp_msg(MSGT_NETWORK,MSGL_V,"=====> Transfer complete\n"); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
126 if( drop_packet!=NULL ) *drop_packet = 1; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
127 return stream_chunck->size; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
128 break; |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
129 case ASF_STREAMING_HEADER: // $H ASF header chunk follows |
5915 | 130 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF header chunk follows\n"); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
131 break; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
132 default: |
5915 | 133 mp_msg(MSGT_NETWORK,MSGL_V,"=====> Unknown stream type 0x%x\n", stream_chunck->type ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
134 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
135 return stream_chunck->size+4; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
136 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
137 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
138 extern int find_asf_guid(char *buf, const char *guid, int cur_pos, int buf_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
139 extern const char asf_file_header_guid[]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
140 extern const char asf_stream_header_guid[]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
141 extern const char asf_stream_group_guid[]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
142 extern int audio_id; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
143 extern int video_id; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
144 |
15585 | 145 static void close_s(stream_t *stream) { |
146 close(stream->fd); | |
147 stream->fd=-1; | |
148 } | |
149 | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
150 static int max_idx(int s_count, int *s_rates, int bound) { |
14639 | 151 int i, best = -1, rate = -1; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
152 for (i = 0; i < s_count; i++) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
153 if (s_rates[i] > rate && s_rates[i] <= bound) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
154 rate = s_rates[i]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
155 best = i; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
156 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
157 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
158 return best; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
159 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
160 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
161 static int asf_streaming_parse_header(int fd, streaming_ctrl_t* streaming_ctrl) { |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
162 ASF_header_t asfh; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
163 ASF_stream_chunck_t chunk; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
164 asf_http_streaming_ctrl_t* asf_ctrl = (asf_http_streaming_ctrl_t*) streaming_ctrl->data; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
165 char* buffer=NULL, *chunk_buffer=NULL; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
166 int i,r,size,pos = 0; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
167 int start; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
168 int buffer_size = 0; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
169 int chunk_size2read = 0; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
170 int bw = streaming_ctrl->bandwidth; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
171 int *v_rates = NULL, *a_rates = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
172 int v_rate = 0, a_rate = 0, a_idx = -1, v_idx = -1; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
173 |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
174 if(asf_ctrl == NULL) return -1; |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
175 |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
176 // The ASF header can be in several network chunks. For example if the content description |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
177 // is big, the ASF header will be split in 2 network chunk. |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
178 // So we need to retrieve all the chunk before starting to parse the header. |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
179 do { |
7953 | 180 for( r=0; r < (int)sizeof(ASF_stream_chunck_t) ; ) { |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
181 i = nop_streaming_read(fd,((char*)&chunk)+r,sizeof(ASF_stream_chunck_t) - r,streaming_ctrl); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
182 if(i <= 0) return -1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
183 r += i; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
184 } |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
185 // Endian handling of the stream chunk |
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
186 le2me_ASF_stream_chunck_t(&chunk); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
187 size = asf_streaming( &chunk, &r) - sizeof(ASF_stream_chunck_t); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
188 if(r) mp_msg(MSGT_NETWORK,MSGL_WARN,MSGTR_MPDEMUX_ASF_WarnDropHeader); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
189 if(size < 0){ |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
190 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrorParsingChunkHeader); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
191 return -1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
192 } |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
193 if (chunk.type != ASF_STREAMING_HEADER) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
194 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_NoHeaderAtFirstChunk); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
195 return -1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
196 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
197 |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
17932
diff
changeset
|
198 // audit: do not overflow buffer_size |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
17932
diff
changeset
|
199 if (size > SIZE_MAX - buffer_size) return -1; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
200 buffer = (char*) malloc(size+buffer_size); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
201 if(buffer == NULL) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
202 mp_msg(MSGT_NETWORK,MSGL_FATAL,MSGTR_MPDEMUX_ASF_BufferMallocFailed,size+buffer_size); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
203 return -1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
204 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
205 if( chunk_buffer!=NULL ) { |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
206 memcpy( buffer, chunk_buffer, buffer_size ); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
207 free( chunk_buffer ); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
208 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
209 chunk_buffer = buffer; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
210 buffer += buffer_size; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
211 buffer_size += size; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
212 |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
213 for(r = 0; r < size;) { |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
214 i = nop_streaming_read(fd,buffer+r,size-r,streaming_ctrl); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
215 if(i < 0) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
216 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrReadingNetworkStream); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
217 return -1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
218 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
219 r += i; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
220 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
221 |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
222 if( chunk_size2read==0 ) { |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
223 if(size < (int)sizeof(asfh)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
224 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrChunk2Small); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
225 return -1; |
5915 | 226 } else mp_msg(MSGT_NETWORK,MSGL_DBG2,"Got chunk\n"); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
227 memcpy(&asfh,buffer,sizeof(asfh)); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
228 le2me_ASF_header_t(&asfh); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
229 chunk_size2read = asfh.objh.size; |
5915 | 230 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Size 2 read=%d\n", chunk_size2read); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
231 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
232 } while( buffer_size<chunk_size2read); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
233 buffer = chunk_buffer; |
3551 | 234 size = buffer_size; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
235 |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
236 if(asfh.cno > 256) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
237 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrSubChunkNumberInvalid); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
238 return -1; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
239 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
240 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
241 start = sizeof(asfh); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
242 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
243 pos = find_asf_guid(buffer, asf_file_header_guid, start, size); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
244 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
245 ASF_file_header_t *fileh = (ASF_file_header_t *) &buffer[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
246 pos += sizeof(ASF_file_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
247 if (pos > size) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
248 le2me_ASF_file_header_t(fileh); |
4288
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
4145
diff
changeset
|
249 /* |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
250 if(fileh.packetsize != fileh.packetsize2) { |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
251 printf("Error packetsize check don't match\n"); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
252 return -1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
253 } |
4288
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
4145
diff
changeset
|
254 */ |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
255 asf_ctrl->packet_size = fileh->max_packet_size; |
4288
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
4145
diff
changeset
|
256 // before playing. |
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
4145
diff
changeset
|
257 // preroll: time in ms to bufferize before playing |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
258 streaming_ctrl->prebuffer_size = (unsigned int)(((double)fileh->preroll/1000.0)*((double)fileh->max_bitrate/8.0)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
259 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
260 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
261 pos = start; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
262 while ((pos = find_asf_guid(buffer, asf_stream_header_guid, pos, size)) >= 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
263 { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
264 ASF_stream_header_t *streamh = (ASF_stream_header_t *)&buffer[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
265 pos += sizeof(ASF_stream_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
266 if (pos > size) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
267 le2me_ASF_stream_header_t(streamh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
268 switch(ASF_LOAD_GUID_PREFIX(streamh->type)) { |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
269 case 0xF8699E40 : // audio stream |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
270 if(asf_ctrl->audio_streams == NULL){ |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18558
diff
changeset
|
271 asf_ctrl->audio_streams = malloc(sizeof(int)); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
272 asf_ctrl->n_audio = 1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
273 } else { |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
274 asf_ctrl->n_audio++; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
275 asf_ctrl->audio_streams = (int*)realloc(asf_ctrl->audio_streams, |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
276 asf_ctrl->n_audio*sizeof(int)); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
277 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
278 asf_ctrl->audio_streams[asf_ctrl->n_audio-1] = streamh->stream_no; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
279 break; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
280 case 0xBC19EFC0 : // video stream |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
281 if(asf_ctrl->video_streams == NULL){ |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18558
diff
changeset
|
282 asf_ctrl->video_streams = malloc(sizeof(int)); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
283 asf_ctrl->n_video = 1; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
284 } else { |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
285 asf_ctrl->n_video++; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
286 asf_ctrl->video_streams = (int*)realloc(asf_ctrl->video_streams, |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
287 asf_ctrl->n_video*sizeof(int)); |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
288 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
289 asf_ctrl->video_streams[asf_ctrl->n_video-1] = streamh->stream_no; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
290 break; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
291 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
292 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
293 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
294 // always allocate to avoid lots of ifs later |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
295 v_rates = calloc(asf_ctrl->n_video, sizeof(int)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
296 a_rates = calloc(asf_ctrl->n_audio, sizeof(int)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
297 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
298 pos = find_asf_guid(buffer, asf_stream_group_guid, start, size); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
299 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
300 // stream bitrate properties object |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
301 int stream_count; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
302 char *ptr = &buffer[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
303 |
14262 | 304 mp_msg(MSGT_NETWORK, MSGL_V, "Stream bitrate properties object\n"); |
6643 | 305 stream_count = le2me_16(*(uint16_t*)ptr); |
306 ptr += sizeof(uint16_t); | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
307 if (ptr > &buffer[size]) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
308 mp_msg(MSGT_NETWORK, MSGL_V, " stream count=[0x%x][%u]\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
309 stream_count, stream_count ); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
310 for( i=0 ; i<stream_count ; i++ ) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
311 uint32_t rate; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
312 int id; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
313 int j; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
314 id = le2me_16(*(uint16_t*)ptr); |
6643 | 315 ptr += sizeof(uint16_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
316 if (ptr > &buffer[size]) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
317 memcpy(&rate, ptr, sizeof(uint32_t));// workaround unaligment bug on sparc |
6643 | 318 ptr += sizeof(uint32_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
319 if (ptr > &buffer[size]) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
320 rate = le2me_32(rate); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
321 mp_msg(MSGT_NETWORK, MSGL_V, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
322 " stream id=[0x%x][%u]\n", id, id); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
323 mp_msg(MSGT_NETWORK, MSGL_V, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
324 " max bitrate=[0x%x][%u]\n", rate, rate); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
325 for (j = 0; j < asf_ctrl->n_video; j++) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
326 if (id == asf_ctrl->video_streams[j]) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
327 mp_msg(MSGT_NETWORK, MSGL_V, " is video stream\n"); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
328 v_rates[j] = rate; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
329 break; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
330 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
331 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
332 for (j = 0; j < asf_ctrl->n_audio; j++) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
333 if (id == asf_ctrl->audio_streams[j]) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
334 mp_msg(MSGT_NETWORK, MSGL_V, " is audio stream\n"); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
335 a_rates[j] = rate; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
336 break; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
337 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
338 } |
6643 | 339 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
340 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
341 free(buffer); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
342 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
343 // automatic stream selection based on bandwidth |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
344 if (bw == 0) bw = INT_MAX; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
345 mp_msg(MSGT_NETWORK, MSGL_V, "Max bandwidth set to %d\n", bw); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
346 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
347 if (asf_ctrl->n_audio) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
348 // find lowest-bitrate audio stream |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
349 a_rate = a_rates[0]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
350 a_idx = 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
351 for (i = 0; i < asf_ctrl->n_audio; i++) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
352 if (a_rates[i] < a_rate) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
353 a_rate = a_rates[i]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
354 a_idx = i; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
355 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
356 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
357 if (max_idx(asf_ctrl->n_video, v_rates, bw - a_rate) < 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
358 // both audio and video are not possible, try video only next |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
359 a_idx = -1; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
360 a_rate = 0; |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
361 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
362 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
363 // find best video stream |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
364 v_idx = max_idx(asf_ctrl->n_video, v_rates, bw - a_rate); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
365 if (v_idx >= 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
366 v_rate = v_rates[v_idx]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
367 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
368 // find best audio stream |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
369 a_idx = max_idx(asf_ctrl->n_audio, a_rates, bw - v_rate); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
370 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
371 free(v_rates); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
372 free(a_rates); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
373 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
374 if (a_idx < 0 && v_idx < 0) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
375 mp_msg(MSGT_NETWORK, MSGL_FATAL, MSGTR_MPDEMUX_ASF_Bandwidth2SmallCannotPlay); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
376 return -1; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
377 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
378 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
379 if (audio_id > 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
380 // a audio stream was forced |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
381 asf_ctrl->audio_id = audio_id; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
382 else if (a_idx >= 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
383 asf_ctrl->audio_id = asf_ctrl->audio_streams[a_idx]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
384 else if (asf_ctrl->n_audio) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
385 mp_msg(MSGT_NETWORK, MSGL_WARN, MSGTR_MPDEMUX_ASF_Bandwidth2SmallDeselectedAudio); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
386 audio_id = -2; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
387 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
388 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
389 if (video_id > 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
390 // a video stream was forced |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
391 asf_ctrl->video_id = video_id; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
392 else if (v_idx >= 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
393 asf_ctrl->video_id = asf_ctrl->video_streams[v_idx]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
394 else if (asf_ctrl->n_video) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
395 mp_msg(MSGT_NETWORK, MSGL_WARN, MSGTR_MPDEMUX_ASF_Bandwidth2SmallDeselectedVideo); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
396 video_id = -2; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
397 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
398 |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
399 return 1; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
400 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
401 len_err_out: |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
402 mp_msg(MSGT_NETWORK, MSGL_FATAL, MSGTR_MPDEMUX_ASF_InvalidLenInHeader); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
403 if (buffer) free(buffer); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
404 if (v_rates) free(v_rates); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
405 if (a_rates) free(a_rates); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
406 return -1; |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
407 } |
3042 | 408 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
409 static int asf_http_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *streaming_ctrl ) { |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
410 static ASF_stream_chunck_t chunk; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
411 int read,chunk_size = 0; |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7310
diff
changeset
|
412 static int rest = 0, drop_chunk = 0, waiting = 0; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
413 asf_http_streaming_ctrl_t *asf_http_ctrl = (asf_http_streaming_ctrl_t*)streaming_ctrl->data; |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
414 |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
415 while(1) { |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
416 if (rest == 0 && waiting == 0) { |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
417 read = 0; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
418 while(read < (int)sizeof(ASF_stream_chunck_t)){ |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
419 int r = nop_streaming_read( fd, ((char*)&chunk) + read, |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
420 sizeof(ASF_stream_chunck_t)-read, |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
421 streaming_ctrl ); |
4041
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3727
diff
changeset
|
422 if(r <= 0){ |
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3727
diff
changeset
|
423 if( r < 0) |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
424 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrReadingChunkHeader); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
425 return -1; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
426 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
427 read += r; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
428 } |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
429 |
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
430 // Endian handling of the stream chunk |
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
431 le2me_ASF_stream_chunck_t(&chunk); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
432 chunk_size = asf_streaming( &chunk, &drop_chunk ); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
433 if(chunk_size < 0) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
434 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrorParsingChunkHeader); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
435 return -1; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
436 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
437 chunk_size -= sizeof(ASF_stream_chunck_t); |
3042 | 438 |
5617
75a43bb3ed80
Added big endian handling for the ASF_chunk_t struct.
bertrand
parents:
4334
diff
changeset
|
439 if(chunk.type != ASF_STREAMING_HEADER && (!drop_chunk)) { |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
440 if (asf_http_ctrl->packet_size < chunk_size) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
441 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrChunkBiggerThanPacket); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
442 return -1; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
443 } |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
444 waiting = asf_http_ctrl->packet_size; |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
445 } else { |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
446 waiting = chunk_size; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
447 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
448 |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
449 } else if (rest){ |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
450 chunk_size = rest; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
451 rest = 0; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
452 } |
3042 | 453 |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
454 read = 0; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
455 if ( waiting >= chunk_size) { |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
456 if (chunk_size > size){ |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
457 rest = chunk_size - size; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
458 chunk_size = size; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
459 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
460 while(read < chunk_size) { |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
461 int got = nop_streaming_read( fd,buffer+read,chunk_size-read,streaming_ctrl ); |
4041
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3727
diff
changeset
|
462 if(got <= 0) { |
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3727
diff
changeset
|
463 if(got < 0) |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
464 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ErrReadingChunk); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
465 return -1; |
1001 | 466 } |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
467 read += got; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
468 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
469 waiting -= read; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
470 if (drop_chunk) continue; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
471 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
472 if (rest == 0 && waiting > 0 && size-read > 0) { |
22378 | 473 int s = FFMIN(waiting,size-read); |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
474 memset(buffer+read,0,s); |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
475 waiting -= s; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
476 read += s; |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
477 } |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
478 break; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
479 } |
3475
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
480 |
390388c75209
Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents:
3454
diff
changeset
|
481 return read; |
2489
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
482 } |
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
483 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
484 static int asf_http_streaming_seek( int fd, off_t pos, streaming_ctrl_t *streaming_ctrl ) { |
3042 | 485 return -1; |
7953 | 486 // to shut up gcc warning |
487 fd++; | |
488 pos++; | |
489 streaming_ctrl=NULL; | |
3042 | 490 } |
491 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
492 static int asf_header_check( HTTP_header_t *http_hdr ) { |
4312
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
493 ASF_obj_header_t *objh; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
494 if( http_hdr==NULL ) return -1; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
495 if( http_hdr->body==NULL || http_hdr->body_size<sizeof(ASF_obj_header_t) ) return -1; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
496 |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
497 objh = (ASF_obj_header_t*)http_hdr->body; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
498 if( ASF_LOAD_GUID_PREFIX(objh->guid)==0x75B22630 ) return 0; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
499 return -1; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
500 } |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
501 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
502 static int asf_http_streaming_type(char *content_type, char *features, HTTP_header_t *http_hdr ) { |
905 | 503 if( content_type==NULL ) return ASF_Unknown_e; |
7252
0a0527c82560
- If fatal error while trying to connect to a WM server, skip other proto.
bertrand
parents:
6677
diff
changeset
|
504 if( !strcasecmp(content_type, "application/octet-stream") || |
0a0527c82560
- If fatal error while trying to connect to a WM server, skip other proto.
bertrand
parents:
6677
diff
changeset
|
505 !strcasecmp(content_type, "application/vnd.ms.wms-hdr.asfv1") || // New in Corona, first request |
11349
786407b1bc78
Accept video/x-ms-asf as the MIME type for ASF as well. Patch by Dominique Andre Gunia <Dominique.Gunia@schunter.etc.tu-bs.de>.
mosu
parents:
10939
diff
changeset
|
506 !strcasecmp(content_type, "application/x-mms-framed") || // New in Corana, second request |
786407b1bc78
Accept video/x-ms-asf as the MIME type for ASF as well. Patch by Dominique Andre Gunia <Dominique.Gunia@schunter.etc.tu-bs.de>.
mosu
parents:
10939
diff
changeset
|
507 !strcasecmp(content_type, "video/x-ms-asf")) { |
7252
0a0527c82560
- If fatal error while trying to connect to a WM server, skip other proto.
bertrand
parents:
6677
diff
changeset
|
508 |
8718
d630a6f4c7c0
- Now mmst will use the MMS/TCP implementation first, instead of trying
bertrand
parents:
7953
diff
changeset
|
509 if( strstr(features, "broadcast") ) { |
5915 | 510 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF Live stream\n"); |
905 | 511 return ASF_Live_e; |
833 | 512 } else { |
5915 | 513 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF Prerecorded\n"); |
905 | 514 return ASF_Prerecorded_e; |
833 | 515 } |
516 } else { | |
4312
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
517 // Ok in a perfect world, web servers should be well configured |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
518 // so we could used mime type to know the stream type, |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
519 // but guess what? All of them are not well configured. |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
520 // So we have to check for an asf header :(, but it works :p |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
521 if( http_hdr->body_size>sizeof(ASF_obj_header_t) ) { |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
522 if( asf_header_check( http_hdr )==0 ) { |
5915 | 523 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF Plain text\n"); |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
524 return ASF_PlainText_e; |
8718
d630a6f4c7c0
- Now mmst will use the MMS/TCP implementation first, instead of trying
bertrand
parents:
7953
diff
changeset
|
525 } else if( (!strcasecmp(content_type, "text/html")) ) { |
12654 | 526 mp_msg(MSGT_NETWORK,MSGL_V,"=====> HTML, MPlayer is not a browser...yet!\n"); |
8718
d630a6f4c7c0
- Now mmst will use the MMS/TCP implementation first, instead of trying
bertrand
parents:
7953
diff
changeset
|
527 return ASF_Unknown_e; |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
528 } else { |
5915 | 529 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF Redirector\n"); |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
530 return ASF_Redirector_e; |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
531 } |
4312
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
532 } else { |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
533 if( (!strcasecmp(content_type, "audio/x-ms-wax")) || |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
534 (!strcasecmp(content_type, "audio/x-ms-wma")) || |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
535 (!strcasecmp(content_type, "video/x-ms-asf")) || |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
536 (!strcasecmp(content_type, "video/x-ms-afs")) || |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
537 (!strcasecmp(content_type, "video/x-ms-wmv")) || |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
538 (!strcasecmp(content_type, "video/x-ms-wma")) ) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
539 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ASFRedirector); |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
540 return ASF_Redirector_e; |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
541 } else if( !strcasecmp(content_type, "text/plain") ) { |
5915 | 542 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF Plain text\n"); |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
543 return ASF_PlainText_e; |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
544 } else { |
5915 | 545 mp_msg(MSGT_NETWORK,MSGL_V,"=====> ASF unknown content-type: %s\n", content_type ); |
4334
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
546 return ASF_Unknown_e; |
3fb147d59ca6
Readded the content-type checking, in case of the no HTTP body are
bertrand
parents:
4315
diff
changeset
|
547 } |
4312
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
548 } |
833 | 549 } |
905 | 550 return ASF_Unknown_e; |
833 | 551 } |
871 | 552 |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
553 static HTTP_header_t *asf_http_request(streaming_ctrl_t *streaming_ctrl) { |
871 | 554 HTTP_header_t *http_hdr; |
4121 | 555 URL_t *url = NULL; |
556 URL_t *server_url = NULL; | |
557 asf_http_streaming_ctrl_t *asf_http_ctrl; | |
871 | 558 char str[250]; |
1001 | 559 char *ptr; |
6643 | 560 int i, enable; |
871 | 561 |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
562 int offset_hi=0, offset_lo=0, length=0; |
6643 | 563 int asf_nb_stream=0, stream_id; |
871 | 564 |
4121 | 565 // Sanity check |
566 if( streaming_ctrl==NULL ) return NULL; | |
567 url = streaming_ctrl->url; | |
568 asf_http_ctrl = (asf_http_streaming_ctrl_t*)streaming_ctrl->data; | |
569 if( url==NULL || asf_http_ctrl==NULL ) return NULL; | |
570 | |
871 | 571 // Common header for all requests. |
572 http_hdr = http_new_header(); | |
573 http_set_field( http_hdr, "Accept: */*" ); | |
574 http_set_field( http_hdr, "User-Agent: NSPlayer/4.1.0.3856" ); | |
6670 | 575 http_add_basic_authentication( http_hdr, url->username, url->password ); |
4121 | 576 |
577 // Check if we are using a proxy | |
4145 | 578 if( !strcasecmp( url->protocol, "http_proxy" ) ) { |
4121 | 579 server_url = url_new( (url->file)+1 ); |
580 if( server_url==NULL ) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
581 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_InvalidProxyURL); |
4121 | 582 http_free( http_hdr ); |
583 return NULL; | |
584 } | |
585 http_set_uri( http_hdr, server_url->url ); | |
10939
55c9903bd51c
simple fix for buffer overflow (remotely exploitable). feel free to
rfelker
parents:
10625
diff
changeset
|
586 sprintf( str, "Host: %.220s:%d", server_url->hostname, server_url->port ); |
4121 | 587 url_free( server_url ); |
588 } else { | |
589 http_set_uri( http_hdr, url->file ); | |
10939
55c9903bd51c
simple fix for buffer overflow (remotely exploitable). feel free to
rfelker
parents:
10625
diff
changeset
|
590 sprintf( str, "Host: %.220s:%d", url->hostname, url->port ); |
4121 | 591 } |
592 | |
871 | 593 http_set_field( http_hdr, str ); |
594 http_set_field( http_hdr, "Pragma: xClientGUID={c77e7400-738a-11d2-9add-0020af0a3278}" ); | |
595 sprintf(str, | |
596 "Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=%u:%u,request-context=%d,max-duration=%u", | |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
597 offset_hi, offset_lo, asf_http_ctrl->request, length ); |
871 | 598 http_set_field( http_hdr, str ); |
599 | |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
600 switch( asf_http_ctrl->streaming_type ) { |
871 | 601 case ASF_Live_e: |
602 case ASF_Prerecorded_e: | |
603 http_set_field( http_hdr, "Pragma: xPlayStrm=1" ); | |
1001 | 604 ptr = str; |
605 ptr += sprintf( ptr, "Pragma: stream-switch-entry="); | |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
606 if(asf_http_ctrl->n_audio > 0) { |
6643 | 607 for( i=0; i<asf_http_ctrl->n_audio ; i++ ) { |
608 stream_id = asf_http_ctrl->audio_streams[i]; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
609 if(stream_id == asf_http_ctrl->audio_id) { |
6643 | 610 enable = 0; |
611 } else { | |
612 enable = 2; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
613 continue; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
614 } |
6643 | 615 asf_nb_stream++; |
616 ptr += sprintf(ptr, "ffff:%d:%d ", stream_id, enable); | |
1001 | 617 } |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
618 } |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
619 if(asf_http_ctrl->n_video > 0) { |
6643 | 620 for( i=0; i<asf_http_ctrl->n_video ; i++ ) { |
621 stream_id = asf_http_ctrl->video_streams[i]; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
622 if(stream_id == asf_http_ctrl->video_id) { |
6643 | 623 enable = 0; |
624 } else { | |
625 enable = 2; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12879
diff
changeset
|
626 continue; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
627 } |
6643 | 628 asf_nb_stream++; |
629 ptr += sprintf(ptr, "ffff:%d:%d ", stream_id, enable); | |
1001 | 630 } |
631 } | |
632 http_set_field( http_hdr, str ); | |
871 | 633 sprintf( str, "Pragma: stream-switch-count=%d", asf_nb_stream ); |
634 http_set_field( http_hdr, str ); | |
635 break; | |
636 case ASF_Redirector_e: | |
637 break; | |
638 case ASF_Unknown_e: | |
639 // First request goes here. | |
640 break; | |
641 default: | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
642 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_UnknownASFStreamType); |
871 | 643 } |
644 | |
645 http_set_field( http_hdr, "Connection: Close" ); | |
905 | 646 http_build_request( http_hdr ); |
871 | 647 |
905 | 648 return http_hdr; |
871 | 649 } |
650 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
651 static int asf_http_parse_response(asf_http_streaming_ctrl_t *asf_http_ctrl, HTTP_header_t *http_hdr ) { |
871 | 652 char *content_type, *pragma; |
653 char features[64] = "\0"; | |
7953 | 654 size_t len; |
905 | 655 if( http_response_parse(http_hdr)<0 ) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
656 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_Failed2ParseHTTPResponse); |
905 | 657 return -1; |
658 } | |
6677 | 659 switch( http_hdr->status_code ) { |
660 case 200: | |
661 break; | |
662 case 401: // Authentication required | |
663 return ASF_Authenticate_e; | |
664 default: | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
665 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_ServerReturn, http_hdr->status_code, http_hdr->reason_phrase); |
6677 | 666 return -1; |
871 | 667 } |
668 | |
669 content_type = http_get_field( http_hdr, "Content-Type"); | |
3042 | 670 //printf("Content-Type: [%s]\n", content_type); |
871 | 671 |
672 pragma = http_get_field( http_hdr, "Pragma"); | |
905 | 673 while( pragma!=NULL ) { |
871 | 674 char *comma_ptr=NULL; |
675 char *end; | |
3042 | 676 //printf("Pragma: [%s]\n", pragma ); |
871 | 677 // The pragma line can get severals attributes |
678 // separeted with a comma ','. | |
679 do { | |
680 if( !strncasecmp( pragma, "features=", 9) ) { | |
681 pragma += 9; | |
682 end = strstr( pragma, "," ); | |
683 if( end==NULL ) { | |
17837 | 684 len = strlen(pragma); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
685 } else { |
17837 | 686 len = (unsigned int)(end-pragma); |
687 } | |
688 if(len > sizeof(features) - 1) { | |
17840 | 689 mp_msg(MSGT_NETWORK,MSGL_WARN,MSGTR_MPDEMUX_ASF_ASFHTTPParseWarnCuttedPragma,pragma,len,sizeof(features) - 1); |
17837 | 690 len = sizeof(features) - 1; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
691 } |
871 | 692 strncpy( features, pragma, len ); |
693 features[len]='\0'; | |
694 break; | |
695 } | |
696 comma_ptr = strstr( pragma, "," ); | |
697 if( comma_ptr!=NULL ) { | |
698 pragma = comma_ptr+1; | |
699 if( pragma[0]==' ' ) pragma++; | |
700 } | |
701 } while( comma_ptr!=NULL ); | |
702 pragma = http_get_next_field( http_hdr ); | |
905 | 703 } |
7953 | 704 asf_http_ctrl->streaming_type = asf_http_streaming_type( content_type, features, http_hdr ); |
705 return 0; | |
871 | 706 } |
707 | |
15626
941b1a71351f
printf converted to mp_msg; made static many unnecessarily global symbols
nicodvb
parents:
15585
diff
changeset
|
708 static int asf_http_streaming_start( stream_t *stream, int *demuxer_type ) { |
905 | 709 HTTP_header_t *http_hdr=NULL; |
3042 | 710 URL_t *url = stream->streaming_ctrl->url; |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
711 asf_http_streaming_ctrl_t *asf_http_ctrl; |
905 | 712 char buffer[BUFFER_SIZE]; |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
713 int i, ret; |
3042 | 714 int fd = stream->fd; |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
715 int done; |
6677 | 716 int auth_retry = 0; |
1001 | 717 |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18558
diff
changeset
|
718 asf_http_ctrl = malloc(sizeof(asf_http_streaming_ctrl_t)); |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
719 if( asf_http_ctrl==NULL ) { |
16907
54a414dd1c0b
Changed MSGTR_MPDEMUX_ASF_MallocFailed to MSGTR_MemAllocFailed (msg defined two times inhelp_mp-en.h)
ptt
parents:
16882
diff
changeset
|
720 mp_msg(MSGT_NETWORK,MSGL_FATAL,MSGTR_MemAllocFailed); |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
721 return -1; |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
722 } |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
723 asf_http_ctrl->streaming_type = ASF_Unknown_e; |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
724 asf_http_ctrl->request = 1; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
725 asf_http_ctrl->audio_streams = asf_http_ctrl->video_streams = NULL; |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
726 asf_http_ctrl->n_audio = asf_http_ctrl->n_video = 0; |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
727 stream->streaming_ctrl->data = (void*)asf_http_ctrl; |
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
728 |
905 | 729 do { |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
730 done = 1; |
10281 | 731 if( fd>0 ) closesocket( fd ); |
1001 | 732 |
4145 | 733 if( !strcasecmp( url->protocol, "http_proxy" ) ) { |
4121 | 734 if( url->port==0 ) url->port = 8080; |
735 } else { | |
736 if( url->port==0 ) url->port = 80; | |
737 } | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10281
diff
changeset
|
738 fd = connect2Server( url->hostname, url->port, 1); |
7252
0a0527c82560
- If fatal error while trying to connect to a WM server, skip other proto.
bertrand
parents:
6677
diff
changeset
|
739 if( fd<0 ) return fd; |
905 | 740 |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
741 http_hdr = asf_http_request( stream->streaming_ctrl ); |
5915 | 742 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Request [%s]\n", http_hdr->buffer ); |
7953 | 743 for(i=0; i < (int)http_hdr->buffer_size ; ) { |
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:
9749
diff
changeset
|
744 int r = send( fd, http_hdr->buffer+i, http_hdr->buffer_size-i, 0 ); |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3475
diff
changeset
|
745 if(r <0) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
746 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_SocketWriteError,strerror(errno)); |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
747 goto err_out; |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3475
diff
changeset
|
748 } |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3475
diff
changeset
|
749 i += r; |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3475
diff
changeset
|
750 } |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
751 http_free( http_hdr ); |
905 | 752 http_hdr = http_new_header(); |
753 do { | |
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:
9749
diff
changeset
|
754 i = recv( fd, buffer, BUFFER_SIZE, 0 ); |
4121 | 755 //printf("read: %d\n", i ); |
7310
d8e2623a2ea1
Don't try to reread from the socket if the server says EOF
bertrand
parents:
7252
diff
changeset
|
756 if( i<=0 ) { |
1001 | 757 perror("read"); |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
758 goto err_out; |
1001 | 759 } |
905 | 760 http_response_append( http_hdr, buffer, i ); |
2489
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
761 } while( !http_is_header_entire( http_hdr ) ); |
17932 | 762 if( mp_msg_test(MSGT_NETWORK,MSGL_V) ) { |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
763 http_hdr->buffer[http_hdr->buffer_size]='\0'; |
5915 | 764 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Response [%s]\n", http_hdr->buffer ); |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
765 } |
7953 | 766 ret = asf_http_parse_response(asf_http_ctrl, http_hdr); |
767 if( ret<0 ) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
768 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_HeaderParseFailed); |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
769 goto err_out; |
905 | 770 } |
7953 | 771 switch( asf_http_ctrl->streaming_type ) { |
905 | 772 case ASF_Live_e: |
773 case ASF_Prerecorded_e: | |
2489
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
774 case ASF_PlainText_e: |
1001 | 775 if( http_hdr->body_size>0 ) { |
3042 | 776 if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) { |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
777 goto err_out; |
1001 | 778 } |
905 | 779 } |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
780 if( asf_http_ctrl->request==1 ) { |
7953 | 781 if( asf_http_ctrl->streaming_type!=ASF_PlainText_e ) { |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
782 // First request, we only got the ASF header. |
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
783 ret = asf_streaming_parse_header(fd,stream->streaming_ctrl); |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
784 if(ret < 0) goto err_out; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
785 if(asf_http_ctrl->n_audio == 0 && asf_http_ctrl->n_video == 0) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
786 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_NoStreamFound); |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
787 goto err_out; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
788 } |
4312
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
789 asf_http_ctrl->request++; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
790 done = 0; |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
791 } else { |
971836f677a9
Added a turn around for badly configured web servers.
bertrand
parents:
4288
diff
changeset
|
792 done = 1; |
3533
6e6a74d2d1ea
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3494
diff
changeset
|
793 } |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
794 } |
905 | 795 break; |
796 case ASF_Redirector_e: | |
4073
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
797 if( http_hdr->body_size>0 ) { |
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
798 if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) { |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
799 goto err_out; |
4073
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
800 } |
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
801 } |
9749 | 802 *demuxer_type = DEMUXER_TYPE_PLAYLIST; |
4073
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
803 done = 1; |
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
804 break; |
6677 | 805 case ASF_Authenticate_e: |
806 if( http_authenticate( http_hdr, url, &auth_retry)<0 ) return -1; | |
807 asf_http_ctrl->streaming_type = ASF_Unknown_e; | |
808 done = 0; | |
809 break; | |
905 | 810 case ASF_Unknown_e: |
811 default: | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
812 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_ASF_UnknownASFStreamingType); |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
813 goto err_out; |
905 | 814 } |
3454
78057c7120f6
Added a switch for the ASF streaming protocol. It will first try ASF/UDP,
bertrand
parents:
3042
diff
changeset
|
815 // Check if we got a redirect. |
905 | 816 } while(!done); |
817 | |
4073
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
818 stream->fd = fd; |
7953 | 819 if( asf_http_ctrl->streaming_type==ASF_PlainText_e || asf_http_ctrl->streaming_type==ASF_Redirector_e ) { |
3042 | 820 stream->streaming_ctrl->streaming_read = nop_streaming_read; |
821 stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
2489
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
822 } else { |
3042 | 823 stream->streaming_ctrl->streaming_read = asf_http_streaming_read; |
824 stream->streaming_ctrl->streaming_seek = asf_http_streaming_seek; | |
4288
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
4145
diff
changeset
|
825 stream->streaming_ctrl->buffering = 1; |
2489
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
826 } |
3042 | 827 stream->streaming_ctrl->status = streaming_playing_e; |
15585 | 828 stream->close = close_s; |
1001 | 829 |
830 http_free( http_hdr ); | |
4073
5f28d9d7d346
Changed the return value of the start function. Doesn't return the fd
bertrand
parents:
4046
diff
changeset
|
831 return 0; |
21537
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
832 |
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
833 err_out: |
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
834 if (fd > 0) |
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
835 closesocket(fd); |
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
836 stream->fd = -1; |
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
837 http_free(http_hdr); |
21263c9ddd87
Avoid memory and fd leaks in asf streaming open code.
reimar
parents:
20100
diff
changeset
|
838 return -1; |
905 | 839 } |
840 | |
15585 | 841 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { |
842 URL_t *url; | |
843 | |
844 stream->streaming_ctrl = streaming_ctrl_new(); | |
845 if( stream->streaming_ctrl==NULL ) { | |
846 return STREAM_ERROR; | |
847 } | |
848 stream->streaming_ctrl->bandwidth = network_bandwidth; | |
849 url = url_new(stream->url); | |
850 stream->streaming_ctrl->url = check4proxies(url); | |
16418
264b3b909850
check4proxies always creates a copy, so url should be freed
reimar
parents:
16112
diff
changeset
|
851 url_free(url); |
15585 | 852 |
16930 | 853 mp_msg(MSGT_OPEN, MSGL_INFO, MSGTR_MPDEMUX_ASF_InfoStreamASFURL, stream->url); |
15585 | 854 if((!strncmp(stream->url, "http", 4)) && (*file_format!=DEMUXER_TYPE_ASF && *file_format!=DEMUXER_TYPE_UNKNOWN)) { |
855 streaming_ctrl_free(stream->streaming_ctrl); | |
856 stream->streaming_ctrl = NULL; | |
24257 | 857 return STREAM_UNSUPPORTED; |
15585 | 858 } |
859 | |
860 if(asf_streaming_start(stream, file_format) < 0) { | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16418
diff
changeset
|
861 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_ASF_StreamingFailed); |
15585 | 862 streaming_ctrl_free(stream->streaming_ctrl); |
863 stream->streaming_ctrl = NULL; | |
24257 | 864 return STREAM_UNSUPPORTED; |
15585 | 865 } |
866 | |
867 *file_format = DEMUXER_TYPE_ASF; | |
868 stream->type = STREAMTYPE_STREAM; | |
869 fixup_network_stream_cache(stream); | |
870 return STREAM_OK; | |
871 } | |
872 | |
873 stream_info_t stream_info_asf = { | |
874 "mms and mms over http streaming", | |
875 "null", | |
876 "Bertrand, Reimar Doeffinger, Albeu", | |
877 "originally based on work by Majormms (is that code still there?)", | |
878 open_s, | |
879 {"mms", "mmsu", "mmst", "http", "http_proxy", "mmshttp", NULL}, | |
880 NULL, | |
881 0 // Urls are an option string | |
882 }; | |
883 |