Mercurial > mplayer.hg
annotate libmpdemux/asfheader.c @ 9009:f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
2) Put this code in a separated function: sub_pp_ssa
3) After recoding added a call to sub_pp_ssa. To be more acqurate: I
added a pointer to function to hold a postprocessing function to be
invoked after using iconv. There are one pointer for each format, if
this pointer isn.t NULL the post processing function is called.
patch by Salvador Eduardo Tropea <salvador@inti.gov.ar>
help by <hephooey@fastmail.fm>
author | arpi |
---|---|
date | Sun, 19 Jan 2003 00:54:55 +0000 |
parents | ae5a2ae1c349 |
children | d42177a0da2a |
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; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8027
diff
changeset
|
51 double asf_packetrate=0; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8027
diff
changeset
|
52 int asf_movielength=0; |
1 | 53 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
54 //int i; |
1 | 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}; |
114 stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj | |
1342 | 115 le2me_ASF_header_t(&asfh); // swap to machine endian |
1 | 116 // for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n"); |
117 // for(i=0;i<16;i++) printf(" %02X",asfhdrguid[i]);printf("\n"); | |
118 if(memcmp(asfhdrguid,asfh.objh.guid,16)){ | |
1567 | 119 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: not ASF guid!\n"); |
1 | 120 return 0; // not ASF guid |
121 } | |
122 if(asfh.cno>256){ | |
1567 | 123 mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asfh.cno); |
1 | 124 return 0; // invalid header??? |
125 } | |
126 return 1; | |
127 } | |
128 | |
601 | 129 extern void print_wave_header(WAVEFORMATEX *h); |
130 extern void print_video_header(BITMAPINFOHEADER *h); | |
131 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
432
diff
changeset
|
132 int read_asf_header(demuxer_t *demuxer){ |
7889 | 133 static unsigned char buffer[2048]; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
134 uint32_t* streams = NULL; |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
135 int audio_streams=0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
136 int video_streams=0; |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
137 uint16_t stream_count=0; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
138 int best_video = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
139 int best_audio = -1; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
140 |
1 | 141 #if 1 |
340 | 142 //printf("ASF file! (subchunks: %d)\n",asfh.cno); |
1 | 143 while(!stream_eof(demuxer->stream)){ |
144 int pos,endpos; | |
145 pos=stream_tell(demuxer->stream); | |
146 stream_read(demuxer->stream,(char*) &objh,sizeof(objh)); | |
1342 | 147 le2me_ASF_obj_header_t(&objh); |
1 | 148 if(stream_eof(demuxer->stream)) break; // EOF |
149 endpos=pos+objh.size; | |
150 // for(i=0;i<16;i++) printf("%02X ",objh.guid[i]); | |
340 | 151 //printf("0x%08X [%s] %d\n",pos, asf_chunk_type(objh.guid),(int) objh.size); |
1342 | 152 switch(ASF_LOAD_GUID_PREFIX(objh.guid)){ |
153 case ASF_GUID_PREFIX_stream_header: | |
1 | 154 stream_read(demuxer->stream,(char*) &streamh,sizeof(streamh)); |
1342 | 155 le2me_ASF_stream_header_t(&streamh); |
8027 | 156 if(verbose>0){ |
1567 | 157 mp_msg(MSGT_HEADER,MSGL_V,"stream type: %s\n",asf_chunk_type(streamh.type)); |
158 mp_msg(MSGT_HEADER,MSGL_V,"stream concealment: %s\n",asf_chunk_type(streamh.concealment)); | |
159 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); | |
160 mp_msg(MSGT_HEADER,MSGL_V,"unk1: %lX unk2: %X\n",(unsigned long)streamh.unk1,(unsigned int)streamh.unk2); | |
161 mp_msg(MSGT_HEADER,MSGL_V,"FILEPOS=0x%X\n",stream_tell(demuxer->stream)); | |
1342 | 162 } |
7889 | 163 if(streamh.type_size>2048 || streamh.stream_size>2048){ |
164 mp_msg(MSGT_HEADER,MSGL_FATAL,"FATAL: header size bigger than 2048 bytes (%d,%d)!\n" | |
165 "Please contact mplayer authors, and upload/send this file.\n", | |
166 (int)streamh.type_size,(int)streamh.stream_size); | |
1631 | 167 return 0; |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
168 } |
1 | 169 // type-specific data: |
170 stream_read(demuxer->stream,(char*) buffer,streamh.type_size); | |
1342 | 171 switch(ASF_LOAD_GUID_PREFIX(streamh.type)){ |
172 case ASF_GUID_PREFIX_audio_stream: { | |
1289 | 173 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
|
174 ++audio_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
175 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
|
176 memcpy(sh_audio->wf,buffer,streamh.type_size); |
1342 | 177 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
|
178 if(verbose>=1) print_wave_header(sh_audio->wf); |
1342 | 179 if(ASF_LOAD_GUID_PREFIX(streamh.concealment)==ASF_GUID_PREFIX_audio_conceal_interleave){ |
1 | 180 stream_read(demuxer->stream,(char*) buffer,streamh.stream_size); |
181 asf_scrambling_h=buffer[0]; | |
182 asf_scrambling_w=(buffer[2]<<8)|buffer[1]; | |
183 asf_scrambling_b=(buffer[4]<<8)|buffer[3]; | |
184 asf_scrambling_w/=asf_scrambling_b; | |
185 } else { | |
186 asf_scrambling_b=asf_scrambling_h=asf_scrambling_w=1; | |
187 } | |
1567 | 188 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 | 189 //if(demuxer->audio->id==-1) demuxer->audio->id=streamh.stream_no & 0x7F; |
1 | 190 break; |
291 | 191 } |
1342 | 192 case ASF_GUID_PREFIX_video_stream: { |
1289 | 193 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
|
194 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
|
195 ++video_streams; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
196 // 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
|
197 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
|
198 memcpy(sh_video->bih,&buffer[4+4+1+2],len); |
1342 | 199 le2me_BITMAPINFOHEADER(sh_video->bih); |
426 | 200 //sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
201 //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
|
202 if(verbose>=1) print_video_header(sh_video->bih); |
1 | 203 //asf_video_id=streamh.stream_no & 0x7F; |
426 | 204 //if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F; |
1 | 205 break; |
291 | 206 } |
1 | 207 } |
208 // stream-specific data: | |
209 // stream_read(demuxer->stream,(char*) buffer,streamh.stream_size); | |
210 break; | |
1342 | 211 // case ASF_GUID_PREFIX_header_2_0: return "guid_header_2_0"; |
212 case ASF_GUID_PREFIX_file_header: // guid_file_header | |
1 | 213 stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh)); |
1342 | 214 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
|
215 //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
|
216 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
|
217 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
|
218 asf_packet=malloc(asf_packetsize); // !!! |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8027
diff
changeset
|
219 asf_packetrate=fileh.max_bitrate/8.0/(double)asf_packetsize; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8027
diff
changeset
|
220 asf_movielength=fileh.send_duration/10000000LL; |
1 | 221 break; |
1342 | 222 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
|
223 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
|
224 demuxer->movi_end=endpos; |
1754 | 225 mp_msg(MSGT_HEADER,MSGL_V,"Found movie at 0x%X - 0x%X\n",(int)demuxer->movi_start,(int)demuxer->movi_end); |
1 | 226 break; |
227 | |
1342 | 228 // case ASF_GUID_PREFIX_index_chunk: return "guid_index_chunk"; |
1 | 229 |
1342 | 230 case ASF_GUID_PREFIX_content_desc: // Content description |
3070 | 231 { |
1003
26579d6e6c38
Initialisation of ptr string to NULL to avoid gcc warning.
bertrand
parents:
848
diff
changeset
|
232 char *string=NULL; |
838 | 233 stream_read(demuxer->stream,(char*) &contenth,sizeof(contenth)); |
1342 | 234 le2me_ASF_content_description_t(&contenth); |
1567 | 235 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
|
236 // extract the title |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
237 if( contenth.title_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
238 string=(char*)malloc(contenth.title_size); |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
239 stream_read(demuxer->stream, string, contenth.title_size); |
8027 | 240 if(verbose>0) |
3070 | 241 print_asf_string(" Title: ", string, contenth.title_size); |
242 else | |
243 pack_asf_string(string, contenth.title_size); | |
244 demux_info_add(demuxer, "name", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
245 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
246 // extract the author |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
247 if( contenth.author_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
248 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
|
249 stream_read(demuxer->stream, string, contenth.author_size); |
8027 | 250 if(verbose>0) |
3070 | 251 print_asf_string(" Author: ", string, contenth.author_size); |
252 else | |
253 pack_asf_string(string, contenth.author_size); | |
254 demux_info_add(demuxer, "author", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
255 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
256 // extract the copyright |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
257 if( contenth.copyright_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
258 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
|
259 stream_read(demuxer->stream, string, contenth.copyright_size); |
8027 | 260 if(verbose>0) |
3070 | 261 print_asf_string(" Copyright: ", string, contenth.copyright_size); |
262 else | |
263 pack_asf_string(string, contenth.copyright_size); | |
264 demux_info_add(demuxer, "copyright", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
265 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
266 // extract the comment |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
267 if( contenth.comment_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
268 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
|
269 stream_read(demuxer->stream, string, contenth.comment_size); |
8027 | 270 if(verbose>0) |
3070 | 271 print_asf_string(" Comment: ", string, contenth.comment_size); |
272 else | |
273 pack_asf_string(string, contenth.comment_size); | |
274 demux_info_add(demuxer, "comments", string); | |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
275 } |
816
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
276 // extract the rating |
843
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
277 if( contenth.rating_size!=0 ) { |
a88b87750b8a
Fixed crashing while reading the content description for some ASF file.
bertrand
parents:
838
diff
changeset
|
278 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
|
279 stream_read(demuxer->stream, string, contenth.rating_size); |
8027 | 280 if(verbose>0) |
3070 | 281 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
|
282 } |
1567 | 283 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
|
284 free(string); |
6d72528d56ff
ASF description printing patch by Bertrand BAUDET, fixed segfault of hory_bug/a.asf
arpi_esp
parents:
692
diff
changeset
|
285 break; |
3070 | 286 } |
4333
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
287 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
|
288 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
|
289 uint32_t max_bitrate; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 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
|
294 if( object==NULL ) { |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
295 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
|
296 return 0; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
297 } |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
298 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
|
299 // 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
|
300 ptr = object; |
5618
f02b9bec4eed
Changed the big handling to make it use mplayer's endian macros.
bertrand
parents:
5597
diff
changeset
|
301 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
|
302 ptr += sizeof(uint16_t); |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
303 if(stream_count > 0) |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 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
|
310 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
|
311 ptr += sizeof(uint32_t); |
5597
e9ceb08cc007
bigendlian fix by Guillaume Morin <guillaume@morinfr.org>
arpi
parents:
4538
diff
changeset
|
312 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
|
313 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
|
314 streams[2*i] = stream_id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
315 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
|
316 } |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
317 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
|
318 free( object ); |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
319 break; |
c67d50d4a889
Add a parser for the "ASF group stream object" and display the bitrate values
bertrand
parents:
4288
diff
changeset
|
320 } |
1 | 321 } // switch GUID |
692 | 322 |
1342 | 323 if(ASF_LOAD_GUID_PREFIX(objh.guid)==ASF_GUID_PREFIX_data_chunk) break; // movi chunk |
692 | 324 |
1 | 325 if(!stream_seek(demuxer->stream,endpos)) break; |
326 } // while EOF | |
327 | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
328 if(streams) { |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
329 uint32_t vr = 0, ar = 0,i; |
6666 | 330 #ifdef STREAMING |
6645
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
331 if( demuxer->stream->streaming_ctrl!=NULL ) { |
fc2de514a140
If network is used, take the streams id that were requested.
bertrand
parents:
6187
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 } |
6666 | 336 } else |
337 #endif | |
4538
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
338 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
|
339 uint32_t id = streams[2*i]; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
340 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
|
341 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
|
342 vr = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
343 best_video = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
344 } 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
|
345 ar = rate; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
346 best_audio = id; |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
347 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
348 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
349 free(streams); |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
350 } |
354048e506ab
Added auto selection of the best streams and fixed a few compiler
albeu
parents:
4349
diff
changeset
|
351 |
4349
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 if(!video_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
356 if(!audio_streams){ |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
357 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
|
358 return 0; |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
359 } |
266cb1a68519
pre-check for audio/video streams (hope it fix wma steraming)
arpi
parents:
4333
diff
changeset
|
360 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
|
361 } 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
|
362 |
1 | 363 #if 0 |
364 if(verbose){ | |
365 printf("ASF duration: %d\n",(int)fileh.duration); | |
366 printf("ASF start pts: %d\n",(int)fileh.start_timestamp); | |
367 printf("ASF end pts: %d\n",(int)fileh.end_timestamp); | |
368 } | |
369 #endif | |
370 | |
371 #endif | |
372 return 1; | |
373 } |