Mercurial > mplayer.hg
annotate libmpdemux/asfheader.c @ 7492:5465cbd5c5ef
Modern versions of OpenSSH listen on localhost to forward the X11 connection
(X11UseLocalhost defaults to yes). The following patch permits to consider
as non local any DISPLAY environment which port is greater or equal to 10
else mplayer tries a local optimization on a distant X server which doesn't
work.
patch by Denis.Ducamp@groar.org
author | arpi |
---|---|
date | Mon, 23 Sep 2002 21:17:30 +0000 |
parents | 349138a7b414 |
children | e44ec5681211 |
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 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
8 extern int verbose; // defined in mplayer.c |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
9 |
1567 | 10 #include "config.h" |
11 #include "mp_msg.h" | |
12 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
13 #include "stream.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
14 #include "demuxer.h" |
2338 | 15 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
16 |
1342 | 17 #include "asf.h" |
833 | 18 |
1342 | 19 #ifdef ARCH_X86 |
20 #define ASF_LOAD_GUID_PREFIX(guid) (*(uint32_t *)(guid)) | |
21 #else | |
22 #define ASF_LOAD_GUID_PREFIX(guid) \ | |
23 ((guid)[3] << 24 | (guid)[2] << 16 | (guid)[1] << 8 | (guid)[0]) | |
24 #endif | |
1 | 25 |
1342 | 26 #define ASF_GUID_PREFIX_audio_stream 0xF8699E40 |
27 #define ASF_GUID_PREFIX_video_stream 0xBC19EFC0 | |
28 #define ASF_GUID_PREFIX_audio_conceal_none 0x49f1a440 | |
29 #define ASF_GUID_PREFIX_audio_conceal_interleave 0xbfc3cd50 | |
30 #define ASF_GUID_PREFIX_header 0x75B22630 | |
31 #define ASF_GUID_PREFIX_data_chunk 0x75b22636 | |
32 #define ASF_GUID_PREFIX_index_chunk 0x33000890 | |
33 #define ASF_GUID_PREFIX_stream_header 0xB7DC0791 | |
34 #define ASF_GUID_PREFIX_header_2_0 0xD6E229D1 | |
35 #define ASF_GUID_PREFIX_file_header 0x8CABDCA1 | |
36 #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
|
37 #define ASF_GUID_PREFIX_stream_group 0x7bf875ce |
1 | 38 |
39 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
40 static ASF_header_t asfh; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
41 static ASF_obj_header_t objh; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
42 static ASF_file_header_t fileh; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
43 static ASF_stream_header_t streamh; |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
44 static ASF_content_description_t contenth; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
45 |
1 | 46 unsigned char* asf_packet=NULL; |
47 int asf_scrambling_h=1; | |
48 int asf_scrambling_w=1; | |
49 int asf_scrambling_b=1; | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
50 int asf_packetsize=0; |
1 | 51 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
52 //int i; |
1 | 53 |
833 | 54 // the variable string is modify in this function |
55 void pack_asf_string(char* string, int length) { | |
56 int i,j; | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
57 if( string==NULL ) return; |
833 | 58 for( i=0, j=0; i<length && string[i]!='\0'; i+=2, j++) { |
59 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
|
60 } |
833 | 61 string[j]='\0'; |
62 } | |
63 | |
64 // the variable string is modify in this function | |
65 void print_asf_string(const char* name, char* string, int length) { | |
66 pack_asf_string(string, length); | |
1567 | 67 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
|
68 } |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
69 |
1342 | 70 static char* asf_chunk_type(unsigned char* guid) { |
71 static char tmp[60]; | |
72 char *p; | |
73 int i; | |
74 | |
75 switch(ASF_LOAD_GUID_PREFIX(guid)){ | |
76 case ASF_GUID_PREFIX_audio_stream: | |
77 return "guid_audio_stream"; | |
78 case ASF_GUID_PREFIX_video_stream: | |
79 return "guid_video_stream"; | |
80 case ASF_GUID_PREFIX_audio_conceal_none: | |
81 return "guid_audio_conceal_none"; | |
82 case ASF_GUID_PREFIX_audio_conceal_interleave: | |
83 return "guid_audio_conceal_interleave"; | |
84 case ASF_GUID_PREFIX_header: | |
85 return "guid_header"; | |
86 case ASF_GUID_PREFIX_data_chunk: | |
87 return "guid_data_chunk"; | |
88 case ASF_GUID_PREFIX_index_chunk: | |
89 return "guid_index_chunk"; | |
90 case ASF_GUID_PREFIX_stream_header: | |
91 return "guid_stream_header"; | |
92 case ASF_GUID_PREFIX_header_2_0: | |
93 return "guid_header_2_0"; | |
94 case ASF_GUID_PREFIX_file_header: | |
95 return "guid_file_header"; | |
96 case ASF_GUID_PREFIX_content_desc: | |
97 return "guid_content_desc"; | |
98 default: | |
99 strcpy(tmp, "unknown guid "); | |
100 p = tmp + strlen(tmp); | |
101 for (i = 0; i < 16; i++) { | |
102 if ((1 << i) & ((1<<4) | (1<<6) | (1<<8))) *p++ = '-'; | |
103 sprintf(p, "%02x", guid[i]); | |
104 p += 2; | |
105 } | |
106 return tmp; | |
1 | 107 } |
108 } | |
109 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
110 int asf_check_header(demuxer_t *demuxer){ |
1 | 111 unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C}; |
112 stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj | |
1342 | 113 le2me_ASF_header_t(&asfh); // swap to machine endian |
1 | 114 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); |
115 // for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n"); | |
116 if(memcmp(asfhdrguid,asfh.objh.guid,16)){ | |
1567 | 117 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: not ASF guid!\n"); |
1 | 118 return 0; // not ASF guid |
119 } | |
120 if(asfh.cno>256){ | |
1567 | 121 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asfh.cno); |
1 | 122 return 0; // invalid header??? |
123 } | |
124 return 1; | |
125 } | |
126 | |
601 | 127 extern void print_wave_header(WAVEFORMATEX *h); |
128 extern void print_video_header(BITMAPINFOHEADER *h); | |
129 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
130 int read_asf_header(demuxer_t *demuxer){ |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
131 static unsigned char buffer[1024]; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
132 uint32_t* streams = NULL; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
133 int audio_streams=0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
134 int video_streams=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
135 uint16_t stream_count=0; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
136 int best_video = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
137 int best_audio = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
138 |
1 | 139 #if 1 |
340 | 140 //printf("ASF file! (subchunks: %d)\n",asfh.cno); |
1 | 141 while(!stream_eof(demuxer->stream)){ |
142 int pos,endpos; | |
143 pos=stream_tell(demuxer->stream); | |
144 stream_read(demuxer->stream,(char*) &objh,sizeof(objh)); | |
1342 | 145 le2me_ASF_obj_header_t(&objh); |
1 | 146 if(stream_eof(demuxer->stream)) break; // EOF |
147 endpos=pos+objh.size; | |
148 // for(i=0;i<16;i++) printf("%02X ",objh.guid[i]); | |
340 | 149 //printf("0x%08X [%s] %d\n",pos, asf_chunk_type(objh.guid),(int) objh.size); |
1342 | 150 switch(ASF_LOAD_GUID_PREFIX(objh.guid)){ |
151 case ASF_GUID_PREFIX_stream_header: | |
1 | 152 stream_read(demuxer->stream,(char*) &streamh,sizeof(streamh)); |
1342 | 153 le2me_ASF_stream_header_t(&streamh); |
154 if(verbose){ | |
1567 | 155 mp_msg(MSGT_HEADER,MSGL_V,"stream type: %s\n",asf_chunk_type(streamh.type)); |
156 mp_msg(MSGT_HEADER,MSGL_V,"stream concealment: %s\n",asf_chunk_type(streamh.concealment)); | |
157 mp_msg(MSGT_HEADER,MSGL_V,"type: %d bytes, stream: %d bytes ID: %d\n",(int)streamh.type_size,(int)streamh.stream_size,(int)streamh.stream_no); | |
158 mp_msg(MSGT_HEADER,MSGL_V,"unk1: %lX unk2: %X\n",(unsigned long)streamh.unk1,(unsigned int)streamh.unk2); | |
159 mp_msg(MSGT_HEADER,MSGL_V,"FILEPOS=0x%X\n",stream_tell(demuxer->stream)); | |
1342 | 160 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
161 if(streamh.type_size>1024 || streamh.stream_size>1024){ |
1567 | 162 mp_msg(MSGT_HEADER,MSGL_FATAL,"FATAL: header size bigger than 1024 bytes!\n" |
163 "Please contact mplayer authors, and upload/send this file.\n"); | |
1631 | 164 return 0; |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
165 } |
1 | 166 // type-specific data: |
167 stream_read(demuxer->stream,(char*) buffer,streamh.type_size); | |
1342 | 168 switch(ASF_LOAD_GUID_PREFIX(streamh.type)){ |
169 case ASF_GUID_PREFIX_audio_stream: { | |
1289 | 170 sh_audio_t* sh_audio=new_sh_audio(demuxer,streamh.stream_no & 0x7F); |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
171 ++audio_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
172 sh_audio->wf=calloc((streamh.type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh.type_size,1); |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
173 memcpy(sh_audio->wf,buffer,streamh.type_size); |
1342 | 174 le2me_WAVEFORMATEX(sh_audio->wf); |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
175 if(verbose>=1) print_wave_header(sh_audio->wf); |
1342 | 176 if(ASF_LOAD_GUID_PREFIX(streamh.concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){ |
1 | 177 stream_read(demuxer->stream,(char*) buffer,streamh.stream_size); |
178 asf_scrambling_h=buffer[0]; | |
179 asf_scrambling_w=(buffer[2]<<8)|buffer[1]; | |
180 asf_scrambling_b=(buffer[4]<<8)|buffer[3]; | |
181 asf_scrambling_w/=asf_scrambling_b; | |
182 } else { | |
183 asf_scrambling_b=asf_scrambling_h=asf_scrambling_w=1; | |
184 } | |
1567 | 185 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 | 186 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F; |
1 | 187 break; |
291 | 188 } |
1342 | 189 case ASF_GUID_PREFIX_video_stream: { |
1289 | 190 sh_video_t* sh_video=new_sh_video(demuxer,streamh.stream_no & 0x7F); |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
191 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
|
192 ++video_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
193 // 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
|
194 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
|
195 memcpy(sh_video->bih,&buffer[4+4+1+2],len); |
1342 | 196 le2me_BITMAPINFOHEADER(sh_video->bih); |
426 | 197 //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
198 //sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
199 if(verbose>=1) print_video_header(sh_video->bih); |
1 | 200 //asf_video_id=streamh.stream_no & 0x7F; |
426 | 201 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F; |
1 | 202 break; |
291 | 203 } |
1 | 204 } |
205 // stream-specific data: | |
206 // stream_read(demuxer->stream,(char*) buffer,streamh.stream_size); | |
207 break; | |
1342 | 208 // case ASF_GUID_PREFIX_header_2_0: return "guid_header_2_0"; |
209 case ASF_GUID_PREFIX_file_header: // guid_file_header | |
1 | 210 stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh)); |
1342 | 211 le2me_ASF_file_header_t(&fileh); |
4288
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
3070
diff
changeset
|
212 //mp_msg(MSGT_HEADER,MSGL_V,"ASF: packets: %d flags: %d pack_size: %d frame_size: %d\n",(int)fileh.packets,(int)fileh.flags,(int)fileh.packetsize,(int)fileh.frame_size); |
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
3070
diff
changeset
|
213 mp_msg(MSGT_HEADER,MSGL_V,"ASF: packets: %d flags: %d max_packet_size: %d min_packet_size: %d max_bitrate: %d preroll: %d\n",(int)fileh.num_packets,(int)fileh.flags,(int)fileh.min_packet_size,(int)fileh.max_packet_size,(int)fileh.max_bitrate,(int)fileh.preroll); |
b84e9861461c
Changed the asf_file_header_t struct to read all the fields properly.
bertrand
parents:
3070
diff
changeset
|
214 asf_packetsize=fileh.max_packet_size; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
215 asf_packet=malloc(asf_packetsize); // !!! |
1 | 216 break; |
1342 | 217 case ASF_GUID_PREFIX_data_chunk: // guid_data_chunk |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
218 demuxer->movi_start=stream_tell(demuxer->stream)+26; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
219 demuxer->movi_end=endpos; |
1754 | 220 mp_msg(MSGT_HEADER,MSGL_V,"Found movie at 0x%X - 0x%X\n",(int)demuxer->movi_start,(int)demuxer->movi_end); |
1 | 221 break; |
222 | |
1342 | 223 // case ASF_GUID_PREFIX_index_chunk: return "guid_index_chunk"; |
1 | 224 |
1342 | 225 case ASF_GUID_PREFIX_content_desc: // Content description |
3070 | 226 { |
1003
26579d6e6c38
Initialisation of ptr string to NULL to avoid gcc warning.
bertrand
parents:
848
diff
changeset
|
227 char *string=NULL; |
838 | 228 stream_read(demuxer->stream,(char*) &contenth,sizeof(contenth)); |
1342 | 229 le2me_ASF_content_description_t(&contenth); |
1567 | 230 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
|
231 // extract the title |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
232 if( contenth.title_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
233 string=(char*)malloc(contenth.title_size); |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
234 stream_read(demuxer->stream, string, contenth.title_size); |
3070 | 235 if(verbose) |
236 print_asf_string(" Title: ", string, contenth.title_size); | |
237 else | |
238 pack_asf_string(string, contenth.title_size); | |
239 demux_info_add(demuxer, "name", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
240 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
241 // extract the author |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
242 if( contenth.author_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
243 string=(char*)realloc((void*)string, contenth.author_size); |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
244 stream_read(demuxer->stream, string, contenth.author_size); |
3070 | 245 if(verbose) |
246 print_asf_string(" Author: ", string, contenth.author_size); | |
247 else | |
248 pack_asf_string(string, contenth.author_size); | |
249 demux_info_add(demuxer, "author", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
250 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
251 // extract the copyright |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
252 if( contenth.copyright_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
253 string=(char*)realloc((void*)string, contenth.copyright_size); |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
254 stream_read(demuxer->stream, string, contenth.copyright_size); |
3070 | 255 if(verbose) |
256 print_asf_string(" Copyright: ", string, contenth.copyright_size); | |
257 else | |
258 pack_asf_string(string, contenth.copyright_size); | |
259 demux_info_add(demuxer, "copyright", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
260 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
261 // extract the comment |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
262 if( contenth.comment_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
263 string=(char*)realloc((void*)string, contenth.comment_size); |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
264 stream_read(demuxer->stream, string, contenth.comment_size); |
3070 | 265 if(verbose) |
266 print_asf_string(" Comment: ", string, contenth.comment_size); | |
267 else | |
268 pack_asf_string(string, contenth.comment_size); | |
269 demux_info_add(demuxer, "comments", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
270 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
271 // extract the rating |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
272 if( contenth.rating_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
273 string=(char*)realloc((void*)string, contenth.rating_size); |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
274 stream_read(demuxer->stream, string, contenth.rating_size); |
3070 | 275 if(verbose) |
276 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
|
277 } |
1567 | 278 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
|
279 free(string); |
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
280 break; |
3070 | 281 } |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
282 case ASF_GUID_PREFIX_stream_group: { |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
283 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
|
284 uint32_t max_bitrate; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
285 char *object=NULL, *ptr=NULL; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
286 printf("============ ASF Stream group == START ===\n"); |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
287 printf(" object size = %d\n", (int)objh.size); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
288 object = (char*)malloc(objh.size); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
289 if( object==NULL ) { |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
290 printf("Memory allocation failed\n"); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
291 return 0; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
292 } |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
293 stream_read( demuxer->stream, object, objh.size ); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
294 // FIXME: We need some endian handling below... |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
295 ptr = object; |
5618
f02b9bec4eed
Changed the big handling to make it use mplayer's endian macros.
bertrand
parents:
5597
diff
changeset
|
296 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
|
297 ptr += sizeof(uint16_t); |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
298 if(stream_count > 0) |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
299 streams = (uint32_t*)malloc(2*stream_count*sizeof(uint32_t)); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
300 printf(" stream count=[0x%x][%u]\n", stream_count, stream_count ); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
301 for( i=0 ; i<stream_count && ptr<((char*)object+objh.size) ; i++ ) { |
5618
f02b9bec4eed
Changed the big handling to make it use mplayer's endian macros.
bertrand
parents:
5597
diff
changeset
|
302 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
|
303 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
|
304 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
|
305 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
|
306 ptr += sizeof(uint32_t); |
5597
e9ceb08cc007
bigendlian fix by Guillaume Morin <guillaume@morinfr.org>
arpi
parents:
4538
diff
changeset
|
307 printf(" stream id=[0x%x][%u]\n", stream_id, stream_id ); |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
308 printf(" 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
|
309 streams[2*i] = stream_id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
310 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
|
311 } |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
312 printf("============ ASF Stream group == END ===\n"); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
313 free( object ); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
314 break; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
315 } |
1 | 316 } // switch GUID |
692 | 317 |
1342 | 318 if(ASF_LOAD_GUID_PREFIX(objh.guid)==ASF_GUID_PREFIX_data_chunk) break; // movi chunk |
692 | 319 |
1 | 320 if(!stream_seek(demuxer->stream,endpos)) break; |
321 } // while EOF | |
322 | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
323 if(streams) { |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
324 uint32_t vr = 0, ar = 0,i; |
6666 | 325 #ifdef STREAMING |
6645
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
326 if( demuxer->stream->streaming_ctrl!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
327 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
|
328 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
|
329 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
|
330 } |
6666 | 331 } else |
332 #endif | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
333 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
|
334 uint32_t id = streams[2*i]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
335 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
|
336 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
|
337 vr = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
338 best_video = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
339 } 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
|
340 ar = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
341 best_audio = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
342 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
343 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
344 free(streams); |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
345 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
346 |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
347 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
|
348 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
|
349 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
|
350 if(!video_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
351 if(!audio_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
352 mp_msg(MSGT_HEADER,MSGL_ERR,"ASF: no audio or video headers found - broken file?\n"); |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
353 return 0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
354 } |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
355 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
|
356 } 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
|
357 |
1 | 358 #if 0 |
359 if(verbose){ | |
360 printf("ASF duration: %d\n",(int)fileh.duration); | |
361 printf("ASF start pts: %d\n",(int)fileh.start_timestamp); | |
362 printf("ASF end pts: %d\n",(int)fileh.end_timestamp); | |
363 } | |
364 #endif | |
365 | |
366 #endif | |
367 return 1; | |
368 } |