Mercurial > mplayer.hg
annotate libmpdemux/asfheader.c @ 18001:a2683ee7cb5a
fix descrambling of asf file,
where signed buffer could cause erroneous values to be filled in descrable variables,
add misssing check for one of these variables
and restore sign of these variables as insurance that these checks will work even in such case.
author | iive |
---|---|
date | Thu, 30 Mar 2006 23:06:18 +0000 |
parents | 2545bbd91450 |
children | 11c9dfbe120c |
rev | line source |
---|---|
1 | 1 // .asf fileformat docs from http://divx.euro.ru |
2 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
3 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
4 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
5 #include <stdlib.h> |
1430 | 6 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
7 |
1567 | 8 #include "config.h" |
9 #include "mp_msg.h" | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
10 #include "help_mp.h" |
1567 | 11 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
12 #include "stream.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
13 #include "demuxer.h" |
2338 | 14 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
15 |
1342 | 16 #include "asf.h" |
833 | 17 |
1342 | 18 #ifdef ARCH_X86 |
19 #define ASF_LOAD_GUID_PREFIX(guid) (*(uint32_t *)(guid)) | |
20 #else | |
21 #define ASF_LOAD_GUID_PREFIX(guid) \ | |
22 ((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0]) | |
23 #endif | |
1 | 24 |
1342 | 25 #define ASF_GUID_PREFIX_audio_stream 0xF8699E40 |
26 #define ASF_GUID_PREFIX_video_stream 0xBC19EFC0 | |
27 #define ASF_GUID_PREFIX_audio_conceal_none 0x49f1a440 | |
28 #define ASF_GUID_PREFIX_audio_conceal_interleave 0xbfc3cd50 | |
29 #define ASF_GUID_PREFIX_header 0x75B22630 | |
30 #define ASF_GUID_PREFIX_data_chunk 0x75b22636 | |
31 #define ASF_GUID_PREFIX_index_chunk 0x33000890 | |
32 #define ASF_GUID_PREFIX_stream_header 0xB7DC0791 | |
33 #define ASF_GUID_PREFIX_header_2_0 0xD6E229D1 | |
34 #define ASF_GUID_PREFIX_file_header 0x8CABDCA1 | |
35 #define ASF_GUID_PREFIX_content_desc 0x75b22633 | |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
36 #define ASF_GUID_PREFIX_stream_group 0x7bf875ce |
1 | 37 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
38 /* |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
39 const char asf_audio_stream_guid[16] = {0x40, 0x9e, 0x69, 0xf8, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
40 0x4d, 0x5b, 0xcf, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
41 const char asf_video_stream_guid[16] = {0xc0, 0xef, 0x19, 0xbc, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
42 0x4d, 0x5b, 0xcf, 0x11, 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b}; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
43 */ |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
44 const char asf_stream_header_guid[16] = {0x91, 0x07, 0xdc, 0xb7, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
45 0xb7, 0xa9, 0xcf, 0x11, 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
46 const char asf_file_header_guid[16] = {0xa1, 0xdc, 0xab, 0x8c, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
47 0x47, 0xa9, 0xcf, 0x11, 0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65}; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
48 const char asf_content_desc_guid[16] = {0x33, 0x26, 0xb2, 0x75, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
49 0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
50 const char asf_stream_group_guid[16] = {0xce, 0x75, 0xf8, 0x7b, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
51 0x8d, 0x46, 0xd1, 0x11, 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
52 const char asf_data_chunk_guid[16] = {0x36, 0x26, 0xb2, 0x75, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
53 0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c}; |
1 | 54 |
55 | |
833 | 56 // the variable string is modify in this function |
57 void pack_asf_string(char* string, int length) { | |
58 int i,j; | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
59 if( string==NULL ) return; |
833 | 60 for( i=0, j=0; i<length && string[i]!='\0'; i+=2, j++) { |
61 string[j]=string[i]; | |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
62 } |
833 | 63 string[j]='\0'; |
64 } | |
65 | |
66 // the variable string is modify in this function | |
67 void print_asf_string(const char* name, char* string, int length) { | |
68 pack_asf_string(string, length); | |
1567 | 69 mp_msg(MSGT_HEADER,MSGL_V,"%s%s\n", name, string); |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
70 } |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
71 |
1342 | 72 static char* asf_chunk_type(unsigned char* guid) { |
73 static char tmp[60]; | |
74 char *p; | |
75 int i; | |
76 | |
77 switch(ASF_LOAD_GUID_PREFIX(guid)){ | |
78 case ASF_GUID_PREFIX_audio_stream: | |
79 return "guid_audio_stream"; | |
80 case ASF_GUID_PREFIX_video_stream: | |
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"; | |
94 case ASF_GUID_PREFIX_header_2_0: | |
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"; | |
100 default: | |
101 strcpy(tmp, "unknown guid "); | |
102 p = tmp + strlen(tmp); | |
103 for (i = 0; i < 16; i++) { | |
104 if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-'; | |
105 sprintf(p, "%02x", guid[i]); | |
106 p += 2; | |
107 } | |
108 return tmp; | |
1 | 109 } |
110 } | |
111 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
112 int asf_check_header(demuxer_t *demuxer){ |
1 | 113 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
|
114 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
|
115 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
|
116 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
|
117 le2me_ASF_header_t(&asf->header); // swap to machine endian |
1 | 118 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); |
119 // 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
|
120 if(memcmp(asfhdrguid,asf->header.objh.guid,16)){ |
1567 | 121 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
|
122 free(asf); |
1 | 123 return 0; // not ASF guid |
124 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
125 if(asf->header.cno>256){ |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
126 free(asf); |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
127 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asf->header.cno); |
1 | 128 return 0; // invalid header??? |
129 } | |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
130 demuxer->priv = asf; |
16175 | 131 return DEMUXER_TYPE_ASF; |
1 | 132 } |
133 | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
134 extern void print_wave_header(WAVEFORMATEX *h, int verbose_level); |
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
135 extern void print_video_header(BITMAPINFOHEADER *h, int verbose_level); |
601 | 136 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
137 int find_asf_guid(char *buf, const char *guid, int cur_pos, int buf_len) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
138 { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
139 int i; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
140 for (i = cur_pos; i < buf_len - 19; i++) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
141 if (memcmp(&buf[i], guid, 16) == 0) |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
142 return i + 16 + 8; // point after guid + length |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
143 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
144 return -1; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
145 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
146 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
147 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
|
148 int hdr_len = asf->header.objh.size - sizeof(asf->header); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
149 char *hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
150 char guid_buffer[16]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
151 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
|
152 uint32_t* streams = NULL; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
153 int audio_streams=0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
154 int video_streams=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
155 uint16_t stream_count=0; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
156 int best_video = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
157 int best_audio = -1; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
158 uint64_t data_len; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
159 |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
160 if(hdr_len < 0) { |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
161 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
|
162 return 0; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
163 } |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
164 |
15795
546b49d7147d
M$ puts whole FAQs in these headers, so they can get really big...
reimar
parents:
15572
diff
changeset
|
165 if (hdr_len > 1024 * 1024) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
166 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_HeaderSizeOver1MB, |
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
167 hdr_len); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
168 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
169 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
170 hdr = malloc(hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
171 if (!hdr) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
172 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
|
173 hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
174 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
175 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
176 stream_read(demuxer->stream, hdr, hdr_len); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
177 if (stream_eof(demuxer->stream)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
178 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
|
179 goto err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
180 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
181 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
182 // find stream headers |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
183 pos = 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
184 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
|
185 { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
186 ASF_stream_header_t *streamh = (ASF_stream_header_t *)&hdr[pos]; |
18001 | 187 uint8_t *buffer; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
188 pos += sizeof(ASF_stream_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
189 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
190 le2me_ASF_stream_header_t(streamh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
191 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
|
192 asf_chunk_type(streamh->type)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
193 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
|
194 asf_chunk_type(streamh->concealment)); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
195 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
|
196 (int)streamh->type_size, (int)streamh->stream_size, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
197 (int)streamh->stream_no); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
198 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
|
199 (unsigned long)streamh->unk1, (unsigned int)streamh->unk2); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
200 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
|
201 // type-specific data: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
202 buffer = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
203 pos += streamh->type_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
204 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
205 switch(ASF_LOAD_GUID_PREFIX(streamh->type)){ |
1342 | 206 case ASF_GUID_PREFIX_audio_stream: { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
207 sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh->stream_no & 0x7F); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
208 ++audio_streams; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
209 sh_audio->wf=calloc((streamh->type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh->type_size,1); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
210 memcpy(sh_audio->wf,buffer,streamh->type_size); |
1342 | 211 le2me_WAVEFORMATEX(sh_audio->wf); |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
212 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
213 if(ASF_LOAD_GUID_PREFIX(streamh->concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){ |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
214 buffer = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
215 pos += streamh->stream_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
216 if (pos > hdr_len) goto len_err_out; |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
217 asf->scrambling_h=buffer[0]; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
218 asf->scrambling_w=(buffer[2]<<8)|buffer[1]; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
219 asf->scrambling_b=(buffer[4]<<8)|buffer[3]; |
18001 | 220 if(asf->scrambling_b>0){ |
221 asf->scrambling_w/=asf->scrambling_b; | |
222 } | |
1 | 223 } else { |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
224 asf->scrambling_b=asf->scrambling_h=asf->scrambling_w=1; |
1 | 225 } |
17992
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
226 mp_msg(MSGT_HEADER,MSGL_V,"ASF: audio scrambling: %d x %d x %d\n",asf->scrambling_h,asf->scrambling_w,asf->scrambling_b); |
426 | 227 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F; |
1 | 228 break; |
291 | 229 } |
1342 | 230 case ASF_GUID_PREFIX_video_stream: { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
231 sh_video_t* sh_video=new_sh_video(demuxer,streamh->stream_no & 0x7F); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
232 unsigned int 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
|
233 ++video_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
234 // 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
|
235 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
|
236 memcpy(sh_video->bih,&buffer[4+4+1+2],len); |
1342 | 237 le2me_BITMAPINFOHEADER(sh_video->bih); |
15572 | 238 if (sh_video->bih->biCompression == mmioFOURCC('D', 'V', 'R', ' ')) |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
239 mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_MPDEMUX_ASFHDR_DVRWantsLibavformat); |
426 | 240 //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
241 //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
242 if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V); |
1 | 243 //asf_video_id=streamh.stream_no & 0x7F; |
426 | 244 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F; |
1 | 245 break; |
291 | 246 } |
1 | 247 } |
248 // stream-specific data: | |
249 // 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
|
250 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
251 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
252 // find file header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
253 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
|
254 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
255 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
|
256 pos += sizeof(ASF_file_header_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
257 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
258 le2me_ASF_file_header_t(fileh); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
259 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
|
260 "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
|
261 "preroll: %d\n", |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
262 (int)fileh->num_packets, (int)fileh->flags, |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
263 (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
|
264 (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
|
265 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
|
266 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
|
267 asf->packetrate=fileh->max_bitrate/8.0/(double)asf->packetsize; |
2545bbd91450
Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents:
17977
diff
changeset
|
268 asf->movielength=fileh->send_duration/10000000LL; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
269 } |
1 | 270 |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
271 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
272 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
|
273 if (pos >= 0) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
274 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
|
275 char *string=NULL; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
276 pos += sizeof(ASF_content_description_t); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
277 if (pos > hdr_len) goto len_err_out; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
278 le2me_ASF_content_description_t(contenth); |
1567 | 279 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
|
280 // extract the title |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
281 if( contenth->title_size!=0 ) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
282 string = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
283 pos += contenth->title_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
284 if (pos > hdr_len) goto len_err_out; |
17932 | 285 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
286 print_asf_string(" Title: ", string, contenth->title_size); |
3070 | 287 else |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
288 pack_asf_string(string, contenth->title_size); |
3070 | 289 demux_info_add(demuxer, "name", string); |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
290 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
291 // extract the author |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
292 if( contenth->author_size!=0 ) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
293 string = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
294 pos += contenth->author_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
295 if (pos > hdr_len) goto len_err_out; |
17932 | 296 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
297 print_asf_string(" Author: ", string, contenth->author_size); |
3070 | 298 else |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
299 pack_asf_string(string, contenth->author_size); |
3070 | 300 demux_info_add(demuxer, "author", string); |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
301 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
302 // extract the copyright |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
303 if( contenth->copyright_size!=0 ) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
304 string = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
305 pos += contenth->copyright_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
306 if (pos > hdr_len) goto len_err_out; |
17932 | 307 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
308 print_asf_string(" Copyright: ", string, contenth->copyright_size); |
3070 | 309 else |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
310 pack_asf_string(string, contenth->copyright_size); |
3070 | 311 demux_info_add(demuxer, "copyright", string); |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
312 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
313 // extract the comment |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
314 if( contenth->comment_size!=0 ) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
315 string = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
316 pos += contenth->comment_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
317 if (pos > hdr_len) goto len_err_out; |
17932 | 318 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
319 print_asf_string(" Comment: ", string, contenth->comment_size); |
3070 | 320 else |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
321 pack_asf_string(string, contenth->comment_size); |
3070 | 322 demux_info_add(demuxer, "comments", string); |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
323 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
324 // extract the rating |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
325 if( contenth->rating_size!=0 ) { |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
326 string = &hdr[pos]; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
327 pos += contenth->rating_size; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
328 if (pos > hdr_len) goto len_err_out; |
17932 | 329 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
330 print_asf_string(" Rating: ", string, contenth->rating_size); |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
331 } |
1567 | 332 mp_msg(MSGT_HEADER,MSGL_V,"\n"); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
333 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
334 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
335 // find content header |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
336 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
|
337 if (pos >= 0) { |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
338 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
|
339 uint32_t max_bitrate; |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
340 char *ptr = &hdr[pos]; |
12219 | 341 mp_msg(MSGT_HEADER,MSGL_V,"============ ASF Stream group == START ===\n"); |
5618
f02b9bec4eed
Changed the big handling to make it use mplayer's endian macros.
bertrand
parents:
5597
diff
changeset
|
342 stream_count = le2me_16(*(uint16_t*)ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
343 ptr += sizeof(uint16_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
344 if (ptr > &hdr[hdr_len]) goto len_err_out; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
345 if(stream_count > 0) |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
346 streams = (uint32_t*)malloc(2*stream_count*sizeof(uint32_t)); |
12219 | 347 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
|
348 for( i=0 ; i<stream_count ; i++ ) { |
5618
f02b9bec4eed
Changed the big handling to make it use mplayer's endian macros.
bertrand
parents:
5597
diff
changeset
|
349 stream_id = le2me_16(*(uint16_t*)ptr); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
350 ptr += sizeof(uint16_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
351 if (ptr > &hdr[hdr_len]) goto len_err_out; |
6187
50858d90c8d0
On the sun all int32 objects have to be aligned on 32 bit boundaries. With
arpi
parents:
5618
diff
changeset
|
352 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
|
353 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
|
354 ptr += sizeof(uint32_t); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
355 if (ptr > &hdr[hdr_len]) goto len_err_out; |
12219 | 356 mp_msg(MSGT_HEADER,MSGL_V," stream id=[0x%x][%u]\n", stream_id, stream_id ); |
357 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
|
358 streams[2*i] = stream_id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
359 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
|
360 } |
12219 | 361 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
|
362 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
363 free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
364 hdr = NULL; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
365 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
|
366 stream_read(demuxer->stream, guid_buffer, 16); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
367 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
|
368 mp_msg(MSGT_HEADER, MSGL_FATAL, MSGTR_MPDEMUX_ASFHDR_NoDataChunkAfterHeader); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
369 return 0; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
370 } |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
371 // read length of chunk |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
372 stream_read(demuxer->stream, (char *)&data_len, sizeof(data_len)); |
16149 | 373 data_len = le2me_64(data_len); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
374 demuxer->movi_start = stream_tell(demuxer->stream) + 26; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
375 demuxer->movi_end = start + data_len; |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
376 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
|
377 (int)demuxer->movi_start, (int)demuxer->movi_end); |
1 | 378 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
379 if(streams) { |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
380 // 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
|
381 // 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
|
382 #if 0 |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
383 uint32_t vr = 0, ar = 0,i; |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
8208
diff
changeset
|
384 #ifdef MPLAYER_NETWORK |
6645
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
385 if( demuxer->stream->streaming_ctrl!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
386 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
|
387 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
|
388 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
|
389 } |
6666 | 390 } else |
391 #endif | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
392 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
|
393 uint32_t id = streams[2*i]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
394 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
|
395 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
|
396 vr = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
397 best_video = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
398 } 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
|
399 ar = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
400 best_audio = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
401 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
402 } |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
403 #endif |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
404 free(streams); |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
405 streams = NULL; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
406 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
407 |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
408 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
|
409 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
|
410 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
|
411 if(!video_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
412 if(!audio_streams){ |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
413 mp_msg(MSGT_HEADER,MSGL_ERR,MSGTR_MPDEMUX_ASFHDR_AudioVideoHeaderNotFound); |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
414 return 0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
415 } |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
416 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
|
417 } 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
|
418 |
1 | 419 #if 0 |
17932 | 420 if( mp_msg_test(MSGT_HEADER,MSGL_V) ){ |
1 | 421 printf("ASF duration: %d\n",(int)fileh.duration); |
422 printf("ASF start pts: %d\n",(int)fileh.start_timestamp); | |
423 printf("ASF end pts: %d\n",(int)fileh.end_timestamp); | |
424 } | |
425 #endif | |
426 | |
427 return 1; | |
14236
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
428 |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
429 len_err_out: |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
16175
diff
changeset
|
430 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
|
431 err_out: |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
432 if (hdr) free(hdr); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
433 if (streams) free(streams); |
2dc4595c3998
fix stream selection and -bandwidth for mms-over-http.
reimar
parents:
12219
diff
changeset
|
434 return 0; |
1 | 435 } |