Mercurial > mplayer.hg
annotate libmpdemux/aviheader.c @ 36659:f41b65ac7e81
configure: disable internal libmpeg2 by default.
While the last tests showed that it can be slightly
faster in some cases, the difference should not be
relevant to the majority of users.
In addition, the code is of not particularly high
quality, so I consider it better/safer to have it
disabled by default.
Removing the code after the next release is a possible
future action.
author | reimar |
---|---|
date | Sun, 26 Jan 2014 18:19:31 +0000 |
parents | 33a385204875 |
children |
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) { |
36316
139f2b064ef9
Don't subsequently calculate original_aspect from last movie_aspect.
ib
parents:
35410
diff
changeset
|
367 sh_video->original_aspect = GET_AVI_ASPECT(vprp->dwFrameAspectRatio); |
12036 | 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 |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
397 AVIINDEXENTRY *entry=priv->idx + i; |
12737
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 | |
36341
63f19afc5a6f
avidemux: try reading ODML index if the default one is
reimar
parents:
36316
diff
changeset
|
464 // Some files contain a dummy non-odml index. |
63f19afc5a6f
avidemux: try reading ODML index if the default one is
reimar
parents:
36316
diff
changeset
|
465 // Ignore an index smaller than some arbitrary size. |
63f19afc5a6f
avidemux: try reading ODML index if the default one is
reimar
parents:
36316
diff
changeset
|
466 // Some Canon cameras recording in MJPEG do this |
63f19afc5a6f
avidemux: try reading ODML index if the default one is
reimar
parents:
36316
diff
changeset
|
467 // (encoder software identifier CanonMVI06). |
63f19afc5a6f
avidemux: try reading ODML index if the default one is
reimar
parents:
36316
diff
changeset
|
468 if (priv->suidx_size > 0 && priv->idx_size < 4) { |
12728
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 * 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
|
471 */ |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
472 priv->isodml = 1; |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
473 } |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
474 |
17564
8762ebad064f
fix -idx with ODML files (patch by Benjamin Zores < ben _at_ tutuxclan.org >)
aurel
parents:
17366
diff
changeset
|
475 if (priv->isodml && (index_mode==-1 || index_mode==0 || index_mode==1)) { |
12036 | 476 int i, j, k; |
477 | |
478 avisuperindex_chunk *cx; | |
479 AVIINDEXENTRY *idx; | |
480 | |
481 | |
482 if (priv->idx_size) free(priv->idx); | |
483 priv->idx_size = 0; | |
484 priv->idx_offset = 0; | |
485 priv->idx = NULL; | |
486 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
487 mp_msg(MSGT_HEADER, MSGL_INFO, MSGTR_MPDEMUX_AVIHDR_BuildingODMLidx, priv->suidx_size); |
12036 | 488 |
489 // read the standard indices | |
490 for (cx = &priv->suidx[0], i=0; i<priv->suidx_size; cx++, i++) { | |
491 stream_reset(demuxer->stream); | |
492 for (j=0; j<cx->nEntriesInUse; j++) { | |
493 int ret1, ret2; | |
494 memset(&cx->stdidx[j], 0, 32); | |
495 ret1 = stream_seek(demuxer->stream, (off_t)cx->aIndex[j].qwOffset); | |
496 ret2 = stream_read(demuxer->stream, (char *)&cx->stdidx[j], 32); | |
497 if (ret1 != 1 || ret2 != 32 || cx->stdidx[j].nEntriesInUse==0) { | |
498 // this is a broken file (probably incomplete) let the standard | |
499 // gen_index routine handle this | |
500 priv->isodml = 0; | |
501 priv->idx_size = 0; | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
502 mp_msg(MSGT_HEADER, MSGL_WARN, MSGTR_MPDEMUX_AVIHDR_BrokenODMLfile); |
12036 | 503 goto freeout; |
504 } | |
505 | |
506 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
|
507 print_avistdindex_chunk(&cx->stdidx[j],MSGL_V); |
12036 | 508 priv->idx_size += cx->stdidx[j].nEntriesInUse; |
509 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
|
510 stream_read(demuxer->stream, (char *)cx->stdidx[j].aIndex, |
12036 | 511 cx->stdidx[j].nEntriesInUse*sizeof(avistdindex_entry)); |
512 for (k=0;k<cx->stdidx[j].nEntriesInUse; k++) | |
513 le2me_AVISTDIDXENTRY(&cx->stdidx[j].aIndex[k]); | |
514 | |
515 cx->stdidx[j].dwReserved3 = 0; | |
516 | |
517 } | |
518 } | |
519 | |
520 /* | |
521 * We convert the index by translating all entries into AVIINDEXENTRYs | |
522 * and sorting them by offset. The result should be the same index | |
523 * we would get with -forceidx. | |
524 */ | |
525 | |
526 idx = priv->idx = malloc(priv->idx_size * sizeof (AVIINDEXENTRY)); | |
527 | |
528 for (cx = priv->suidx; cx != &priv->suidx[priv->suidx_size]; cx++) { | |
529 avistdindex_chunk *sic; | |
530 for (sic = cx->stdidx; sic != &cx->stdidx[cx->nEntriesInUse]; sic++) { | |
531 avistdindex_entry *sie; | |
532 for (sie = sic->aIndex; sie != &sic->aIndex[sic->nEntriesInUse]; sie++) { | |
533 uint64_t off = sic->qwBaseOffset + sie->dwOffset - 8; | |
534 memcpy(&idx->ckid, sic->dwChunkId, 4); | |
535 idx->dwChunkOffset = off; | |
536 idx->dwFlags = (off >> 32) << 16; | |
537 idx->dwChunkLength = sie->dwSize & 0x7fffffff; | |
538 idx->dwFlags |= (sie->dwSize&0x80000000)?0x0:AVIIF_KEYFRAME; // bit 31 denotes !keyframe | |
539 idx++; | |
540 } | |
541 } | |
542 } | |
14297 | 543 qsort(priv->idx, priv->idx_size, sizeof(AVIINDEXENTRY), avi_idx_cmp); |
12036 | 544 |
545 /* | |
546 Hack to work around a "wrong" index in some divx odml files | |
547 (processor_burning.avi as an example) | |
548 They have ##dc on non keyframes but the ix00 tells us they are ##db. | |
549 Read the fcc of a non-keyframe vid frame and check it. | |
550 */ | |
551 | |
552 { | |
553 uint32_t id; | |
554 uint32_t db = 0; | |
555 stream_reset (demuxer->stream); | |
556 | |
557 // find out the video stream id. I have seen files with 01db. | |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
558 for (idx = priv->idx, i=0; i<priv->idx_size; i++, idx++){ |
12036 | 559 unsigned char res[2]; |
560 if (odml_get_vstream_id(idx->ckid, res)) { | |
561 db = mmioFOURCC(res[0], res[1], 'd', 'b'); | |
562 break; | |
563 } | |
564 } | |
565 | |
566 // find first non keyframe | |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
567 for (idx = priv->idx, i=0; i<priv->idx_size; i++, idx++){ |
12036 | 568 if (!(idx->dwFlags & AVIIF_KEYFRAME) && idx->ckid == db) break; |
569 } | |
570 if (i<priv->idx_size && db) { | |
571 stream_seek(demuxer->stream, AVI_IDX_OFFSET(idx)); | |
572 id = stream_read_dword_le(demuxer->stream); | |
573 if (id && id != db) // index fcc and real fcc differ? fix it. | |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
574 for (idx = priv->idx, i=0; i<priv->idx_size; i++, idx++){ |
12036 | 575 if (!(idx->dwFlags & AVIIF_KEYFRAME) && idx->ckid == db) |
576 idx->ckid = id; | |
577 } | |
578 } | |
579 } | |
580 | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
581 if ( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx, priv->idx_size,MSGL_DBG2); |
12036 | 582 |
583 demuxer->movi_end=demuxer->stream->end_pos; | |
584 | |
585 freeout: | |
586 | |
587 // free unneeded stuff | |
588 cx = &priv->suidx[0]; | |
589 do { | |
590 for (j=0;j<cx->nEntriesInUse;j++) | |
591 if (cx->stdidx[j].nEntriesInUse) free(cx->stdidx[j].aIndex); | |
592 free(cx->stdidx); | |
593 | |
594 } while (cx++ != &priv->suidx[priv->suidx_size-1]); | |
595 free(priv->suidx); | |
596 | |
597 } | |
598 | |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
599 /* Read a saved index file */ |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
600 if (index_file_load) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
601 FILE *fp; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
602 char magic[7]; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
603 unsigned int i; |
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 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
|
606 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
|
607 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
608 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
609 fread(&magic, 6, 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
610 if (strncmp(magic, "MPIDX1", 6)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
611 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
|
612 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
613 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
614 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
|
615 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
|
616 if (!priv->idx) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
617 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
|
618 priv->idx_size = 0; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
619 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
620 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
621 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
622 for (i=0; i<priv->idx_size;i++) { |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
623 AVIINDEXENTRY *idx=priv->idx + i; |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
624 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
|
625 if (feof(fp)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
626 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
|
627 free(priv->idx); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
628 priv->idx_size = 0; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
629 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
630 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
631 } |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
632 mp_msg(MSGT_HEADER,MSGL_INFO, MSGTR_MPDEMUX_AVIHDR_IdxFileLoaded, index_file_load); |
36558
33a385204875
aviheader: Close file also when an index file contains an error.
reimar
parents:
36341
diff
changeset
|
633 gen_index: |
33a385204875
aviheader: Close file also when an index file contains an error.
reimar
parents:
36341
diff
changeset
|
634 if (fp) fclose(fp); |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
635 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
636 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
|
637 int idx_pos = 0; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
638 // build index for file: |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
639 stream_reset(demuxer->stream); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
640 stream_seek(demuxer->stream,demuxer->movi_start); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
641 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
642 priv->idx_size=0; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
643 priv->idx=NULL; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
644 |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
645 while(1){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
646 int id; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
647 unsigned len; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
648 off_t skip; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
649 AVIINDEXENTRY* idx; |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
650 unsigned int c; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
651 demuxer->filepos=stream_tell(demuxer->stream); |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
652 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
|
653 id=stream_read_dword_le(demuxer->stream); |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
654 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
|
655 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
|
656 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
|
657 continue; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
658 } |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
659 if(stream_eof(demuxer->stream)) break; |
1392 | 660 if(!id || avi_stream_id(id)==100) goto skip_chunk; // bad ID (or padding?) |
661 | |
30010
5babc40c26de
Do not modify priv->idx_pos when regenerating the index, use a local
reimar
parents:
29288
diff
changeset
|
662 if(idx_pos>=priv->idx_size){ |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
663 // priv->idx_size+=32; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
664 priv->idx_size+=1024; // +16kB |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
665 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
|
666 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
|
667 } |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
668 idx=priv->idx + idx_pos++; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
669 idx->ckid=id; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
670 idx->dwFlags=AVIIF_KEYFRAME; // FIXME |
12036 | 671 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
|
672 idx->dwChunkOffset=(unsigned long)demuxer->filepos; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
673 idx->dwChunkLength=len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
674 |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
675 c=stream_read_dword(demuxer->stream); |
568 | 676 |
18050 | 677 if(!len) idx->dwFlags&=~AVIIF_KEYFRAME; |
678 | |
568 | 679 // Fix keyframes for DivX files: |
680 if(idxfix_divx) | |
681 if(avi_stream_id(id)==idxfix_videostream){ | |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
682 switch(idxfix_divx){ |
6275 | 683 case 3: c=stream_read_dword(demuxer->stream)<<5; //skip 32+5 bits for m$mpeg4v1 |
12036 | 684 case 1: if(c&0x40000000) idx->dwFlags&=~AVIIF_KEYFRAME;break; // divx 3 |
685 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
|
686 } |
568 | 687 } |
3781 | 688 |
689 // update status line: | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
690 { static off_t lastpos; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
691 off_t pos; |
3781 | 692 off_t len=demuxer->movi_end-demuxer->movi_start; |
693 if(len){ | |
694 pos=100*(demuxer->filepos-demuxer->movi_start)/len; // % | |
695 } else { | |
696 pos=(demuxer->filepos-demuxer->movi_start)>>20; // MB | |
697 } | |
698 if(pos!=lastpos){ | |
699 lastpos=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_STATUS,MSGTR_MPDEMUX_AVIHDR_GeneratingIdx, |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
701 (unsigned long)pos, len?"%":"MB"); |
3781 | 702 } |
703 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
704 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 | 705 #if 0 |
706 { unsigned char tmp[64]; | |
707 int i; | |
708 stream_read(demuxer->stream,tmp,64); | |
709 printf("%.4s",&id); | |
710 for(i=0;i<64;i++) printf(" %02X",tmp[i]); | |
711 printf("\n"); | |
712 } | |
713 #endif | |
1392 | 714 skip_chunk: |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
715 skip=(len+1)&(~1UL); // total bytes in this chunk |
568 | 716 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
|
717 } |
30010
5babc40c26de
Do not modify priv->idx_pos when regenerating the index, use a local
reimar
parents:
29288
diff
changeset
|
718 priv->idx_size=idx_pos; |
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_IdxGeneratedForHowManyChunks,priv->idx_size); |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
720 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
|
721 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
722 /* 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
|
723 if (index_file_save) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
724 FILE *fp; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
725 unsigned int i; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
726 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
727 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
|
728 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
|
729 return; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
730 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
731 fwrite("MPIDX1", 6, 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
732 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
|
733 for (i=0; i<priv->idx_size; i++) { |
35410
1c991ec0e6da
Change declaration to use proper type to avoid a ridiculous
reimar
parents:
35409
diff
changeset
|
734 AVIINDEXENTRY *idx = priv->idx + i; |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
735 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
|
736 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
737 fclose(fp); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
738 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
|
739 } |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
740 } |
1 | 741 } |