Mercurial > mplayer.hg
annotate libmpdemux/asfheader.c @ 27319:09cf111f68b8
Revert to previous dependency checking behavior.
Take included header files into account when generating dependency files.
This has problems when header files are removed or renamed, but does not
silently miscompile files.
author | diego |
---|---|
date | Sat, 26 Jul 2008 18:36:48 +0000 |
parents | 580ddfaa46d4 |
children | d47744b95b78 |
rev | line source |
---|---|
1 | 1 // .asf fileformat docs from http://divx.euro.ru |
2 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
3 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
4 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
5 #include <stdlib.h> |
1430 | 6 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
7 |
1567 | 8 #include "config.h" |
21445 | 9 #include "libavutil/common.h" |
21454
f91f04764311
Use libavutil LE_* macros instead of pointer casts which can result
reimar
parents:
21445
diff
changeset
|
10 #include "libavutil/intreadwrite.h" |
1567 | 11 #include "mp_msg.h" |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
12 #include "help_mp.h" |
1567 | 13 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22409
diff
changeset
|
14 #include "stream/stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
15 #include "demuxer.h" |
2338 | 16 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
17 |
1342 | 18 #include "asf.h" |
833 | 19 |
26325
890180cde40f
Make stream independent of libmpdemux, the asf demuxer and streaming
albeu
parents:
23840
diff
changeset
|
20 #include "asfguid.h" |
21610 | 21 |
22 typedef struct { | |
23 // must be 0 for metadata record, might be non-zero for metadata lib record | |
24 uint16_t lang_list_index; | |
25 uint16_t stream_num; | |
26 uint16_t name_length; | |
27 uint16_t data_type; | |
28 uint32_t data_length; | |
29 uint16_t* name; | |
30 void* data; | |
31 } ASF_meta_record_t; | |
1 | 32 |
21445 | 33 static char* get_ucs2str(const uint16_t* inbuf, uint16_t inlen) |
34 { | |
35 char* outbuf = calloc(inlen, 2); | |
36 char* q; | |
37 int i; | |
1 | 38 |
21445 | 39 if (!outbuf) { |
40 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed); | |
41 return NULL; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
42 } |
21445 | 43 q = outbuf; |
44 for (i = 0; i < inlen / 2; i++) { | |
45 uint8_t tmp; | |
23737
304beddf4700
fix unaligned memory access in asfheader.c, courtesy of Balatoni Denes
zuxy
parents:
23399
diff
changeset
|
46 PUT_UTF8(AV_RL16(&inbuf[i]), tmp, *q++ = tmp;) |
21445 | 47 } |
48 return outbuf; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
49 } |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
50 |
19108
5e767cabf4cd
marks several read-only string parameters and function return-values which can only be used read-only as const. Patch by Stefan Huehner, stefan _AT huener-org
reynaldo
parents:
19062
diff
changeset
|
51 static const char* asf_chunk_type(unsigned char* guid) { |
1342 | 52 static char tmp[60]; |
53 char *p; | |
54 int i; | |
55 | |
56 switch(ASF_LOAD_GUID_PREFIX(guid)){ | |
57 case ASF_GUID_PREFIX_audio_stream: | |
58 return "guid_audio_stream"; | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
59 case ASF_GUID_PREFIX_ext_audio_stream: |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
60 return "guid_ext_audio_stream"; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
61 case ASF_GUID_PREFIX_ext_stream_embed_stream_header: |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
62 return "guid_ext_stream_embed_stream_header"; |
1342 | 63 case ASF_GUID_PREFIX_video_stream: |
64 return "guid_video_stream"; | |
65 case ASF_GUID_PREFIX_audio_conceal_none: | |
66 return "guid_audio_conceal_none"; | |
67 case ASF_GUID_PREFIX_audio_conceal_interleave: | |
68 return "guid_audio_conceal_interleave"; | |
69 case ASF_GUID_PREFIX_header: | |
70 return "guid_header"; | |
71 case ASF_GUID_PREFIX_data_chunk: | |
72 return "guid_data_chunk"; | |
73 case ASF_GUID_PREFIX_index_chunk: | |
74 return "guid_index_chunk"; | |
75 case ASF_GUID_PREFIX_stream_header: | |
76 return "guid_stream_header"; | |
77 case ASF_GUID_PREFIX_header_2_0: | |
78 return "guid_header_2_0"; | |
79 case ASF_GUID_PREFIX_file_header: | |
80 return "guid_file_header"; | |
81 case ASF_GUID_PREFIX_content_desc: | |
82 return "guid_content_desc"; | |
23239 | 83 case ASF_GUID_PREFIX_dvr_ms_timing_rep_data: |
84 return "guid_dvr_ms_timing_rep_data"; | |
85 case ASF_GUID_PREFIX_dvr_ms_vid_frame_rep_data: | |
86 return "guid_dvr_ms_vid_frame_rep_data"; | |
1342 | 87 default: |
88 strcpy(tmp, "unknown guid "); | |
89 p = tmp + strlen(tmp); | |
90 for (i = 0; i < 16; i++) { | |
91 if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-'; | |
92 sprintf(p, "%02x", guid[i]); | |
93 p += 2; | |
94 } | |
95 return tmp; | |
1 | 96 } |
97 } | |
98 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
99 int asf_check_header(demuxer_t *demuxer){ |
1 | 100 unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C}; |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
101 struct asf_priv* asf = calloc(1,sizeof(*asf)); |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
102 asf->scrambling_h=asf->scrambling_w=asf->scrambling_b=1; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
103 stream_read(demuxer->stream,(char*) &asf->header,sizeof(asf->header)); // header obj |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
104 le2me_ASF_header_t(&asf->header); // swap to machine endian |
1 | 105 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); |
106 // for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n"); | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
107 if(memcmp(asfhdrguid,asf->header.objh.guid,16)){ |
1567 | 108 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: not ASF guid!\n"); |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
109 free(asf); |
1 | 110 return 0; // not ASF guid |
111 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
112 if(asf->header.cno>256){ |
18011 | 113 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asf->header.cno); |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
114 free(asf); |
1 | 115 return 0; // invalid header??? |
116 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
117 demuxer->priv = asf; |
16175 | 118 return DEMUXER_TYPE_ASF; |
1 | 119 } |
120 | |
23840
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23803
diff
changeset
|
121 void print_wave_header(WAVEFORMATEX *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23803
diff
changeset
|
122 void print_video_header(BITMAPINFOHEADER *h, int verbose_level); |
601 | 123 |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
124 |
23239 | 125 static int get_ext_stream_properties(char *buf, int buf_len, int stream_num, struct asf_priv* asf, int is_video) |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
126 { |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
127 int pos=0; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
128 uint8_t *buffer = &buf[0]; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
129 uint64_t avg_ft; |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
130 unsigned bitrate; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
131 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
132 while ((pos = find_asf_guid(buf, asf_ext_stream_header, pos, buf_len)) >= 0) { |
23381
300e9b7c499f
Remove some unused variables, patch by timwoj ieee org.
diego
parents:
23357
diff
changeset
|
133 int this_stream_num, stnamect, payct, i; |
23239 | 134 int buf_max_index=pos+50; |
135 if (buf_max_index > buf_len) return 0; | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
136 buffer = &buf[pos]; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
137 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
138 // the following info is available |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
139 // some of it may be useful but we're skipping it for now |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
140 // starttime(8 bytes), endtime(8), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
141 // leak-datarate(4), bucket-datasize(4), init-bucket-fullness(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
142 // alt-leak-datarate(4), alt-bucket-datasize(4), alt-init-bucket-fullness(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
143 // max-object-size(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
144 // flags(4) (reliable,seekable,no_cleanpoints?,resend-live-cleanpoints, rest of bits reserved) |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
145 |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
146 buffer += 8+8; |
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
147 bitrate = AV_RL32(buffer); |
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
148 buffer += 8*4; |
21945 | 149 this_stream_num=AV_RL16(buffer);buffer+=2; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
150 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
151 if (this_stream_num == stream_num) { |
23239 | 152 buf_max_index+=14; |
153 if (buf_max_index > buf_len) return 0; | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
154 buffer+=2; //skip stream-language-id-index |
23311 | 155 avg_ft = AV_RL64(buffer); // provided in 100ns units |
23239 | 156 buffer+=8; |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
157 asf->bps = bitrate / 8; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
158 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
159 // after this are values for stream-name-count and |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
160 // payload-extension-system-count |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
161 // followed by associated info for each |
23239 | 162 stnamect = AV_RL16(buffer);buffer+=2; |
163 payct = AV_RL16(buffer);buffer+=2; | |
164 | |
165 // need to read stream names if present in order | |
166 // to get lengths - values are ignored for now | |
167 for (i=0; i<stnamect; i++) { | |
168 int stream_name_len; | |
169 buf_max_index+=4; | |
170 if (buf_max_index > buf_len) return 0; | |
171 buffer+=2; //language_id_index | |
172 stream_name_len = AV_RL16(buffer);buffer+=2; | |
173 buffer+=stream_name_len; //stream_name | |
174 buf_max_index+=stream_name_len; | |
175 if (buf_max_index > buf_len) return 0; | |
176 } | |
177 | |
178 if (is_video) { | |
179 asf->vid_repdata_count = payct; | |
180 asf->vid_repdata_sizes = malloc(payct*sizeof(int)); | |
181 } else { | |
182 asf->aud_repdata_count = payct; | |
183 asf->aud_repdata_sizes = malloc(payct*sizeof(int)); | |
184 } | |
185 | |
186 for (i=0; i<payct; i++) { | |
187 int payload_len; | |
188 buf_max_index+=22; | |
189 if (buf_max_index > buf_len) return 0; | |
190 // Each payload extension definition starts with a GUID. | |
191 // In dvr-ms files one of these indicates the presence an | |
192 // extension that contains pts values and this is always present | |
193 // in the video and audio streams. | |
194 // Another GUID indicates the presence of an extension | |
195 // that contains useful video frame demuxing information. | |
196 // Note that the extension data in each packet does not contain | |
197 // these GUIDs and that this header section defines the order the data | |
198 // will appear in. | |
199 if (memcmp(buffer, asf_dvr_ms_timing_rep_data, 16) == 0) { | |
200 if (is_video) | |
201 asf->vid_ext_timing_index = i; | |
202 else | |
203 asf->aud_ext_timing_index = i; | |
204 } else if (is_video && memcmp(buffer, asf_dvr_ms_vid_frame_rep_data, 16) == 0) | |
205 asf->vid_ext_frame_index = i; | |
206 buffer+=16; | |
207 | |
208 payload_len = AV_RL16(buffer);buffer+=2; | |
209 | |
210 if (is_video) | |
211 asf->vid_repdata_sizes[i] = payload_len; | |
212 else | |
213 asf->aud_repdata_sizes[i] = payload_len; | |
214 buffer+=4;//sys_len | |
215 } | |
216 | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
217 return 1; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
218 } |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
219 } |
23803
ec1a81c77628
fixed bug introduced with the addition of get_ext_stream_properties()
nicodvb
parents:
23737
diff
changeset
|
220 return 1; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
221 } |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
222 |
21610 | 223 #define CHECKDEC(l, n) if (((l) -= (n)) < 0) return 0 |
224 static char* read_meta_record(ASF_meta_record_t* dest, char* buf, | |
225 int* buf_len) | |
226 { | |
227 CHECKDEC(*buf_len, 2 + 2 + 2 + 2 + 4); | |
21945 | 228 dest->lang_list_index = AV_RL16(buf); |
229 dest->stream_num = AV_RL16(&buf[2]); | |
230 dest->name_length = AV_RL16(&buf[4]); | |
231 dest->data_type = AV_RL16(&buf[6]); | |
232 dest->data_length = AV_RL32(&buf[8]); | |
21610 | 233 buf += 2 + 2 + 2 + 2 + 4; |
234 CHECKDEC(*buf_len, dest->name_length); | |
235 dest->name = (uint16_t*)buf; | |
236 buf += dest->name_length; | |
237 CHECKDEC(*buf_len, dest->data_length); | |
238 dest->data = buf; | |
239 buf += dest->data_length; | |
240 return buf; | |
241 } | |
242 | |
243 static int get_meta(char *buf, int buf_len, int this_stream_num, | |
244 float* asp_ratio) | |
245 { | |
246 int pos = 0; | |
247 uint16_t records_count; | |
248 uint16_t x = 0, y = 0; | |
249 | |
250 if ((pos = find_asf_guid(buf, asf_metadata_header, pos, buf_len)) < 0) | |
251 return 0; | |
252 | |
253 CHECKDEC(buf_len, pos); | |
254 buf += pos; | |
255 CHECKDEC(buf_len, 2); | |
21945 | 256 records_count = AV_RL16(buf); |
21610 | 257 buf += 2; |
258 | |
259 while (records_count--) { | |
260 ASF_meta_record_t record_entry; | |
261 char* name; | |
262 | |
263 if (!(buf = read_meta_record(&record_entry, buf, &buf_len))) | |
264 return 0; | |
265 /* reserved, must be zero */ | |
266 if (record_entry.lang_list_index) | |
267 continue; | |
268 /* match stream number: 0 to match all */ | |
269 if (record_entry.stream_num && record_entry.stream_num != this_stream_num) | |
270 continue; | |
271 if (!(name = get_ucs2str(record_entry.name, record_entry.name_length))) { | |
272 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed); | |
273 continue; | |
274 } | |
275 if (strcmp(name, "AspectRatioX") == 0) | |
21945 | 276 x = AV_RL16(record_entry.data); |
21610 | 277 else if (strcmp(name, "AspectRatioY") == 0) |
21945 | 278 y = AV_RL16(record_entry.data); |
21610 | 279 free(name); |
280 } | |
281 if (x && y) { | |
282 *asp_ratio = (float)x / (float)y; | |
283 return 1; | |
284 } | |
285 return 0; | |
286 } | |
287 | |
22409 | 288 static int is_drm(char* buf, int buf_len) |
289 { | |
290 uint32_t data_len, type_len, key_len, url_len; | |
291 int pos = find_asf_guid(buf, asf_content_encryption, 0, buf_len); | |
292 | |
293 if (pos < 0) | |
294 return 0; | |
295 | |
296 CHECKDEC(buf_len, pos + 4); | |
297 buf += pos; | |
298 data_len = AV_RL32(buf); | |
299 buf += 4; | |
300 CHECKDEC(buf_len, data_len); | |
301 buf += data_len; | |
302 type_len = AV_RL32(buf); | |
303 if (type_len < 4) | |
304 return 0; | |
305 CHECKDEC(buf_len, 4 + type_len + 4); | |
306 buf += 4; | |
307 | |
308 if (buf[0] != 'D' || buf[1] != 'R' || buf[2] != 'M' || buf[3] != '\0') | |
309 return 0; | |
310 | |
311 buf += type_len; | |
312 key_len = AV_RL32(buf); | |
313 CHECKDEC(buf_len, key_len + 4); | |
314 buf += 4; | |
315 | |
316 buf[key_len - 1] = '\0'; | |
317 mp_msg(MSGT_HEADER, MSGL_V, "DRM Key ID: %s\n", buf); | |
318 | |
319 buf += key_len; | |
320 url_len = AV_RL32(buf); | |
321 CHECKDEC(buf_len, url_len); | |
322 buf += 4; | |
323 | |
324 buf[url_len - 1] = '\0'; | |
325 mp_msg(MSGT_HEADER, MSGL_INFO, MSGTR_MPDEMUX_ASFHDR_DRMLicenseURL, buf); | |
326 return 1; | |
327 } | |
328 | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
329 static int asf_init_audio_stream(demuxer_t *demuxer,struct asf_priv* asf, sh_audio_t* sh_audio, ASF_stream_header_t *streamh, int *ppos, uint8_t** buf, char *hdr, unsigned int hdr_len) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
330 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
331 uint8_t *buffer = *buf; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
332 int pos = *ppos; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
333 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
334 sh_audio->wf=calloc((streamh->type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh->type_size,1); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
335 memcpy(sh_audio->wf,buffer,streamh->type_size); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
336 le2me_WAVEFORMATEX(sh_audio->wf); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
337 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
338 if(ASF_LOAD_GUID_PREFIX(streamh->concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){ |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
339 buffer = &hdr[pos]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
340 pos += streamh->stream_size; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
341 if (pos > hdr_len) return 0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
342 asf->scrambling_h=buffer[0]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
343 asf->scrambling_w=(buffer[2]<<8)|buffer[1]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
344 asf->scrambling_b=(buffer[4]<<8)|buffer[3]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
345 if(asf->scrambling_b>0){ |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
346 asf->scrambling_w/=asf->scrambling_b; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
347 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
348 } else { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
349 asf->scrambling_b=asf->scrambling_h=asf->scrambling_w=1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
350 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
351 mp_msg(MSGT_HEADER,MSGL_V,"ASF: audio scrambling: %d x %d x %d\n",asf->scrambling_h,asf->scrambling_w,asf->scrambling_b); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
352 return 1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
353 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
354 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
355 int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf){ |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
356 int hdr_len = asf->header.objh.size - sizeof(asf->header); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
357 int hdr_skip = 0; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
358 char *hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
359 char guid_buffer[16]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
360 int pos, start = stream_tell(demuxer->stream); |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
361 uint32_t* streams = NULL; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
362 int audio_streams=0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
363 int video_streams=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
364 uint16_t stream_count=0; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
365 int best_video = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
366 int best_audio = -1; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
367 uint64_t data_len; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
368 ASF_stream_header_t *streamh; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
369 uint8_t *buffer; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
370 int audio_pos=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
371 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
372 if(hdr_len < 0) { |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
373 mp_msg(MSGT_HEADER, MSGL_FATAL, "Header size is too small.\n"); |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
374 return 0; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
375 } |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
376 |
15795
546b49d7147d
M$ puts whole FAQs in these headers, so they can get really big...
reimar
parents:
15572
diff
changeset
|
377 if (hdr_len > 1024 * 1024) { |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
378 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MPDEMUX_ASFHDR_HeaderSizeOver1MB, |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
379 hdr_len); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
380 hdr_skip = hdr_len - 1024 * 1024; |
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
381 hdr_len = 1024 * 1024; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
382 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
383 hdr = malloc(hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
384 if (!hdr) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
385 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_HeaderMallocFailed, |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
386 hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
387 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
388 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
389 stream_read(demuxer->stream, hdr, hdr_len); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
390 if (hdr_skip) |
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
391 stream_skip(demuxer->stream, hdr_skip); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
392 if (stream_eof(demuxer->stream)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
393 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_EOFWhileReadingHeader); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
394 goto err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
395 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
396 |
22409 | 397 if (is_drm(hdr, hdr_len)) |
398 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_DRMProtected); | |
399 | |
19124 | 400 if ((pos = find_asf_guid(hdr, asf_ext_stream_audio, 0, hdr_len)) >= 0) |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
401 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
402 // Special case: found GUID for dvr-ms audio. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
403 // Now skip back to associated stream header. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
404 int sh_pos=0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
405 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
406 sh_pos = find_backwards_asf_guid(hdr, asf_stream_header_guid, pos); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
407 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
408 if (sh_pos > 0) { |
18670
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
409 sh_audio_t *sh_audio; |
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
410 |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
411 mp_msg(MSGT_HEADER, MSGL_V, "read_asf_header found dvr-ms audio stream header pos=%d\n", sh_pos); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
412 // found audio stream header - following code reads header and |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
413 // initializes audio stream. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
414 audio_pos = pos - 16 - 8; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
415 streamh = (ASF_stream_header_t *)&hdr[sh_pos]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
416 le2me_ASF_stream_header_t(streamh); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
417 audio_pos += 64; //16+16+4+4+4+16+4; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
418 buffer = &hdr[audio_pos]; |
18670
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
419 sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
420 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "asfheader", streamh->stream_no & 0x7F); |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
421 ++audio_streams; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
422 if (!asf_init_audio_stream(demuxer, asf, sh_audio, streamh, &audio_pos, &buffer, hdr, hdr_len)) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
423 goto len_err_out; |
23239 | 424 if (!get_ext_stream_properties(hdr, hdr_len, streamh->stream_no, asf, 0)) |
425 goto len_err_out; | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
426 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
427 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
428 // find stream headers |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
429 // only reset pos if we didnt find dvr_ms audio stream |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
430 // if we did find it then we want to avoid reading its header twice |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
431 if (audio_pos == 0) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
432 pos = 0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
433 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
434 while ((pos = find_asf_guid(hdr, asf_stream_header_guid, pos, hdr_len)) >= 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
435 { |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
436 streamh = (ASF_stream_header_t *)&hdr[pos]; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
437 pos += sizeof(ASF_stream_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
438 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
439 le2me_ASF_stream_header_t(streamh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
440 mp_msg(MSGT_HEADER, MSGL_V, "stream type: %s\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
441 asf_chunk_type(streamh->type)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
442 mp_msg(MSGT_HEADER, MSGL_V, "stream concealment: %s\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
443 asf_chunk_type(streamh->concealment)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
444 mp_msg(MSGT_HEADER, MSGL_V, "type: %d bytes, stream: %d bytes ID: %d\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
445 (int)streamh->type_size, (int)streamh->stream_size, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
446 (int)streamh->stream_no); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
447 mp_msg(MSGT_HEADER, MSGL_V, "unk1: %lX unk2: %X\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
448 (unsigned long)streamh->unk1, (unsigned int)streamh->unk2); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
449 mp_msg(MSGT_HEADER, MSGL_V, "FILEPOS=0x%X\n", pos + start); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
450 // type-specific data: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
451 buffer = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
452 pos += streamh->type_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
453 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
454 switch(ASF_LOAD_GUID_PREFIX(streamh->type)){ |
1342 | 455 case ASF_GUID_PREFIX_audio_stream: { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
456 sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
457 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "asfheader", streamh->stream_no & 0x7F); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
458 ++audio_streams; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
459 if (!asf_init_audio_stream(demuxer, asf, sh_audio, streamh, &pos, &buffer, hdr, hdr_len)) |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
460 goto len_err_out; |
426 | 461 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F; |
1 | 462 break; |
291 | 463 } |
1342 | 464 case ASF_GUID_PREFIX_video_stream: { |
23089 | 465 unsigned int len; |
466 float asp_ratio; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
467 sh_video_t* sh_video=new_sh_video(demuxer,streamh->stream_no & 0x7F); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
468 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "asfheader", streamh->stream_no & 0x7F); |
23089 | 469 len=streamh->type_size-(4+4+1+2); |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
470 ++video_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
471 // sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
472 sh_video->bih=calloc((len<sizeof(BITMAPINFOHEADER))?sizeof(BITMAPINFOHEADER):len,1); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
473 memcpy(sh_video->bih,&buffer[4+4+1+2],len); |
1342 | 474 le2me_BITMAPINFOHEADER(sh_video->bih); |
21967 | 475 if (sh_video->bih->biSize > len && sh_video->bih->biSize > sizeof(BITMAPINFOHEADER)) |
476 sh_video->bih->biSize = len; | |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
477 if (sh_video->bih->biCompression == mmioFOURCC('D', 'V', 'R', ' ')) { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
478 //mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_MPDEMUX_ASFHDR_DVRWantsLibavformat); |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
479 //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
480 //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
481 asf->asf_frame_state=-1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
482 asf->asf_frame_start_found=0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
483 asf->asf_is_dvr_ms=1; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
484 asf->dvr_last_vid_pts=0.0; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
485 } else asf->asf_is_dvr_ms=0; |
23239 | 486 if (!get_ext_stream_properties(hdr, hdr_len, streamh->stream_no, asf, 1)) |
487 goto len_err_out; | |
21610 | 488 if (get_meta(hdr, hdr_len, streamh->stream_no, &asp_ratio)) { |
489 sh_video->aspect = asp_ratio * sh_video->bih->biWidth / | |
490 sh_video->bih->biHeight; | |
491 } | |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
492 sh_video->i_bps = asf->bps; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
493 |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
494 if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V); |
1 | 495 //asf_video_id=streamh.stream_no & 0x7F; |
426 | 496 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F; |
1 | 497 break; |
291 | 498 } |
1 | 499 } |
500 // stream-specific data: | |
501 // stream_read(demuxer->stream,(char*) buffer,streamh.stream_size); | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
502 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
503 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
504 // find file header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
505 pos = find_asf_guid(hdr, asf_file_header_guid, 0, hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
506 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
507 ASF_file_header_t *fileh = (ASF_file_header_t *)&hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
508 pos += sizeof(ASF_file_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
509 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
510 le2me_ASF_file_header_t(fileh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
511 mp_msg(MSGT_HEADER, MSGL_V, "ASF: packets: %d flags: %d " |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
512 "max_packet_size: %d min_packet_size: %d max_bitrate: %d " |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
513 "preroll: %d\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
514 (int)fileh->num_packets, (int)fileh->flags, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
515 (int)fileh->min_packet_size, (int)fileh->max_packet_size, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
516 (int)fileh->max_bitrate, (int)fileh->preroll); |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
517 asf->packetsize=fileh->max_packet_size; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
518 asf->packet=malloc(asf->packetsize); // !!! |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
519 asf->packetrate=fileh->max_bitrate/8.0/(double)asf->packetsize; |
23399
8a0062b81dcc
Use play duration instead of send duration to calculate the length
zuxy
parents:
23381
diff
changeset
|
520 asf->movielength=(fileh->play_duration-fileh->preroll)/10000000LL; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
521 } |
1 | 522 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
523 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
524 pos = find_asf_guid(hdr, asf_content_desc_guid, 0, hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
525 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
526 ASF_content_description_t *contenth = (ASF_content_description_t *)&hdr[pos]; |
1003
26579d6e6c38
Initialisation of ptr string to NULL to avoid gcc warning.
bertrand
parents:
848
diff
changeset
|
527 char *string=NULL; |
21445 | 528 uint16_t* wstring = NULL; |
529 uint16_t len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
530 pos += sizeof(ASF_content_description_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
531 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
532 le2me_ASF_content_description_t(contenth); |
1567 | 533 mp_msg(MSGT_HEADER,MSGL_V,"\n"); |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
534 // extract the title |
21445 | 535 if((len = contenth->title_size) != 0) { |
536 wstring = (uint16_t*)&hdr[pos]; | |
537 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
538 if (pos > hdr_len) goto len_err_out; |
21445 | 539 if ((string = get_ucs2str(wstring, len))) { |
540 mp_msg(MSGT_HEADER,MSGL_V," Title: %s\n", string); | |
541 demux_info_add(demuxer, "name", string); | |
542 free(string); | |
543 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
544 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
545 // extract the author |
21445 | 546 if((len = contenth->author_size) != 0) { |
547 wstring = (uint16_t*)&hdr[pos]; | |
548 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
549 if (pos > hdr_len) goto len_err_out; |
21445 | 550 if ((string = get_ucs2str(wstring, len))) { |
551 mp_msg(MSGT_HEADER,MSGL_V," Author: %s\n", string); | |
552 demux_info_add(demuxer, "author", string); | |
553 free(string); | |
554 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
555 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
556 // extract the copyright |
21445 | 557 if((len = contenth->copyright_size) != 0) { |
558 wstring = (uint16_t*)&hdr[pos]; | |
559 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
560 if (pos > hdr_len) goto len_err_out; |
21445 | 561 if ((string = get_ucs2str(wstring, len))) { |
562 mp_msg(MSGT_HEADER,MSGL_V," Copyright: %s\n", string); | |
563 demux_info_add(demuxer, "copyright", string); | |
564 free(string); | |
565 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
566 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
567 // extract the comment |
21445 | 568 if((len = contenth->comment_size) != 0) { |
569 wstring = (uint16_t*)&hdr[pos]; | |
570 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
571 if (pos > hdr_len) goto len_err_out; |
21445 | 572 if ((string = get_ucs2str(wstring, len))) { |
573 mp_msg(MSGT_HEADER,MSGL_V," Comment: %s\n", string); | |
574 demux_info_add(demuxer, "comments", string); | |
575 free(string); | |
576 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
577 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
578 // extract the rating |
21445 | 579 if((len = contenth->rating_size) != 0) { |
580 wstring = (uint16_t*)&hdr[pos]; | |
581 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
582 if (pos > hdr_len) goto len_err_out; |
21445 | 583 if ((string = get_ucs2str(wstring, len))) { |
584 mp_msg(MSGT_HEADER,MSGL_V," Rating: %s\n", string); | |
585 free(string); | |
586 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
587 } |
1567 | 588 mp_msg(MSGT_HEADER,MSGL_V,"\n"); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
589 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
590 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
591 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
592 pos = find_asf_guid(hdr, asf_stream_group_guid, 0, hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
593 if (pos >= 0) { |
27211
580ddfaa46d4
Fix stupid and almost pointless check-after-read code in asfheader.c.
reimar
parents:
26325
diff
changeset
|
594 int max_streams = (hdr_len - pos - 2) / 6; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
595 uint16_t stream_id, i; |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
596 uint32_t max_bitrate; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
597 char *ptr = &hdr[pos]; |
12219 | 598 mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == START ===\n"); |
27211
580ddfaa46d4
Fix stupid and almost pointless check-after-read code in asfheader.c.
reimar
parents:
26325
diff
changeset
|
599 if(max_streams <= 0) goto len_err_out; |
21945 | 600 stream_count = AV_RL16(ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
601 ptr += sizeof(uint16_t); |
27211
580ddfaa46d4
Fix stupid and almost pointless check-after-read code in asfheader.c.
reimar
parents:
26325
diff
changeset
|
602 if(stream_count > max_streams) stream_count = max_streams; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
603 if(stream_count > 0) |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18809
diff
changeset
|
604 streams = malloc(2*stream_count*sizeof(uint32_t)); |
12219 | 605 mp_msg(MSGT_HEADER,MSGL_V," stream count=[0x%x][%u]\n", stream_count, stream_count ); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
606 for( i=0 ; i<stream_count ; i++ ) { |
21945 | 607 stream_id = AV_RL16(ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
608 ptr += sizeof(uint16_t); |
6187
50858d90c8d0
On the sun all int32 objects have to be aligned on 32 bit boundaries. With
arpi
parents:
5618
diff
changeset
|
609 memcpy(&max_bitrate, ptr, sizeof(uint32_t));// workaround unaligment bug on sparc |
50858d90c8d0
On the sun all int32 objects have to be aligned on 32 bit boundaries. With
arpi
parents:
5618
diff
changeset
|
610 max_bitrate = le2me_32(max_bitrate); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
611 ptr += sizeof(uint32_t); |
12219 | 612 mp_msg(MSGT_HEADER,MSGL_V," stream id=[0x%x][%u]\n", stream_id, stream_id ); |
613 mp_msg(MSGT_HEADER,MSGL_V," max bitrate=[0x%x][%u]\n", max_bitrate, max_bitrate ); | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
614 streams[2*i] = stream_id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
615 streams[2*i+1] = max_bitrate; |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
616 } |
12219 | 617 mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == END ===\n"); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
618 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
619 free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
620 hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
621 start = stream_tell(demuxer->stream); // start of first data chunk |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
622 stream_read(demuxer->stream, guid_buffer, 16); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
623 if (memcmp(guid_buffer, asf_data_chunk_guid, 16) != 0) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
624 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_NoDataChunkAfterHeader); |
18809 | 625 free(streams); |
626 streams = NULL; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
627 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
628 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
629 // read length of chunk |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
630 stream_read(demuxer->stream, (char *)&data_len, sizeof(data_len)); |
16149 | 631 data_len = le2me_64(data_len); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
632 demuxer->movi_start = stream_tell(demuxer->stream) + 26; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
633 demuxer->movi_end = start + data_len; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
634 mp_msg(MSGT_HEADER, MSGL_V, "Found movie at 0x%X - 0x%X\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
635 (int)demuxer->movi_start, (int)demuxer->movi_end); |
1 | 636 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
637 if(streams) { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
638 // stream selection is done in the network code, it shouldn't be done here |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
639 // as the servers often do not care about what we requested. |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
640 #if 0 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
641 uint32_t vr = 0, ar = 0,i; |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
8208
diff
changeset
|
642 #ifdef MPLAYER_NETWORK |
6645
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
643 if( demuxer->stream->streaming_ctrl!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
644 if( demuxer->stream->streaming_ctrl->bandwidth!=0 && demuxer->stream->streaming_ctrl->data!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
645 best_audio = ((asf_http_streaming_ctrl_t*)demuxer->stream->streaming_ctrl->data)->audio_id; |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
646 best_video = ((asf_http_streaming_ctrl_t*)demuxer->stream->streaming_ctrl->data)->video_id; |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
647 } |
6666 | 648 } else |
649 #endif | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
650 for(i = 0; i < stream_count; i++) { |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
651 uint32_t id = streams[2*i]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
652 uint32_t rate = streams[2*i+1]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
653 if(demuxer->v_streams[id] && rate > vr) { |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
654 vr = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
655 best_video = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
656 } else if(demuxer->a_streams[id] && rate > ar) { |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
657 ar = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
658 best_audio = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
659 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
660 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
661 #endif |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
662 free(streams); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
663 streams = NULL; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
664 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
665 |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
666 mp_msg(MSGT_HEADER,MSGL_V,"ASF: %d audio and %d video streams found\n",audio_streams,video_streams); |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
667 if(!audio_streams) demuxer->audio->id=-2; // nosound |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
668 else if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
669 if(!video_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
670 if(!audio_streams){ |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
671 mp_msg(MSGT_HEADER,MSGL_ERR,MSGTR_MPDEMUX_ASFHDR_AudioVideoHeaderNotFound); |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
672 return 0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
673 } |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
674 demuxer->video->id=-2; // audio-only |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
675 } else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
676 |
1 | 677 #if 0 |
17932 | 678 if( mp_msg_test(MSGT_HEADER,MSGL_V) ){ |
1 | 679 printf("ASF duration: %d\n",(int)fileh.duration); |
680 printf("ASF start pts: %d\n",(int)fileh.start_timestamp); | |
681 printf("ASF end pts: %d\n",(int)fileh.end_timestamp); | |
682 } | |
683 #endif | |
684 | |
685 return 1; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
686 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
687 len_err_out: |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
688 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_InvalidLengthInASFHeader); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
689 err_out: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
690 if (hdr) free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
691 if (streams) free(streams); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
692 return 0; |
1 | 693 } |