Mercurial > mplayer.hg
annotate libmpdemux/aviheader.c @ 26146:20a126aaa756
ve_vfw.c: #include aviheader.h instead of wine avifmt.h
Compilation was broken after libmpdemux/muxer.h started including
libmpdemux/aviheader.h. ve_vfw.c included both muxer.h and
loader/wine/avifmt.h, and the latter has definitions that conflict with
aviheader.h ones. Fix by removing the avifmt.h include.
I did not carefully check that changing the includes doesn't break
any ve_vfw.c code. However it at least fixes compilation, and if the
avifmt.h versions differ in some significant way then the code is
fundamentally broken anyway: ve_vfw cannot use different versions of
the avi struct definitions when it also uses shared muxer.h types
(those must use the standard definitions to keep the type compatible
with what's used in other files).
author | uau |
---|---|
date | Thu, 06 Mar 2008 01:57:26 +0000 |
parents | f2036002cac3 |
children | d643e4643313 |
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> |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
5 #include <errno.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
6 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
7 #include "config.h" |
1567 | 8 #include "mp_msg.h" |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
9 #include "help_mp.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
10 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21967
diff
changeset
|
11 #include "stream/stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
12 #include "demuxer.h" |
2338 | 13 #include "stheader.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
14 |
1342 | 15 #include "aviheader.h" |
21532 | 16 #include "libavutil/common.h" |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
17 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
18 static MainAVIHeader avih; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
19 |
23840
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
20 void print_avih(MainAVIHeader *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
21 void print_avih_flags(MainAVIHeader *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
22 void print_strh(AVIStreamHeader *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
23 void print_wave_header(WAVEFORMATEX *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
24 void print_video_header(BITMAPINFOHEADER *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
25 void print_index(AVIINDEXENTRY *idx,int idx_size, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
26 void print_avistdindex_chunk(avistdindex_chunk *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
27 void print_avisuperindex_chunk(avisuperindex_chunk *h, int verbose_level); |
5fd33d4d5c3e
Remove some useless "extern" before function prototypes
reimar
parents:
23759
diff
changeset
|
28 void print_vprp(VideoPropHeader *vprp, int verbose_level); |
12036 | 29 |
30 static int odml_get_vstream_id(int id, unsigned char res[]) | |
31 { | |
32 unsigned char *p = (unsigned char *)&id; | |
33 id = le2me_32(id); | |
34 | |
35 if (p[2] == 'd') { | |
36 if (res) { | |
37 res[0] = p[0]; | |
38 res[1] = p[1]; | |
39 } | |
40 return 1; | |
41 } | |
42 return 0; | |
43 } | |
44 | |
14297 | 45 int avi_idx_cmp(const void *elem1,const void *elem2) { |
46 register off_t a = AVI_IDX_OFFSET((AVIINDEXENTRY *)elem1); | |
47 register off_t b = AVI_IDX_OFFSET((AVIINDEXENTRY *)elem2); | |
48 return (a > b) - (b > a); | |
12036 | 49 } |
601 | 50 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
51 void read_avi_header(demuxer_t *demuxer,int index_mode){ |
426 | 52 sh_audio_t *sh_audio=NULL; |
53 sh_video_t *sh_video=NULL; | |
1 | 54 int stream_id=-1; |
568 | 55 int idxfix_videostream=0; |
56 int idxfix_divx=0; | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
57 avi_priv_t* priv=demuxer->priv; |
4664 | 58 off_t list_end=0; |
1 | 59 |
60 //---- AVI header: | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
61 priv->idx_size=0; |
2330 | 62 priv->audio_streams=0; |
1 | 63 while(1){ |
64 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
|
65 unsigned chunksize,size2; |
1 | 66 static int last_fccType=0; |
23965
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
67 static int last_fccHandler=0; |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
68 char* hdr=NULL; |
1 | 69 // |
70 if(stream_eof(demuxer->stream)) break; | |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
71 // Imply -forceidx if -saveidx is specified |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
72 if (index_file_save) |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
73 index_mode = 2; |
1 | 74 // |
75 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
|
76 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
|
77 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
|
78 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
|
79 if(len >= 4) { |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
80 len -= 4; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
81 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
|
82 } else { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
83 mp_msg(MSGT_HEADER,MSGL_WARN,MSGTR_MPDEMUX_AVIHDR_EmptyList); |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
84 list_end = 0; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
85 } |
5933 | 86 mp_msg(MSGT_HEADER,MSGL_V,"list_end=0x%X\n",(int)list_end); |
1 | 87 if(id==listtypeAVIMOVIE){ |
88 // found MOVI header | |
4154 | 89 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
|
90 demuxer->movi_end=stream_tell(demuxer->stream)+len; |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
91 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_FoundMovieAt,(int)demuxer->movi_start,(int)demuxer->movi_end); |
6274 | 92 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
|
93 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
|
94 break; // reading from non-seekable source (stdin) or forced index or no index forced |
7762 | 95 if(list_end>0) stream_seek(demuxer->stream,list_end); // skip movi |
96 list_end=0; | |
1 | 97 } |
98 continue; | |
99 } | |
100 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
|
101 mp_msg(MSGT_HEADER,MSGL_DBG2,"CHUNK %.4s len=%u\n",(char *) &id,size2); |
1 | 102 chunksize=(size2+1)&(~1); |
103 switch(id){ | |
4664 | 104 |
105 // Indicates where the subject of the file is archived | |
106 case mmioFOURCC('I','A','R','L'): hdr="Archival Location";break; | |
107 // Lists the artist of the original subject of the file; | |
108 // for example, "Michaelangelo." | |
109 case mmioFOURCC('I','A','R','T'): hdr="Artist";break; | |
110 // Lists the name of the person or organization that commissioned | |
111 // the subject of the file; for example "Pope Julian II." | |
112 case mmioFOURCC('I','C','M','S'): hdr="Commissioned";break; | |
113 // Provides general comments about the file or the subject | |
114 // of the file. If the comment is several sentences long, end each | |
115 // sentence with a period. Do not include new-line characters. | |
116 case mmioFOURCC('I','C','M','T'): hdr="Comments";break; | |
117 // Records the copyright information for the file; for example, | |
118 // "Copyright Encyclopedia International 1991." If there are multiple | |
119 // copyrights, separate them by semicolon followed by a space. | |
120 case mmioFOURCC('I','C','O','P'): hdr="Copyright";break; | |
121 // Describes whether an image has been cropped and, if so, how it | |
122 // was cropped; for example, "lower-right corner." | |
123 case mmioFOURCC('I','C','R','D'): hdr="Creation Date";break; | |
124 // Describes whether an image has been cropped and, if so, how it | |
125 // was cropped; for example, "lower-right corner." | |
126 case mmioFOURCC('I','C','R','P'): hdr="Cropped";break; | |
127 // Specifies the size of the original subject of the file; for | |
128 // example, "8.5 in h, 11 in w." | |
129 case mmioFOURCC('I','D','I','M'): hdr="Dimensions";break; | |
130 // Stores dots per inch setting of the digitizer used to | |
131 // produce the file, such as "300." | |
132 case mmioFOURCC('I','D','P','I'): hdr="Dots Per Inch";break; | |
133 // Stores the of the engineer who worked on the file. If there are | |
134 // multiple engineers, separate the names by a semicolon and a blank; | |
135 // for example, "Smith, John; Adams, Joe." | |
136 case mmioFOURCC('I','E','N','G'): hdr="Engineer";break; | |
137 // Describes the original work, such as "landscape,", "portrait," | |
138 // "still liefe," etc. | |
139 case mmioFOURCC('I','G','N','R'): hdr="Genre";break; | |
140 // Provides a list of keywords that refer to the file or subject of the | |
141 // file. Separate multiple keywords with a semicolon and a blank; | |
142 // for example, "Seattle, aerial view; scenery." | |
143 case mmioFOURCC('I','K','E','Y'): hdr="Keywords";break; | |
144 // ILGT - Describes the changes in the lightness settings on the digitizer | |
145 // required to produce the file. Note that the format of this information | |
146 // depends on the hardware used. | |
147 case mmioFOURCC('I','L','G','T'): hdr="Lightness";break; | |
148 // IMED - Decribes the original subject of the file, such as | |
149 // "computer image," "drawing," "lithograph," and so on. | |
150 case mmioFOURCC('I','M','E','D'): hdr="Medium";break; | |
151 // INAM - Stores the title of the subject of the file, such as | |
152 // "Seattle from Above." | |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
153 case mmioFOURCC('I','N','A','M'): hdr="Name";break; |
4664 | 154 // IPLT - Specifies the number of colors requested when digitizing |
155 // an image, such as "256." | |
156 case mmioFOURCC('I','P','L','T'): hdr="Palette Setting";break; | |
157 // IPRD - Specifies the name of title the file was originally intended | |
158 // for, such as "Encyclopedia of Pacific Northwest Geography." | |
159 case mmioFOURCC('I','P','R','D'): hdr="Product";break; | |
160 // ISBJ - Decsribes the contents of the file, such as | |
161 // "Aerial view of Seattle." | |
162 case mmioFOURCC('I','S','B','J'): hdr="Subject";break; | |
163 // ISFT - Identifies the name of the software packages used to create the | |
164 // file, such as "Microsoft WaveEdit" | |
165 case mmioFOURCC('I','S','F','T'): hdr="Software";break; | |
166 // ISHP - Identifies the change in sharpness for the digitizer | |
167 // required to produce the file (the format depends on the hardware used). | |
168 case mmioFOURCC('I','S','H','P'): hdr="Sharpness";break; | |
169 // ISRC - Identifies the name of the person or organization who | |
170 // suplied the original subject of the file; for example, "Try Research." | |
171 case mmioFOURCC('I','S','R','C'): hdr="Source";break; | |
172 // ISRF - Identifies the original form of the material that was digitized, | |
173 // such as "slide," "paper," "map," and so on. This is not necessarily | |
174 // the same as IMED | |
175 case mmioFOURCC('I','S','R','F'): hdr="Source Form";break; | |
176 // ITCH - Identifies the technician who digitized the subject file; | |
177 // for example, "Smith, John." | |
178 case mmioFOURCC('I','T','C','H'): hdr="Technician";break; | |
179 case mmioFOURCC('I','S','M','P'): hdr="Time Code";break; | |
180 case mmioFOURCC('I','D','I','T'): hdr="Digitization Time";break; | |
181 | |
1 | 182 case ckidAVIMAINHDR: // read 'avih' |
21532 | 183 stream_read(demuxer->stream,(char*) &avih,FFMIN(size2,sizeof(avih))); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
184 le2me_MainAVIHeader(&avih); // swap to machine endian |
21532 | 185 chunksize-=FFMIN(size2,sizeof(avih)); |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
186 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_avih(&avih,MSGL_V); // else print_avih_flags(&avih,MSGL_V); |
1 | 187 break; |
188 case ckidSTREAMHEADER: { // read 'strh' | |
189 AVIStreamHeader h; | |
21532 | 190 stream_read(demuxer->stream,(char*) &h,FFMIN(size2,sizeof(h))); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
191 le2me_AVIStreamHeader(&h); // swap to machine endian |
21532 | 192 chunksize-=FFMIN(size2,sizeof(h)); |
426 | 193 ++stream_id; |
194 if(h.fccType==streamtypeVIDEO){ | |
1289 | 195 sh_video=new_sh_video(demuxer,stream_id); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
196 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "aviheader", stream_id); |
426 | 197 memcpy(&sh_video->video,&h,sizeof(h)); |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
198 sh_video->stream_delay = (float)sh_video->video.dwStart * sh_video->video.dwScale/sh_video->video.dwRate; |
426 | 199 } else |
200 if(h.fccType==streamtypeAUDIO){ | |
1289 | 201 sh_audio=new_sh_audio(demuxer,stream_id); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
202 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "aviheader", stream_id); |
426 | 203 memcpy(&sh_audio->audio,&h,sizeof(h)); |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
204 sh_audio->stream_delay = (float)sh_audio->audio.dwStart * sh_audio->audio.dwScale/sh_audio->audio.dwRate; |
426 | 205 } |
1 | 206 last_fccType=h.fccType; |
23965
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
207 last_fccHandler=h.fccHandler; |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
208 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_strh(&h,MSGL_V); |
1 | 209 break; } |
12036 | 210 case mmioFOURCC('i', 'n', 'd', 'x'): { |
12342 | 211 uint32_t i; |
12036 | 212 avisuperindex_chunk *s; |
21772 | 213 |
214 if(!index_mode) break; | |
215 | |
18052
be163e9c9bca
make sure the indx chunk is big enough to hold the basic structure.
iive
parents:
18051
diff
changeset
|
216 if(chunksize<=24){ |
be163e9c9bca
make sure the indx chunk is big enough to hold the basic structure.
iive
parents:
18051
diff
changeset
|
217 break; |
be163e9c9bca
make sure the indx chunk is big enough to hold the basic structure.
iive
parents:
18051
diff
changeset
|
218 } |
12036 | 219 priv->suidx_size++; |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18052
diff
changeset
|
220 priv->suidx = realloc_struct(priv->suidx, priv->suidx_size, sizeof (avisuperindex_chunk)); |
12036 | 221 s = &priv->suidx[priv->suidx_size-1]; |
222 | |
223 chunksize-=24; | |
224 memcpy(s->fcc, "indx", 4); | |
225 s->dwSize = size2; | |
226 s->wLongsPerEntry = stream_read_word_le(demuxer->stream); | |
227 s->bIndexSubType = stream_read_char(demuxer->stream); | |
228 s->bIndexType = stream_read_char(demuxer->stream); | |
229 s->nEntriesInUse = stream_read_dword_le(demuxer->stream); | |
230 *(uint32_t *)s->dwChunkId = stream_read_dword_le(demuxer->stream); | |
231 stream_read(demuxer->stream, (char *)s->dwReserved, 3*4); | |
232 memset(s->dwReserved, 0, 3*4); | |
233 | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
234 print_avisuperindex_chunk(s,MSGL_V); |
18049
77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
iive
parents:
17990
diff
changeset
|
235 |
24427 | 236 // Check and fix this useless crap |
237 if(s->wLongsPerEntry != sizeof (avisuperindex_entry)/4) { | |
238 mp_msg (MSGT_HEADER, MSGL_WARN, "Broken super index chunk size: %u\n",s->wLongsPerEntry); | |
239 s->wLongsPerEntry = sizeof(avisuperindex_entry)/4; | |
240 } | |
18049
77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
iive
parents:
17990
diff
changeset
|
241 if( ((chunksize/4)/s->wLongsPerEntry) < s->nEntriesInUse){ |
77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
iive
parents:
17990
diff
changeset
|
242 mp_msg (MSGT_HEADER, MSGL_WARN, "Broken super index chunk\n"); |
77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
iive
parents:
17990
diff
changeset
|
243 s->nEntriesInUse = (chunksize/4)/s->wLongsPerEntry; |
77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
iive
parents:
17990
diff
changeset
|
244 } |
12036 | 245 |
18051
110105412f8f
use calloc instead of malloc - simplifies code and fixes overflow problems.
reimar
parents:
18050
diff
changeset
|
246 s->aIndex = calloc(s->nEntriesInUse, sizeof (avisuperindex_entry)); |
110105412f8f
use calloc instead of malloc - simplifies code and fixes overflow problems.
reimar
parents:
18050
diff
changeset
|
247 s->stdidx = calloc(s->nEntriesInUse, sizeof (avistdindex_chunk)); |
12036 | 248 |
249 // now the real index of indices | |
250 for (i=0; i<s->nEntriesInUse; i++) { | |
251 chunksize-=16; | |
23759 | 252 s->aIndex[i].qwOffset = stream_read_qword_le(demuxer->stream); |
12036 | 253 s->aIndex[i].dwSize = stream_read_dword_le(demuxer->stream); |
254 s->aIndex[i].dwDuration = stream_read_dword_le(demuxer->stream); | |
17366 | 255 mp_msg (MSGT_HEADER, MSGL_V, "ODML (%.4s): [%d] 0x%016"PRIx64" 0x%04x %u\n", |
12036 | 256 (s->dwChunkId), i, |
257 (uint64_t)s->aIndex[i].qwOffset, s->aIndex[i].dwSize, s->aIndex[i].dwDuration); | |
258 } | |
259 | |
260 break; } | |
1 | 261 case ckidSTREAMFORMAT: { // read 'strf' |
262 if(last_fccType==streamtypeVIDEO){ | |
23841 | 263 sh_video->bih=calloc(FFMAX(chunksize, sizeof(BITMAPINFOHEADER)), 1); |
433 | 264 // sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
265 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_FoundBitmapInfoHeader,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
|
266 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
|
267 le2me_BITMAPINFOHEADER(sh_video->bih); // swap to machine endian |
21967 | 268 if (sh_video->bih->biSize > chunksize && sh_video->bih->biSize > sizeof(BITMAPINFOHEADER)) |
269 sh_video->bih->biSize = chunksize; | |
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
|
270 // fixup MS-RLE header (seems to be broken for <256 color files) |
7784 | 271 if(sh_video->bih->biCompression<=1 && sh_video->bih->biSize==40) |
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
|
272 sh_video->bih->biSize=chunksize; |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
273 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_video->bih,MSGL_V); |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
274 chunksize=0; |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
275 sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; |
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
276 sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
25201
f2036002cac3
Set sh_video->format when parsing aviheader, otherwise it might never
reimar
parents:
24427
diff
changeset
|
277 sh_video->format = sh_video->bih->biCompression; |
426 | 278 // if(demuxer->video->id==-1) demuxer->video->id=stream_id; |
568 | 279 // IdxFix: |
280 idxfix_videostream=stream_id; | |
281 switch(sh_video->bih->biCompression){ | |
6275 | 282 case mmioFOURCC('M', 'P', 'G', '4'): |
283 case mmioFOURCC('m', 'p', 'g', '4'): | |
284 case mmioFOURCC('D', 'I', 'V', '1'): | |
13700 | 285 idxfix_divx=3; // set index recovery mpeg4 flavour: msmpeg4v1 |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
286 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_RegeneratingKeyfTableForMPG4V1); |
6275 | 287 break; |
288 case mmioFOURCC('D', 'I', 'V', '3'): | |
568 | 289 case mmioFOURCC('d', 'i', 'v', '3'): |
290 case mmioFOURCC('D', 'I', 'V', '4'): | |
291 case mmioFOURCC('d', 'i', 'v', '4'): | |
292 case mmioFOURCC('D', 'I', 'V', '5'): | |
293 case mmioFOURCC('d', 'i', 'v', '5'): | |
294 case mmioFOURCC('D', 'I', 'V', '6'): | |
295 case mmioFOURCC('d', 'i', 'v', '6'): | |
296 case mmioFOURCC('M', 'P', '4', '3'): | |
297 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
|
298 case mmioFOURCC('M', 'P', '4', '2'): |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
299 case mmioFOURCC('m', 'p', '4', '2'): |
773 | 300 case mmioFOURCC('D', 'I', 'V', '2'): |
568 | 301 case mmioFOURCC('A', 'P', '4', '1'): |
13700 | 302 idxfix_divx=1; // set index recovery mpeg4 flavour: msmpeg4v3 |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
303 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_RegeneratingKeyfTableForDIVX3); |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
304 break; |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
305 case mmioFOURCC('D', 'I', 'V', 'X'): |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
306 case mmioFOURCC('d', 'i', 'v', 'x'): |
6274 | 307 case mmioFOURCC('D', 'X', '5', '0'): |
13671 | 308 case mmioFOURCC('X', 'V', 'I', 'D'): |
309 case mmioFOURCC('x', 'v', 'i', 'd'): | |
14766 | 310 case mmioFOURCC('F', 'M', 'P', '4'): |
311 case mmioFOURCC('f', 'm', 'p', '4'): | |
13700 | 312 idxfix_divx=2; // set index recovery mpeg4 flavour: generic mpeg4 |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
313 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_RegeneratingKeyfTableForMPEG4); |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
314 break; |
568 | 315 } |
1 | 316 } else |
317 if(last_fccType==streamtypeAUDIO){ | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
318 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
|
319 sh_audio->wf=calloc(wf_size,1); |
433 | 320 // sh_audio->wf=malloc(chunksize); memset(sh_audio->wf,0,chunksize); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
321 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_FoundWaveFmt,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
|
322 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
|
323 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
|
324 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
|
325 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
|
326 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
|
327 } |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
328 sh_audio->format=sh_audio->wf->wFormatTag; |
23965
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
329 if (sh_audio->format == 1 && |
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
330 last_fccHandler == mmioFOURCC('A', 'x', 'a', 'n')) |
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
331 sh_audio->format = last_fccHandler; |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
332 sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec; |
432
5251b0c57e39
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
arpi_esp
parents:
426
diff
changeset
|
333 chunksize=0; |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
334 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V); |
2330 | 335 ++priv->audio_streams; |
426 | 336 // if(demuxer->audio->id==-1) demuxer->audio->id=stream_id; |
1 | 337 } |
338 break; | |
339 } | |
12036 | 340 case mmioFOURCC('v', 'p', 'r', 'p'): { |
341 VideoPropHeader *vprp = malloc(chunksize); | |
12342 | 342 unsigned int i; |
12036 | 343 stream_read(demuxer->stream, (void*)vprp, chunksize); |
344 le2me_VideoPropHeader(vprp); | |
345 chunksize -= sizeof(*vprp)-sizeof(vprp->FieldInfo); | |
346 chunksize /= sizeof(VIDEO_FIELD_DESC); | |
347 if (vprp->nbFieldPerFrame > chunksize) { | |
348 vprp->nbFieldPerFrame = chunksize; | |
349 } | |
350 chunksize = 0; | |
351 for (i=0; i<vprp->nbFieldPerFrame; i++) { | |
352 le2me_VIDEO_FIELD_DESC(&vprp->FieldInfo[i]); | |
353 } | |
12061 | 354 if (sh_video) { |
12036 | 355 sh_video->aspect = GET_AVI_ASPECT(vprp->dwFrameAspectRatio); |
356 } | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
357 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_vprp(vprp,MSGL_V); |
15738
a0b807d489bc
memleak fix by bryanwilkerson WHIRLPOOL yahoo SPOT com
henry
parents:
14766
diff
changeset
|
358 free(vprp); |
12036 | 359 break; |
360 } | |
361 case mmioFOURCC('d', 'm', 'l', 'h'): { | |
362 // dmlh 00 00 00 04 frms | |
363 unsigned int total_frames = stream_read_dword_le(demuxer->stream); | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
364 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_FoundAVIV2Header, chunksize, total_frames); |
12036 | 365 stream_skip(demuxer->stream, chunksize-4); |
366 chunksize = 0; | |
367 } | |
368 break; | |
4225 | 369 case ckidAVINEWINDEX: |
370 if(demuxer->movi_end>stream_tell(demuxer->stream)) | |
371 demuxer->movi_end=stream_tell(demuxer->stream); // fixup movi-end | |
12036 | 372 if(index_mode && !priv->isodml){ |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
373 int i; |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
374 priv->idx_size=size2>>4; |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
375 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_ReadingIndexBlockChunksForFrames, |
17366 | 376 priv->idx_size,avih.dwTotalFrames, (int64_t)stream_tell(demuxer->stream)); |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
377 priv->idx=malloc(priv->idx_size<<4); |
7762 | 378 // printf("\nindex to %p !!!!! (priv=%p)\n",priv->idx,priv); |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
379 stream_read(demuxer->stream,(char*)priv->idx,priv->idx_size<<4); |
12737
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
380 for (i = 0; i < priv->idx_size; i++) { // swap index to machine endian |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
381 AVIINDEXENTRY *entry=(AVIINDEXENTRY*)priv->idx + i; |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
382 le2me_AVIINDEXENTRY(entry); |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
383 /* |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
384 * We (ab)use the upper word for bits 32-47 of the offset, so |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
385 * we'll clear them here. |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
386 * FIXME: AFAIK no codec uses them, but if one does it will break |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
387 */ |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
388 entry->dwFlags&=0xffff; |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
389 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
390 chunksize-=priv->idx_size<<4; |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
391 if( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx,priv->idx_size,MSGL_DBG2); |
1 | 392 } |
12036 | 393 break; |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
394 /* added May 2002 */ |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
395 case mmioFOURCC('R','I','F','F'): { |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
396 char riff_type[4]; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
397 |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
398 mp_msg(MSGT_HEADER, MSGL_V, MSGTR_MPDEMUX_AVIHDR_AdditionalRIFFHdr); |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
399 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
|
400 if (strncmp(riff_type, "AVIX", sizeof riff_type)) |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
401 mp_msg(MSGT_HEADER, MSGL_WARN, MSGTR_MPDEMUX_AVIHDR_WarnNotExtendedAVIHdr); |
12362 | 402 else { |
403 /* | |
404 * We got an extended AVI header, so we need to switch to | |
405 * ODML to get seeking to work, provided we got indx chunks | |
406 * in the header (suidx_size > 0). | |
407 */ | |
408 if (priv->suidx_size > 0) | |
409 priv->isodml = 1; | |
410 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
411 chunksize = 0; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
412 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
|
413 break; } |
12036 | 414 case ckidAVIPADDING: |
415 stream_skip(demuxer->stream, chunksize); | |
416 chunksize = 0; | |
417 break; | |
1 | 418 } |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
419 if(hdr){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
420 mp_msg(MSGT_HEADER,MSGL_V,"hdr=%s size=%u\n",hdr,size2); |
4664 | 421 if(size2==3) |
422 chunksize=1; // empty | |
423 else { | |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
424 char buf[256]; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
425 int len=(size2<250)?size2:250; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
426 stream_read(demuxer->stream,buf,len); |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
427 chunksize-=len; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
428 buf[len]=0; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
429 mp_msg(MSGT_HEADER,MSGL_V,"%-10s: %s\n",hdr,buf); |
3071 | 430 demux_info_add(demuxer, hdr, buf); |
4664 | 431 } |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
432 } |
17366 | 433 mp_msg(MSGT_HEADER,MSGL_DBG2,"list_end=0x%"PRIX64" pos=0x%"PRIX64" chunksize=0x%"PRIX64" next=0x%"PRIX64"\n", |
434 (int64_t)list_end, (int64_t)stream_tell(demuxer->stream), | |
435 (int64_t)chunksize, (int64_t)chunksize+(int64_t)stream_tell(demuxer->stream)); | |
12036 | 436 if(list_end>0 && |
437 chunksize+stream_tell(demuxer->stream) == list_end) list_end=0; | |
4664 | 438 if(list_end>0 && chunksize+stream_tell(demuxer->stream)>list_end){ |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
439 mp_msg(MSGT_HEADER,MSGL_V,MSGTR_MPDEMUX_AVIHDR_BrokenChunk,chunksize,(char *) &id); |
4664 | 440 stream_seek(demuxer->stream,list_end); |
441 list_end=0; | |
442 } else | |
1 | 443 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
|
444 if((int)chunksize<0) mp_msg(MSGT_HEADER,MSGL_WARN,"chunksize=%u (id=%.4s)\n",chunksize,(char *) &id); |
1 | 445 |
446 } | |
447 | |
12728
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
448 if (priv->suidx_size > 0 && priv->idx_size == 0) { |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
449 /* |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
450 * No NEWAVIINDEX, but we got an OpenDML index. |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
451 */ |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
452 priv->isodml = 1; |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
453 } |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
454 |
17564
8762ebad064f
fix -idx with ODML files (patch by Benjamin Zores < ben _at_ tutuxclan.org >)
aurel
parents:
17366
diff
changeset
|
455 if (priv->isodml && (index_mode==-1 || index_mode==0 || index_mode==1)) { |
12036 | 456 int i, j, k; |
457 | |
458 avisuperindex_chunk *cx; | |
459 AVIINDEXENTRY *idx; | |
460 | |
461 | |
462 if (priv->idx_size) free(priv->idx); | |
463 priv->idx_size = 0; | |
464 priv->idx_offset = 0; | |
465 priv->idx = NULL; | |
466 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
467 mp_msg(MSGT_HEADER, MSGL_INFO, MSGTR_MPDEMUX_AVIHDR_BuildingODMLidx, priv->suidx_size); |
12036 | 468 |
469 // read the standard indices | |
470 for (cx = &priv->suidx[0], i=0; i<priv->suidx_size; cx++, i++) { | |
471 stream_reset(demuxer->stream); | |
472 for (j=0; j<cx->nEntriesInUse; j++) { | |
473 int ret1, ret2; | |
474 memset(&cx->stdidx[j], 0, 32); | |
475 ret1 = stream_seek(demuxer->stream, (off_t)cx->aIndex[j].qwOffset); | |
476 ret2 = stream_read(demuxer->stream, (char *)&cx->stdidx[j], 32); | |
477 if (ret1 != 1 || ret2 != 32 || cx->stdidx[j].nEntriesInUse==0) { | |
478 // this is a broken file (probably incomplete) let the standard | |
479 // gen_index routine handle this | |
480 priv->isodml = 0; | |
481 priv->idx_size = 0; | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
482 mp_msg(MSGT_HEADER, MSGL_WARN, MSGTR_MPDEMUX_AVIHDR_BrokenODMLfile); |
12036 | 483 goto freeout; |
484 } | |
485 | |
486 le2me_AVISTDIDXCHUNK(&cx->stdidx[j]); | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
487 print_avistdindex_chunk(&cx->stdidx[j],MSGL_V); |
12036 | 488 priv->idx_size += cx->stdidx[j].nEntriesInUse; |
489 cx->stdidx[j].aIndex = malloc(cx->stdidx[j].nEntriesInUse*sizeof(avistdindex_entry)); | |
490 stream_read(demuxer->stream, (char *)cx->stdidx[j].aIndex, | |
491 cx->stdidx[j].nEntriesInUse*sizeof(avistdindex_entry)); | |
492 for (k=0;k<cx->stdidx[j].nEntriesInUse; k++) | |
493 le2me_AVISTDIDXENTRY(&cx->stdidx[j].aIndex[k]); | |
494 | |
495 cx->stdidx[j].dwReserved3 = 0; | |
496 | |
497 } | |
498 } | |
499 | |
500 /* | |
501 * We convert the index by translating all entries into AVIINDEXENTRYs | |
502 * and sorting them by offset. The result should be the same index | |
503 * we would get with -forceidx. | |
504 */ | |
505 | |
506 idx = priv->idx = malloc(priv->idx_size * sizeof (AVIINDEXENTRY)); | |
507 | |
508 for (cx = priv->suidx; cx != &priv->suidx[priv->suidx_size]; cx++) { | |
509 avistdindex_chunk *sic; | |
510 for (sic = cx->stdidx; sic != &cx->stdidx[cx->nEntriesInUse]; sic++) { | |
511 avistdindex_entry *sie; | |
512 for (sie = sic->aIndex; sie != &sic->aIndex[sic->nEntriesInUse]; sie++) { | |
513 uint64_t off = sic->qwBaseOffset + sie->dwOffset - 8; | |
514 memcpy(&idx->ckid, sic->dwChunkId, 4); | |
515 idx->dwChunkOffset = off; | |
516 idx->dwFlags = (off >> 32) << 16; | |
517 idx->dwChunkLength = sie->dwSize & 0x7fffffff; | |
518 idx->dwFlags |= (sie->dwSize&0x80000000)?0x0:AVIIF_KEYFRAME; // bit 31 denotes !keyframe | |
519 idx++; | |
520 } | |
521 } | |
522 } | |
14297 | 523 qsort(priv->idx, priv->idx_size, sizeof(AVIINDEXENTRY), avi_idx_cmp); |
12036 | 524 |
525 /* | |
526 Hack to work around a "wrong" index in some divx odml files | |
527 (processor_burning.avi as an example) | |
528 They have ##dc on non keyframes but the ix00 tells us they are ##db. | |
529 Read the fcc of a non-keyframe vid frame and check it. | |
530 */ | |
531 | |
532 { | |
533 uint32_t id; | |
534 uint32_t db = 0; | |
535 stream_reset (demuxer->stream); | |
536 | |
537 // find out the video stream id. I have seen files with 01db. | |
538 for (idx = &((AVIINDEXENTRY *)priv->idx)[0], i=0; i<priv->idx_size; i++, idx++){ | |
539 unsigned char res[2]; | |
540 if (odml_get_vstream_id(idx->ckid, res)) { | |
541 db = mmioFOURCC(res[0], res[1], 'd', 'b'); | |
542 break; | |
543 } | |
544 } | |
545 | |
546 // find first non keyframe | |
547 for (idx = &((AVIINDEXENTRY *)priv->idx)[0], i=0; i<priv->idx_size; i++, idx++){ | |
548 if (!(idx->dwFlags & AVIIF_KEYFRAME) && idx->ckid == db) break; | |
549 } | |
550 if (i<priv->idx_size && db) { | |
551 stream_seek(demuxer->stream, AVI_IDX_OFFSET(idx)); | |
552 id = stream_read_dword_le(demuxer->stream); | |
553 if (id && id != db) // index fcc and real fcc differ? fix it. | |
554 for (idx = &((AVIINDEXENTRY *)priv->idx)[0], i=0; i<priv->idx_size; i++, idx++){ | |
555 if (!(idx->dwFlags & AVIIF_KEYFRAME) && idx->ckid == db) | |
556 idx->ckid = id; | |
557 } | |
558 } | |
559 } | |
560 | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
561 if ( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx, priv->idx_size,MSGL_DBG2); |
12036 | 562 |
563 demuxer->movi_end=demuxer->stream->end_pos; | |
564 | |
565 freeout: | |
566 | |
567 // free unneeded stuff | |
568 cx = &priv->suidx[0]; | |
569 do { | |
570 for (j=0;j<cx->nEntriesInUse;j++) | |
571 if (cx->stdidx[j].nEntriesInUse) free(cx->stdidx[j].aIndex); | |
572 free(cx->stdidx); | |
573 | |
574 } while (cx++ != &priv->suidx[priv->suidx_size-1]); | |
575 free(priv->suidx); | |
576 | |
577 } | |
578 | |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
579 /* Read a saved index file */ |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
580 if (index_file_load) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
581 FILE *fp; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
582 char magic[7]; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
583 unsigned int i; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
584 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
585 if ((fp = fopen(index_file_load, "r")) == NULL) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
586 mp_msg(MSGT_HEADER,MSGL_ERR, MSGTR_MPDEMUX_AVIHDR_CantReadIdxFile, index_file_load, strerror(errno)); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
587 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
588 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
589 fread(&magic, 6, 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
590 if (strncmp(magic, "MPIDX1", 6)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
591 mp_msg(MSGT_HEADER,MSGL_ERR, MSGTR_MPDEMUX_AVIHDR_NotValidMPidxFile, index_file_load); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
592 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
593 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
594 fread(&priv->idx_size, sizeof(priv->idx_size), 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
595 priv->idx=malloc(priv->idx_size*sizeof(AVIINDEXENTRY)); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
596 if (!priv->idx) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
597 mp_msg(MSGT_HEADER,MSGL_ERR, MSGTR_MPDEMUX_AVIHDR_FailedMallocForIdxFile, index_file_load); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
598 priv->idx_size = 0; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
599 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
600 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
601 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
602 for (i=0; i<priv->idx_size;i++) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
603 AVIINDEXENTRY *idx; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
604 idx=&((AVIINDEXENTRY *)priv->idx)[i]; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
605 fread(idx, sizeof(AVIINDEXENTRY), 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
606 if (feof(fp)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
607 mp_msg(MSGT_HEADER,MSGL_ERR, MSGTR_MPDEMUX_AVIHDR_PrematureEOF, index_file_load); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
608 free(priv->idx); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
609 priv->idx_size = 0; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
610 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
611 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
612 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
613 fclose(fp); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
614 mp_msg(MSGT_HEADER,MSGL_INFO, MSGTR_MPDEMUX_AVIHDR_IdxFileLoaded, index_file_load); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
615 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
616 gen_index: |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
617 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
|
618 // build index for file: |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
619 stream_reset(demuxer->stream); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
620 stream_seek(demuxer->stream,demuxer->movi_start); |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
621 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
622 priv->idx_pos=0; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
623 priv->idx_size=0; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
624 priv->idx=NULL; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
625 |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
626 while(1){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
627 int id; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
628 unsigned len; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
629 off_t skip; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
630 AVIINDEXENTRY* idx; |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
631 unsigned int c; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
632 demuxer->filepos=stream_tell(demuxer->stream); |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
633 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
|
634 id=stream_read_dword_le(demuxer->stream); |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
635 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
|
636 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
|
637 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
|
638 continue; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
639 } |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
640 if(stream_eof(demuxer->stream)) break; |
1392 | 641 if(!id || avi_stream_id(id)==100) goto skip_chunk; // bad ID (or padding?) |
642 | |
1499 | 643 if(priv->idx_pos>=priv->idx_size){ |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
644 // priv->idx_size+=32; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
645 priv->idx_size+=1024; // +16kB |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
646 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
|
647 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
|
648 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
649 idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
650 idx->ckid=id; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
651 idx->dwFlags=AVIIF_KEYFRAME; // FIXME |
12036 | 652 idx->dwFlags|=(demuxer->filepos>>16)&0xffff0000U; |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
653 idx->dwChunkOffset=(unsigned long)demuxer->filepos; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
654 idx->dwChunkLength=len; |
569 | 655 |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
656 c=stream_read_dword(demuxer->stream); |
568 | 657 |
18050 | 658 if(!len) idx->dwFlags&=~AVIIF_KEYFRAME; |
659 | |
568 | 660 // Fix keyframes for DivX files: |
661 if(idxfix_divx) | |
662 if(avi_stream_id(id)==idxfix_videostream){ | |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
663 switch(idxfix_divx){ |
6275 | 664 case 3: c=stream_read_dword(demuxer->stream)<<5; //skip 32+5 bits for m$mpeg4v1 |
12036 | 665 case 1: if(c&0x40000000) idx->dwFlags&=~AVIIF_KEYFRAME;break; // divx 3 |
666 case 2: if(c==0x1B6) idx->dwFlags&=~AVIIF_KEYFRAME;break; // divx 4 | |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
667 } |
568 | 668 } |
3781 | 669 |
670 // update status line: | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
671 { static off_t lastpos; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
672 off_t pos; |
3781 | 673 off_t len=demuxer->movi_end-demuxer->movi_start; |
674 if(len){ | |
675 pos=100*(demuxer->filepos-demuxer->movi_start)/len; // % | |
676 } else { | |
677 pos=(demuxer->filepos-demuxer->movi_start)>>20; // MB | |
678 } | |
679 if(pos!=lastpos){ | |
680 lastpos=pos; | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
681 mp_msg(MSGT_HEADER,MSGL_STATUS,MSGTR_MPDEMUX_AVIHDR_GeneratingIdx, |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
682 (unsigned long)pos, len?"%":"MB"); |
3781 | 683 } |
684 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
685 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 | 686 #if 0 |
687 { unsigned char tmp[64]; | |
688 int i; | |
689 stream_read(demuxer->stream,tmp,64); | |
690 printf("%.4s",&id); | |
691 for(i=0;i<64;i++) printf(" %02X",tmp[i]); | |
692 printf("\n"); | |
693 } | |
694 #endif | |
1392 | 695 skip_chunk: |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
696 skip=(len+1)&(~1UL); // total bytes in this chunk |
568 | 697 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
|
698 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
699 priv->idx_size=priv->idx_pos; |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
700 mp_msg(MSGT_HEADER,MSGL_INFO,MSGTR_MPDEMUX_AVIHDR_IdxGeneratedForHowManyChunks,priv->idx_size); |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
701 if( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx,priv->idx_size,MSGL_DBG2); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
702 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
703 /* Write generated index to a file */ |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
704 if (index_file_save) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
705 FILE *fp; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
706 unsigned int i; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
707 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
708 if ((fp=fopen(index_file_save, "w")) == NULL) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
709 mp_msg(MSGT_HEADER,MSGL_ERR, MSGTR_MPDEMUX_AVIHDR_Failed2WriteIdxFile, index_file_save, strerror(errno)); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
710 return; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
711 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
712 fwrite("MPIDX1", 6, 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
713 fwrite(&priv->idx_size, sizeof(priv->idx_size), 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
714 for (i=0; i<priv->idx_size; i++) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
715 AVIINDEXENTRY *idx = &((AVIINDEXENTRY *)priv->idx)[i]; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
716 fwrite(idx, sizeof(AVIINDEXENTRY), 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
717 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
718 fclose(fp); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
719 mp_msg(MSGT_HEADER,MSGL_INFO, MSGTR_MPDEMUX_AVIHDR_IdxFileSaved, index_file_save); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
720 } |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
721 } |
1 | 722 } |
723 |