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