Mercurial > mplayer.hg
annotate libmpdemux/aviheader.c @ 7280:d77c243f0456
Added CDDA credits to Alban.
Added CDDB credits to Bertrand.
Why is my last name all upper case, and only for me?
Sorry for the cosmetic, but it looks wierd :/
author | bertrand |
---|---|
date | Thu, 05 Sep 2002 05:08:55 +0000 |
parents | 64351d2f32d3 |
children | d676c2a86b9e |
rev | line source |
---|---|
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
1 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
2 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
3 #include <stdlib.h> |
1430 | 4 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
5 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
6 #include "config.h" |
1567 | 7 #include "mp_msg.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
8 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
9 #include "stream.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
10 #include "demuxer.h" |
2338 | 11 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
12 |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
13 #include "bswap.h" |
1342 | 14 #include "aviheader.h" |
1 | 15 |
16 #define MIN(a,b) (((a)<(b))?(a):(b)) | |
17 | |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
18 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
19 static MainAVIHeader avih; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
20 |
601 | 21 extern void print_avih(MainAVIHeader *h); |
1456
8c57a5a3c645
printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents:
1430
diff
changeset
|
22 extern void print_avih_flags(MainAVIHeader *h); |
601 | 23 extern void print_strh(AVIStreamHeader *h); |
24 extern void print_wave_header(WAVEFORMATEX *h); | |
1496 | 25 extern void print_video_header(BITMAPINFOHEADER *h); |
601 | 26 extern void print_index(AVIINDEXENTRY *idx,int idx_size); |
27 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
28 void read_avi_header(demuxer_t *demuxer,int index_mode){ |
426 | 29 sh_audio_t *sh_audio=NULL; |
30 sh_video_t *sh_video=NULL; | |
1 | 31 int stream_id=-1; |
568 | 32 int idxfix_videostream=0; |
33 int idxfix_divx=0; | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
34 avi_priv_t* priv=demuxer->priv; |
4664 | 35 off_t list_end=0; |
1 | 36 |
37 //---- AVI header: | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
38 priv->idx_size=0; |
2330 | 39 priv->audio_streams=0; |
1 | 40 while(1){ |
41 int id=stream_read_dword_le(demuxer->stream); | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
42 unsigned chunksize,size2; |
1 | 43 static int last_fccType=0; |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
44 char* hdr=NULL; |
1 | 45 // |
46 if(stream_eof(demuxer->stream)) break; | |
47 // | |
48 if(id==mmioFOURCC('L','I','S','T')){ | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
49 unsigned len=stream_read_dword_le(demuxer->stream); // list size |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
50 id=stream_read_dword_le(demuxer->stream); // list type |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
51 mp_msg(MSGT_HEADER,MSGL_DBG2,"LIST %.4s len=%u\n",(char *) &id,len); |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
52 if(len >= 4) { |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
53 len -= 4; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
54 list_end=stream_tell(demuxer->stream)+((len+1)&(~1)); |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
55 } else { |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
56 mp_msg(MSGT_HEADER,MSGL_WARN,"** empty list?!\n"); |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
57 list_end = 0; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
58 } |
5933 | 59 mp_msg(MSGT_HEADER,MSGL_V,"list_end=0x%X\n",(int)list_end); |
1 | 60 if(id==listtypeAVIMOVIE){ |
61 // found MOVI header | |
4154 | 62 if(!demuxer->movi_start) demuxer->movi_start=stream_tell(demuxer->stream); |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
63 demuxer->movi_end=stream_tell(demuxer->stream)+len; |
1754 | 64 mp_msg(MSGT_HEADER,MSGL_V,"Found movie at 0x%X - 0x%X\n",(int)demuxer->movi_start,(int)demuxer->movi_end); |
6274 | 65 if(demuxer->stream->end_pos>demuxer->movi_end) demuxer->movi_end=demuxer->stream->end_pos; |
4621
16cbaff638ac
Don't read index for -forceidx and -nodix (speedup with bad media and not needed anyway)
atmos4
parents:
4225
diff
changeset
|
66 if(index_mode==-2 || index_mode==2 || index_mode==0) |
16cbaff638ac
Don't read index for -forceidx and -nodix (speedup with bad media and not needed anyway)
atmos4
parents:
4225
diff
changeset
|
67 break; // reading from non-seekable source (stdin) or forced index or no index forced |
1 | 68 len=(len+1)&(~1); |
69 stream_skip(demuxer->stream,len); | |
70 } | |
71 continue; | |
72 } | |
73 size2=stream_read_dword_le(demuxer->stream); | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
74 mp_msg(MSGT_HEADER,MSGL_DBG2,"CHUNK %.4s len=%u\n",(char *) &id,size2); |
1 | 75 chunksize=(size2+1)&(~1); |
76 switch(id){ | |
4664 | 77 |
78 // Indicates where the subject of the file is archived | |
79 case mmioFOURCC('I','A','R','L'): hdr="Archival Location";break; | |
80 // Lists the artist of the original subject of the file; | |
81 // for example, "Michaelangelo." | |
82 case mmioFOURCC('I','A','R','T'): hdr="Artist";break; | |
83 // Lists the name of the person or organization that commissioned | |
84 // the subject of the file; for example "Pope Julian II." | |
85 case mmioFOURCC('I','C','M','S'): hdr="Commissioned";break; | |
86 // Provides general comments about the file or the subject | |
87 // of the file. If the comment is several sentences long, end each | |
88 // sentence with a period. Do not include new-line characters. | |
89 case mmioFOURCC('I','C','M','T'): hdr="Comments";break; | |
90 // Records the copyright information for the file; for example, | |
91 // "Copyright Encyclopedia International 1991." If there are multiple | |
92 // copyrights, separate them by semicolon followed by a space. | |
93 case mmioFOURCC('I','C','O','P'): hdr="Copyright";break; | |
94 // Describes whether an image has been cropped and, if so, how it | |
95 // was cropped; for example, "lower-right corner." | |
96 case mmioFOURCC('I','C','R','D'): hdr="Creation Date";break; | |
97 // Describes whether an image has been cropped and, if so, how it | |
98 // was cropped; for example, "lower-right corner." | |
99 case mmioFOURCC('I','C','R','P'): hdr="Cropped";break; | |
100 // Specifies the size of the original subject of the file; for | |
101 // example, "8.5 in h, 11 in w." | |
102 case mmioFOURCC('I','D','I','M'): hdr="Dimensions";break; | |
103 // Stores dots per inch setting of the digitizer used to | |
104 // produce the file, such as "300." | |
105 case mmioFOURCC('I','D','P','I'): hdr="Dots Per Inch";break; | |
106 // Stores the of the engineer who worked on the file. If there are | |
107 // multiple engineers, separate the names by a semicolon and a blank; | |
108 // for example, "Smith, John; Adams, Joe." | |
109 case mmioFOURCC('I','E','N','G'): hdr="Engineer";break; | |
110 // Describes the original work, such as "landscape,", "portrait," | |
111 // "still liefe," etc. | |
112 case mmioFOURCC('I','G','N','R'): hdr="Genre";break; | |
113 // Provides a list of keywords that refer to the file or subject of the | |
114 // file. Separate multiple keywords with a semicolon and a blank; | |
115 // for example, "Seattle, aerial view; scenery." | |
116 case mmioFOURCC('I','K','E','Y'): hdr="Keywords";break; | |
117 // ILGT - Describes the changes in the lightness settings on the digitizer | |
118 // required to produce the file. Note that the format of this information | |
119 // depends on the hardware used. | |
120 case mmioFOURCC('I','L','G','T'): hdr="Lightness";break; | |
121 // IMED - Decribes the original subject of the file, such as | |
122 // "computer image," "drawing," "lithograph," and so on. | |
123 case mmioFOURCC('I','M','E','D'): hdr="Medium";break; | |
124 // INAM - Stores the title of the subject of the file, such as | |
125 // "Seattle from Above." | |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
126 case mmioFOURCC('I','N','A','M'): hdr="Name";break; |
4664 | 127 // IPLT - Specifies the number of colors requested when digitizing |
128 // an image, such as "256." | |
129 case mmioFOURCC('I','P','L','T'): hdr="Palette Setting";break; | |
130 // IPRD - Specifies the name of title the file was originally intended | |
131 // for, such as "Encyclopedia of Pacific Northwest Geography." | |
132 case mmioFOURCC('I','P','R','D'): hdr="Product";break; | |
133 // ISBJ - Decsribes the contents of the file, such as | |
134 // "Aerial view of Seattle." | |
135 case mmioFOURCC('I','S','B','J'): hdr="Subject";break; | |
136 // ISFT - Identifies the name of the software packages used to create the | |
137 // file, such as "Microsoft WaveEdit" | |
138 case mmioFOURCC('I','S','F','T'): hdr="Software";break; | |
139 // ISHP - Identifies the change in sharpness for the digitizer | |
140 // required to produce the file (the format depends on the hardware used). | |
141 case mmioFOURCC('I','S','H','P'): hdr="Sharpness";break; | |
142 // ISRC - Identifies the name of the person or organization who | |
143 // suplied the original subject of the file; for example, "Try Research." | |
144 case mmioFOURCC('I','S','R','C'): hdr="Source";break; | |
145 // ISRF - Identifies the original form of the material that was digitized, | |
146 // such as "slide," "paper," "map," and so on. This is not necessarily | |
147 // the same as IMED | |
148 case mmioFOURCC('I','S','R','F'): hdr="Source Form";break; | |
149 // ITCH - Identifies the technician who digitized the subject file; | |
150 // for example, "Smith, John." | |
151 case mmioFOURCC('I','T','C','H'): hdr="Technician";break; | |
152 case mmioFOURCC('I','S','M','P'): hdr="Time Code";break; | |
153 case mmioFOURCC('I','D','I','T'): hdr="Digitization Time";break; | |
154 | |
1 | 155 case ckidAVIMAINHDR: // read 'avih' |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
156 stream_read(demuxer->stream,(char*) &avih,MIN(size2,sizeof(avih))); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
157 le2me_MainAVIHeader(&avih); // swap to machine endian |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
158 chunksize-=MIN(size2,sizeof(avih)); |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
6056
diff
changeset
|
159 if(verbose) print_avih(&avih); // else print_avih_flags(&avih); |
1 | 160 break; |
161 case ckidSTREAMHEADER: { // read 'strh' | |
162 AVIStreamHeader h; | |
163 stream_read(demuxer->stream,(char*) &h,MIN(size2,sizeof(h))); | |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
164 le2me_AVIStreamHeader(&h); // swap to machine endian |
1 | 165 chunksize-=MIN(size2,sizeof(h)); |
426 | 166 ++stream_id; |
167 if(h.fccType==streamtypeVIDEO){ | |
1289 | 168 sh_video=new_sh_video(demuxer,stream_id); |
426 | 169 memcpy(&sh_video->video,&h,sizeof(h)); |
170 } else | |
171 if(h.fccType==streamtypeAUDIO){ | |
1289 | 172 sh_audio=new_sh_audio(demuxer,stream_id); |
426 | 173 memcpy(&sh_audio->audio,&h,sizeof(h)); |
174 } | |
1 | 175 last_fccType=h.fccType; |
176 if(verbose>=1) print_strh(&h); | |
177 break; } | |
178 case ckidSTREAMFORMAT: { // read 'strf' | |
179 if(last_fccType==streamtypeVIDEO){ | |
433 | 180 sh_video->bih=calloc((chunksize<sizeof(BITMAPINFOHEADER))?sizeof(BITMAPINFOHEADER):chunksize,1); |
181 // sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize); | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
182 mp_msg(MSGT_HEADER,MSGL_V,"found 'bih', %u bytes of %d\n",chunksize,sizeof(BITMAPINFOHEADER)); |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
183 stream_read(demuxer->stream,(char*) sh_video->bih,chunksize); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
184 le2me_BITMAPINFOHEADER(sh_video->bih); // swap to machine endian |
5418
5b852c08473f
I hate M$. it seems that MSRLE biSize is always 40 when number of colors < 256 instead of 40+colors*4
arpi
parents:
4664
diff
changeset
|
185 // fixup MS-RLE header (seems to be broken for <256 color files) |
5b852c08473f
I hate M$. it seems that MSRLE biSize is always 40 when number of colors < 256 instead of 40+colors*4
arpi
parents:
4664
diff
changeset
|
186 if(sh_video->bih->biCompression==1 && sh_video->bih->biSize==40) |
5b852c08473f
I hate M$. it seems that MSRLE biSize is always 40 when number of colors < 256 instead of 40+colors*4
arpi
parents:
4664
diff
changeset
|
187 sh_video->bih->biSize=chunksize; |
1492 | 188 if(verbose>=1) print_video_header(sh_video->bih); |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
189 chunksize=0; |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
190 // sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
191 // sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
426 | 192 // if(demuxer->video->id==-1) demuxer->video->id=stream_id; |
568 | 193 // IdxFix: |
194 idxfix_videostream=stream_id; | |
195 switch(sh_video->bih->biCompression){ | |
6275 | 196 case mmioFOURCC('M', 'P', 'G', '4'): |
197 case mmioFOURCC('m', 'p', 'g', '4'): | |
198 case mmioFOURCC('D', 'I', 'V', '1'): | |
199 idxfix_divx=3; // we can fix keyframes only for divx coded files! | |
200 mp_msg(MSGT_HEADER,MSGL_V,"Regenerating keyframe table for M$ mpg4v1 video\n"); | |
201 break; | |
202 case mmioFOURCC('D', 'I', 'V', '3'): | |
568 | 203 case mmioFOURCC('d', 'i', 'v', '3'): |
204 case mmioFOURCC('D', 'I', 'V', '4'): | |
205 case mmioFOURCC('d', 'i', 'v', '4'): | |
206 case mmioFOURCC('D', 'I', 'V', '5'): | |
207 case mmioFOURCC('d', 'i', 'v', '5'): | |
208 case mmioFOURCC('D', 'I', 'V', '6'): | |
209 case mmioFOURCC('d', 'i', 'v', '6'): | |
210 case mmioFOURCC('M', 'P', '4', '3'): | |
211 case mmioFOURCC('m', 'p', '4', '3'): | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
212 case mmioFOURCC('M', 'P', '4', '2'): |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
213 case mmioFOURCC('m', 'p', '4', '2'): |
773 | 214 case mmioFOURCC('D', 'I', 'V', '2'): |
568 | 215 case mmioFOURCC('A', 'P', '4', '1'): |
216 idxfix_divx=1; // we can fix keyframes only for divx coded files! | |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
217 mp_msg(MSGT_HEADER,MSGL_V,"Regenerating keyframe table for DIVX 3 video\n"); |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
218 break; |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
219 case mmioFOURCC('D', 'I', 'V', 'X'): |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
220 case mmioFOURCC('d', 'i', 'v', 'x'): |
6274 | 221 case mmioFOURCC('D', 'X', '5', '0'): |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
222 idxfix_divx=2; // we can fix keyframes only for divx coded files! |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
223 mp_msg(MSGT_HEADER,MSGL_V,"Regenerating keyframe table for DIVX 4 video\n"); |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
224 break; |
568 | 225 } |
1 | 226 } else |
227 if(last_fccType==streamtypeAUDIO){ | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
228 unsigned wf_size = chunksize<sizeof(WAVEFORMATEX)?sizeof(WAVEFORMATEX):chunksize; |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
773
diff
changeset
|
229 sh_audio->wf=calloc(wf_size,1); |
433 | 230 // sh_audio->wf=malloc(chunksize); memset(sh_audio->wf,0,chunksize); |
1567 | 231 mp_msg(MSGT_HEADER,MSGL_V,"found 'wf', %d bytes of %d\n",chunksize,sizeof(WAVEFORMATEX)); |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
232 stream_read(demuxer->stream,(char*) sh_audio->wf,chunksize); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
233 le2me_WAVEFORMATEX(sh_audio->wf); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
773
diff
changeset
|
234 if (sh_audio->wf->cbSize != 0 && |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
773
diff
changeset
|
235 wf_size < sizeof(WAVEFORMATEX)+sh_audio->wf->cbSize) { |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
773
diff
changeset
|
236 sh_audio->wf=realloc(sh_audio->wf, sizeof(WAVEFORMATEX)+sh_audio->wf->cbSize); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
773
diff
changeset
|
237 } |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
238 chunksize=0; |
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
239 if(verbose>=1) print_wave_header(sh_audio->wf); |
2330 | 240 ++priv->audio_streams; |
426 | 241 // if(demuxer->audio->id==-1) demuxer->audio->id=stream_id; |
1 | 242 } |
243 break; | |
244 } | |
4225 | 245 case ckidAVINEWINDEX: |
246 if(demuxer->movi_end>stream_tell(demuxer->stream)) | |
247 demuxer->movi_end=stream_tell(demuxer->stream); // fixup movi-end | |
248 if(index_mode){ | |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
249 int i; |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
250 priv->idx_size=size2>>4; |
1567 | 251 mp_msg(MSGT_HEADER,MSGL_V,"Reading INDEX block, %d chunks for %ld frames\n", |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
252 priv->idx_size,avih.dwTotalFrames); |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
253 priv->idx=malloc(priv->idx_size<<4); |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
254 stream_read(demuxer->stream,(char*)priv->idx,priv->idx_size<<4); |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
255 for (i = 0; i < priv->idx_size; i++) // swap index to machine endian |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
256 le2me_AVIINDEXENTRY((AVIINDEXENTRY*)priv->idx + i); |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
257 chunksize-=priv->idx_size<<4; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
258 if(verbose>=2) print_index(priv->idx,priv->idx_size); |
1 | 259 break; |
260 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
261 /* added May 2002 */ |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
262 case mmioFOURCC('R','I','F','F'): { |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
263 char riff_type[4]; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
264 |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
265 mp_msg(MSGT_HEADER, MSGL_V, "additional RIFF header...\n"); |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
266 stream_read(demuxer->stream, riff_type, sizeof riff_type); |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
267 if (strncmp(riff_type, "AVIX", sizeof riff_type)) |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
268 mp_msg(MSGT_HEADER, MSGL_WARN, |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
269 "** warning: this is no extended AVI header..\n"); |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
270 chunksize = 0; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
271 list_end = 0; /* a new list will follow */ |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
272 break; } |
1 | 273 } |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
274 if(hdr){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
275 mp_msg(MSGT_HEADER,MSGL_V,"hdr=%s size=%u\n",hdr,size2); |
4664 | 276 if(size2==3) |
277 chunksize=1; // empty | |
278 else { | |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
279 char buf[256]; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
280 int len=(size2<250)?size2:250; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
281 stream_read(demuxer->stream,buf,len); |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
282 chunksize-=len; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
283 buf[len]=0; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
284 mp_msg(MSGT_HEADER,MSGL_V,"%-10s: %s\n",hdr,buf); |
3071 | 285 demux_info_add(demuxer, hdr, buf); |
4664 | 286 } |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
287 } |
4664 | 288 mp_msg(MSGT_HEADER,MSGL_DBG2,"list_end=0x%X pos=0x%X chunksize=0x%X next=0x%X\n", |
289 (int)list_end, (int)stream_tell(demuxer->stream), | |
290 chunksize, (int)chunksize+stream_tell(demuxer->stream)); | |
291 if(list_end>0 && chunksize+stream_tell(demuxer->stream)>list_end){ | |
292 mp_msg(MSGT_HEADER,MSGL_V,"Broken chunk? chunksize=%d (id=%.4s)\n",chunksize,(char *) &id); | |
293 stream_seek(demuxer->stream,list_end); | |
294 list_end=0; | |
295 } else | |
1 | 296 if(chunksize>0) stream_skip(demuxer->stream,chunksize); else |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
297 if((int)chunksize<0) mp_msg(MSGT_HEADER,MSGL_WARN,"chunksize=%u (id=%.4s)\n",chunksize,(char *) &id); |
1 | 298 |
299 } | |
300 | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
301 if(index_mode>=2 || (priv->idx_size==0 && index_mode==1)){ |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
302 // build index for file: |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
303 stream_reset(demuxer->stream); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
304 stream_seek(demuxer->stream,demuxer->movi_start); |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
305 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
306 priv->idx_pos=0; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
307 priv->idx_size=0; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
308 priv->idx=NULL; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
309 |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
310 while(1){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
311 int id; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
312 unsigned len; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
313 off_t skip; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
314 AVIINDEXENTRY* idx; |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
315 unsigned int c; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
316 demuxer->filepos=stream_tell(demuxer->stream); |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
317 if(demuxer->filepos>=demuxer->movi_end && demuxer->movi_start<demuxer->movi_end) break; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
318 id=stream_read_dword_le(demuxer->stream); |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
319 len=stream_read_dword_le(demuxer->stream); |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
320 if(id==mmioFOURCC('L','I','S','T') || id==mmioFOURCC('R', 'I', 'F', 'F')){ |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
321 id=stream_read_dword_le(demuxer->stream); // list or RIFF type |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
322 continue; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
323 } |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
324 if(stream_eof(demuxer->stream)) break; |
1392 | 325 if(!id || avi_stream_id(id)==100) goto skip_chunk; // bad ID (or padding?) |
326 | |
1499 | 327 if(priv->idx_pos>=priv->idx_size){ |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
328 // priv->idx_size+=32; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
329 priv->idx_size+=1024; // +16kB |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
330 priv->idx=realloc(priv->idx,priv->idx_size*sizeof(AVIINDEXENTRY)); |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
331 if(!priv->idx){priv->idx_pos=0; break;} // error! |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
332 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
333 idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
334 idx->ckid=id; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
335 idx->dwFlags=AVIIF_KEYFRAME; // FIXME |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
336 idx->dwChunkOffset=(unsigned long)demuxer->filepos; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
337 idx->dwChunkLength=len; |
569 | 338 |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
339 c=stream_read_dword(demuxer->stream); |
568 | 340 |
341 // Fix keyframes for DivX files: | |
342 if(idxfix_divx) | |
343 if(avi_stream_id(id)==idxfix_videostream){ | |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
344 switch(idxfix_divx){ |
6275 | 345 case 3: c=stream_read_dword(demuxer->stream)<<5; //skip 32+5 bits for m$mpeg4v1 |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
346 case 1: if(c&0x40000000) idx->dwFlags=0;break; // divx 3 |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
347 case 2: if(c==0x1B6) idx->dwFlags=0;break; // divx 4 |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
348 } |
568 | 349 } |
3781 | 350 |
351 // update status line: | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
352 { static off_t lastpos; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
353 off_t pos; |
3781 | 354 off_t len=demuxer->movi_end-demuxer->movi_start; |
355 if(len){ | |
356 pos=100*(demuxer->filepos-demuxer->movi_start)/len; // % | |
357 } else { | |
358 pos=(demuxer->filepos-demuxer->movi_start)>>20; // MB | |
359 } | |
360 if(pos!=lastpos){ | |
361 lastpos=pos; | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
362 mp_msg(MSGT_HEADER,MSGL_STATUS,"Generating Index: %3lu %s \r", |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
363 (unsigned long)pos, len?"%":"MB"); |
3781 | 364 } |
365 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
366 mp_dbg(MSGT_HEADER,MSGL_DBG2,"%08X %08X %.4s %08X %X\n",(unsigned int)demuxer->filepos,id,(char *) &id,(int)c,(unsigned int) idx->dwFlags); |
568 | 367 #if 0 |
368 { unsigned char tmp[64]; | |
369 int i; | |
370 stream_read(demuxer->stream,tmp,64); | |
371 printf("%.4s",&id); | |
372 for(i=0;i<64;i++) printf(" %02X",tmp[i]); | |
373 printf("\n"); | |
374 } | |
375 #endif | |
1392 | 376 skip_chunk: |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
377 skip=(len+1)&(~1UL); // total bytes in this chunk |
568 | 378 stream_seek(demuxer->stream,8+demuxer->filepos+skip); |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
379 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
380 priv->idx_size=priv->idx_pos; |
1567 | 381 mp_msg(MSGT_HEADER,MSGL_INFO,"AVI: Generated index table for %d chunks!\n",priv->idx_size); |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
382 } |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
383 |
1 | 384 } |
385 | |
386 #undef MIN | |
387 | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
388 |