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