Mercurial > mplayer.hg
annotate libmpdemux/aviheader.c @ 34064:54becc464788
Set MPlayer filename in uiSetFileName().
This ensures that filename always points to guiInfo.Filename (the GUI
filename).
If guiInit() is called without filename being set, leave it that way.
(This applies if the GUI should not start playing immediately.)
author | ib |
---|---|
date | Thu, 29 Sep 2011 13:26:32 +0000 |
parents | 25667edae85c |
children | 8f2167abd6e0 |
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){ | |
32105 | 270 sh_video->bih=calloc(FFMAX(chunksize, sizeof(*sh_video->bih)), 1); |
433 | 271 // 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
|
272 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
|
273 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
|
274 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
|
275 le2me_BITMAPINFOHEADER(sh_video->bih); // swap to machine endian |
32105 | 276 if (sh_video->bih->biSize > chunksize && sh_video->bih->biSize > sizeof(*sh_video->bih)) |
21967 | 277 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
|
278 // fixup MS-RLE header (seems to be broken for <256 color files) |
7784 | 279 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
|
280 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
|
281 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
|
282 chunksize=0; |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
283 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
|
284 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
|
285 sh_video->format = sh_video->bih->biCompression; |
426 | 286 // if(demuxer->video->id==-1) demuxer->video->id=stream_id; |
568 | 287 // IdxFix: |
288 idxfix_videostream=stream_id; | |
289 switch(sh_video->bih->biCompression){ | |
6275 | 290 case mmioFOURCC('M', 'P', 'G', '4'): |
291 case mmioFOURCC('m', 'p', 'g', '4'): | |
292 case mmioFOURCC('D', 'I', 'V', '1'): | |
13700 | 293 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
|
294 mp_msg(MSGT_HEADER, MSGL_V, "Regenerating keyframe table for M$ mpg4v1 video.\n"); |
6275 | 295 break; |
296 case mmioFOURCC('D', 'I', 'V', '3'): | |
568 | 297 case mmioFOURCC('d', 'i', 'v', '3'): |
298 case mmioFOURCC('D', 'I', 'V', '4'): | |
299 case mmioFOURCC('d', 'i', 'v', '4'): | |
300 case mmioFOURCC('D', 'I', 'V', '5'): | |
301 case mmioFOURCC('d', 'i', 'v', '5'): | |
302 case mmioFOURCC('D', 'I', 'V', '6'): | |
303 case mmioFOURCC('d', 'i', 'v', '6'): | |
304 case mmioFOURCC('M', 'P', '4', '3'): | |
305 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
|
306 case mmioFOURCC('M', 'P', '4', '2'): |
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'): |
773 | 308 case mmioFOURCC('D', 'I', 'V', '2'): |
568 | 309 case mmioFOURCC('A', 'P', '4', '1'): |
13700 | 310 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
|
311 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
|
312 break; |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
313 case mmioFOURCC('D', 'I', 'V', 'X'): |
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
314 case mmioFOURCC('d', 'i', 'v', 'x'): |
6274 | 315 case mmioFOURCC('D', 'X', '5', '0'): |
13671 | 316 case mmioFOURCC('X', 'V', 'I', 'D'): |
317 case mmioFOURCC('x', 'v', 'i', 'd'): | |
14766 | 318 case mmioFOURCC('F', 'M', 'P', '4'): |
319 case mmioFOURCC('f', 'm', 'p', '4'): | |
13700 | 320 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
|
321 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
|
322 break; |
568 | 323 } |
1 | 324 } else |
325 if(last_fccType==streamtypeAUDIO){ | |
32105 | 326 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
|
327 sh_audio->wf=calloc(wf_size,1); |
433 | 328 // 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
|
329 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
|
330 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
|
331 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
|
332 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
|
333 if (sh_audio->wf->cbSize != 0 && |
32105 | 334 wf_size < sizeof(*sh_audio->wf)+sh_audio->wf->cbSize) { |
335 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
|
336 } |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
337 sh_audio->format=sh_audio->wf->wFormatTag; |
32552 | 338 if (sh_audio->wf->wFormatTag == 0xfffe && sh_audio->wf->cbSize >= 22) |
339 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
|
340 if (sh_audio->format == 1 && |
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
341 last_fccHandler == mmioFOURCC('A', 'x', 'a', 'n')) |
8d4b1bda30f1
Fix detection of xan audio. -noidx or -forceidx still is necessary
reimar
parents:
23841
diff
changeset
|
342 sh_audio->format = last_fccHandler; |
21387
8621736097f8
Move initialization of sh_audio/sh_video members to aviheader
reimar
parents:
21372
diff
changeset
|
343 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
|
344 chunksize=0; |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
345 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf,MSGL_V); |
2330 | 346 ++priv->audio_streams; |
426 | 347 // if(demuxer->audio->id==-1) demuxer->audio->id=stream_id; |
1 | 348 } |
349 break; | |
350 } | |
12036 | 351 case mmioFOURCC('v', 'p', 'r', 'p'): { |
352 VideoPropHeader *vprp = malloc(chunksize); | |
12342 | 353 unsigned int i; |
12036 | 354 stream_read(demuxer->stream, (void*)vprp, chunksize); |
355 le2me_VideoPropHeader(vprp); | |
356 chunksize -= sizeof(*vprp)-sizeof(vprp->FieldInfo); | |
357 chunksize /= sizeof(VIDEO_FIELD_DESC); | |
358 if (vprp->nbFieldPerFrame > chunksize) { | |
359 vprp->nbFieldPerFrame = chunksize; | |
360 } | |
361 chunksize = 0; | |
362 for (i=0; i<vprp->nbFieldPerFrame; i++) { | |
363 le2me_VIDEO_FIELD_DESC(&vprp->FieldInfo[i]); | |
364 } | |
12061 | 365 if (sh_video) { |
12036 | 366 sh_video->aspect = GET_AVI_ASPECT(vprp->dwFrameAspectRatio); |
367 } | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
368 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
|
369 free(vprp); |
12036 | 370 break; |
371 } | |
372 case mmioFOURCC('d', 'm', 'l', 'h'): { | |
373 // dmlh 00 00 00 04 frms | |
374 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
|
375 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
|
376 chunksize, total_frames); |
12036 | 377 stream_skip(demuxer->stream, chunksize-4); |
378 chunksize = 0; | |
379 } | |
380 break; | |
4225 | 381 case ckidAVINEWINDEX: |
382 if(demuxer->movi_end>stream_tell(demuxer->stream)) | |
383 demuxer->movi_end=stream_tell(demuxer->stream); // fixup movi-end | |
12036 | 384 if(index_mode && !priv->isodml){ |
32620
231764e0b755
Avoid using uninitialized data if index read does not return enough data.
reimar
parents:
32552
diff
changeset
|
385 int read; |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1289
diff
changeset
|
386 int i; |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
387 priv->idx_size=size2>>4; |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33334
diff
changeset
|
388 mp_msg(MSGT_HEADER, MSGL_V, |
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33334
diff
changeset
|
389 "Reading INDEX block, %d chunks for %d frames (fpos=%"PRId64").\n", |
17366 | 390 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
|
391 priv->idx=malloc(priv->idx_size<<4); |
7762 | 392 // 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
|
393 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
|
394 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
|
395 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
|
396 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
|
397 le2me_AVIINDEXENTRY(entry); |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
398 /* |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
399 * 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
|
400 * 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
|
401 * 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
|
402 */ |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
403 entry->dwFlags&=0xffff; |
ac56419ba6db
We still need to make sure the upper 16 bits of dwFlags are cleared
ranma
parents:
12736
diff
changeset
|
404 } |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
405 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
|
406 if( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx,priv->idx_size,MSGL_DBG2); |
1 | 407 } |
12036 | 408 break; |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
409 /* added May 2002 */ |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
410 case mmioFOURCC('R','I','F','F'): { |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
411 char riff_type[4]; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
412 |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
33334
diff
changeset
|
413 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
|
414 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
|
415 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
|
416 mp_msg(MSGT_HEADER, MSGL_WARN, MSGTR_MPDEMUX_AVIHDR_WarnNotExtendedAVIHdr); |
12362 | 417 else { |
418 /* | |
419 * We got an extended AVI header, so we need to switch to | |
420 * ODML to get seeking to work, provided we got indx chunks | |
421 * in the header (suidx_size > 0). | |
422 */ | |
423 if (priv->suidx_size > 0) | |
424 priv->isodml = 1; | |
425 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
426 chunksize = 0; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
427 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
|
428 break; } |
12036 | 429 case ckidAVIPADDING: |
430 stream_skip(demuxer->stream, chunksize); | |
431 chunksize = 0; | |
432 break; | |
1 | 433 } |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
434 if(hdr){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
435 mp_msg(MSGT_HEADER,MSGL_V,"hdr=%s size=%u\n",hdr,size2); |
4664 | 436 if(size2==3) |
437 chunksize=1; // empty | |
438 else { | |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
439 char buf[256]; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
440 int len=(size2<250)?size2:250; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
441 stream_read(demuxer->stream,buf,len); |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
442 chunksize-=len; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
443 buf[len]=0; |
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
444 mp_msg(MSGT_HEADER,MSGL_V,"%-10s: %s\n",hdr,buf); |
3071 | 445 demux_info_add(demuxer, hdr, buf); |
4664 | 446 } |
1671
e6804fef9061
print AVI info block (copyright,artist etc) (-v only)
arpi
parents:
1567
diff
changeset
|
447 } |
17366 | 448 mp_msg(MSGT_HEADER,MSGL_DBG2,"list_end=0x%"PRIX64" pos=0x%"PRIX64" chunksize=0x%"PRIX64" next=0x%"PRIX64"\n", |
449 (int64_t)list_end, (int64_t)stream_tell(demuxer->stream), | |
450 (int64_t)chunksize, (int64_t)chunksize+(int64_t)stream_tell(demuxer->stream)); | |
12036 | 451 if(list_end>0 && |
452 chunksize+stream_tell(demuxer->stream) == list_end) list_end=0; | |
4664 | 453 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
|
454 mp_msg(MSGT_HEADER, MSGL_V, "Broken chunk? chunksize=%d (id=%.4s)\n", chunksize, (char *) &id); |
4664 | 455 stream_seek(demuxer->stream,list_end); |
456 list_end=0; | |
457 } else | |
1 | 458 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
|
459 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
|
460 |
1 | 461 } |
462 | |
12728
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
463 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
|
464 /* |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
465 * 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
|
466 */ |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
467 priv->isodml = 1; |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
468 } |
5369a905c5a5
If we don't have a NEWAVIINDEX chunk, but have an OpenDML index,
ranma
parents:
12362
diff
changeset
|
469 |
17564
8762ebad064f
fix -idx with ODML files (patch by Benjamin Zores < ben _at_ tutuxclan.org >)
aurel
parents:
17366
diff
changeset
|
470 if (priv->isodml && (index_mode==-1 || index_mode==0 || index_mode==1)) { |
12036 | 471 int i, j, k; |
472 | |
473 avisuperindex_chunk *cx; | |
474 AVIINDEXENTRY *idx; | |
475 | |
476 | |
477 if (priv->idx_size) free(priv->idx); | |
478 priv->idx_size = 0; | |
479 priv->idx_offset = 0; | |
480 priv->idx = NULL; | |
481 | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
482 mp_msg(MSGT_HEADER, MSGL_INFO, MSGTR_MPDEMUX_AVIHDR_BuildingODMLidx, priv->suidx_size); |
12036 | 483 |
484 // read the standard indices | |
485 for (cx = &priv->suidx[0], i=0; i<priv->suidx_size; cx++, i++) { | |
486 stream_reset(demuxer->stream); | |
487 for (j=0; j<cx->nEntriesInUse; j++) { | |
488 int ret1, ret2; | |
489 memset(&cx->stdidx[j], 0, 32); | |
490 ret1 = stream_seek(demuxer->stream, (off_t)cx->aIndex[j].qwOffset); | |
491 ret2 = stream_read(demuxer->stream, (char *)&cx->stdidx[j], 32); | |
492 if (ret1 != 1 || ret2 != 32 || cx->stdidx[j].nEntriesInUse==0) { | |
493 // this is a broken file (probably incomplete) let the standard | |
494 // gen_index routine handle this | |
495 priv->isodml = 0; | |
496 priv->idx_size = 0; | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
497 mp_msg(MSGT_HEADER, MSGL_WARN, MSGTR_MPDEMUX_AVIHDR_BrokenODMLfile); |
12036 | 498 goto freeout; |
499 } | |
500 | |
501 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
|
502 print_avistdindex_chunk(&cx->stdidx[j],MSGL_V); |
12036 | 503 priv->idx_size += cx->stdidx[j].nEntriesInUse; |
504 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
|
505 stream_read(demuxer->stream, (char *)cx->stdidx[j].aIndex, |
12036 | 506 cx->stdidx[j].nEntriesInUse*sizeof(avistdindex_entry)); |
507 for (k=0;k<cx->stdidx[j].nEntriesInUse; k++) | |
508 le2me_AVISTDIDXENTRY(&cx->stdidx[j].aIndex[k]); | |
509 | |
510 cx->stdidx[j].dwReserved3 = 0; | |
511 | |
512 } | |
513 } | |
514 | |
515 /* | |
516 * We convert the index by translating all entries into AVIINDEXENTRYs | |
517 * and sorting them by offset. The result should be the same index | |
518 * we would get with -forceidx. | |
519 */ | |
520 | |
521 idx = priv->idx = malloc(priv->idx_size * sizeof (AVIINDEXENTRY)); | |
522 | |
523 for (cx = priv->suidx; cx != &priv->suidx[priv->suidx_size]; cx++) { | |
524 avistdindex_chunk *sic; | |
525 for (sic = cx->stdidx; sic != &cx->stdidx[cx->nEntriesInUse]; sic++) { | |
526 avistdindex_entry *sie; | |
527 for (sie = sic->aIndex; sie != &sic->aIndex[sic->nEntriesInUse]; sie++) { | |
528 uint64_t off = sic->qwBaseOffset + sie->dwOffset - 8; | |
529 memcpy(&idx->ckid, sic->dwChunkId, 4); | |
530 idx->dwChunkOffset = off; | |
531 idx->dwFlags = (off >> 32) << 16; | |
532 idx->dwChunkLength = sie->dwSize & 0x7fffffff; | |
533 idx->dwFlags |= (sie->dwSize&0x80000000)?0x0:AVIIF_KEYFRAME; // bit 31 denotes !keyframe | |
534 idx++; | |
535 } | |
536 } | |
537 } | |
14297 | 538 qsort(priv->idx, priv->idx_size, sizeof(AVIINDEXENTRY), avi_idx_cmp); |
12036 | 539 |
540 /* | |
541 Hack to work around a "wrong" index in some divx odml files | |
542 (processor_burning.avi as an example) | |
543 They have ##dc on non keyframes but the ix00 tells us they are ##db. | |
544 Read the fcc of a non-keyframe vid frame and check it. | |
545 */ | |
546 | |
547 { | |
548 uint32_t id; | |
549 uint32_t db = 0; | |
550 stream_reset (demuxer->stream); | |
551 | |
552 // find out the video stream id. I have seen files with 01db. | |
553 for (idx = &((AVIINDEXENTRY *)priv->idx)[0], i=0; i<priv->idx_size; i++, idx++){ | |
554 unsigned char res[2]; | |
555 if (odml_get_vstream_id(idx->ckid, res)) { | |
556 db = mmioFOURCC(res[0], res[1], 'd', 'b'); | |
557 break; | |
558 } | |
559 } | |
560 | |
561 // find first non keyframe | |
562 for (idx = &((AVIINDEXENTRY *)priv->idx)[0], i=0; i<priv->idx_size; i++, idx++){ | |
563 if (!(idx->dwFlags & AVIIF_KEYFRAME) && idx->ckid == db) break; | |
564 } | |
565 if (i<priv->idx_size && db) { | |
566 stream_seek(demuxer->stream, AVI_IDX_OFFSET(idx)); | |
567 id = stream_read_dword_le(demuxer->stream); | |
568 if (id && id != db) // index fcc and real fcc differ? fix it. | |
569 for (idx = &((AVIINDEXENTRY *)priv->idx)[0], i=0; i<priv->idx_size; i++, idx++){ | |
570 if (!(idx->dwFlags & AVIIF_KEYFRAME) && idx->ckid == db) | |
571 idx->ckid = id; | |
572 } | |
573 } | |
574 } | |
575 | |
17977
f70772d02eaa
Convert printfs in aviprint.c to mp_msg and give the information printing
diego
parents:
17932
diff
changeset
|
576 if ( mp_msg_test(MSGT_HEADER,MSGL_DBG2) ) print_index(priv->idx, priv->idx_size,MSGL_DBG2); |
12036 | 577 |
578 demuxer->movi_end=demuxer->stream->end_pos; | |
579 | |
580 freeout: | |
581 | |
582 // free unneeded stuff | |
583 cx = &priv->suidx[0]; | |
584 do { | |
585 for (j=0;j<cx->nEntriesInUse;j++) | |
586 if (cx->stdidx[j].nEntriesInUse) free(cx->stdidx[j].aIndex); | |
587 free(cx->stdidx); | |
588 | |
589 } while (cx++ != &priv->suidx[priv->suidx_size-1]); | |
590 free(priv->suidx); | |
591 | |
592 } | |
593 | |
11234
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
594 /* Read a saved index file */ |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
595 if (index_file_load) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
596 FILE *fp; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
597 char magic[7]; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
598 unsigned int i; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
599 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
600 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
|
601 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
|
602 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
603 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
604 fread(&magic, 6, 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
605 if (strncmp(magic, "MPIDX1", 6)) { |
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_NotValidMPidxFile, index_file_load); |
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(&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
|
610 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
|
611 if (!priv->idx) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
612 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
|
613 priv->idx_size = 0; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
614 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
615 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
616 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
617 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
|
618 AVIINDEXENTRY *idx; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
619 idx=&((AVIINDEXENTRY *)priv->idx)[i]; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
620 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
|
621 if (feof(fp)) { |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
622 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
|
623 free(priv->idx); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
624 priv->idx_size = 0; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
625 goto gen_index; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
626 } |
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 fclose(fp); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
629 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
|
630 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
631 gen_index: |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
632 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
|
633 int idx_pos = 0; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
634 // build index for file: |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
635 stream_reset(demuxer->stream); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
569
diff
changeset
|
636 stream_seek(demuxer->stream,demuxer->movi_start); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
637 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
638 priv->idx_size=0; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
639 priv->idx=NULL; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
640 |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
641 while(1){ |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
642 int id; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
643 unsigned len; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
644 off_t skip; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
645 AVIINDEXENTRY* idx; |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
646 unsigned int c; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
647 demuxer->filepos=stream_tell(demuxer->stream); |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
648 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
|
649 id=stream_read_dword_le(demuxer->stream); |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
650 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
|
651 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
|
652 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
|
653 continue; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
654 } |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
655 if(stream_eof(demuxer->stream)) break; |
1392 | 656 if(!id || avi_stream_id(id)==100) goto skip_chunk; // bad ID (or padding?) |
657 | |
30010
5babc40c26de
Do not modify priv->idx_pos when regenerating the index, use a local
reimar
parents:
29288
diff
changeset
|
658 if(idx_pos>=priv->idx_size){ |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
659 // priv->idx_size+=32; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
660 priv->idx_size+=1024; // +16kB |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
661 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
|
662 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
|
663 } |
30010
5babc40c26de
Do not modify priv->idx_pos when regenerating the index, use a local
reimar
parents:
29288
diff
changeset
|
664 idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos++]; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
665 idx->ckid=id; |
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
666 idx->dwFlags=AVIIF_KEYFRAME; // FIXME |
12036 | 667 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
|
668 idx->dwChunkOffset=(unsigned long)demuxer->filepos; |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
669 idx->dwChunkLength=len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
670 |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
671 c=stream_read_dword(demuxer->stream); |
568 | 672 |
18050 | 673 if(!len) idx->dwFlags&=~AVIIF_KEYFRAME; |
674 | |
568 | 675 // Fix keyframes for DivX files: |
676 if(idxfix_divx) | |
677 if(avi_stream_id(id)==idxfix_videostream){ | |
2598
a937f0024514
-idx fixes: support for divx4 and ignoring bad movi_end
arpi
parents:
2338
diff
changeset
|
678 switch(idxfix_divx){ |
6275 | 679 case 3: c=stream_read_dword(demuxer->stream)<<5; //skip 32+5 bits for m$mpeg4v1 |
12036 | 680 case 1: if(c&0x40000000) idx->dwFlags&=~AVIIF_KEYFRAME;break; // divx 3 |
681 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
|
682 } |
568 | 683 } |
3781 | 684 |
685 // update status line: | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
686 { static off_t lastpos; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
687 off_t pos; |
3781 | 688 off_t len=demuxer->movi_end-demuxer->movi_start; |
689 if(len){ | |
690 pos=100*(demuxer->filepos-demuxer->movi_start)/len; // % | |
691 } else { | |
692 pos=(demuxer->filepos-demuxer->movi_start)>>20; // MB | |
693 } | |
694 if(pos!=lastpos){ | |
695 lastpos=pos; | |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
696 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
|
697 (unsigned long)pos, len?"%":"MB"); |
3781 | 698 } |
699 } | |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
700 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 | 701 #if 0 |
702 { unsigned char tmp[64]; | |
703 int i; | |
704 stream_read(demuxer->stream,tmp,64); | |
705 printf("%.4s",&id); | |
706 for(i=0;i<64;i++) printf(" %02X",tmp[i]); | |
707 printf("\n"); | |
708 } | |
709 #endif | |
1392 | 710 skip_chunk: |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
5933
diff
changeset
|
711 skip=(len+1)&(~1UL); // total bytes in this chunk |
568 | 712 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
|
713 } |
30010
5babc40c26de
Do not modify priv->idx_pos when regenerating the index, use a local
reimar
parents:
29288
diff
changeset
|
714 priv->idx_size=idx_pos; |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
715 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
|
716 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
|
717 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
718 /* 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
|
719 if (index_file_save) { |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
720 FILE *fp; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
721 unsigned int i; |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
722 |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
723 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
|
724 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
|
725 return; |
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 fwrite("MPIDX1", 6, 1, fp); |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
728 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
|
729 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
|
730 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
|
731 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
|
732 } |
9767665d49e0
Saving and loading external index file. Patch by Jason Tackaberry <tack@auc.ca>
alex
parents:
8027
diff
changeset
|
733 fclose(fp); |
16882
dfbe8cd0e081
libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents:
15738
diff
changeset
|
734 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
|
735 } |
564
747759a4a28f
seeking in raw/broken avi files (rebuilding index chunk)
arpi_esp
parents:
433
diff
changeset
|
736 } |
1 | 737 } |