Mercurial > mplayer.hg
annotate libmpdemux/asfheader.c @ 36189:71360817b772
Discard parts that we do not actually care about instead of
reading them in.
Since more than one character can match, this could read
beyond the target variable.
Based on patch by wm4 (nfxjfg googlemail.com).
author | reimar |
---|---|
date | Sat, 25 May 2013 12:06:55 +0000 |
parents | 7dfe52e4f2e1 |
children | 139f2b064ef9 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
2 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
3 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
7 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
8 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
12 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
13 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
17 */ |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
27691
diff
changeset
|
18 |
1 | 19 // .asf fileformat docs from http://divx.euro.ru |
20 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
21 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
22 #include <stdlib.h> |
1430 | 23 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
24 |
1567 | 25 #include "config.h" |
21445 | 26 #include "libavutil/common.h" |
21454
f91f04764311
Use libavutil LE_* macros instead of pointer casts which can result
reimar
parents:
21445
diff
changeset
|
27 #include "libavutil/intreadwrite.h" |
1567 | 28 #include "mp_msg.h" |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
29 #include "help_mp.h" |
1567 | 30 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22409
diff
changeset
|
31 #include "stream/stream.h" |
30589
df6c41f16b40
Add header for AVI print functions; avoids many forward declarations.
diego
parents:
30587
diff
changeset
|
32 #include "aviprint.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
33 #include "demuxer.h" |
2338 | 34 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
35 |
1342 | 36 #include "asf.h" |
26325
890180cde40f
Make stream independent of libmpdemux, the asf demuxer and streaming
albeu
parents:
23840
diff
changeset
|
37 #include "asfguid.h" |
30587
5df7d33f5545
Add header for asf_check_header, read_asf_header; avoids forward declarations.
diego
parents:
30395
diff
changeset
|
38 #include "asfheader.h" |
21610 | 39 |
40 typedef struct { | |
41 // must be 0 for metadata record, might be non-zero for metadata lib record | |
42 uint16_t lang_list_index; | |
43 uint16_t stream_num; | |
44 uint16_t name_length; | |
45 uint16_t data_type; | |
46 uint32_t data_length; | |
47 uint16_t* name; | |
48 void* data; | |
49 } ASF_meta_record_t; | |
1 | 50 |
21445 | 51 static char* get_ucs2str(const uint16_t* inbuf, uint16_t inlen) |
52 { | |
53 char* outbuf = calloc(inlen, 2); | |
54 char* q; | |
55 int i; | |
1 | 56 |
21445 | 57 if (!outbuf) { |
58 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed); | |
59 return NULL; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
60 } |
21445 | 61 q = outbuf; |
62 for (i = 0; i < inlen / 2; i++) { | |
63 uint8_t tmp; | |
23737
304beddf4700
fix unaligned memory access in asfheader.c, courtesy of Balatoni Denes
zuxy
parents:
23399
diff
changeset
|
64 PUT_UTF8(AV_RL16(&inbuf[i]), tmp, *q++ = tmp;) |
21445 | 65 } |
66 return outbuf; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
67 } |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
68 |
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
|
69 static const char* asf_chunk_type(unsigned char* guid) { |
1342 | 70 static char tmp[60]; |
71 char *p; | |
72 int i; | |
73 | |
74 switch(ASF_LOAD_GUID_PREFIX(guid)){ | |
75 case ASF_GUID_PREFIX_audio_stream: | |
76 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
|
77 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
|
78 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
|
79 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
|
80 return "guid_ext_stream_embed_stream_header"; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
81 case ASF_GUID_PREFIX_video_stream: |
1342 | 82 return "guid_video_stream"; |
83 case ASF_GUID_PREFIX_audio_conceal_none: | |
84 return "guid_audio_conceal_none"; | |
85 case ASF_GUID_PREFIX_audio_conceal_interleave: | |
86 return "guid_audio_conceal_interleave"; | |
87 case ASF_GUID_PREFIX_header: | |
88 return "guid_header"; | |
89 case ASF_GUID_PREFIX_data_chunk: | |
90 return "guid_data_chunk"; | |
91 case ASF_GUID_PREFIX_index_chunk: | |
92 return "guid_index_chunk"; | |
93 case ASF_GUID_PREFIX_stream_header: | |
94 return "guid_stream_header"; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
95 case ASF_GUID_PREFIX_header_2_0: |
1342 | 96 return "guid_header_2_0"; |
97 case ASF_GUID_PREFIX_file_header: | |
98 return "guid_file_header"; | |
99 case ASF_GUID_PREFIX_content_desc: | |
100 return "guid_content_desc"; | |
23239 | 101 case ASF_GUID_PREFIX_dvr_ms_timing_rep_data: |
102 return "guid_dvr_ms_timing_rep_data"; | |
103 case ASF_GUID_PREFIX_dvr_ms_vid_frame_rep_data: | |
104 return "guid_dvr_ms_vid_frame_rep_data"; | |
1342 | 105 default: |
106 strcpy(tmp, "unknown guid "); | |
107 p = tmp + strlen(tmp); | |
108 for (i = 0; i < 16; i++) { | |
109 if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-'; | |
110 sprintf(p, "%02x", guid[i]); | |
111 p += 2; | |
112 } | |
113 return tmp; | |
1 | 114 } |
115 } | |
116 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
117 int asf_check_header(demuxer_t *demuxer){ |
1 | 118 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
|
119 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
|
120 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
|
121 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
|
122 le2me_ASF_header_t(&asf->header); // swap to machine endian |
1 | 123 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); |
124 // 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
|
125 if(memcmp(asfhdrguid,asf->header.objh.guid,16)){ |
1567 | 126 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
|
127 free(asf); |
1 | 128 return 0; // not ASF guid |
129 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
130 if(asf->header.cno>256){ |
18011 | 131 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
|
132 free(asf); |
1 | 133 return 0; // invalid header??? |
134 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
135 demuxer->priv = asf; |
16175 | 136 return DEMUXER_TYPE_ASF; |
1 | 137 } |
138 | |
23239 | 139 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
|
140 { |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
141 int pos=0; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
142 uint8_t *buffer = &buf[0]; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
143 uint64_t avg_ft; |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
144 unsigned bitrate; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
145 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
146 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
|
147 int this_stream_num, stnamect, payct, i; |
23239 | 148 int buf_max_index=pos+50; |
149 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
|
150 buffer = &buf[pos]; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
151 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
152 // the following info is available |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
153 // 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
|
154 // starttime(8 bytes), endtime(8), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
155 // 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
|
156 // 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
|
157 // max-object-size(4), |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
158 // 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
|
159 |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
160 buffer += 8+8; |
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
161 bitrate = AV_RL32(buffer); |
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
162 buffer += 8*4; |
21945 | 163 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
|
164 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
165 if (this_stream_num == stream_num) { |
23239 | 166 buf_max_index+=14; |
167 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
|
168 buffer+=2; //skip stream-language-id-index |
23311 | 169 avg_ft = AV_RL64(buffer); // provided in 100ns units |
23239 | 170 buffer+=8; |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
171 asf->bps = bitrate / 8; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
172 |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
173 // 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
|
174 // payload-extension-system-count |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
175 // followed by associated info for each |
23239 | 176 stnamect = AV_RL16(buffer);buffer+=2; |
177 payct = AV_RL16(buffer);buffer+=2; | |
178 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
179 // need to read stream names if present in order |
23239 | 180 // to get lengths - values are ignored for now |
181 for (i=0; i<stnamect; i++) { | |
182 int stream_name_len; | |
183 buf_max_index+=4; | |
184 if (buf_max_index > buf_len) return 0; | |
185 buffer+=2; //language_id_index | |
186 stream_name_len = AV_RL16(buffer);buffer+=2; | |
187 buffer+=stream_name_len; //stream_name | |
188 buf_max_index+=stream_name_len; | |
189 if (buf_max_index > buf_len) return 0; | |
190 } | |
191 | |
192 if (is_video) { | |
193 asf->vid_repdata_count = payct; | |
194 asf->vid_repdata_sizes = malloc(payct*sizeof(int)); | |
195 } else { | |
196 asf->aud_repdata_count = payct; | |
197 asf->aud_repdata_sizes = malloc(payct*sizeof(int)); | |
198 } | |
199 | |
200 for (i=0; i<payct; i++) { | |
201 int payload_len; | |
202 buf_max_index+=22; | |
203 if (buf_max_index > buf_len) return 0; | |
204 // Each payload extension definition starts with a GUID. | |
205 // In dvr-ms files one of these indicates the presence an | |
206 // extension that contains pts values and this is always present | |
207 // in the video and audio streams. | |
208 // Another GUID indicates the presence of an extension | |
209 // that contains useful video frame demuxing information. | |
210 // Note that the extension data in each packet does not contain | |
211 // these GUIDs and that this header section defines the order the data | |
212 // will appear in. | |
213 if (memcmp(buffer, asf_dvr_ms_timing_rep_data, 16) == 0) { | |
214 if (is_video) | |
215 asf->vid_ext_timing_index = i; | |
216 else | |
217 asf->aud_ext_timing_index = i; | |
218 } else if (is_video && memcmp(buffer, asf_dvr_ms_vid_frame_rep_data, 16) == 0) | |
219 asf->vid_ext_frame_index = i; | |
220 buffer+=16; | |
221 | |
222 payload_len = AV_RL16(buffer);buffer+=2; | |
223 | |
224 if (is_video) | |
225 asf->vid_repdata_sizes[i] = payload_len; | |
226 else | |
227 asf->aud_repdata_sizes[i] = payload_len; | |
228 buffer+=4;//sys_len | |
229 } | |
230 | |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
231 return 1; |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
232 } |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
233 } |
23803
ec1a81c77628
fixed bug introduced with the addition of get_ext_stream_properties()
nicodvb
parents:
23737
diff
changeset
|
234 return 1; |
19961
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
235 } |
9f011e6892e8
interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents:
19124
diff
changeset
|
236 |
21610 | 237 #define CHECKDEC(l, n) if (((l) -= (n)) < 0) return 0 |
238 static char* read_meta_record(ASF_meta_record_t* dest, char* buf, | |
239 int* buf_len) | |
240 { | |
241 CHECKDEC(*buf_len, 2 + 2 + 2 + 2 + 4); | |
21945 | 242 dest->lang_list_index = AV_RL16(buf); |
243 dest->stream_num = AV_RL16(&buf[2]); | |
244 dest->name_length = AV_RL16(&buf[4]); | |
245 dest->data_type = AV_RL16(&buf[6]); | |
246 dest->data_length = AV_RL32(&buf[8]); | |
21610 | 247 buf += 2 + 2 + 2 + 2 + 4; |
248 CHECKDEC(*buf_len, dest->name_length); | |
249 dest->name = (uint16_t*)buf; | |
250 buf += dest->name_length; | |
251 CHECKDEC(*buf_len, dest->data_length); | |
252 dest->data = buf; | |
253 buf += dest->data_length; | |
254 return buf; | |
255 } | |
256 | |
257 static int get_meta(char *buf, int buf_len, int this_stream_num, | |
258 float* asp_ratio) | |
259 { | |
260 int pos = 0; | |
261 uint16_t records_count; | |
262 uint16_t x = 0, y = 0; | |
263 | |
264 if ((pos = find_asf_guid(buf, asf_metadata_header, pos, buf_len)) < 0) | |
265 return 0; | |
266 | |
267 CHECKDEC(buf_len, pos); | |
268 buf += pos; | |
269 CHECKDEC(buf_len, 2); | |
21945 | 270 records_count = AV_RL16(buf); |
21610 | 271 buf += 2; |
272 | |
273 while (records_count--) { | |
274 ASF_meta_record_t record_entry; | |
275 char* name; | |
276 | |
277 if (!(buf = read_meta_record(&record_entry, buf, &buf_len))) | |
278 return 0; | |
279 /* reserved, must be zero */ | |
280 if (record_entry.lang_list_index) | |
281 continue; | |
282 /* match stream number: 0 to match all */ | |
283 if (record_entry.stream_num && record_entry.stream_num != this_stream_num) | |
284 continue; | |
285 if (!(name = get_ucs2str(record_entry.name, record_entry.name_length))) { | |
286 mp_msg(MSGT_HEADER, MSGL_ERR, MSGTR_MemAllocFailed); | |
287 continue; | |
288 } | |
289 if (strcmp(name, "AspectRatioX") == 0) | |
21945 | 290 x = AV_RL16(record_entry.data); |
21610 | 291 else if (strcmp(name, "AspectRatioY") == 0) |
21945 | 292 y = AV_RL16(record_entry.data); |
21610 | 293 free(name); |
294 } | |
295 if (x && y) { | |
296 *asp_ratio = (float)x / (float)y; | |
297 return 1; | |
298 } | |
299 return 0; | |
300 } | |
301 | |
22409 | 302 static int is_drm(char* buf, int buf_len) |
303 { | |
304 uint32_t data_len, type_len, key_len, url_len; | |
305 int pos = find_asf_guid(buf, asf_content_encryption, 0, buf_len); | |
306 | |
307 if (pos < 0) | |
308 return 0; | |
309 | |
310 CHECKDEC(buf_len, pos + 4); | |
311 buf += pos; | |
312 data_len = AV_RL32(buf); | |
313 buf += 4; | |
314 CHECKDEC(buf_len, data_len); | |
315 buf += data_len; | |
316 type_len = AV_RL32(buf); | |
317 if (type_len < 4) | |
318 return 0; | |
319 CHECKDEC(buf_len, 4 + type_len + 4); | |
320 buf += 4; | |
321 | |
322 if (buf[0] != 'D' || buf[1] != 'R' || buf[2] != 'M' || buf[3] != '\0') | |
323 return 0; | |
324 | |
325 buf += type_len; | |
326 key_len = AV_RL32(buf); | |
327 CHECKDEC(buf_len, key_len + 4); | |
328 buf += 4; | |
329 | |
330 buf[key_len - 1] = '\0'; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
331 mp_msg(MSGT_HEADER, MSGL_V, "DRM Key ID: %s\n", buf); |
22409 | 332 |
333 buf += key_len; | |
334 url_len = AV_RL32(buf); | |
335 CHECKDEC(buf_len, url_len); | |
336 buf += 4; | |
337 | |
338 buf[url_len - 1] = '\0'; | |
339 mp_msg(MSGT_HEADER, MSGL_INFO, MSGTR_MPDEMUX_ASFHDR_DRMLicenseURL, buf); | |
340 return 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
341 } |
22409 | 342 |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
343 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
|
344 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
345 uint8_t *buffer = *buf; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
346 int pos = *ppos; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
347 |
32600 | 348 sh_audio->wf=calloc(FFMAX(streamh->type_size, sizeof(*sh_audio->wf)), 1); |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
349 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
|
350 le2me_WAVEFORMATEX(sh_audio->wf); |
32597
627c9e32c3f2
Move setup of sh_audio->format to a more appropriate place (in asfheader.c).
reimar
parents:
32537
diff
changeset
|
351 sh_audio->format=sh_audio->wf->wFormatTag; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
352 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
|
353 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
|
354 buffer = &hdr[pos]; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
355 pos += streamh->stream_size; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 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
|
362 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
363 } else { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
364 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
|
365 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
366 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
|
367 return 1; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
368 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
369 |
27691
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
370 static int find_backwards_asf_guid(char *buf, const char *guid, int cur_pos) |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
371 { |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
372 int i; |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
373 for (i=cur_pos-16; i>0; i--) { |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
374 if (memcmp(&buf[i], guid, 16) == 0) |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
375 return i + 16 + 8; // point after guid + length |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
376 } |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
377 return -1; |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
378 } |
db22dd913ac3
Move find_backwards_asf_guid asfguid.h to asfheader.c, the only place where
diego
parents:
27397
diff
changeset
|
379 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
380 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
|
381 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
|
382 int hdr_skip = 0; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
383 char *hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
384 char guid_buffer[16]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
385 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
|
386 uint32_t* streams = NULL; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
387 int audio_streams=0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
388 int video_streams=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
389 uint16_t stream_count=0; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
390 int best_video = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
391 int best_audio = -1; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
392 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
|
393 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
|
394 uint8_t *buffer; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
395 int audio_pos=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
396 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
397 if(hdr_len < 0) { |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
398 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
|
399 return 0; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
400 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
401 |
15795
546b49d7147d
M$ puts whole FAQs in these headers, so they can get really big...
reimar
parents:
15572
diff
changeset
|
402 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
|
403 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
|
404 hdr_len); |
20878
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
405 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
|
406 hdr_len = 1024 * 1024; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
407 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
408 hdr = malloc(hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
409 if (!hdr) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
410 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
|
411 hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
412 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
413 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
414 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
|
415 if (hdr_skip) |
908aa826d8ed
Try to handle oversized asf headers by ignoring anything beyond the first MB
reimar
parents:
19961
diff
changeset
|
416 stream_skip(demuxer->stream, hdr_skip); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
417 if (stream_eof(demuxer->stream)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
418 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
|
419 goto err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
420 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
421 |
22409 | 422 if (is_drm(hdr, hdr_len)) |
423 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_DRMProtected); | |
424 | |
19124 | 425 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
|
426 { |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
427 // 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
|
428 // 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
|
429 int sh_pos=0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
430 |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
431 sh_pos = find_backwards_asf_guid(hdr, asf_stream_header_guid, pos); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
432 |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
433 if (sh_pos > 0) { |
18670
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
diff
changeset
|
434 sh_audio_t *sh_audio; |
bf04d0097971
Fix declaration mixed in among statements in the recent dvr-ms code
pacman
parents:
18609
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 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
|
437 // 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
|
438 // initializes audio stream. |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 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
|
443 buffer = &hdr[audio_pos]; |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
30589
diff
changeset
|
444 sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F, NULL); |
30395 | 445 sh_audio->needs_parsing = 1; |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
446 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
|
447 ++audio_streams; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
448 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
|
449 goto len_err_out; |
23239 | 450 if (!get_ext_stream_properties(hdr, hdr_len, streamh->stream_no, asf, 0)) |
451 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
|
452 } |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
453 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
454 // find stream headers |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
455 // 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
|
456 // if we did find it then we want to avoid reading its header twice |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
457 if (audio_pos == 0) |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
458 pos = 0; |
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
459 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
460 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
|
461 { |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
462 streamh = (ASF_stream_header_t *)&hdr[pos]; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
463 pos += sizeof(ASF_stream_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
464 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
465 le2me_ASF_stream_header_t(streamh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
466 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
|
467 asf_chunk_type(streamh->type)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
468 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
|
469 asf_chunk_type(streamh->concealment)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
470 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
|
471 (int)streamh->type_size, (int)streamh->stream_size, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
472 (int)streamh->stream_no); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
473 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
|
474 (unsigned long)streamh->unk1, (unsigned int)streamh->unk2); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
475 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
|
476 // type-specific data: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
477 buffer = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
478 pos += streamh->type_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
479 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
480 switch(ASF_LOAD_GUID_PREFIX(streamh->type)){ |
1342 | 481 case ASF_GUID_PREFIX_audio_stream: { |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
30589
diff
changeset
|
482 sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F, NULL); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
483 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
|
484 ++audio_streams; |
18609
bb7042d74855
Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents:
18011
diff
changeset
|
485 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
|
486 goto len_err_out; |
426 | 487 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F; |
1 | 488 break; |
291 | 489 } |
1342 | 490 case ASF_GUID_PREFIX_video_stream: { |
23089 | 491 unsigned int len; |
492 float asp_ratio; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
493 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
|
494 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "asfheader", streamh->stream_no & 0x7F); |
23089 | 495 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
|
496 ++video_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
497 // sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize); |
32100 | 498 sh_video->bih=calloc((len<sizeof(*sh_video->bih))?sizeof(*sh_video->bih):len,1); |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
499 memcpy(sh_video->bih,&buffer[4+4+1+2],len); |
1342 | 500 le2me_BITMAPINFOHEADER(sh_video->bih); |
32100 | 501 if (sh_video->bih->biSize > len && sh_video->bih->biSize > sizeof(*sh_video->bih)) |
21967 | 502 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
|
503 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
|
504 //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
|
505 //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
|
506 //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
|
507 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
|
508 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
|
509 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
|
510 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
|
511 } else asf->asf_is_dvr_ms=0; |
23239 | 512 if (!get_ext_stream_properties(hdr, hdr_len, streamh->stream_no, asf, 1)) |
513 goto len_err_out; | |
21610 | 514 if (get_meta(hdr, hdr_len, streamh->stream_no, &asp_ratio)) { |
515 sh_video->aspect = asp_ratio * sh_video->bih->biWidth / | |
516 sh_video->bih->biHeight; | |
517 } | |
23357
ab5ff1c5ccaa
Set i_bps for ASF video streams according to extended stream properties
zuxy
parents:
23311
diff
changeset
|
518 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
|
519 |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
520 if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V); |
1 | 521 //asf_video_id=streamh.stream_no & 0x7F; |
426 | 522 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F; |
1 | 523 break; |
291 | 524 } |
1 | 525 } |
526 // stream-specific data: | |
527 // 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
|
528 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
529 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
530 // find file header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
531 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
|
532 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
533 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
|
534 pos += sizeof(ASF_file_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
535 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
536 le2me_ASF_file_header_t(fileh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
537 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
|
538 "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
|
539 "preroll: %d\n", |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
540 (int)fileh->num_packets, (int)fileh->flags, |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
541 (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
|
542 (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
|
543 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
|
544 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
|
545 asf->packetrate=fileh->max_bitrate/8.0/(double)asf->packetsize; |
33404 | 546 asf->movielength=FFMAX(0.0, (fileh->play_duration / 10000.0 - fileh->preroll) / 1000.0); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
547 } |
1 | 548 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
549 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
550 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
|
551 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
552 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
|
553 char *string=NULL; |
21445 | 554 uint16_t* wstring = NULL; |
555 uint16_t len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
556 pos += sizeof(ASF_content_description_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
557 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
558 le2me_ASF_content_description_t(contenth); |
1567 | 559 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
|
560 // extract the title |
21445 | 561 if((len = contenth->title_size) != 0) { |
562 wstring = (uint16_t*)&hdr[pos]; | |
563 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
564 if (pos > hdr_len) goto len_err_out; |
21445 | 565 if ((string = get_ucs2str(wstring, len))) { |
566 mp_msg(MSGT_HEADER,MSGL_V," Title: %s\n", string); | |
29288
4a1c217a844b
In all demux_info_add calls change "name" to "title".
reimar
parents:
29263
diff
changeset
|
567 demux_info_add(demuxer, "title", string); |
21445 | 568 free(string); |
569 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
570 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
571 // extract the author |
21445 | 572 if((len = contenth->author_size) != 0) { |
573 wstring = (uint16_t*)&hdr[pos]; | |
574 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
575 if (pos > hdr_len) goto len_err_out; |
21445 | 576 if ((string = get_ucs2str(wstring, len))) { |
577 mp_msg(MSGT_HEADER,MSGL_V," Author: %s\n", string); | |
578 demux_info_add(demuxer, "author", string); | |
579 free(string); | |
580 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
581 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
582 // extract the copyright |
21445 | 583 if((len = contenth->copyright_size) != 0) { |
584 wstring = (uint16_t*)&hdr[pos]; | |
585 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
586 if (pos > hdr_len) goto len_err_out; |
21445 | 587 if ((string = get_ucs2str(wstring, len))) { |
588 mp_msg(MSGT_HEADER,MSGL_V," Copyright: %s\n", string); | |
589 demux_info_add(demuxer, "copyright", string); | |
590 free(string); | |
591 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
592 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
593 // extract the comment |
21445 | 594 if((len = contenth->comment_size) != 0) { |
595 wstring = (uint16_t*)&hdr[pos]; | |
596 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
597 if (pos > hdr_len) goto len_err_out; |
21445 | 598 if ((string = get_ucs2str(wstring, len))) { |
599 mp_msg(MSGT_HEADER,MSGL_V," Comment: %s\n", string); | |
600 demux_info_add(demuxer, "comments", string); | |
601 free(string); | |
602 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
603 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
604 // extract the rating |
21445 | 605 if((len = contenth->rating_size) != 0) { |
606 wstring = (uint16_t*)&hdr[pos]; | |
607 pos += len; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
608 if (pos > hdr_len) goto len_err_out; |
21445 | 609 if ((string = get_ucs2str(wstring, len))) { |
610 mp_msg(MSGT_HEADER,MSGL_V," Rating: %s\n", string); | |
611 free(string); | |
612 } | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
613 } |
1567 | 614 mp_msg(MSGT_HEADER,MSGL_V,"\n"); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
615 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
616 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
617 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
618 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
|
619 if (pos >= 0) { |
27211
580ddfaa46d4
Fix stupid and almost pointless check-after-read code in asfheader.c.
reimar
parents:
26325
diff
changeset
|
620 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
|
621 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
|
622 uint32_t max_bitrate; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
623 char *ptr = &hdr[pos]; |
12219 | 624 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
|
625 if(max_streams <= 0) goto len_err_out; |
21945 | 626 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
|
627 ptr += sizeof(uint16_t); |
27211
580ddfaa46d4
Fix stupid and almost pointless check-after-read code in asfheader.c.
reimar
parents:
26325
diff
changeset
|
628 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
|
629 if(stream_count > 0) |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18809
diff
changeset
|
630 streams = malloc(2*stream_count*sizeof(uint32_t)); |
12219 | 631 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
|
632 for( i=0 ; i<stream_count ; i++ ) { |
21945 | 633 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
|
634 ptr += sizeof(uint16_t); |
31619 | 635 max_bitrate = AV_RL32(ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
636 ptr += sizeof(uint32_t); |
12219 | 637 mp_msg(MSGT_HEADER,MSGL_V," stream id=[0x%x][%u]\n", stream_id, stream_id ); |
638 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
|
639 streams[2*i] = stream_id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
640 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
|
641 } |
12219 | 642 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
|
643 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
644 free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
645 hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
646 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
|
647 stream_read(demuxer->stream, guid_buffer, 16); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
648 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
|
649 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_NoDataChunkAfterHeader); |
18809 | 650 free(streams); |
651 streams = NULL; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
652 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
653 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
654 // read length of chunk |
31619 | 655 data_len = stream_read_qword_le(demuxer->stream); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
656 demuxer->movi_start = stream_tell(demuxer->stream) + 26; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
657 demuxer->movi_end = start + data_len; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
658 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
|
659 (int)demuxer->movi_start, (int)demuxer->movi_end); |
1 | 660 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
661 if(streams) { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
662 // 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
|
663 // 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
|
664 #if 0 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
665 uint32_t vr = 0, ar = 0,i; |
31683
db0b49579eeb
Rename network build system variable and command line option to networking.
diego
parents:
31619
diff
changeset
|
666 #ifdef CONFIG_NETWORKING |
6645
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
667 if( demuxer->stream->streaming_ctrl!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
668 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
|
669 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
|
670 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
|
671 } |
6666 | 672 } else |
673 #endif | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
674 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
|
675 uint32_t id = streams[2*i]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
676 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
|
677 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
|
678 vr = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
679 best_video = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
680 } 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
|
681 ar = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
682 best_audio = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
683 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
684 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
685 #endif |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
686 free(streams); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
687 streams = NULL; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
688 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
689 |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
690 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
|
691 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
|
692 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
|
693 if(!video_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
694 if(!audio_streams){ |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
695 mp_msg(MSGT_HEADER,MSGL_ERR,MSGTR_MPDEMUX_ASFHDR_AudioVideoHeaderNotFound); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
696 return 0; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
697 } |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
698 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
|
699 } 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
|
700 |
1 | 701 #if 0 |
17932 | 702 if( mp_msg_test(MSGT_HEADER,MSGL_V) ){ |
1 | 703 printf("ASF duration: %d\n",(int)fileh.duration); |
704 printf("ASF start pts: %d\n",(int)fileh.start_timestamp); | |
705 printf("ASF end pts: %d\n",(int)fileh.end_timestamp); | |
706 } | |
707 #endif | |
708 | |
709 return 1; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
710 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
711 len_err_out: |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
712 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
|
713 err_out: |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32100
diff
changeset
|
714 free(hdr); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32100
diff
changeset
|
715 free(streams); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
716 return 0; |
1 | 717 } |