Mercurial > mplayer.hg
annotate libmpdemux/demux_mov.c @ 30935:59f25d383d12
rename eatgv -> ffeatgv, lpcm -> fflpcm
for consitently naming all ffmpeg codecs
requested by compn
author | attila |
---|---|
date | Wed, 31 Mar 2010 06:33:08 +0000 |
parents | a25d16882312 |
children | cd81fce1f010 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
2 * QuickTime MOV file parser |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
3 * copyright(c) 2001 A'rpi |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
4 * additional work by Atmos |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
5 * based on TOOLS/movinfo.c by A'rpi & Al3x |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
6 * compressed header support from moov.c of the openquicktime lib. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
7 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
8 * references: http://openquicktime.sf.net/, http://www.heroinewarrior.com/ |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
9 * http://www.geocities.com/SiliconValley/Lakes/2160/fformats/files/mov.pdf |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
10 * (above URL no longer works, file mirrored somewhere? ::atmos) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
11 * The QuickTime File Format PDF from Apple: |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
12 * http://developer.apple.com/techpubs/quicktime/qtdevdocs/PDF/QTFileFormat.pdf |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
13 * (Complete list of documentation at http://developer.apple.com/quicktime/) |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
14 * MP4-Lib sources from http://mpeg4ip.sf.net/ might be useful for .mp4 |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
15 * as well as .mov specific stuff. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
16 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
17 * All sort of Stuff about MPEG4: |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
18 * http://www.cmlab.csie.ntu.edu.tw/~pkhsiao/thesis.html |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
19 * I really recommend N4270-1.doc and N4270-2.doc which are exact specs |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
20 * of the MP4-File Format and the MPEG4 Specific extensions. ::atmos |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
21 * TSGS#15(02)0088 |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
22 * http://www.3gpp.org/ftp/tsg_sa/TSG_SA/TSGS_15/Docs/pdf/SP-020088.pdf |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
23 * http://www.3gpp2.org/Public_html/specs/C.S0050-0_v1.0_121503.pdf |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
24 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
25 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
26 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
27 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
28 * 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:
28844
diff
changeset
|
29 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
30 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
31 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
32 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
33 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
35 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
36 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
37 * 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:
28844
diff
changeset
|
38 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
39 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
28844
diff
changeset
|
40 */ |
1490 | 41 |
42 #include <stdio.h> | |
43 #include <stdlib.h> | |
44 #include <unistd.h> | |
21354
072d3248d309
Fix 2 header bugs introduced by nplourde's previous commit:
uau
parents:
21353
diff
changeset
|
45 #include <inttypes.h> |
072d3248d309
Fix 2 header bugs introduced by nplourde's previous commit:
uau
parents:
21353
diff
changeset
|
46 |
072d3248d309
Fix 2 header bugs introduced by nplourde's previous commit:
uau
parents:
21353
diff
changeset
|
47 #include "config.h" |
1490 | 48 |
27388
ac03760f7fcc
Rename all preprocessor directives related to Apple / Mac OS X.
diego
parents:
27341
diff
changeset
|
49 #ifdef CONFIG_QUICKTIME |
21353
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
50 #include <QuickTime/QuickTime.h> |
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
51 #include <QuickTime/ImageCompression.h> |
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
52 #include <QuickTime/ImageCodec.h> |
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
53 #else |
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
54 #include "loader/qtx/qtxsdk/components.h" |
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
55 #endif |
a965ca17debc
reordering of #include to avoid clash with math.h and quicktime/*.h, patch by Crhis Roccati<roccati@pobox.com>
nplourde
parents:
21032
diff
changeset
|
56 |
1567 | 57 #include "mp_msg.h" |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1567
diff
changeset
|
58 #include "help_mp.h" |
1490 | 59 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22464
diff
changeset
|
60 #include "stream/stream.h" |
1490 | 61 #include "demuxer.h" |
62 #include "stheader.h" | |
63 | |
25359
4bb08145bf66
Set correct image format for 24bit "raw " in mov files.
cehoyos
parents:
24358
diff
changeset
|
64 #include "libmpcodecs/img_format.h" |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
65 #include "libavutil/common.h" |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
66 #include "libavutil/intreadwrite.h" |
25359
4bb08145bf66
Set correct image format for 24bit "raw " in mov files.
cehoyos
parents:
24358
diff
changeset
|
67 |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
68 #include "libvo/sub.h" |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
69 |
30580
a25d16882312
Add header file for store_ughvlc(); avoids forward declarations.
diego
parents:
30571
diff
changeset
|
70 #include "demux_mov.h" |
4332 | 71 #include "qtpalette.h" |
6612 | 72 #include "parse_mp4.h" // .MP4 specific stuff |
4332 | 73 |
28440 | 74 #if CONFIG_ZLIB |
2148 | 75 #include <zlib.h> |
76 #endif | |
77 | |
9951
82f6240091a8
Avoid including a header file twice to prevent Cygwin gcc 2.95.3-10 from
diego
parents:
9590
diff
changeset
|
78 #ifndef _FCNTL_H |
2786 | 79 #include <fcntl.h> |
6334
5becd843ff47
cygwin & darwin fixes by Joey Parrish <joey@yunamusic.com>
arpi
parents:
6139
diff
changeset
|
80 #endif |
2786 | 81 |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
82 #define char2short(x,y) AV_RB16(&(x)[(y)]) |
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
83 #define char2int(x,y) AV_RB32(&(x)[(y)]) |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
84 |
1490 | 85 typedef struct { |
2100 | 86 unsigned int pts; // duration |
87 unsigned int size; | |
88 off_t pos; | |
89 } mov_sample_t; | |
90 | |
91 typedef struct { | |
2546
c9485365537d
added edit atom (edit list), some comments and typos fixes
alex
parents:
2545
diff
changeset
|
92 unsigned int sample; // number of the first sample in the chunk |
2115 | 93 unsigned int size; // number of samples in the chunk |
94 int desc; // for multiple codecs mode - not used | |
2100 | 95 off_t pos; |
96 } mov_chunk_t; | |
97 | |
98 typedef struct { | |
99 unsigned int first; | |
100 unsigned int spc; | |
101 unsigned int sdid; | |
102 } mov_chunkmap_t; | |
103 | |
104 typedef struct { | |
2115 | 105 unsigned int num; |
106 unsigned int dur; | |
107 } mov_durmap_t; | |
108 | |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
109 typedef struct { |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
110 unsigned int dur; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
111 unsigned int pos; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
112 int speed; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
113 // |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
114 int frames; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
115 int start_sample; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
116 int start_frame; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
117 int pts_offset; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
118 } mov_editlist_t; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
119 |
4624 | 120 #define MOV_TRAK_UNKNOWN 0 |
121 #define MOV_TRAK_VIDEO 1 | |
122 #define MOV_TRAK_AUDIO 2 | |
123 #define MOV_TRAK_FLASH 3 | |
124 #define MOV_TRAK_GENERIC 4 | |
125 #define MOV_TRAK_CODE 5 | |
126 | |
2115 | 127 typedef struct { |
1490 | 128 int id; |
129 int type; | |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
130 off_t pos; |
2101 | 131 // |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
132 unsigned int media_handler; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
133 unsigned int data_handler; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
134 // |
1490 | 135 int timescale; |
2100 | 136 unsigned int length; |
2115 | 137 int samplesize; // 0 = variable |
138 int duration; // 0 = variable | |
1490 | 139 int width,height; // for video |
140 unsigned int fourcc; | |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
141 unsigned int nchannels; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
142 unsigned int samplebytes; |
2115 | 143 // |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
144 int tkdata_len; // track data |
2101 | 145 unsigned char* tkdata; |
146 int stdata_len; // stream data | |
147 unsigned char* stdata; | |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
148 // |
5252 | 149 unsigned char* stream_header; |
150 int stream_header_len; // if >0, this header should be sent before the 1st frame | |
151 // | |
2100 | 152 int samples_size; |
153 mov_sample_t* samples; | |
154 int chunks_size; | |
155 mov_chunk_t* chunks; | |
156 int chunkmap_size; | |
157 mov_chunkmap_t* chunkmap; | |
2115 | 158 int durmap_size; |
159 mov_durmap_t* durmap; | |
2544 | 160 int keyframes_size; |
161 unsigned int* keyframes; | |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
162 int editlist_size; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
163 mov_editlist_t* editlist; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
164 int editlist_pos; |
5372
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
165 // |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
166 void* desc; // image/sound/etc description (pointer to ImageDescription etc) |
1490 | 167 } mov_track_t; |
168 | |
30571
7031b2cf61ca
Mark mov_build_index() as static; it is not used outside of the file.
diego
parents:
29598
diff
changeset
|
169 static void mov_build_index(mov_track_t* trak,int timescale){ |
2100 | 170 int i,j,s; |
171 int last=trak->chunks_size; | |
2115 | 172 unsigned int pts=0; |
3652
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
173 |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
174 #if 0 |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
175 if (trak->chunks_size <= 0) |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
176 { |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
177 mp_msg(MSGT_DEMUX, MSGL_WARN, "No chunk offset table, trying to build one!\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
178 |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
179 trak->chunks_size = trak->samples_size; /* XXX: FIXME ! */ |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18491
diff
changeset
|
180 // audit: this code will be vulnerable if it is reenabled (currently #if 0) |
3652
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
181 trak->chunks = realloc(trak->chunks, sizeof(mov_chunk_t)*trak->chunks_size); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
182 |
3652
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
183 for (i=0; i < trak->chunks_size; i++) |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
184 trak->chunks[i].pos = -1; |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
185 } |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
186 #endif |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
187 |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
188 mp_msg(MSGT_DEMUX, MSGL_V, "MOV track #%d: %d chunks, %d samples\n",trak->id,trak->chunks_size,trak->samples_size); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
189 mp_msg(MSGT_DEMUX, MSGL_V, "pts=%d scale=%d time=%5.3f\n",trak->length,trak->timescale,(float)trak->length/(float)trak->timescale); |
2546
c9485365537d
added edit atom (edit list), some comments and typos fixes
alex
parents:
2545
diff
changeset
|
190 |
2100 | 191 // process chunkmap: |
192 i=trak->chunkmap_size; | |
193 while(i>0){ | |
194 --i; | |
27248
f45c38163037
Change a broken check. FFMAX does not work as intended because trak->chunkmap[i].first
reimar
parents:
27234
diff
changeset
|
195 j=trak->chunkmap[i].first; |
f45c38163037
Change a broken check. FFMAX does not work as intended because trak->chunkmap[i].first
reimar
parents:
27234
diff
changeset
|
196 for(;j>=0 && j<last;j++){ |
2100 | 197 trak->chunks[j].desc=trak->chunkmap[i].sdid; |
198 trak->chunks[j].size=trak->chunkmap[i].spc; | |
199 } | |
25892
68a400e63e67
Make sure chunkmap values are within bounds when using them.
reimar
parents:
25891
diff
changeset
|
200 last=FFMIN(trak->chunkmap[i].first, trak->chunks_size); |
2100 | 201 } |
2115 | 202 |
3652
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
203 #if 0 |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
204 for (i=0; i < trak->chunks_size; i++) |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
205 { |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
206 /* fixup position */ |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
207 if (trak->chunks[i].pos == -1) |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
208 if (i > 0) |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
209 trak->chunks[i].pos = trak->chunks[i-1].pos + trak->chunks[i-1].size; |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
210 else |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
211 trak->chunks[i].pos = 0; /* FIXME: set initial pos */ |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
212 #endif |
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
213 |
2115 | 214 // calc pts of chunks: |
215 s=0; | |
216 for(j=0;j<trak->chunks_size;j++){ | |
217 trak->chunks[j].sample=s; | |
218 s+=trak->chunks[j].size; | |
219 } | |
16320
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
220 i = 0; |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
221 for (j = 0; j < trak->durmap_size; j++) |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
222 i += trak->durmap[j].num; |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
223 if (i != s) { |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
224 mp_msg(MSGT_DEMUX, MSGL_WARN, |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
225 "MOV: durmap and chunkmap sample count differ (%i vs %i)\n", i, s); |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
226 if (i > s) s = i; |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
227 } |
2115 | 228 |
4624 | 229 // workaround for fixed-size video frames (dv and uncompressed) |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
230 if(!trak->samples_size && trak->type!=MOV_TRAK_AUDIO){ |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
231 trak->samples=calloc(s, sizeof(mov_sample_t)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
232 trak->samples_size=trak->samples ? s : 0; |
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
233 for(i=0;i<trak->samples_size;i++) |
4624 | 234 trak->samples[i].size=trak->samplesize; |
235 trak->samplesize=0; | |
236 } | |
237 | |
2115 | 238 if(!trak->samples_size){ |
239 // constant sampesize | |
240 if(trak->durmap_size==1 || (trak->durmap_size==2 && trak->durmap[1].num==1)){ | |
2227 | 241 trak->duration=trak->durmap[0].dur; |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
242 } else mp_msg(MSGT_DEMUX, MSGL_ERR, "*** constant samplesize & variable duration not yet supported! ***\nContact the author if you have such sample file!\n"); |
2115 | 243 return; |
244 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
245 |
16320
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
246 if (trak->samples_size < s) { |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
247 mp_msg(MSGT_DEMUX, MSGL_WARN, |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
248 "MOV: durmap or chunkmap bigger than sample count (%i vs %i)\n", |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
249 s, trak->samples_size); |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
250 trak->samples = realloc_struct(trak->samples, s, sizeof(mov_sample_t)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
251 trak->samples_size = trak->samples ? s : 0; |
16320
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
252 } |
2b6430db786a
extra size checks for samples array to avoid crashes in some rare cases.
reimar
parents:
16175
diff
changeset
|
253 |
2115 | 254 // calc pts: |
255 s=0; | |
256 for(j=0;j<trak->durmap_size;j++){ | |
257 for(i=0;i<trak->durmap[j].num;i++){ | |
25893
638493dc056e
Check that index is still within bounds of samples array.
reimar
parents:
25892
diff
changeset
|
258 if (s >= trak->samples_size) |
638493dc056e
Check that index is still within bounds of samples array.
reimar
parents:
25892
diff
changeset
|
259 break; |
2115 | 260 trak->samples[s].pts=pts; |
261 ++s; | |
262 pts+=trak->durmap[j].dur; | |
263 } | |
264 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
265 |
2100 | 266 // calc sample offsets |
267 s=0; | |
268 for(j=0;j<trak->chunks_size;j++){ | |
269 off_t pos=trak->chunks[j].pos; | |
270 for(i=0;i<trak->chunks[j].size;i++){ | |
25893
638493dc056e
Check that index is still within bounds of samples array.
reimar
parents:
25892
diff
changeset
|
271 if (s >= trak->samples_size) |
638493dc056e
Check that index is still within bounds of samples array.
reimar
parents:
25892
diff
changeset
|
272 break; |
2100 | 273 trak->samples[s].pos=pos; |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
274 mp_msg(MSGT_DEMUX, MSGL_DBG3, "Sample %5d: pts=%8d off=0x%08X size=%d\n",s, |
2100 | 275 trak->samples[s].pts, |
276 (int)trak->samples[s].pos, | |
277 trak->samples[s].size); | |
278 pos+=trak->samples[s].size; | |
279 ++s; | |
280 } | |
281 } | |
282 | |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
283 // precalc editlist entries |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
284 if(trak->editlist_size>0){ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
285 int frame=0; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
286 int e_pts=0; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
287 for(i=0;i<trak->editlist_size;i++){ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
288 mov_editlist_t* el=&trak->editlist[i]; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
289 int sample=0; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
290 int pts=el->pos; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
291 el->start_frame=frame; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
292 if(pts<0){ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
293 // skip! |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
294 el->frames=0; continue; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
295 } |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
296 // find start sample |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
297 for(;sample<trak->samples_size;sample++){ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
298 if(pts<=trak->samples[sample].pts) break; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
299 } |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
300 el->start_sample=sample; |
7441
13716c8114a8
fixing edit-list playback (it uses the mvhd-timescale instead of the mdhd-one)
arpi
parents:
6928
diff
changeset
|
301 el->pts_offset=((long long)e_pts*(long long)trak->timescale)/(long long)timescale-trak->samples[sample].pts; |
13716c8114a8
fixing edit-list playback (it uses the mvhd-timescale instead of the mdhd-one)
arpi
parents:
6928
diff
changeset
|
302 pts+=((long long)el->dur*(long long)trak->timescale)/(long long)timescale; |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
303 e_pts+=el->dur; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
304 // find end sample |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
305 for(;sample<trak->samples_size;sample++){ |
16496
cca6a74cf898
Wrong editlist handling: end pts must be included.
reimar
parents:
16346
diff
changeset
|
306 if(pts<trak->samples[sample].pts) break; |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
307 } |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
308 el->frames=sample-el->start_sample; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
309 frame+=el->frames; |
7514 | 310 mp_msg(MSGT_DEMUX,MSGL_V,"EL#%d: pts=%d 1st_sample=%d frames=%d (%5.3fs) pts_offs=%d\n",i, |
311 el->pos,el->start_sample, el->frames, | |
312 (float)(el->dur)/(float)timescale, el->pts_offset); | |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
313 } |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
314 } |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
315 |
2100 | 316 } |
317 | |
1490 | 318 #define MOV_MAX_TRACKS 256 |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
319 #define MOV_MAX_SUBLEN 1024 |
1490 | 320 |
321 typedef struct { | |
322 off_t moov_start; | |
323 off_t moov_end; | |
324 off_t mdat_start; | |
325 off_t mdat_end; | |
326 int track_db; | |
327 mov_track_t* tracks[MOV_MAX_TRACKS]; | |
7441
13716c8114a8
fixing edit-list playback (it uses the mvhd-timescale instead of the mdhd-one)
arpi
parents:
6928
diff
changeset
|
328 int timescale; // movie timescale |
13716c8114a8
fixing edit-list playback (it uses the mvhd-timescale instead of the mdhd-one)
arpi
parents:
6928
diff
changeset
|
329 int duration; // movie duration (in movie timescale units) |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
330 subtitle subs; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
331 char subtext[MOV_MAX_SUBLEN + 1]; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
332 int current_sub; |
1490 | 333 } mov_priv_t; |
334 | |
335 #define MOV_FOURCC(a,b,c,d) ((a<<24)|(b<<16)|(c<<8)|(d)) | |
336 | |
16175 | 337 static int mov_check_file(demuxer_t* demuxer){ |
1490 | 338 int flags=0; |
2879 | 339 int no=0; |
1490 | 340 mov_priv_t* priv=malloc(sizeof(mov_priv_t)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
341 |
1567 | 342 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for MOV\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
343 |
1490 | 344 memset(priv,0,sizeof(mov_priv_t)); |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
345 priv->current_sub = -1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
346 |
1490 | 347 while(1){ |
8315 | 348 int i; |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
349 int skipped=8; |
1490 | 350 off_t len=stream_read_dword(demuxer->stream); |
351 unsigned int id=stream_read_dword(demuxer->stream); | |
352 if(stream_eof(demuxer->stream)) break; // EOF | |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
353 if (len == 1) /* real size is 64bits - cjb */ |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
354 { |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
355 #ifndef _LARGEFILE_SOURCE |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
356 if (stream_read_dword(demuxer->stream) != 0) |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
357 mp_msg(MSGT_DEMUX, MSGL_WARN, "64bit file, but you've compiled MPlayer without LARGEFILE support!\n"); |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
358 len = stream_read_dword(demuxer->stream); |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
359 #else |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
360 len = stream_read_qword(demuxer->stream); |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
361 #endif |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
362 skipped += 8; |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
363 } |
5241
126d5fd76a70
temporary disabled len=0 code due to reported loop errors
alex
parents:
5236
diff
changeset
|
364 #if 0 |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
365 else if (len == 0) /* deleted chunk */ |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
366 { |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
367 /* XXX: CJB! is this right? - alex */ |
5243 | 368 goto skip_chunk; |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
369 } |
5241
126d5fd76a70
temporary disabled len=0 code due to reported loop errors
alex
parents:
5236
diff
changeset
|
370 #endif |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
371 else if(len<8) break; // invalid chunk |
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
372 |
1490 | 373 switch(id){ |
5257 | 374 case MOV_FOURCC('f','t','y','p'): { |
375 unsigned int tmp; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
376 // File Type Box (ftyp): |
5257 | 377 // char[4] major_brand (eg. 'isom') |
378 // int minor_version (eg. 0x00000000) | |
379 // char[4] compatible_brands[] (eg. 'mp41') | |
380 // compatible_brands list spans to the end of box | |
381 #if 1 | |
382 tmp = stream_read_dword(demuxer->stream); | |
383 switch(tmp) { | |
384 case MOV_FOURCC('i','s','o','m'): | |
11810
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
385 mp_msg(MSGT_DEMUX,MSGL_V,"ISO: File Type Major Brand: ISO Base Media\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
386 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
387 case MOV_FOURCC('m','p','4','1'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
388 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: ISO/IEC 14496-1 (MPEG-4 system) v1\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
389 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
390 case MOV_FOURCC('m','p','4','2'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
391 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: ISO/IEC 14496-1 (MPEG-4 system) v2\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
392 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
393 case MOV_FOURCC('M','4','A',' '): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
394 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: Apple iTunes AAC-LC Audio\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
395 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
396 case MOV_FOURCC('M','4','P',' '): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
397 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: Apple iTunes AAC-LC Protected Audio\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
398 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
399 case MOV_FOURCC('q','t',' ',' '): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
400 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: Original QuickTime\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
401 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
402 case MOV_FOURCC('3','g','p','1'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
403 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: 3GPP Profile 1\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
404 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
405 case MOV_FOURCC('3','g','p','2'): |
15286 | 406 case MOV_FOURCC('3','g','2','a'): |
11810
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
407 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: 3GPP Profile 2\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
408 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
409 case MOV_FOURCC('3','g','p','3'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
410 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: 3GPP Profile 3\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
411 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
412 case MOV_FOURCC('3','g','p','4'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
413 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: 3GPP Profile 4\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
414 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
415 case MOV_FOURCC('3','g','p','5'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
416 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: 3GPP Profile 5\n"); |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
417 break; |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
418 case MOV_FOURCC('m','m','p','4'): |
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
419 mp_msg(MSGT_DEMUX,MSGL_INFO,"ISO: File Type Major Brand: Mobile ISO/IEC 14496-1 (MPEG-4 system)\n"); |
5257 | 420 break; |
421 default: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
422 tmp = be2me_32(tmp); |
17366 | 423 mp_msg(MSGT_DEMUX,MSGL_WARN,"ISO: Unknown File Type Major Brand: %.4s\n",(char *)&tmp); |
5257 | 424 } |
11810
8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
diego
parents:
11399
diff
changeset
|
425 mp_msg(MSGT_DEMUX,MSGL_V,"ISO: File Type Minor Version: %d\n", |
5257 | 426 stream_read_dword(demuxer->stream)); |
427 skipped += 8; | |
428 // List all compatible brands | |
429 for(i = 0; i < ((len-16)/4); i++) { | |
430 tmp = be2me_32(stream_read_dword(demuxer->stream)); | |
17366 | 431 mp_msg(MSGT_DEMUX,MSGL_V,"ISO: File Type Compatible Brand #%d: %.4s\n",i,(char *)&tmp); |
5257 | 432 skipped += 4; |
433 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
434 #endif |
5257 | 435 } break; |
1490 | 436 case MOV_FOURCC('m','o','o','v'): |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
437 // case MOV_FOURCC('c','m','o','v'): |
1567 | 438 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Movie header found!\n"); |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
439 priv->moov_start=(off_t)stream_tell(demuxer->stream); |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
440 priv->moov_end=(off_t)priv->moov_start+len-skipped; |
17366 | 441 mp_msg(MSGT_DEMUX,MSGL_DBG2,"MOV: Movie header: start: %"PRIx64" end: %"PRIx64"\n", |
442 (int64_t)priv->moov_start, (int64_t)priv->moov_end); | |
8315 | 443 skipped+=8; |
444 i = stream_read_dword(demuxer->stream)-8; | |
445 if(stream_read_dword(demuxer->stream)==MOV_FOURCC('r','m','r','a')){ | |
446 skipped+=i; | |
447 mp_msg(MSGT_DEMUX,MSGL_INFO,"MOV: Reference Media file!!!\n"); | |
8937 | 448 //set demuxer type to playlist ... |
449 demuxer->type=DEMUXER_TYPE_PLAYLIST; | |
8315 | 450 while(i>0){ |
451 int len=stream_read_dword(demuxer->stream)-8; | |
452 int fcc=stream_read_dword(demuxer->stream); | |
453 if(len<0) break; // EOF!? | |
454 i-=8; | |
455 // printf("i=%d len=%d\n",i,len); | |
456 switch(fcc){ | |
457 case MOV_FOURCC('r','m','d','a'): | |
458 continue; | |
459 case MOV_FOURCC('r','d','r','f'): { | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
460 av_unused int tmp=stream_read_dword(demuxer->stream); |
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
461 av_unused int type=stream_read_dword_le(demuxer->stream); |
8315 | 462 int slen=stream_read_dword(demuxer->stream); |
8937 | 463 //char* s=malloc(slen+1); |
464 //stream_read(demuxer->stream,s,slen); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
465 |
8937 | 466 //FIXME: also store type & data_rate ? |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
467 ds_read_packet(demuxer->video, |
8937 | 468 demuxer->stream, |
469 slen, | |
470 0, | |
471 stream_tell(demuxer->stream), | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
472 0 // no flags |
8937 | 473 ); |
474 flags|=4; | |
475 mp_msg(MSGT_DEMUX,MSGL_V,"Added reference to playlist\n"); | |
476 //s[slen]=0; | |
477 //mp_msg(MSGT_DEMUX,MSGL_INFO,"REF: [%.4s] %s\n",&type,s); | |
8315 | 478 len-=12+slen;i-=12+slen; break; |
479 } | |
480 case MOV_FOURCC('r','m','d','r'): { | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
481 av_unused int flags=stream_read_dword(demuxer->stream); |
8315 | 482 int rate=stream_read_dword(demuxer->stream); |
483 mp_msg(MSGT_DEMUX,MSGL_V," min. data rate: %d bits/sec\n",rate); | |
484 len-=8; i-=8; break; | |
485 } | |
486 case MOV_FOURCC('r','m','q','u'): { | |
487 int q=stream_read_dword(demuxer->stream); | |
488 mp_msg(MSGT_DEMUX,MSGL_V," quality index: %d\n",q); | |
489 len-=4; i-=4; break; | |
490 } | |
491 } | |
492 i-=len;stream_skip(demuxer->stream,len); | |
493 } | |
494 } | |
1490 | 495 flags|=1; |
496 break; | |
5680 | 497 case MOV_FOURCC('w','i','d','e'): |
498 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: 'WIDE' chunk found!\n"); | |
499 if(flags&2) break; | |
1490 | 500 case MOV_FOURCC('m','d','a','t'): |
1567 | 501 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Movie DATA found!\n"); |
1490 | 502 priv->mdat_start=stream_tell(demuxer->stream); |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
503 priv->mdat_end=priv->mdat_start+len-skipped; |
17366 | 504 mp_msg(MSGT_DEMUX,MSGL_DBG2,"MOV: Movie data: start: %"PRIx64" end: %"PRIx64"\n", |
505 (int64_t)priv->mdat_start, (int64_t)priv->mdat_end); | |
1490 | 506 flags|=2; |
8928 | 507 if(flags==3){ |
508 // if we're over the headers, then we can stop parsing here! | |
509 demuxer->priv=priv; | |
16175 | 510 return DEMUXER_TYPE_MOV; |
8928 | 511 } |
1490 | 512 break; |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
513 case MOV_FOURCC('f','r','e','e'): |
2942 | 514 case MOV_FOURCC('s','k','i','p'): |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
515 case MOV_FOURCC('j','u','n','k'): |
17366 | 516 mp_msg(MSGT_DEMUX,MSGL_DBG2,"MOV: free space (len: %"PRId64")\n", (int64_t)len); |
2546
c9485365537d
added edit atom (edit list), some comments and typos fixes
alex
parents:
2545
diff
changeset
|
517 /* unused, if you edit a mov, you can use space provided by free atoms (redefining it) */ |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
518 break; |
6865 | 519 case MOV_FOURCC('p','n','o','t'): |
520 case MOV_FOURCC('P','I','C','T'): | |
521 /* dunno what, but we shoudl ignore it */ | |
522 break; | |
1490 | 523 default: |
7759 | 524 if(no==0){ free(priv); return 0;} // first chunk is bad! |
4903
d8b465e3fd88
fixed some endian issues, like changing bswap_32() -> be2me_32(), and
melanson
parents:
4646
diff
changeset
|
525 id = be2me_32(id); |
17366 | 526 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); |
1490 | 527 } |
24358 | 528 //skip_chunk: |
3999
3c6b061ec033
mov_check_file 64bit support by Chris Bednar. also fixed co64 chunk and added warnings for 64bit files reading without largefiles support
alex
parents:
3652
diff
changeset
|
529 if(!stream_skip(demuxer->stream,len-skipped)) break; |
2879 | 530 ++no; |
1490 | 531 } |
7759 | 532 |
533 if(flags==3){ | |
534 demuxer->priv=priv; | |
16175 | 535 return DEMUXER_TYPE_MOV; |
7759 | 536 } |
537 free(priv); | |
538 | |
9125
61ec44e2f406
Attached PATCH fixes the case, when data-flag and reference flags are set and
arpi
parents:
9113
diff
changeset
|
539 if ((flags==5) || (flags==7)) // reference & header sent |
16326
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16320
diff
changeset
|
540 return DEMUXER_TYPE_PLAYLIST; |
8937 | 541 |
2148 | 542 if(flags==1) |
543 mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing data (mdat) chunk! Maybe broken file...\n"); | |
544 else if(flags==2) | |
545 mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing header (moov/cmov) chunk! Maybe broken file...\n"); | |
1490 | 546 |
7759 | 547 return 0; |
1490 | 548 } |
549 | |
16175 | 550 static void demux_close_mov(demuxer_t *demuxer) { |
15780 | 551 mov_priv_t* priv = demuxer->priv; |
552 int i; | |
553 if (!priv) | |
554 return; | |
555 for (i = 0; i < MOV_MAX_TRACKS; i++) { | |
556 mov_track_t *track = priv->tracks[i]; | |
557 if (track) { | |
558 free(track->tkdata); | |
559 free(track->stdata); | |
560 free(track->stream_header); | |
561 free(track->samples); | |
562 free(track->chunks); | |
563 free(track->chunkmap); | |
564 free(track->durmap); | |
565 free(track->keyframes); | |
566 free(track->editlist); | |
567 free(track->desc); | |
568 free(track); | |
569 } | |
570 } | |
571 free(priv); | |
572 } | |
573 | |
19326
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
574 unsigned int store_ughvlc(unsigned char *s, unsigned int v){ |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
575 unsigned int n = 0; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
576 |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
577 while(v >= 0xff) { |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
578 *s++ = 0xff; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
579 v -= 0xff; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
580 n++; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
581 } |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
582 *s = v; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
583 n++; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
584 |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
585 return n; |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
586 } |
f399b52a985a
Move store_ughvlc to demux_mov as demux_ogg is not always compiled in.
diego
parents:
19325
diff
changeset
|
587 |
20979 | 588 static void init_vobsub(sh_sub_t *sh, mov_track_t *trak) { |
589 sh->type = 'v'; | |
590 if (trak->stdata_len < 106) | |
591 return; | |
25845 | 592 sh->extradata_len = 16*4; |
593 sh->extradata = malloc(sh->extradata_len); | |
594 memcpy(sh->extradata, trak->stdata + 42, sh->extradata_len); | |
20979 | 595 } |
596 | |
15948 | 597 static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, |
598 off_t pos, off_t len, mov_track_t* trak); | |
599 | |
24182
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
600 static int gen_sh_audio(sh_audio_t* sh, mov_track_t* trak, int timescale) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
601 #if 0 |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
602 struct { |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
603 int16_t version; // 0 or 1 (version 1 is qt3.0+) |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
604 int16_t revision; // 0 |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
605 int32_t vendor_id; // 0 |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
606 int16_t channels; // 1 or 2 (Mono/Stereo) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
607 int16_t samplesize; // 8 or 16 (8Bit/16Bit) |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
608 int16_t compression_id; // if version 0 then 0 |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
609 // if version 1 and vbr then -2 else 0 |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
610 int16_t packet_size; // 0 |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
611 uint16_t sample_rate; // samplerate (Hz) |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
612 // qt3.0+ (version == 1) |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
613 uint32_t samples_per_packet; // 0 or num uncompressed samples in a packet |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
614 // if 0 below three values are also 0 |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
615 uint32_t bytes_per_packet; // 0 or num compressed bytes for one channel |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
616 uint32_t bytes_per_frame; // 0 or num compressed bytes for all channels |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
617 // (channels * bytes_per_packet) |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
618 uint32_t bytes_per_sample; // 0 or size of uncompressed sample |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
619 // if samples_per_packet and bytes_per_packet are constant (CBR) |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
620 // then bytes_per_frame and bytes_per_sample must be 0 (else is VBR) |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
621 // --- |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
622 // optional additional atom-based fields |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
623 // ([int32_t size,int32_t type,some data ],repeat) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
624 } my_stdata; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
625 #endif |
17283
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
626 int version, adjust; |
18667 | 627 int is_vorbis = 0; |
2100 | 628 sh->format=trak->fourcc; |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
629 |
19170
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
630 // crude audio delay from editlist0 hack ::atm |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
631 if(trak->editlist_size>=1) { |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
632 if(trak->editlist[0].pos == -1) { |
24182
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
633 sh->stream_delay = (float)trak->editlist[0].dur/(float)timescale; |
19170
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
634 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Initial Audio-Delay: %.3f sec\n", sh->stream_delay); |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
635 } |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
636 } |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
637 |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
638 |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
639 switch( sh->format ) { |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
640 case 0x726D6173: /* samr */ |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
641 /* amr narrowband */ |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
642 trak->samplebytes=sh->samplesize=1; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
643 trak->nchannels=sh->channels=1; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
644 sh->samplerate=8000; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
645 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
646 |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
647 case 0x62776173: /* sawb */ |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
648 /* amr wideband */ |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
649 trak->samplebytes=sh->samplesize=1; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
650 trak->nchannels=sh->channels=1; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
651 sh->samplerate=16000; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
652 break; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
653 |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
654 default: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
655 |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
656 // assumptions for below table: short is 16bit, int is 32bit, intfp is 16bit |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
657 // XXX: 32bit fixed point numbers (intfp) are only 2 Byte! |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
658 // short values are usually one byte leftpadded by zero |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
659 // int values are usually two byte leftpadded by zero |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
660 // stdata[]: |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
661 // 8 short version |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
662 // 10 short revision |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
663 // 12 int vendor_id |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
664 // 16 short channels |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
665 // 18 short samplesize |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
666 // 20 short compression_id |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
667 // 22 short packet_size (==0) |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
668 // 24 intfp sample_rate |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
669 // (26 short) unknown (==0) |
6612 | 670 // ---- qt3.0+ (version>=1) |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
671 // 28 int samples_per_packet |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
672 // 32 int bytes_per_packet |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
673 // 36 int bytes_per_frame |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
674 // 40 int bytes_per_sample |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
675 // there may be additional atoms following at 28 (version 0) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
676 // or 44 (version 1), eg. esds atom of .MP4 files |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
677 // esds atom: |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
678 // 28 int atom size (bytes of int size, int type and data) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
679 // 32 char[4] atom type (fourc charater code -> esds) |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
680 // 36 char[] atom data (len=size-8) |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
681 |
16611
9574fb378080
Sanity-check codecdata_len, fixes crash in libfaad due to failed malloc for
reimar
parents:
16496
diff
changeset
|
682 // TODO: fix parsing for files using version 2. |
27162
045b7646abb2
Check stdata_len before accessing stdata. Fixes bug #1125
reimar
parents:
27110
diff
changeset
|
683 if (trak->stdata_len < 26) { |
045b7646abb2
Check stdata_len before accessing stdata. Fixes bug #1125
reimar
parents:
27110
diff
changeset
|
684 mp_msg(MSGT_DEMUX, MSGL_WARN, "MOV: broken (too small) sound atom!\n"); |
045b7646abb2
Check stdata_len before accessing stdata. Fixes bug #1125
reimar
parents:
27110
diff
changeset
|
685 return 0; |
045b7646abb2
Check stdata_len before accessing stdata. Fixes bug #1125
reimar
parents:
27110
diff
changeset
|
686 } |
17283
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
687 version=char2short(trak->stdata,8); |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
688 if (version > 1) |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
689 mp_msg(MSGT_DEMUX, MSGL_WARN, "MOV: version %d sound atom may not parse correctly!\n", version); |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
690 trak->samplebytes=sh->samplesize=char2short(trak->stdata,18)/8; |
17283
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
691 |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
692 /* I can't find documentation, but so far this is the case. -Corey */ |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
693 switch (char2short(trak->stdata,16)) { |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
694 case 1: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
695 trak->nchannels = 1; break; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
696 case 2: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
697 trak->nchannels = 2; break; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
698 case 3: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
699 trak->nchannels = 6; break; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
700 default: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
701 mp_msg(MSGT_DEMUX, MSGL_WARN, |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
702 "MOV: unable to determine audio channels, assuming 2 (got %d)\n", |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
703 char2short(trak->stdata,16)); |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
704 trak->nchannels = 2; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
705 } |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
706 sh->channels = trak->nchannels; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
707 |
5212
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
708 /*printf("MOV: timescale: %d samplerate: %d durmap: %d (%d) -> %d (%d)\n", |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
709 trak->timescale, char2short(trak->stdata,24), trak->durmap[0].dur, |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
710 trak->durmap[0].num, trak->timescale/trak->durmap[0].dur, |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
711 char2short(trak->stdata,24)/trak->durmap[0].dur);*/ |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
712 sh->samplerate=char2short(trak->stdata,24); |
22464 | 713 if((sh->samplerate < 7000) && trak->durmap && trak->durmap[0].dur > 1) { |
5212
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
714 switch(char2short(trak->stdata,24)/trak->durmap[0].dur) { |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
715 // TODO: add more cases. |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
716 case 31: |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
717 sh->samplerate = 32000; break; |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
718 case 43: |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
719 sh->samplerate = 44100; break; |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
720 case 47: |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
721 sh->samplerate = 48000; break; |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
722 default: |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
723 mp_msg(MSGT_DEMUX, MSGL_WARN, |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
724 "MOV: unable to determine audio samplerate, " |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
725 "assuming 44.1kHz (got %d)\n", |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
726 char2short(trak->stdata,24)/trak->durmap[0].dur); |
12f7cbbe7022
add alternative samplerate calculation for files with timescale\!=samplerate
atmos4
parents:
5206
diff
changeset
|
727 sh->samplerate = 44100; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
728 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
729 } |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
730 } |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
731 mp_msg(MSGT_DEMUX, MSGL_V, "Audio bits: %d chans: %d rate: %d\n", |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
732 sh->samplesize*8,sh->channels,sh->samplerate); |
6612 | 733 |
8003 | 734 if(trak->stdata_len >= 44 && trak->stdata[9]>=1){ |
6612 | 735 mp_msg(MSGT_DEMUX,MSGL_V,"Audio header: samp/pack=%d bytes/pack=%d bytes/frame=%d bytes/samp=%d \n", |
736 char2int(trak->stdata,28), | |
737 char2int(trak->stdata,32), | |
738 char2int(trak->stdata,36), | |
739 char2int(trak->stdata,40)); | |
8003 | 740 if(trak->stdata_len>=44+8){ |
741 int len=char2int(trak->stdata,44); | |
742 int fcc=char2int(trak->stdata,48); | |
743 // we have extra audio headers!!! | |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
744 mp_msg(MSGT_DEMUX,MSGL_V,"Audio extra header: len=%d fcc=0x%X\n",len,fcc); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
745 if((len >= 4) && |
15022
17915d97622d
Fix alac from QTpro (in standard mov file, not in m4a file)
rtognimp
parents:
14922
diff
changeset
|
746 (char2int(trak->stdata,52) >= 12) && |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
747 (char2int(trak->stdata,52+4) == MOV_FOURCC('f','r','m','a'))) { |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
748 switch(char2int(trak->stdata,52+8)) { |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
749 case MOV_FOURCC('a','l','a','c'): |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
750 if (len >= 36 + char2int(trak->stdata,52)) { |
15022
17915d97622d
Fix alac from QTpro (in standard mov file, not in m4a file)
rtognimp
parents:
14922
diff
changeset
|
751 sh->codecdata_len = char2int(trak->stdata,52+char2int(trak->stdata,52)); |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
752 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found alac atom (%d)!\n", sh->codecdata_len); |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18958
diff
changeset
|
753 sh->codecdata = malloc(sh->codecdata_len); |
15022
17915d97622d
Fix alac from QTpro (in standard mov file, not in m4a file)
rtognimp
parents:
14922
diff
changeset
|
754 memcpy(sh->codecdata, &trak->stdata[52+char2int(trak->stdata,52)], sh->codecdata_len); |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
755 } |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
756 break; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
757 case MOV_FOURCC('i','n','2','4'): |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
758 case MOV_FOURCC('i','n','3','2'): |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
759 case MOV_FOURCC('f','l','3','2'): |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
760 case MOV_FOURCC('f','l','6','4'): |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
761 if ((len >= 22) && |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
762 (char2int(trak->stdata,52+16)==MOV_FOURCC('e','n','d','a')) && |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
763 (char2short(trak->stdata,52+20))) { |
17860
d11c23749503
le2me_32 is not necessary, tested by Diego on BE machine
rathann
parents:
17858
diff
changeset
|
764 sh->format=char2int(trak->stdata,52+8); |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
765 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found little endian PCM data, reversed fourcc:%04x\n", sh->format); |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
766 } |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
767 break; |
17982 | 768 default: |
769 if (len > 8 && len + 44 <= trak->stdata_len) { | |
770 sh->codecdata_len = len-8; | |
25630
bdb0a9df0025
Codecdata must always be malloc'd, fixes free being called with an
reimar
parents:
25360
diff
changeset
|
771 sh->codecdata = malloc(sh->codecdata_len); |
bdb0a9df0025
Codecdata must always be malloc'd, fixes free being called with an
reimar
parents:
25360
diff
changeset
|
772 memcpy(sh->codecdata, trak->stdata+44+8, sh->codecdata_len); |
17982 | 773 } |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17756
diff
changeset
|
774 } |
15022
17915d97622d
Fix alac from QTpro (in standard mov file, not in m4a file)
rtognimp
parents:
14922
diff
changeset
|
775 } else { |
16679
66ce674de624
10l, off by one error in last patch (codecdata length sanity check),
reimar
parents:
16613
diff
changeset
|
776 if (len > 8 && len + 44 <= trak->stdata_len) { |
8003 | 777 sh->codecdata_len = len-8; |
25630
bdb0a9df0025
Codecdata must always be malloc'd, fixes free being called with an
reimar
parents:
25360
diff
changeset
|
778 sh->codecdata = malloc(sh->codecdata_len); |
bdb0a9df0025
Codecdata must always be malloc'd, fixes free being called with an
reimar
parents:
25360
diff
changeset
|
779 memcpy(sh->codecdata, trak->stdata+44+8, sh->codecdata_len); |
16611
9574fb378080
Sanity-check codecdata_len, fixes crash in libfaad due to failed malloc for
reimar
parents:
16496
diff
changeset
|
780 } |
15022
17915d97622d
Fix alac from QTpro (in standard mov file, not in m4a file)
rtognimp
parents:
14922
diff
changeset
|
781 } |
8003 | 782 } |
783 } | |
6612 | 784 |
17283
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
785 switch (version) { |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
786 case 0: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
787 adjust = 0; break; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
788 case 1: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
789 adjust = 48; break; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
790 case 2: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
791 adjust = 68; break; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
792 default: |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
793 mp_msg(MSGT_DEMUX, MSGL_WARN, "MOV: unknown sound atom version (%d); may not work!\n", version); |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
794 adjust = 68; |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
795 } |
4fea216307d2
Partial support for QuickTime sound atom version 2.
corey
parents:
17012
diff
changeset
|
796 if (trak->stdata_len >= 36 + adjust) { |
9590
ad8223e04c4f
Animatrix AAC fix, patch by <dimakar(at)yahoo.com>. (This is the right patch)
rtognimp
parents:
9575
diff
changeset
|
797 int atom_len = char2int(trak->stdata,28+adjust); |
27232 | 798 if (atom_len < 0 || atom_len > trak->stdata_len - 28 - adjust) atom_len = trak->stdata_len - 28 - adjust; |
9590
ad8223e04c4f
Animatrix AAC fix, patch by <dimakar(at)yahoo.com>. (This is the right patch)
rtognimp
parents:
9575
diff
changeset
|
799 switch(char2int(trak->stdata,32+adjust)) { // atom type |
5301 | 800 case MOV_FOURCC('e','s','d','s'): { |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
801 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found MPEG4 audio Elementary Stream Descriptor atom (%d)!\n", atom_len); |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
802 if(atom_len > 8) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
803 esds_t esds; |
9590
ad8223e04c4f
Animatrix AAC fix, patch by <dimakar(at)yahoo.com>. (This is the right patch)
rtognimp
parents:
9575
diff
changeset
|
804 if(!mp4_parse_esds(&trak->stdata[36+adjust], atom_len-8, &esds)) { |
19363 | 805 /* 0xdd is a "user private" id, not an official allocated id (see http://www.mp4ra.org/object.html), |
806 so perform some extra checks to be sure that this is really vorbis audio */ | |
807 if(esds.objectTypeId==0xdd && esds.streamType==0x15 && sh->format==0x6134706D && esds.decoderConfigLen > 8) | |
18667 | 808 { |
809 //vorbis audio | |
810 unsigned char *buf[3]; | |
811 unsigned short sizes[3]; | |
812 int offset, len, k; | |
813 unsigned char *ptr = esds.decoderConfig; | |
814 | |
815 if(ptr[0] != 0 || ptr[1] != 30) goto quit_vorbis_block; //wrong extradata layout | |
816 | |
817 offset = len = 0; | |
818 for(k = 0; k < 3; k++) | |
819 { | |
820 sizes[k] = (ptr[offset]<<8) | ptr[offset+1]; | |
821 len += sizes[k]; | |
822 offset += 2; | |
823 if(offset + sizes[k] > esds.decoderConfigLen) | |
824 { | |
825 mp_msg(MSGT_DEMUX, MSGL_FATAL, "MOV: ERROR!, not enough vorbis extradata to read: offset = %d, k=%d, size=%d, len: %d\n", offset, k, sizes[k], esds.decoderConfigLen); | |
826 goto quit_vorbis_block; | |
827 } | |
828 buf[k] = malloc(sizes[k]); | |
829 if(!buf[k]) goto quit_vorbis_block; | |
830 memcpy(buf[k], &ptr[offset], sizes[k]); | |
831 offset += sizes[k]; | |
832 } | |
833 | |
834 sh->codecdata_len = len + len/255 + 64; | |
835 sh->codecdata = malloc(sh->codecdata_len); | |
836 ptr = sh->codecdata; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
837 |
18667 | 838 ptr[0] = 2; |
839 offset = 1; | |
840 offset += store_ughvlc(&ptr[offset], sizes[0]); | |
841 offset += store_ughvlc(&ptr[offset], sizes[1]); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
842 for(k = 0; k < 3; k++) |
18667 | 843 { |
844 memcpy(&ptr[offset], buf[k], sizes[k]); | |
845 offset += sizes[k]; | |
846 } | |
847 | |
848 sh->codecdata_len = offset; | |
849 sh->codecdata = realloc(sh->codecdata, offset); | |
850 mp_msg(MSGT_DEMUX,MSGL_V, "demux_mov, vorbis extradata size: %d\n", offset); | |
851 is_vorbis = 1; | |
852 quit_vorbis_block: | |
853 sh->format = mmioFOURCC('v', 'r', 'b', 's'); | |
854 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
855 sh->i_bps = esds.avgBitrate/8; |
5301 | 856 |
6928 | 857 // printf("######## audio format = %d ########\n",esds.objectTypeId); |
13954
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
858 if(esds.objectTypeId==MP4OTI_MPEG1Audio || esds.objectTypeId==MP4OTI_MPEG2AudioPart3) |
6928 | 859 sh->format=0x55; // .mp3 |
860 | |
19363 | 861 if(esds.objectTypeId==MP4OTI_13kVoice) { // 13K Voice, defined by 3GPP2 |
862 sh->format=mmioFOURCC('Q', 'c', 'l', 'p'); | |
863 trak->nchannels=sh->channels=1; | |
864 trak->samplebytes=sh->samplesize=1; | |
865 } | |
866 | |
5301 | 867 // dump away the codec specific configuration for the AAC decoder |
6928 | 868 if(esds.decoderConfigLen){ |
14706 | 869 if( (esds.decoderConfig[0]>>3) == 29 ) |
870 sh->format = 0x1d61346d; // request multi-channel mp3 decoder | |
18667 | 871 if(!is_vorbis) |
872 { | |
5305 | 873 sh->codecdata_len = esds.decoderConfigLen; |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18958
diff
changeset
|
874 sh->codecdata = malloc(sh->codecdata_len); |
5305 | 875 memcpy(sh->codecdata, esds.decoderConfig, sh->codecdata_len); |
6928 | 876 } |
18667 | 877 } |
5301 | 878 } |
5305 | 879 mp4_free_esds(&esds); // freeup esds mem |
5301 | 880 #if 0 |
881 { FILE* f=fopen("esds.dat","wb"); | |
882 fwrite(&trak->stdata[36],atom_len-8,1,f); | |
883 fclose(f); } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
884 #endif |
5301 | 885 } |
886 } break; | |
14922 | 887 case MOV_FOURCC('a','l','a','c'): { |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
888 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found alac atom (%d)!\n", atom_len); |
14922 | 889 if(atom_len > 8) { |
890 // copy all the atom (not only payload) for lavc alac decoder | |
891 sh->codecdata_len = atom_len; | |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18958
diff
changeset
|
892 sh->codecdata = malloc(sh->codecdata_len); |
14922 | 893 memcpy(sh->codecdata, &trak->stdata[28], sh->codecdata_len); |
894 } | |
895 } break; | |
15356 | 896 case MOV_FOURCC('d','a','m','r'): |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
897 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found AMR audio atom %c%c%c%c (%d)!\n", trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], atom_len); |
15356 | 898 if (atom_len>14) { |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
899 mp_msg(MSGT_DEMUX, MSGL_V, "mov: vendor: %c%c%c%c Version: %d\n",trak->stdata[36+adjust],trak->stdata[37+adjust],trak->stdata[38+adjust], trak->stdata[39+adjust],trak->stdata[40+adjust]); |
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
900 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Modes set: %02x%02x\n",trak->stdata[41+adjust],trak->stdata[42+adjust]); |
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
901 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Mode change period: %d Frames per sample: %d\n",trak->stdata[43+adjust],trak->stdata[44+adjust]); |
15356 | 902 } |
903 break; | |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
904 default: |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
905 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found unknown audio atom %c%c%c%c (%d)!\n", |
9590
ad8223e04c4f
Animatrix AAC fix, patch by <dimakar(at)yahoo.com>. (This is the right patch)
rtognimp
parents:
9575
diff
changeset
|
906 trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], |
5206
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
907 atom_len); |
2ca5a9bfaa98
allow sh_audio struct to be initialized by demuxer, add parsing of mp4 esds header to mov demuxer, init faad from info from mov header
atmos4
parents:
5085
diff
changeset
|
908 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
909 } |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
910 mp_msg(MSGT_DEMUX, MSGL_V, "Fourcc: %.4s\n",(char *)&trak->fourcc); |
2543 | 911 #if 0 |
912 { FILE* f=fopen("stdata.dat","wb"); | |
913 fwrite(trak->stdata,trak->stdata_len,1,f); | |
914 fclose(f); } | |
915 { FILE* f=fopen("tkdata.dat","wb"); | |
916 fwrite(trak->tkdata,trak->tkdata_len,1,f); | |
917 fclose(f); } | |
918 #endif | |
2101 | 919 // Emulate WAVEFORMATEX struct: |
18667 | 920 sh->wf=malloc(sizeof(WAVEFORMATEX) + (is_vorbis ? sh->codecdata_len : 0)); |
2101 | 921 memset(sh->wf,0,sizeof(WAVEFORMATEX)); |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
922 sh->wf->nChannels=sh->channels; |
2543 | 923 sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19]; |
924 // sh->wf->nSamplesPerSec=trak->timescale; | |
15357
9bebc73be6fa
Fix audio playback for no-sound-3gp.3gp (amr nb)
rtognimp
parents:
15356
diff
changeset
|
925 sh->wf->nSamplesPerSec=sh->samplerate; |
8061 | 926 if(trak->stdata_len >= 44 && trak->stdata[9]>=1 && char2int(trak->stdata,28)>0){ |
8009
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
927 //Audio header: samp/pack=4096 bytes/pack=743 bytes/frame=1486 bytes/samp=2 |
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
928 sh->wf->nAvgBytesPerSec=(sh->wf->nChannels*sh->wf->nSamplesPerSec* |
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
929 char2int(trak->stdata,32)+char2int(trak->stdata,28)/2) |
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
930 /char2int(trak->stdata,28); |
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
931 sh->wf->nBlockAlign=char2int(trak->stdata,36); |
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
932 } else { |
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
933 sh->wf->nAvgBytesPerSec=sh->wf->nChannels*sh->wf->wBitsPerSample*sh->wf->nSamplesPerSec/8; |
8105 | 934 // workaround for ms11 ima4 |
935 if (sh->format == 0x1100736d && trak->stdata_len >= 36) | |
936 sh->wf->nBlockAlign=char2int(trak->stdata,36); | |
8009
302708769c69
set up nBlockAlign, nBytesPerSec correctly if extended audio header avail.
arpi
parents:
8003
diff
changeset
|
937 } |
18667 | 938 |
939 if(is_vorbis && sh->codecdata_len) | |
940 { | |
941 memcpy(sh->wf+1, sh->codecdata, sh->codecdata_len); | |
942 sh->wf->cbSize = sh->codecdata_len; | |
943 } | |
2101 | 944 // Selection: |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
945 // if(demuxer->audio->id==-1 || demuxer->audio->id==priv->track_db){ |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
946 // // (auto)selected audio track: |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
947 // demuxer->audio->id=priv->track_db; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
948 // demuxer->audio->sh=sh; sh->ds=demuxer->audio; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
949 // } |
24182
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
950 return 1; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
951 } |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
952 |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
953 static int gen_sh_video(sh_video_t* sh, mov_track_t* trak, int timescale) { |
23089 | 954 int depth, i, entry; |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
955 int flag, start, count_flag, end, palette_count, gray; |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
956 int hdr_ptr = 76; // the byte just after depth |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
957 unsigned char *palette_map; |
25359
4bb08145bf66
Set correct image format for 24bit "raw " in mov files.
cehoyos
parents:
24358
diff
changeset
|
958 |
25360 | 959 sh->format=trak->fourcc; |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
960 |
19170
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
961 // crude video delay from editlist0 hack ::atm |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
962 if(trak->editlist_size>=1) { |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
963 if(trak->editlist[0].pos == -1) { |
24182
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
964 sh->stream_delay = (float)trak->editlist[0].dur/(float)timescale; |
19170
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
965 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Initial Video-Delay: %.3f sec\n", sh->stream_delay); |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
966 } |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
967 } |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
968 |
7e689bb31c07
Add simple edit list support to mov demuxer, it supports delay of audio and video tracks at the beginning of the file. E.g. video starts at 0.0s audio at 4.0s. It uses mplayers a/v-delay to achieve sync so please use with -framedrop for fastest sync. More Details in my mail to dev-eng from 2006-07-22.
atmos4
parents:
19062
diff
changeset
|
969 |
15949
0ad9bf13b72b
Add missing range/length check for video trak desc (fixes bug #335).
reimar
parents:
15948
diff
changeset
|
970 if (trak->stdata_len < 78) { |
0ad9bf13b72b
Add missing range/length check for video trak desc (fixes bug #335).
reimar
parents:
15948
diff
changeset
|
971 mp_msg(MSGT_DEMUXER, MSGL_WARN, |
0ad9bf13b72b
Add missing range/length check for video trak desc (fixes bug #335).
reimar
parents:
15948
diff
changeset
|
972 "MOV: Invalid (%d bytes instead of >= 78) video trak desc\n", |
0ad9bf13b72b
Add missing range/length check for video trak desc (fixes bug #335).
reimar
parents:
15948
diff
changeset
|
973 trak->stdata_len); |
24182
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
974 return 0; |
15949
0ad9bf13b72b
Add missing range/length check for video trak desc (fixes bug #335).
reimar
parents:
15948
diff
changeset
|
975 } |
27110 | 976 |
977 depth = trak->stdata[75] | (trak->stdata[74] << 8); | |
978 if (trak->fourcc == mmioFOURCC('r', 'a', 'w', ' ')) | |
979 sh->format = IMGFMT_RGB | depth; | |
980 | |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
981 // stdata[]: |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
982 // 8 short version |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
983 // 10 short revision |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
984 // 12 int vendor_id |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
985 // 16 int temporal_quality |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
986 // 20 int spatial_quality |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
987 // 24 short width |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
988 // 26 short height |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
989 // 28 int h_dpi |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
990 // 32 int v_dpi |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
991 // 36 int 0 |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
992 // 40 short frames_per_sample |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
993 // 42 char[4] compressor_name |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
994 // 74 short depth |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
995 // 76 short color_table_id |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
996 // additional atoms may follow, |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
997 // eg esds atom from .MP4 files |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
998 // 78 int atom size |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
999 // 82 char[4] atom type |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1000 // 86 ... atom data |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1001 |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1002 { ImageDescription* id=malloc(8+trak->stdata_len); // safe |
5372
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1003 trak->desc=id; |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1004 id->idSize=8+trak->stdata_len; |
10087 | 1005 // id->cType=bswap_32(trak->fourcc); |
1006 id->cType=le2me_32(trak->fourcc); | |
5372
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1007 id->version=char2short(trak->stdata,8); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1008 id->revisionLevel=char2short(trak->stdata,10); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1009 id->vendor=char2int(trak->stdata,12); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1010 id->temporalQuality=char2int(trak->stdata,16); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1011 id->spatialQuality=char2int(trak->stdata,20); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1012 id->width=char2short(trak->stdata,24); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1013 id->height=char2short(trak->stdata,26); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1014 id->hRes=char2int(trak->stdata,28); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1015 id->vRes=char2int(trak->stdata,32); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1016 id->dataSize=char2int(trak->stdata,36); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1017 id->frameCount=char2short(trak->stdata,40); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1018 memcpy(&id->name,trak->stdata+42,32); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1019 id->depth=char2short(trak->stdata,74); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1020 id->clutID=char2short(trak->stdata,76); |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
1021 if(trak->stdata_len>78) memcpy(((char*)&id->clutID)+2,trak->stdata+78,trak->stdata_len-78); |
8158 | 1022 sh->ImageDesc=id; |
1023 #if 0 | |
5372
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1024 { FILE *f=fopen("ImageDescription","wb"); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1025 fwrite(id,id->idSize,1,f); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1026 fclose(f); |
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1027 } |
8158 | 1028 #endif |
5372
ee9dd55ef383
some under-devel code, will be required for qtx codecs
arpi
parents:
5307
diff
changeset
|
1029 } |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1030 |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1031 if(trak->stdata_len >= 86) { // extra atoms found |
5250 | 1032 int pos=78; |
5251 | 1033 int atom_len; |
5250 | 1034 while(pos+8<=trak->stdata_len && |
1035 (pos+(atom_len=char2int(trak->stdata,pos)))<=trak->stdata_len){ | |
1036 switch(char2int(trak->stdata,pos+4)) { // switch atom type | |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1037 case MOV_FOURCC('g','a','m','a'): |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1038 // intfp with gamma value at which movie was captured |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1039 // can be used to gamma correct movie display |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1040 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found unsupported Gamma-Correction movie atom (%d)!\n", |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1041 atom_len); |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1042 break; |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1043 case MOV_FOURCC('f','i','e','l'): |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1044 // 2 char-values (8bit int) that specify field handling |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1045 // see the Apple's QuickTime Fileformat PDF for more info |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1046 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found unsupported Field-Handling movie atom (%d)!\n", |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1047 atom_len); |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1048 break; |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1049 case MOV_FOURCC('m','j','q','t'): |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1050 // Motion-JPEG default quantization table |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1051 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found unsupported MJPEG-Quantization movie atom (%d)!\n", |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1052 atom_len); |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1053 break; |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1054 case MOV_FOURCC('m','j','h','t'): |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1055 // Motion-JPEG default huffman table |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1056 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found unsupported MJPEG-Huffman movie atom (%d)!\n", |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1057 atom_len); |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1058 break; |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1059 case MOV_FOURCC('e','s','d','s'): |
5242
d4ffcbe9ed3d
Recognize and skip ftype chunk used by some .mp4 files and
atmos4
parents:
5241
diff
changeset
|
1060 // MPEG4 Elementary Stream Descriptor header |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1061 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found MPEG4 movie Elementary Stream Descriptor atom (%d)!\n", atom_len); |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1062 // add code here to save esds header of length atom_len-8 |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1063 // beginning at stdata[86] to some variable to pass it |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1064 // on to the decoder ::atmos |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1065 if(atom_len > 8) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1066 esds_t esds; |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1067 if(!mp4_parse_esds(trak->stdata+pos+8, atom_len-8, &esds)) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1068 |
13954
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1069 if(esds.objectTypeId==MP4OTI_MPEG2VisualSimple || esds.objectTypeId==MP4OTI_MPEG2VisualMain || |
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1070 esds.objectTypeId==MP4OTI_MPEG2VisualSNR || esds.objectTypeId==MP4OTI_MPEG2VisualSpatial || |
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1071 esds.objectTypeId==MP4OTI_MPEG2VisualHigh || esds.objectTypeId==MP4OTI_MPEG2Visual422) |
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1072 sh->format=mmioFOURCC('m', 'p', 'g', '2'); |
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1073 else if(esds.objectTypeId==MP4OTI_MPEG1Visual) |
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1074 sh->format=mmioFOURCC('m', 'p', 'g', '1'); |
7dfda76015c8
Extended support for other object type IDs in the ESDS. This enables e.g. MPEG2 video in the MP4 container.
mosu
parents:
13333
diff
changeset
|
1075 |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1076 // dump away the codec specific configuration for the AAC decoder |
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1077 trak->stream_header_len = esds.decoderConfigLen; |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18958
diff
changeset
|
1078 trak->stream_header = malloc(trak->stream_header_len); |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1079 memcpy(trak->stream_header, esds.decoderConfig, trak->stream_header_len); |
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1080 } |
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
1081 mp4_free_esds(&esds); // freeup esds mem |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1082 } |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1083 break; |
13190 | 1084 case MOV_FOURCC('a','v','c','C'): |
1085 // AVC decoder configuration record | |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1086 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: AVC decoder configuration record atom (%d)!\n", atom_len); |
13190 | 1087 if(atom_len > 8) { |
1088 int i, poffs, cnt; | |
1089 // Parse some parts of avcC, just for fun :) | |
13333
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1090 // real parsing is done by avc1 decoder |
13190 | 1091 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC version: %d\n", *(trak->stdata+pos+8)); |
1092 if (*(trak->stdata+pos+8) != 1) | |
1093 mp_msg(MSGT_DEMUX, MSGL_ERR, "MOV: unknown avcC version (%d). Expexct problems.\n", *(trak->stdata+pos+9)); | |
1094 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC profile: %d\n", *(trak->stdata+pos+9)); | |
1095 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC profile compatibility: %d\n", *(trak->stdata+pos+10)); | |
1096 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC level: %d\n", *(trak->stdata+pos+11)); | |
13333
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1097 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC nal length size: %d\n", ((*(trak->stdata+pos+12))&0x03)+1); |
13190 | 1098 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC number of sequence param sets: %d\n", cnt = (*(trak->stdata+pos+13) & 0x1f)); |
1099 poffs = pos + 14; | |
1100 for (i = 0; i < cnt; i++) { | |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1101 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC sps %d have length %d\n", i, AV_RB16(trak->stdata+poffs)); |
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1102 poffs += AV_RB16(trak->stdata+poffs) + 2; |
13190 | 1103 } |
1104 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC number of picture param sets: %d\n", *(trak->stdata+poffs)); | |
1105 poffs++; | |
1106 for (i = 0; i < cnt; i++) { | |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1107 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: avcC pps %d have length %d\n", i, AV_RB16(trak->stdata+poffs)); |
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1108 poffs += AV_RB16(trak->stdata+poffs) + 2; |
13190 | 1109 } |
1110 // Copy avcC for the AVC decoder | |
13333
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1111 // This data will be put in extradata below, where BITMAPINFOHEADER is created |
13190 | 1112 trak->stream_header_len = atom_len-8; |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18958
diff
changeset
|
1113 trak->stream_header = malloc(trak->stream_header_len); |
13190 | 1114 memcpy(trak->stream_header, trak->stdata+pos+8, trak->stream_header_len); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1115 } |
13190 | 1116 break; |
15356 | 1117 case MOV_FOURCC('d','2','6','3'): |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1118 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found H.263 decoder atom %c%c%c%c (%d)!\n", trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7],atom_len); |
15356 | 1119 if (atom_len>10) |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1120 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Vendor: %c%c%c%c H.263 level: %d H.263 profile: %d \n", trak->stdata[pos+8],trak->stdata[pos+9],trak->stdata[pos+10],trak->stdata[pos+11],trak->stdata[pos+12],trak->stdata[pos+13]); |
15356 | 1121 break; |
6655
9eefcaf88e56
fixed endless 'unknown chunk' and doublespeed ima4 audio bugs
arpi
parents:
6612
diff
changeset
|
1122 case 0: |
9eefcaf88e56
fixed endless 'unknown chunk' and doublespeed ima4 audio bugs
arpi
parents:
6612
diff
changeset
|
1123 break; |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1124 default: |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1125 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: Found unknown movie atom %c%c%c%c (%d)!\n", |
5250 | 1126 trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7], |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1127 atom_len); |
5250 | 1128 } |
6655
9eefcaf88e56
fixed endless 'unknown chunk' and doublespeed ima4 audio bugs
arpi
parents:
6612
diff
changeset
|
1129 if(atom_len<8) break; |
5250 | 1130 pos+=atom_len; |
5252 | 1131 // printf("pos=%d max=%d\n",pos,trak->stdata_len); |
5236
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1132 } |
f8a00b2c9c39
Add some atom parsing to movie trak and a bit cosmetics ;), Michael can now write esds movie header whereever he wants.
atmos4
parents:
5212
diff
changeset
|
1133 } |
5630 | 1134 sh->fps=trak->timescale/ |
1135 ((trak->durmap_size>=1)?(float)trak->durmap[0].dur:1); | |
2100 | 1136 sh->frametime=1.0f/sh->fps; |
5242
d4ffcbe9ed3d
Recognize and skip ftype chunk used by some .mp4 files and
atmos4
parents:
5241
diff
changeset
|
1137 |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1138 sh->disp_w=trak->stdata[25]|(trak->stdata[24]<<8); |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1139 sh->disp_h=trak->stdata[27]|(trak->stdata[26]<<8); |
27233
8c5ec96a0bc7
Check size of tkdata before using it in mov demuxer.
reimar
parents:
27232
diff
changeset
|
1140 if(trak->tkdata_len>81) { |
27234 | 1141 // if image size is zero, fallback to display size |
1142 if(!sh->disp_w && !sh->disp_h) { | |
1143 sh->disp_w=trak->tkdata[77]|(trak->tkdata[76]<<8); | |
1144 sh->disp_h=trak->tkdata[81]|(trak->tkdata[80]<<8); | |
1145 } else if(sh->disp_w!=(trak->tkdata[77]|(trak->tkdata[76]<<8))){ | |
1146 // codec and display width differ... use display one for aspect | |
1147 sh->aspect=trak->tkdata[77]|(trak->tkdata[76]<<8); | |
1148 sh->aspect/=trak->tkdata[81]|(trak->tkdata[80]<<8); | |
1149 } | |
27233
8c5ec96a0bc7
Check size of tkdata before using it in mov demuxer.
reimar
parents:
27232
diff
changeset
|
1150 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1151 |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
17982
diff
changeset
|
1152 if(depth>32+8) mp_msg(MSGT_DEMUX, MSGL_INFO,"*** depth = 0x%X\n",depth); |
2101 | 1153 |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1154 // palettized? |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1155 gray = 0; |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1156 if (depth > 32) { depth&=31; gray = 1; } // depth > 32 means grayscale |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1157 if ((depth == 2) || (depth == 4) || (depth == 8)) |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1158 palette_count = (1 << depth); |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1159 else |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1160 palette_count = 0; |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1161 |
2101 | 1162 // emulate BITMAPINFOHEADER: |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1163 if (palette_count) |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1164 { |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1165 sh->bih=malloc(sizeof(BITMAPINFOHEADER) + palette_count * 4); |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1166 memset(sh->bih,0,sizeof(BITMAPINFOHEADER) + palette_count * 4); |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1167 sh->bih->biSize=40 + palette_count * 4; |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1168 // fetch the relevant fields |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1169 flag = AV_RB16(&trak->stdata[hdr_ptr]); |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1170 hdr_ptr += 2; |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1171 start = AV_RB32(&trak->stdata[hdr_ptr]); |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1172 hdr_ptr += 4; |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1173 count_flag = AV_RB16(&trak->stdata[hdr_ptr]); |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1174 hdr_ptr += 2; |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1175 end = AV_RB16(&trak->stdata[hdr_ptr]); |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1176 hdr_ptr += 2; |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1177 palette_map = (unsigned char *)sh->bih + 40; |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1178 mp_msg(MSGT_DEMUX, MSGL_V, "Allocated %d entries for palette\n", |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1179 palette_count); |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1180 mp_msg(MSGT_DEMUX, MSGL_DBG2, "QT palette: start: %x, end: %x, count flag: %d, flags: %x\n", |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1181 start, end, count_flag, flag); |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1182 |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1183 /* XXX: problems with sample (statunit6.mov) with flag&0x4 set! - alex*/ |
4332 | 1184 |
1185 // load default palette | |
4646
59eb588c7115
reinstated original palette decision logic from XAnim (was the QT spec
melanson
parents:
4645
diff
changeset
|
1186 if (flag & 0x08) |
4332 | 1187 { |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1188 if (gray) |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1189 { |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1190 mp_msg(MSGT_DEMUX, MSGL_V, "Using default QT grayscale palette\n"); |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1191 if (palette_count == 16) |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1192 memcpy(palette_map, qt_default_grayscale_palette_16, 16 * 4); |
12708 | 1193 else if (palette_count == 256) { |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1194 memcpy(palette_map, qt_default_grayscale_palette_256, 256 * 4); |
12708 | 1195 if (trak->fourcc == mmioFOURCC('c','v','i','d')) { |
1196 int i; | |
1197 // Hack for grayscale CVID, negative palette | |
1198 // If you have samples where this is not required contact me (rxt) | |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1199 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: greyscale cvid with default palette," |
12708 | 1200 " enabling negative palette hack.\n"); |
1201 for (i = 0; i < 256 * 4; i++) | |
1202 palette_map[i] = palette_map[i] ^ 0xff; | |
1203 } | |
1204 } | |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1205 } |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1206 else |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1207 { |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1208 mp_msg(MSGT_DEMUX, MSGL_V, "Using default QT colour palette\n"); |
10796
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1209 if (palette_count == 4) |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1210 memcpy(palette_map, qt_default_palette_4, 4 * 4); |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1211 else if (palette_count == 16) |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1212 memcpy(palette_map, qt_default_palette_16, 16 * 4); |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1213 else if (palette_count == 256) |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1214 memcpy(palette_map, qt_default_palette_256, 256 * 4); |
266bf4b596a3
Support for grayscale paletted files. Patch by Dima K <dimakar@yahoo.com>
mosu
parents:
10087
diff
changeset
|
1215 } |
4332 | 1216 } |
1217 // load palette from file | |
1218 else | |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1219 { |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1220 mp_msg(MSGT_DEMUX, MSGL_V, "Loading palette from file\n"); |
4332 | 1221 for (i = start; i <= end; i++) |
1222 { | |
25931
775b1e902c32
Use AV_RB*, reduces x86_64 code size by almost 1kB.
reimar
parents:
25893
diff
changeset
|
1223 entry = AV_RB16(&trak->stdata[hdr_ptr]); |
4332 | 1224 hdr_ptr += 2; |
1225 // apparently, if count_flag is set, entry is same as i | |
1226 if (count_flag & 0x8000) | |
1227 entry = i; | |
1228 // only care about top 8 bits of 16-bit R, G, or B value | |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1229 if (entry <= palette_count && entry >= 0) |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1230 { |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1231 palette_map[entry * 4 + 2] = trak->stdata[hdr_ptr + 0]; |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1232 palette_map[entry * 4 + 1] = trak->stdata[hdr_ptr + 2]; |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1233 palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4]; |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1234 mp_dbg(MSGT_DEMUX, MSGL_DBG2, "QT palette: added entry: %d of %d (colors: R:%x G:%x B:%x)\n", |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1235 entry, palette_count, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1236 palette_map[entry * 4 + 2], |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1237 palette_map[entry * 4 + 1], |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1238 palette_map[entry * 4 + 0]); |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1239 } |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1240 else |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1241 mp_msg(MSGT_DEMUX, MSGL_V, "QT palette: skipped entry (out of count): %d of %d\n", |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1242 entry, palette_count); |
4332 | 1243 hdr_ptr += 6; |
1244 } | |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1245 } |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1246 } |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1247 else |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1248 { |
13333
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1249 if (trak->fourcc == mmioFOURCC('a','v','c','1')) { |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1250 if (trak->stream_header_len > 0xffffffff - sizeof(BITMAPINFOHEADER)) { |
18491 | 1251 mp_msg(MSGT_DEMUXER, MSGL_ERR, "Invalid extradata size %d, skipping\n",trak->stream_header_len); |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1252 trak->stream_header_len = 0; |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1253 } |
13333
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1254 sh->bih=malloc(sizeof(BITMAPINFOHEADER) + trak->stream_header_len); |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1255 memset(sh->bih,0,sizeof(BITMAPINFOHEADER) + trak->stream_header_len); |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1256 sh->bih->biSize=40 + trak->stream_header_len; |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1257 memcpy(((unsigned char *)sh->bih)+40, trak->stream_header, trak->stream_header_len); |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1258 free (trak->stream_header); |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1259 trak->stream_header_len = 0; |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1260 trak->stream_header = NULL; |
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1261 } else { |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1262 sh->bih=malloc(sizeof(BITMAPINFOHEADER)); |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1263 memset(sh->bih,0,sizeof(BITMAPINFOHEADER)); |
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1264 sh->bih->biSize=40; |
13333
5d4910f6aa79
AVC support moved to libavcodec, avcC atom is now passed in extradata
rtognimp
parents:
13190
diff
changeset
|
1265 } |
4129
31cd2e0bb961
QT demuxer loads palette information from files that transport palettes in
melanson
parents:
3999
diff
changeset
|
1266 } |
2101 | 1267 sh->bih->biWidth=sh->disp_w; |
1268 sh->bih->biHeight=sh->disp_h; | |
1269 sh->bih->biPlanes=0; | |
3652
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
1270 sh->bih->biBitCount=depth; |
2101 | 1271 sh->bih->biCompression=trak->fourcc; |
1272 sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight; | |
1273 | |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1274 mp_msg(MSGT_DEMUX, MSGL_V, "Image size: %d x %d (%d bpp)\n",sh->disp_w,sh->disp_h,sh->bih->biBitCount); |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1275 if(trak->tkdata_len>81) |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1276 mp_msg(MSGT_DEMUX, MSGL_V, "Display size: %d x %d\n", |
5067
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1277 trak->tkdata[77]|(trak->tkdata[76]<<8), |
54fe37e1f1a7
some cleanup, fixes for video header parsing. finally we get the coded size instead of display size\!
arpi
parents:
4903
diff
changeset
|
1278 trak->tkdata[81]|(trak->tkdata[80]<<8)); |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1279 mp_msg(MSGT_DEMUX, MSGL_V, "Fourcc: %.4s Codec: '%.*s'\n",(char *)&trak->fourcc,trak->stdata[42]&31,trak->stdata+43); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1280 |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1281 // if(demuxer->video->id==-1 || demuxer->video->id==priv->track_db){ |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1282 // // (auto)selected video track: |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1283 // demuxer->video->id=priv->track_db; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1284 // demuxer->video->sh=sh; sh->ds=demuxer->video; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1285 // } |
24182
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1286 return 1; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1287 } |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1288 |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1289 static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak){ |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1290 mov_priv_t* priv=demuxer->priv; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1291 // printf("lschunks (level=%d,endpos=%x)\n", level, endpos); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1292 while(1){ |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1293 off_t pos; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1294 off_t len; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1295 unsigned int id; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1296 // |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1297 pos=stream_tell(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1298 // printf("stream_tell==%d\n",pos); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1299 if(pos>=endpos) return; // END |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1300 len=stream_read_dword(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1301 // printf("len==%d\n",len); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1302 if(len<8) return; // error |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1303 len-=8; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1304 id=stream_read_dword(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1305 // |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1306 mp_msg(MSGT_DEMUX,MSGL_DBG2,"lschunks %.4s %d\n",(char *)&id,(int)len); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1307 // |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1308 if(trak){ |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1309 if (lschunks_intrak(demuxer, level, id, pos, len, trak) < 0) |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1310 return; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1311 } else { /* not in track */ |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1312 switch(id) { |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1313 case MOV_FOURCC('m','v','h','d'): { |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1314 int version = stream_read_char(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1315 stream_skip(demuxer->stream, (version == 1) ? 19 : 11); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1316 priv->timescale=stream_read_dword(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1317 if (version == 1) |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1318 priv->duration=stream_read_qword(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1319 else |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1320 priv->duration=stream_read_dword(demuxer->stream); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1321 mp_msg(MSGT_DEMUX, MSGL_V,"MOV: %*sMovie header (%d bytes): tscale=%d dur=%d\n",level,"",(int)len, |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1322 (int)priv->timescale,(int)priv->duration); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1323 break; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1324 } |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1325 case MOV_FOURCC('t','r','a','k'): { |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1326 // if(trak) printf("MOV: Warning! trak in trak?\n"); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1327 if(priv->track_db>=MOV_MAX_TRACKS){ |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1328 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MOVtooManyTrk); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1329 return; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1330 } |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1331 if(!priv->track_db) mp_msg(MSGT_DEMUX, MSGL_V, "--------------\n"); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1332 trak=malloc(sizeof(mov_track_t)); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1333 memset(trak,0,sizeof(mov_track_t)); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1334 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Track #%d:\n",priv->track_db); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1335 trak->id=priv->track_db; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1336 priv->tracks[priv->track_db]=trak; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1337 lschunks(demuxer,level+1,pos+len,trak); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1338 mov_build_index(trak,priv->timescale); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1339 switch(trak->type){ |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1340 case MOV_TRAK_AUDIO: { |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1341 sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1342 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "mov", priv->track_db); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1343 gen_sh_audio(sh, trak, priv->timescale); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1344 break; |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1345 } |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1346 case MOV_TRAK_VIDEO: { |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1347 sh_video_t* sh=new_sh_video(demuxer,priv->track_db); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1348 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "mov", priv->track_db); |
8d6ad131c010
Split lschunks function further, it is simply too huge to do any useful changes (e.g. for
reimar
parents:
24172
diff
changeset
|
1349 gen_sh_video(sh, trak, priv->timescale); |
2100 | 1350 break; |
1351 } | |
2786 | 1352 case MOV_TRAK_GENERIC: |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
1353 if (trak->fourcc == mmioFOURCC('m','p','4','s') || |
20976
99d7c6cb0f81
Pseudo-support for subtitles in http://samples.mplayerhq.hu/sub/jpn_engSUB_sample.3gp
reimar
parents:
20907
diff
changeset
|
1354 trak->fourcc == mmioFOURCC('t','x','3','g') || |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
1355 trak->fourcc == mmioFOURCC('t','e','x','t')) { |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
1356 sh_sub_t *sh = new_sh_sub(demuxer, priv->track_db); |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22605
diff
changeset
|
1357 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_SubtitleID, "mov", priv->track_db); |
20979 | 1358 if (trak->fourcc == mmioFOURCC('m','p','4','s')) |
1359 init_vobsub(sh, trak); | |
25855
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25845
diff
changeset
|
1360 else { |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25845
diff
changeset
|
1361 sh->type = 'm'; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25845
diff
changeset
|
1362 sub_utf8 = 1; |
57a1511f4e76
Support mov subtitle format directly instead of converting to text in the demuxer
reimar
parents:
25845
diff
changeset
|
1363 } |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
1364 } else |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1365 mp_msg(MSGT_DEMUX, MSGL_V, "Generic track - not completely understood! (id: %d)\n", |
2786 | 1366 trak->id); |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1367 /* XXX: Also this contains the FLASH data */ |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
1368 |
2786 | 1369 #if 0 |
1370 { | |
1371 int pos = stream_tell(demuxer->stream); | |
1372 int i; | |
1373 int fd; | |
1374 char name[20]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1375 |
2786 | 1376 for (i=0; i<trak->samples_size; i++) |
1377 { | |
1378 char buf[trak->samples[i].size]; | |
1379 stream_seek(demuxer->stream, trak->samples[i].pos); | |
1380 snprintf((char *)&name[0], 20, "samp%d", i); | |
1381 fd = open((char *)&name[0], O_CREAT|O_WRONLY); | |
1382 stream_read(demuxer->stream, &buf[0], trak->samples[i].size); | |
1383 write(fd, &buf[0], trak->samples[i].size); | |
1384 close(fd); | |
1385 } | |
1386 for (i=0; i<trak->chunks_size; i++) | |
1387 { | |
1388 char buf[trak->length]; | |
1389 stream_seek(demuxer->stream, trak->chunks[i].pos); | |
1390 snprintf((char *)&name[0], 20, "chunk%d", i); | |
1391 fd = open((char *)&name[0], O_CREAT|O_WRONLY); | |
1392 stream_read(demuxer->stream, &buf[0], trak->length); | |
1393 write(fd, &buf[0], trak->length); | |
1394 close(fd); | |
1395 } | |
1396 if (trak->samplesize > 0) | |
1397 { | |
1398 char *buf; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1399 |
2786 | 1400 buf = malloc(trak->samplesize); |
1401 stream_seek(demuxer->stream, trak->chunks[0].pos); | |
1402 snprintf((char *)&name[0], 20, "trak%d", trak->id); | |
1403 fd = open((char *)&name[0], O_CREAT|O_WRONLY); | |
1404 stream_read(demuxer->stream, buf, trak->samplesize); | |
1405 write(fd, buf, trak->samplesize); | |
1406 close(fd); | |
1407 } | |
1408 stream_seek(demuxer->stream, pos); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1409 } |
2786 | 1410 #endif |
1411 break; | |
2532 | 1412 default: |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1413 mp_msg(MSGT_DEMUX, MSGL_V, "Unknown track type found (type: %d)\n", trak->type); |
2532 | 1414 break; |
2100 | 1415 } |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1416 mp_msg(MSGT_DEMUX, MSGL_V, "--------------\n"); |
2100 | 1417 priv->track_db++; |
1490 | 1418 trak=NULL; |
2532 | 1419 break; |
1420 } | |
28440 | 1421 #if !CONFIG_ZLIB |
2532 | 1422 case MOV_FOURCC('c','m','o','v'): { |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1567
diff
changeset
|
1423 mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_MOVcomprhdr); |
1490 | 1424 return; |
1425 } | |
2148 | 1426 #else |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1427 case MOV_FOURCC('m','o','o','v'): |
2532 | 1428 case MOV_FOURCC('c','m','o','v'): { |
2148 | 1429 // mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_MOVcomprhdr); |
1430 lschunks(demuxer,level+1,pos+len,NULL); | |
2532 | 1431 break; |
1432 } | |
1433 case MOV_FOURCC('d','c','o','m'): { | |
2148 | 1434 // int temp=stream_read_dword(demuxer->stream); |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1435 unsigned int algo=be2me_32(stream_read_dword(demuxer->stream)); |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1436 mp_msg(MSGT_DEMUX, MSGL_V, "Compressed header uses %.4s algo!\n",(char *)&algo); |
2532 | 1437 break; |
1438 } | |
1439 case MOV_FOURCC('c','m','v','d'): { | |
2148 | 1440 // int temp=stream_read_dword(demuxer->stream); |
1441 unsigned int moov_sz=stream_read_dword(demuxer->stream); | |
1442 unsigned int cmov_sz=len-4; | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1443 unsigned char* cmov_buf; |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1444 unsigned char* moov_buf; |
2148 | 1445 int zret; |
1446 z_stream zstrm; | |
1447 stream_t* backup; | |
1448 | |
29598
8f54d278fd50
100l, SIZE_MAX must be UINT_MAX to prevent an integer overflow later on,
reimar
parents:
29288
diff
changeset
|
1449 if (moov_sz > UINT_MAX - 16) { |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1450 mp_msg(MSGT_DEMUX, MSGL_ERR, "Invalid cmvd atom size %d\n", moov_sz); |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1451 break; |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1452 } |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1453 cmov_buf=malloc(cmov_sz); |
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1454 moov_buf=malloc(moov_sz+16); |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1455 mp_msg(MSGT_DEMUX, MSGL_V, "Compressed header size: %d / %d\n",cmov_sz,moov_sz); |
2148 | 1456 |
1457 stream_read(demuxer->stream,cmov_buf,cmov_sz); | |
1458 | |
1459 zstrm.zalloc = (alloc_func)0; | |
1460 zstrm.zfree = (free_func)0; | |
1461 zstrm.opaque = (voidpf)0; | |
1462 zstrm.next_in = cmov_buf; | |
1463 zstrm.avail_in = cmov_sz; | |
1464 zstrm.next_out = moov_buf; | |
1465 zstrm.avail_out = moov_sz; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1466 |
2148 | 1467 zret = inflateInit(&zstrm); |
1468 if (zret != Z_OK) | |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1469 { mp_msg(MSGT_DEMUX, MSGL_ERR, "QT cmov: inflateInit err %d\n",zret); |
2148 | 1470 return; |
1471 } | |
1472 zret = inflate(&zstrm, Z_NO_FLUSH); | |
1473 if ((zret != Z_OK) && (zret != Z_STREAM_END)) | |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1474 { mp_msg(MSGT_DEMUX, MSGL_ERR, "QT cmov inflate: ERR %d\n",zret); |
2148 | 1475 return; |
1476 } | |
1477 #if 0 | |
1478 else { | |
1479 FILE *DecOut; | |
1480 DecOut = fopen("Out.bin", "w"); | |
1481 fwrite(moov_buf, 1, moov_sz, DecOut); | |
1482 fclose(DecOut); | |
1483 } | |
1484 #endif | |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1485 if(moov_sz != zstrm.total_out) |
17366 | 1486 mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! moov size differs cmov: %d zlib: %ld\n",moov_sz,zstrm.total_out); |
2148 | 1487 zret = inflateEnd(&zstrm); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1488 |
2148 | 1489 backup=demuxer->stream; |
1490 demuxer->stream=new_memory_stream(moov_buf,moov_sz); | |
1491 stream_skip(demuxer->stream,8); | |
1492 lschunks(demuxer,level+1,moov_sz,NULL); // parse uncompr. 'moov' | |
1493 //free_stream(demuxer->stream); | |
1494 demuxer->stream=backup; | |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1495 free(cmov_buf); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1496 free(moov_buf); |
2532 | 1497 break; |
2148 | 1498 } |
1499 #endif | |
2532 | 1500 case MOV_FOURCC('u','d','t','a'): |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1501 { |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1502 unsigned int udta_id; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1503 off_t udta_len; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1504 off_t udta_size = len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1505 |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1506 mp_msg(MSGT_DEMUX, MSGL_DBG2, "mov: user data record found\n"); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1507 mp_msg(MSGT_DEMUX, MSGL_V, "Quicktime Clip Info:\n"); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1508 |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1509 while((len > 8) && (udta_size > 8)) |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1510 { |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1511 udta_len = stream_read_dword(demuxer->stream); |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1512 udta_id = stream_read_dword(demuxer->stream); |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1513 udta_size -= 8; |
17366 | 1514 mp_msg(MSGT_DEMUX, MSGL_DBG2, "udta_id: %.4s (len: %"PRId64")\n", (char *)&udta_id, (int64_t)udta_len); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1515 switch (udta_id) |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1516 { |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1517 case MOV_FOURCC(0xa9,'c','p','y'): |
2542 | 1518 case MOV_FOURCC(0xa9,'d','a','y'): |
1519 case MOV_FOURCC(0xa9,'d','i','r'): | |
1520 /* 0xa9,'e','d','1' - '9' : edit timestamps */ | |
1521 case MOV_FOURCC(0xa9,'f','m','t'): | |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1522 case MOV_FOURCC(0xa9,'i','n','f'): |
2542 | 1523 case MOV_FOURCC(0xa9,'p','r','d'): |
1524 case MOV_FOURCC(0xa9,'p','r','f'): | |
1525 case MOV_FOURCC(0xa9,'r','e','q'): | |
1526 case MOV_FOURCC(0xa9,'s','r','c'): | |
1527 case MOV_FOURCC('n','a','m','e'): | |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1528 case MOV_FOURCC(0xa9,'n','a','m'): |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1529 case MOV_FOURCC(0xa9,'A','R','T'): |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1530 case MOV_FOURCC(0xa9,'c','m','t'): |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1531 case MOV_FOURCC(0xa9,'a','u','t'): |
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1532 case MOV_FOURCC(0xa9,'s','w','r'): |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1533 { |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1534 off_t text_len = stream_read_word(demuxer->stream); |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1535 char text[text_len+2+1]; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1536 stream_read(demuxer->stream, (char *)&text, text_len+2); |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1537 text[text_len+2] = 0x0; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1538 switch(udta_id) |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1539 { |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1540 case MOV_FOURCC(0xa9,'a','u','t'): |
3071 | 1541 demux_info_add(demuxer, "author", &text[2]); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1542 mp_msg(MSGT_DEMUX, MSGL_V, " Author: %s\n", &text[2]); |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1543 break; |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1544 case MOV_FOURCC(0xa9,'c','p','y'): |
3071 | 1545 demux_info_add(demuxer, "copyright", &text[2]); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1546 mp_msg(MSGT_DEMUX, MSGL_V, " Copyright: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1547 break; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1548 case MOV_FOURCC(0xa9,'i','n','f'): |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1549 mp_msg(MSGT_DEMUX, MSGL_V, " Info: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1550 break; |
2542 | 1551 case MOV_FOURCC('n','a','m','e'): |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1552 case MOV_FOURCC(0xa9,'n','a','m'): |
29288
4a1c217a844b
In all demux_info_add calls change "name" to "title".
reimar
parents:
29263
diff
changeset
|
1553 demux_info_add(demuxer, "title", &text[2]); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1554 mp_msg(MSGT_DEMUX, MSGL_V, " Name: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1555 break; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1556 case MOV_FOURCC(0xa9,'A','R','T'): |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1557 mp_msg(MSGT_DEMUX, MSGL_V, " Artist: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1558 break; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1559 case MOV_FOURCC(0xa9,'d','i','r'): |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1560 mp_msg(MSGT_DEMUX, MSGL_V, " Director: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1561 break; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1562 case MOV_FOURCC(0xa9,'c','m','t'): |
3071 | 1563 demux_info_add(demuxer, "comments", &text[2]); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1564 mp_msg(MSGT_DEMUX, MSGL_V, " Comment: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1565 break; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1566 case MOV_FOURCC(0xa9,'r','e','q'): |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1567 mp_msg(MSGT_DEMUX, MSGL_V, " Requirements: %s\n", &text[2]); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1568 break; |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1569 case MOV_FOURCC(0xa9,'s','w','r'): |
3071 | 1570 demux_info_add(demuxer, "encoder", &text[2]); |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1571 mp_msg(MSGT_DEMUX, MSGL_V, " Software: %s\n", &text[2]); |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1572 break; |
2542 | 1573 case MOV_FOURCC(0xa9,'d','a','y'): |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1574 mp_msg(MSGT_DEMUX, MSGL_V, " Creation timestamp: %s\n", &text[2]); |
2542 | 1575 break; |
1576 case MOV_FOURCC(0xa9,'f','m','t'): | |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1577 mp_msg(MSGT_DEMUX, MSGL_V, " Format: %s\n", &text[2]); |
2542 | 1578 break; |
1579 case MOV_FOURCC(0xa9,'p','r','d'): | |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1580 mp_msg(MSGT_DEMUX, MSGL_V, " Producer: %s\n", &text[2]); |
2542 | 1581 break; |
1582 case MOV_FOURCC(0xa9,'p','r','f'): | |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1583 mp_msg(MSGT_DEMUX, MSGL_V, " Performer(s): %s\n", &text[2]); |
2542 | 1584 break; |
1585 case MOV_FOURCC(0xa9,'s','r','c'): | |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1586 mp_msg(MSGT_DEMUX, MSGL_V, " Source providers: %s\n", &text[2]); |
2542 | 1587 break; |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1588 } |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1589 udta_size -= 4+text_len; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1590 break; |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1591 } |
2542 | 1592 /* some other shits: WLOC - window location, |
1593 LOOP - looping style, | |
1594 SelO - play only selected frames | |
1595 AllF - play all frames | |
1596 */ | |
1597 case MOV_FOURCC('W','L','O','C'): | |
1598 case MOV_FOURCC('L','O','O','P'): | |
1599 case MOV_FOURCC('S','e','l','O'): | |
1600 case MOV_FOURCC('A','l','l','F'): | |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1601 default: |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1602 { |
10888
0e940f364a6e
Fix for borked .mov files with bogus user data length values. Patch by Marek Zelem.
mosu
parents:
10849
diff
changeset
|
1603 if( udta_len>udta_size) |
0e940f364a6e
Fix for borked .mov files with bogus user data length values. Patch by Marek Zelem.
mosu
parents:
10849
diff
changeset
|
1604 udta_len=udta_size; |
0e940f364a6e
Fix for borked .mov files with bogus user data length values. Patch by Marek Zelem.
mosu
parents:
10849
diff
changeset
|
1605 { |
25891 | 1606 stream_skip(demuxer->stream, udta_len-4-4); |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1607 udta_size -= udta_len; |
10888
0e940f364a6e
Fix for borked .mov files with bogus user data length values. Patch by Marek Zelem.
mosu
parents:
10849
diff
changeset
|
1608 } |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1609 } |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1610 } |
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1611 } |
2532 | 1612 break; |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1613 } /* eof udta */ |
2532 | 1614 default: |
4903
d8b465e3fd88
fixed some endian issues, like changing bswap_32() -> be2me_32(), and
melanson
parents:
4646
diff
changeset
|
1615 id = be2me_32(id); |
17366 | 1616 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); |
2532 | 1617 } /* endof switch */ |
1618 } /* endof else */ | |
2429
8d00b25169af
handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents:
2419
diff
changeset
|
1619 |
1490 | 1620 pos+=len+8; |
1621 if(pos>=endpos) break; | |
1622 if(!stream_seek(demuxer->stream,pos)) break; | |
1623 } | |
1624 } | |
1625 | |
15948 | 1626 static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, |
1627 off_t pos, off_t len, mov_track_t* trak) | |
1628 { | |
1629 switch(id) { | |
1630 case MOV_FOURCC('m','d','a','t'): { | |
1631 mp_msg(MSGT_DEMUX,MSGL_WARN,"Hmm, strange MOV, parsing mdat in lschunks?\n"); | |
1632 return -1; | |
1633 } | |
1634 case MOV_FOURCC('f','r','e','e'): | |
1635 case MOV_FOURCC('u','d','t','a'): | |
1636 /* here not supported :p */ | |
1637 break; | |
1638 case MOV_FOURCC('t','k','h','d'): { | |
1639 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sTrack header!\n", level, ""); | |
1640 // read codec data | |
1641 trak->tkdata_len = len; | |
1642 trak->tkdata = malloc(trak->tkdata_len); | |
1643 stream_read(demuxer->stream, trak->tkdata, trak->tkdata_len); | |
1644 /* | |
1645 0 1 Version | |
1646 1 3 Flags | |
1647 4 4 Creation time | |
1648 8 4 Modification time | |
1649 12 4 Track ID | |
1650 16 4 Reserved | |
1651 20 4 Duration | |
1652 24 8 Reserved | |
1653 32 2 Layer | |
1654 34 2 Alternate group | |
1655 36 2 Volume | |
1656 38 2 Reserved | |
1657 40 36 Matrix structure | |
1658 76 4 Track width | |
1659 80 4 Track height | |
1660 */ | |
1661 mp_msg(MSGT_DEMUX, MSGL_V, | |
1662 "tkhd len=%d ver=%d flags=0x%X id=%d dur=%d lay=%d vol=%d\n", | |
1663 trak->tkdata_len, trak->tkdata[0], trak->tkdata[1], | |
1664 char2int(trak->tkdata, 12), // id | |
1665 char2int(trak->tkdata, 20), // duration | |
1666 char2short(trak->tkdata, 32), // layer | |
1667 char2short(trak->tkdata, 36)); // volume | |
1668 break; | |
1669 } | |
1670 case MOV_FOURCC('m','d','h','d'): { | |
19343
24f2f73f03ca
Support for version 1 (64 bit) mvhd and mdhd, taken from libavformat mov demuxer
reimar
parents:
19326
diff
changeset
|
1671 int version = stream_read_char(demuxer->stream); |
15948 | 1672 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sMedia header!\n", level, ""); |
19343
24f2f73f03ca
Support for version 1 (64 bit) mvhd and mdhd, taken from libavformat mov demuxer
reimar
parents:
19326
diff
changeset
|
1673 stream_skip(demuxer->stream, (version == 1) ? 19 : 11); |
15948 | 1674 // read timescale |
1675 trak->timescale = stream_read_dword(demuxer->stream); | |
1676 // read length | |
19343
24f2f73f03ca
Support for version 1 (64 bit) mvhd and mdhd, taken from libavformat mov demuxer
reimar
parents:
19326
diff
changeset
|
1677 if (version == 1) |
24f2f73f03ca
Support for version 1 (64 bit) mvhd and mdhd, taken from libavformat mov demuxer
reimar
parents:
19326
diff
changeset
|
1678 trak->length = stream_read_qword(demuxer->stream); |
24f2f73f03ca
Support for version 1 (64 bit) mvhd and mdhd, taken from libavformat mov demuxer
reimar
parents:
19326
diff
changeset
|
1679 else |
24f2f73f03ca
Support for version 1 (64 bit) mvhd and mdhd, taken from libavformat mov demuxer
reimar
parents:
19326
diff
changeset
|
1680 trak->length = stream_read_dword(demuxer->stream); |
15948 | 1681 break; |
1682 } | |
1683 case MOV_FOURCC('h','d','l','r'): { | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
1684 av_unused unsigned int tmp = stream_read_dword(demuxer->stream); |
15948 | 1685 unsigned int type = stream_read_dword_le(demuxer->stream); |
1686 unsigned int subtype = stream_read_dword_le(demuxer->stream); | |
1687 unsigned int manufact = stream_read_dword_le(demuxer->stream); | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
1688 av_unused unsigned int comp_flags = stream_read_dword(demuxer->stream); |
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
1689 av_unused unsigned int comp_mask = stream_read_dword(demuxer->stream); |
15948 | 1690 int len = stream_read_char(demuxer->stream); |
1691 char* str = malloc(len + 1); | |
1692 stream_read(demuxer->stream, str, len); | |
1693 str[len] = 0; | |
1694 mp_msg(MSGT_DEMUX, MSGL_V, | |
1695 "MOV: %*sHandler header: %.4s/%.4s (%.4s) %s\n", level, "", | |
17366 | 1696 (char *)&type, (char *)&subtype, (char *)&manufact, str); |
15948 | 1697 free(str); |
1698 switch(bswap_32(type)) { | |
1699 case MOV_FOURCC('m','h','l','r'): | |
1700 trak->media_handler = bswap_32(subtype); | |
1701 break; | |
1702 case MOV_FOURCC('d','h','l','r'): | |
1703 trak->data_handler = bswap_32(subtype); | |
1704 break; | |
1705 default: | |
1706 mp_msg(MSGT_DEMUX, MSGL_V, | |
1707 "MOV: unknown handler class: 0x%X (%.4s)\n", | |
17366 | 1708 bswap_32(type), (char *)&type); |
15948 | 1709 } |
1710 break; | |
1711 } | |
1712 case MOV_FOURCC('v','m','h','d'): { | |
1713 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sVideo header!\n", level, ""); | |
1714 trak->type = MOV_TRAK_VIDEO; | |
1715 // read video data | |
1716 break; | |
1717 } | |
1718 case MOV_FOURCC('s','m','h','d'): { | |
1719 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sSound header!\n", level, ""); | |
1720 trak->type = MOV_TRAK_AUDIO; | |
1721 // read audio data | |
1722 break; | |
1723 } | |
1724 case MOV_FOURCC('g','m','h','d'): { | |
1725 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sGeneric header!\n", level, ""); | |
1726 trak->type = MOV_TRAK_GENERIC; | |
1727 break; | |
1728 } | |
1729 case MOV_FOURCC('n','m','h','d'): { | |
1730 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sGeneric header!\n", level, ""); | |
1731 trak->type = MOV_TRAK_GENERIC; | |
1732 break; | |
1733 } | |
1734 case MOV_FOURCC('s','t','s','d'): { | |
1735 int i = stream_read_dword(demuxer->stream); // temp! | |
1736 int count = stream_read_dword(demuxer->stream); | |
1737 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sDescription list! (cnt:%d)\n", | |
1738 level, "", count); | |
1739 for (i = 0; i < count; i++) { | |
1740 off_t pos = stream_tell(demuxer->stream); | |
1741 off_t len = stream_read_dword(demuxer->stream); | |
1742 unsigned int fourcc = stream_read_dword_le(demuxer->stream); | |
1743 /* some files created with Broadcast 2000 (e.g. ilacetest.mov) | |
1744 contain raw I420 video but have a yv12 fourcc */ | |
1745 if (fourcc == mmioFOURCC('y','v','1','2')) | |
1746 fourcc = mmioFOURCC('I','4','2','0'); | |
1747 if (len < 8) | |
1748 break; // error | |
1749 mp_msg(MSGT_DEMUX, MSGL_V, | |
17366 | 1750 "MOV: %*s desc #%d: %.4s (%"PRId64" bytes)\n", level, "", |
1751 i, (char *)&fourcc, (int64_t)len - 16); | |
15948 | 1752 if (fourcc != trak->fourcc && i) |
1753 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MOVvariableFourCC); | |
1754 // if(!i) | |
1755 { | |
1756 trak->fourcc = fourcc; | |
1757 // read type specific (audio/video/time/text etc) header | |
1758 // NOTE: trak type is not yet known at this point :((( | |
1759 trak->stdata_len = len - 8; | |
1760 trak->stdata = malloc(trak->stdata_len); | |
1761 stream_read(demuxer->stream, trak->stdata, trak->stdata_len); | |
1762 } | |
1763 if (!stream_seek(demuxer->stream, pos + len)) | |
1764 break; | |
1765 } | |
1766 break; | |
1767 } | |
1768 case MOV_FOURCC('s','t','t','s'): { | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
1769 av_unused int temp = stream_read_dword(demuxer->stream); |
15948 | 1770 int len = stream_read_dword(demuxer->stream); |
1771 int i; | |
1772 unsigned int pts = 0; | |
1773 mp_msg(MSGT_DEMUX, MSGL_V, | |
1774 "MOV: %*sSample duration table! (%d blocks)\n", level, "", | |
1775 len); | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1776 trak->durmap = calloc(len, sizeof(mov_durmap_t)); |
27272
6d5c1d9bf273
And a 1000l for r27263, swapped a condition, thus setting size to
reimar
parents:
27271
diff
changeset
|
1777 trak->durmap_size = trak->durmap ? len : 0; |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1778 for (i = 0; i < trak->durmap_size; i++) { |
15948 | 1779 trak->durmap[i].num = stream_read_dword(demuxer->stream); |
1780 trak->durmap[i].dur = stream_read_dword(demuxer->stream); | |
1781 pts += trak->durmap[i].num * trak->durmap[i].dur; | |
1782 } | |
1783 if (trak->length != pts) | |
1784 mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! pts=%d length=%d\n", | |
1785 pts, trak->length); | |
1786 break; | |
1787 } | |
1788 case MOV_FOURCC('s','t','s','c'): { | |
1789 int temp = stream_read_dword(demuxer->stream); | |
1790 int len = stream_read_dword(demuxer->stream); | |
1791 int ver = (temp << 24); | |
1792 int flags = (temp << 16) | (temp << 8) | temp; | |
1793 int i; | |
1794 mp_msg(MSGT_DEMUX, MSGL_V, | |
17366 | 1795 "MOV: %*sSample->Chunk mapping table! (%d blocks) (ver:%d,flags:%d)\n", level, "", |
15948 | 1796 len, ver, flags); |
1797 // read data: | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1798 trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1799 trak->chunkmap_size = trak->chunkmap ? len : 0; |
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1800 for (i = 0; i < trak->chunkmap_size; i++) { |
15948 | 1801 trak->chunkmap[i].first = stream_read_dword(demuxer->stream) - 1; |
1802 trak->chunkmap[i].spc = stream_read_dword(demuxer->stream); | |
1803 trak->chunkmap[i].sdid = stream_read_dword(demuxer->stream); | |
1804 } | |
1805 break; | |
1806 } | |
1807 case MOV_FOURCC('s','t','s','z'): { | |
1808 int temp = stream_read_dword(demuxer->stream); | |
1809 int ss=stream_read_dword(demuxer->stream); | |
1810 int ver = (temp << 24); | |
1811 int flags = (temp << 16) | (temp << 8) | temp; | |
1812 int entries = stream_read_dword(demuxer->stream); | |
1813 int i; | |
1814 mp_msg(MSGT_DEMUX, MSGL_V, | |
17366 | 1815 "MOV: %*sSample size table! (entries=%d ss=%d) (ver:%d,flags:%d)\n", level, "", |
15948 | 1816 entries, ss, ver, flags); |
1817 trak->samplesize = ss; | |
1818 if (!ss) { | |
1819 // variable samplesize | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1820 trak->samples = realloc_struct(trak->samples, entries, sizeof(mov_sample_t)); |
15948 | 1821 trak->samples_size = entries; |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1822 for (i = 0; i < trak->samples_size; i++) |
15948 | 1823 trak->samples[i].size = stream_read_dword(demuxer->stream); |
1824 } | |
1825 break; | |
1826 } | |
1827 case MOV_FOURCC('s','t','c','o'): { | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
1828 av_unused int temp = stream_read_dword(demuxer->stream); |
15948 | 1829 int len = stream_read_dword(demuxer->stream); |
1830 int i; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1831 mp_msg(MSGT_DEMUX, MSGL_V, |
15948 | 1832 "MOV: %*sChunk offset table! (%d chunks)\n", level, "", |
1833 len); | |
1834 // extend array if needed: | |
1835 if (len > trak->chunks_size) { | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1836 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1837 trak->chunks_size = trak->chunks ? len : 0; |
15948 | 1838 } |
1839 // read elements: | |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1840 for(i = 0; i < trak->chunks_size; i++) |
15948 | 1841 trak->chunks[i].pos = stream_read_dword(demuxer->stream); |
1842 break; | |
1843 } | |
1844 case MOV_FOURCC('c','o','6','4'): { | |
28441
669df097f203
Fix a couple of unused variable warnings through the av_unused attribute.
diego
parents:
28440
diff
changeset
|
1845 av_unused int temp = stream_read_dword(demuxer->stream); |
15948 | 1846 int len = stream_read_dword(demuxer->stream); |
1847 int i; | |
1848 mp_msg(MSGT_DEMUX, MSGL_V, | |
1849 "MOV: %*s64bit chunk offset table! (%d chunks)\n", level, "", | |
1850 len); | |
1851 // extend array if needed: | |
1852 if (len > trak->chunks_size) { | |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1853 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1854 trak->chunks_size = trak->chunks ? len : 0; |
15948 | 1855 } |
1856 // read elements: | |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1857 for (i = 0; i < trak->chunks_size; i++) { |
15948 | 1858 #ifndef _LARGEFILE_SOURCE |
1859 if (stream_read_dword(demuxer->stream) != 0) | |
1860 mp_msg(MSGT_DEMUX, MSGL_WARN, "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", i); | |
1861 trak->chunks[i].pos = stream_read_dword(demuxer->stream); | |
1862 #else | |
1863 trak->chunks[i].pos = stream_read_qword(demuxer->stream); | |
1864 #endif | |
1865 } | |
1866 break; | |
1867 } | |
1868 case MOV_FOURCC('s','t','s','s'): { | |
1869 int temp = stream_read_dword(demuxer->stream); | |
1870 int entries = stream_read_dword(demuxer->stream); | |
1871 int ver = (temp << 24); | |
1872 int flags = (temp << 16) | (temp<<8) | temp; | |
1873 int i; | |
1874 mp_msg(MSGT_DEMUX, MSGL_V, | |
17366 | 1875 "MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%d)\n", level, "", |
15948 | 1876 entries, ver, flags); |
18444
fa603193eccf
Fix potential integer overflows in memory allocation. Patch by Reimar and me, SIZE_MAX by Rich
rtognimp
parents:
18218
diff
changeset
|
1877 trak->keyframes = calloc(entries, sizeof(unsigned int)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1878 trak->keyframes_size = trak->keyframes ? entries : 0; |
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1879 for (i = 0; i < trak->keyframes_size; i++) |
15948 | 1880 trak->keyframes[i] = stream_read_dword(demuxer->stream) - 1; |
1881 break; | |
1882 } | |
1883 case MOV_FOURCC('m','d','i','a'): { | |
1884 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sMedia stream!\n", level, ""); | |
1885 lschunks(demuxer, level + 1, pos + len, trak); | |
1886 break; | |
1887 } | |
1888 case MOV_FOURCC('m','i','n','f'): { | |
1889 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sMedia info!\n", level, ""); | |
1890 lschunks(demuxer, level + 1 ,pos + len, trak); | |
1891 break; | |
1892 } | |
1893 case MOV_FOURCC('s','t','b','l'): { | |
1894 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sSample info!\n", level, ""); | |
1895 lschunks(demuxer, level + 1, pos + len, trak); | |
1896 break; | |
1897 } | |
1898 case MOV_FOURCC('e','d','t','s'): { | |
1899 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sEdit atom!\n", level, ""); | |
1900 lschunks(demuxer, level + 1, pos + len, trak); | |
1901 break; | |
1902 } | |
1903 case MOV_FOURCC('e','l','s','t'): { | |
1904 int temp = stream_read_dword(demuxer->stream); | |
1905 int entries = stream_read_dword(demuxer->stream); | |
1906 int ver = (temp << 24); | |
1907 int flags = (temp << 16) | (temp << 8) | temp; | |
1908 int i; | |
1909 mp_msg(MSGT_DEMUX, MSGL_V, | |
17366 | 1910 "MOV: %*sEdit list table (%d entries) (ver:%d,flags:%d)\n", level, "", |
15948 | 1911 entries, ver, flags); |
1912 #if 1 | |
27271
e96d8e20bf69
100l, fix calloc being called with the wrong argument due to reordering
reimar
parents:
27248
diff
changeset
|
1913 trak->editlist = calloc(entries, sizeof(mov_editlist_t)); |
27231
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1914 trak->editlist_size = trak->editlist ? entries : 0; |
f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
reimar
parents:
27162
diff
changeset
|
1915 for (i = 0; i < trak->editlist_size; i++) { |
15948 | 1916 int dur = stream_read_dword(demuxer->stream); |
1917 int mt = stream_read_dword(demuxer->stream); | |
1918 int mr = stream_read_dword(demuxer->stream); // 16.16fp | |
1919 trak->editlist[i].dur = dur; | |
1920 trak->editlist[i].pos = mt; | |
1921 trak->editlist[i].speed = mr; | |
1922 mp_msg(MSGT_DEMUX, MSGL_V, | |
1923 "MOV: %*s entry#%d: duration: %d start time: %d speed: %3.1fx\n", level, "", | |
1924 i, dur, mt, (float)mr/65536.0f); | |
1925 } | |
1926 #endif | |
1927 break; | |
1928 } | |
1929 case MOV_FOURCC('c','o','d','e'): { | |
1930 /* XXX: Implement atom 'code' for FLASH support */ | |
1931 break; | |
1932 } | |
1933 default: | |
1934 id = be2me_32(id); | |
17366 | 1935 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); |
15948 | 1936 break; |
1937 }//switch(id) | |
1938 return 0; | |
1939 } | |
1940 | |
16175 | 1941 static demuxer_t* mov_read_header(demuxer_t* demuxer){ |
1490 | 1942 mov_priv_t* priv=demuxer->priv; |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1943 int t_no; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1944 int best_a_id=-1, best_a_len=0; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1945 int best_v_id=-1, best_v_len=0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1946 |
2483
22bfa362af42
added two new clip info types, all printf's were upgraded to mp_msg
alex
parents:
2429
diff
changeset
|
1947 mp_msg(MSGT_DEMUX, MSGL_DBG3, "mov_read_header!\n"); |
1490 | 1948 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1949 // Parse header: |
2100 | 1950 stream_reset(demuxer->stream); |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1951 if(!stream_seek(demuxer->stream,priv->moov_start)) |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1952 { |
17366 | 1953 mp_msg(MSGT_DEMUX,MSGL_ERR,"MOV: Cannot seek to the beginning of the Movie header (0x%"PRIx64")\n", |
1954 (int64_t)priv->moov_start); | |
5085
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1955 return 0; |
3d558414320f
workaround in palette reader for statunit6.mov, needed to implement support for flag&0x4 and small changes to avoid some sig11-places in the badly muxed cinepak pro movs
alex
parents:
5067
diff
changeset
|
1956 } |
1490 | 1957 lschunks(demuxer, 0, priv->moov_end, NULL); |
14581
a9b1c0695a27
Reset stream eof after parsing header, fixes bug #218
reimar
parents:
14279
diff
changeset
|
1958 // just in case we have hit eof while parsing... |
a9b1c0695a27
Reset stream eof after parsing header, fixes bug #218
reimar
parents:
14279
diff
changeset
|
1959 demuxer->stream->eof = 0; |
6139
3898967fcc96
some more output cosmetics, especially for vivo and mov demuxers
arpi
parents:
5776
diff
changeset
|
1960 // mp_msg(MSGT_DEMUX, MSGL_INFO, "--------------\n"); |
1490 | 1961 |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1962 // find the best (longest) streams: |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1963 for(t_no=0;t_no<priv->track_db;t_no++){ |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1964 mov_track_t* trak=priv->tracks[t_no]; |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1965 int len=(trak->samplesize) ? trak->chunks_size : trak->samples_size; |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1966 if(demuxer->a_streams[t_no]){ // need audio |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1967 if(len>best_a_len){ best_a_len=len; best_a_id=t_no; } |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1968 } |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1969 if(demuxer->v_streams[t_no]){ // need video |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1970 if(len>best_v_len){ best_v_len=len; best_v_id=t_no; } |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1971 } |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1972 } |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
1973 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: longest streams: A: #%d (%d samples) V: #%d (%d samples)\n", |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1974 best_a_id,best_a_len,best_v_id,best_v_len); |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1975 if(demuxer->audio->id==-1 && best_a_id>=0) demuxer->audio->id=best_a_id; |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1976 if(demuxer->video->id==-1 && best_v_id>=0) demuxer->video->id=best_v_id; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
1977 |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1978 // setup sh pointers: |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1979 if(demuxer->audio->id>=0){ |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1980 sh_audio_t* sh=demuxer->a_streams[demuxer->audio->id]; |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1981 if(sh){ |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1982 demuxer->audio->sh=sh; sh->ds=demuxer->audio; |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1983 } else { |
22201
50d45af133a0
English grammar fix: There is no 's' after "does not exist"
reimar
parents:
22200
diff
changeset
|
1984 mp_msg(MSGT_DEMUX, MSGL_ERR, "MOV: selected audio stream (%d) does not exist\n",demuxer->audio->id); |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1985 demuxer->audio->id=-2; |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1986 } |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1987 } |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1988 if(demuxer->video->id>=0){ |
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1989 sh_video_t* sh=demuxer->v_streams[demuxer->video->id]; |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1990 if(sh){ |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1991 demuxer->video->sh=sh; sh->ds=demuxer->video; |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1992 } else { |
22201
50d45af133a0
English grammar fix: There is no 's' after "does not exist"
reimar
parents:
22200
diff
changeset
|
1993 mp_msg(MSGT_DEMUX, MSGL_ERR, "MOV: selected video stream (%d) does not exist\n",demuxer->video->id); |
8830
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1994 demuxer->video->id=-2; |
f4ca727309aa
- always print the longest stream in info, not the selected one
arpi
parents:
8451
diff
changeset
|
1995 } |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
1996 } |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
1997 if(demuxer->sub->id>=0){ |
20907 | 1998 sh_sub_t* sh=demuxer->s_streams[demuxer->sub->id]; |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
1999 if(sh){ |
20907 | 2000 demuxer->sub->sh=sh; |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2001 } else { |
22201
50d45af133a0
English grammar fix: There is no 's' after "does not exist"
reimar
parents:
22200
diff
changeset
|
2002 mp_msg(MSGT_DEMUX, MSGL_ERR, "MOV: selected subtitle stream (%d) does not exist\n",demuxer->sub->id); |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2003 demuxer->sub->id=-2; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2004 } |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2005 } |
8386
52a4ece3bbe2
find best (longest) streams if not specified (-aid/-vid)
arpi
parents:
8315
diff
changeset
|
2006 |
19325
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2007 if(demuxer->video->id<0 && demuxer->audio->id<0) { |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2008 /* No AV streams found. Try to find an MPEG stream. */ |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2009 for(t_no=0;t_no<priv->track_db;t_no++){ |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2010 mov_track_t* trak=priv->tracks[t_no]; |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2011 if(trak->media_handler == MOV_FOURCC('M','P','E','G')) { |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2012 stream_t *s; |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2013 demuxer_t *od; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2014 |
19325
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2015 demuxer->video->id = t_no; |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2016 s = new_ds_stream(demuxer->video); |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2017 od = demux_open(s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2018 if(od) return new_demuxers_demuxer(od, od, od); |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2019 demuxer->video->id = -2; //new linked demuxer couldn't be allocated |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2020 break; |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2021 } |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2022 } |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2023 } |
0a78cbf7c24f
auto-detection of mpeg-ps in mov; initial patch by John Koleszar jkoleszar on2 com (fixed by me)
nicodvb
parents:
19170
diff
changeset
|
2024 |
18583
b6444dfda51b
Disable unsecure dumping of generic track with -v -v -v
rtogni
parents:
18558
diff
changeset
|
2025 #if 0 |
17932 | 2026 if( mp_msg_test(MSGT_DEMUX,MSGL_DBG3) ){ |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2027 for(t_no=0;t_no<priv->track_db;t_no++){ |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2028 mov_track_t* trak=priv->tracks[t_no]; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2029 if(trak->type==MOV_TRAK_GENERIC){ |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2030 int i; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2031 int fd; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2032 char name[20]; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2033 mp_msg(MSGT_DEMUX, MSGL_INFO, "MOV: Track #%d: Extracting %d data chunks to files\n",t_no,trak->samples_size); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2034 for (i=0; i<trak->samples_size; i++) |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2035 { |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2036 int len=trak->samples[i].size; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2037 char buf[len]; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2038 stream_seek(demuxer->stream, trak->samples[i].pos); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2039 snprintf(name, 20, "t%02d-s%03d.%s", t_no,i, |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2040 (trak->media_handler==MOV_FOURCC('f','l','s','h')) ? |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2041 "swf":"dump"); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2042 fd = open(name, O_CREAT|O_WRONLY); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2043 // { int j; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2044 // for(j=0;j<trak->stdata_len-3; j++) |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2045 // printf("stdata[%d]=0x%X ize=0x%X\n",j,char2int(trak->stdata,j),MOV_FOURCC('z','l','i','b')); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2046 // } |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2047 if( //trak->media_handler==MOV_FOURCC('s','p','r','t') && |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2048 trak->stdata_len>=16 && |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2049 char2int(trak->stdata,12)==MOV_FOURCC('z','l','i','b') |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2050 ){ |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2051 int newlen=stream_read_dword(demuxer->stream); |
28440 | 2052 #if CONFIG_ZLIB |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2053 // unzip: |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2054 z_stream zstrm; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2055 int zret; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2056 char buf2[newlen]; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2057 |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2058 len-=4; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2059 stream_read(demuxer->stream, buf, len); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2060 |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2061 zstrm.zalloc = (alloc_func)0; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2062 zstrm.zfree = (free_func)0; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2063 zstrm.opaque = (voidpf)0; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2064 zstrm.next_in = buf; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2065 zstrm.avail_in = len; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2066 zstrm.next_out = buf2; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2067 zstrm.avail_out = newlen; |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2068 |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2069 zret = inflateInit(&zstrm); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2070 zret = inflate(&zstrm, Z_NO_FLUSH); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2071 if(newlen != zstrm.total_out) |
17366 | 2072 mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! unzipped frame size differs hdr: %d zlib: %ld\n",newlen,zstrm.total_out); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2073 |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2074 write(fd, buf2, newlen); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2075 } else { |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2076 #else |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2077 len-=4; |
17756
9c1656872e96
Reduce output verbosity in non-verbose mode, change some printf to mp_msg.
diego
parents:
17716
diff
changeset
|
2078 mp_msg(MSGT_DEMUX, MSGL_INFO, "******* ZLIB COMPRESSED SAMPLE!!!!! (%d->%d bytes) *******\n",len,newlen); |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2079 } |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2080 { |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2081 #endif |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2082 stream_read(demuxer->stream, buf, len); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2083 write(fd, buf, len); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2084 } |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2085 close(fd); |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2086 } |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2087 } |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2088 } |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2089 } |
14581
a9b1c0695a27
Reset stream eof after parsing header, fixes bug #218
reimar
parents:
14279
diff
changeset
|
2090 demuxer->stream->eof = 0; |
8314
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2091 #endif |
d7ae896c5cde
- parsing the handler reference atom (hnlr), save handler fourccs
arpi
parents:
8258
diff
changeset
|
2092 |
16175 | 2093 return demuxer; |
1490 | 2094 } |
2101 | 2095 |
14198 | 2096 /** |
2097 * \brief return the mov track that belongs to a demuxer stream | |
2098 * \param ds the demuxer stream, may be NULL | |
2099 * \return the mov track info structure belonging to the stream, | |
2100 * NULL if not found | |
2101 */ | |
2102 static mov_track_t *stream_track(mov_priv_t *priv, demux_stream_t *ds) { | |
2103 if (ds && (ds->id >= 0) && (ds->id < priv->track_db)) | |
2104 return priv->tracks[ds->id]; | |
2105 return NULL; | |
2106 } | |
2107 | |
2101 | 2108 // return value: |
2109 // 0 = EOF or no stream found | |
2110 // 1 = successfully read a packet | |
16175 | 2111 static int demux_mov_fill_buffer(demuxer_t *demuxer,demux_stream_t* ds){ |
2101 | 2112 mov_priv_t* priv=demuxer->priv; |
2113 mov_track_t* trak=NULL; | |
2114 float pts; | |
5252 | 2115 int x; |
2116 off_t pos; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2117 |
16613
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2118 if (ds->eof) return 0; |
14198 | 2119 trak = stream_track(priv, ds); |
2120 if (!trak) return 0; | |
2101 | 2121 |
2115 | 2122 if(trak->samplesize){ |
2123 // read chunk: | |
2124 if(trak->pos>=trak->chunks_size) return 0; // EOF | |
2125 stream_seek(demuxer->stream,trak->chunks[trak->pos].pos); | |
2126 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; | |
3071 | 2127 if(trak->samplesize!=1) |
2128 { | |
4645
33c2fc18138c
added nmhd, added checking for audio trak in demux_mov_fill_buffer
alex
parents:
4624
diff
changeset
|
2129 mp_msg(MSGT_DEMUX, MSGL_DBG2, "WARNING! Samplesize(%d) != 1\n", |
3071 | 2130 trak->samplesize); |
18218
a1ad37ef0a30
Partially revert 1.140, restoring the old behaviour for all codecs
rtognimp
parents:
18176
diff
changeset
|
2131 if((trak->fourcc != MOV_FOURCC('t','w','o','s')) && (trak->fourcc != MOV_FOURCC('s','o','w','t'))) |
a1ad37ef0a30
Partially revert 1.140, restoring the old behaviour for all codecs
rtognimp
parents:
18176
diff
changeset
|
2132 x=trak->chunks[trak->pos].size*trak->samplesize; |
a1ad37ef0a30
Partially revert 1.140, restoring the old behaviour for all codecs
rtognimp
parents:
18176
diff
changeset
|
2133 else |
a1ad37ef0a30
Partially revert 1.140, restoring the old behaviour for all codecs
rtognimp
parents:
18176
diff
changeset
|
2134 x=trak->chunks[trak->pos].size; |
3071 | 2135 } |
18218
a1ad37ef0a30
Partially revert 1.140, restoring the old behaviour for all codecs
rtognimp
parents:
18176
diff
changeset
|
2136 else |
3071 | 2137 x=trak->chunks[trak->pos].size; |
3652
65fd971932dc
added co64 (64bit chunk offset table) chunk (needed for mov files created with xawtv) and added depth detection in video track (tested with my *.mov files (about 15-20) and worked fine)
alex
parents:
3071
diff
changeset
|
2138 // printf("X = %d\n", x); |
4645
33c2fc18138c
added nmhd, added checking for audio trak in demux_mov_fill_buffer
alex
parents:
4624
diff
changeset
|
2139 /* the following stuff is audio related */ |
6612 | 2140 if (trak->type == MOV_TRAK_AUDIO){ |
6718
872235b50330
workaround for empty version1 audio headers (bugreport by Sascha Sommer)
arpi
parents:
6664
diff
changeset
|
2141 if(trak->stdata_len>=44 && trak->stdata[9]>=1 && char2int(trak->stdata,28)>0){ |
6612 | 2142 // stsd version 1 - we have audio compression ratio info: |
2143 x/=char2int(trak->stdata,28); // samples/packet | |
6655
9eefcaf88e56
fixed endless 'unknown chunk' and doublespeed ima4 audio bugs
arpi
parents:
6612
diff
changeset
|
2144 // x*=char2int(trak->stdata,32); // bytes/packet |
9eefcaf88e56
fixed endless 'unknown chunk' and doublespeed ima4 audio bugs
arpi
parents:
6612
diff
changeset
|
2145 x*=char2int(trak->stdata,36); // bytes/frame |
6612 | 2146 } else { |
7754 | 2147 if(ds->ss_div && ds->ss_mul){ |
6612 | 2148 // workaround for buggy files like 7up-high-traffic-areas.mov, |
2149 // with missing stsd v1 header containing compression rate | |
2549 | 2150 x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix ! HACK ! |
2151 } else { | |
14279
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
2152 x*=trak->nchannels; |
b4b202086260
Fix channels, sample rate and sample size for 3gp files
rtognimp
parents:
14198
diff
changeset
|
2153 x*=trak->samplebytes; |
2549 | 2154 } |
6612 | 2155 } |
2156 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Audio sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts); | |
4645
33c2fc18138c
added nmhd, added checking for audio trak in demux_mov_fill_buffer
alex
parents:
4624
diff
changeset
|
2157 } /* MOV_TRAK_AUDIO */ |
5252 | 2158 pos=trak->chunks[trak->pos].pos; |
2115 | 2159 } else { |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2160 int frame=trak->pos; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2161 // editlist support: |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2162 if(trak->type == MOV_TRAK_VIDEO && trak->editlist_size>=1){ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2163 // find the right editlist entry: |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2164 if(frame<trak->editlist[trak->editlist_pos].start_frame) |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2165 trak->editlist_pos=0; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2166 while(trak->editlist_pos<trak->editlist_size-1 && |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2167 frame>=trak->editlist[trak->editlist_pos+1].start_frame) |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2168 ++trak->editlist_pos; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2169 if(frame>=trak->editlist[trak->editlist_pos].start_frame+ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2170 trak->editlist[trak->editlist_pos].frames) return 0; // EOF |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2171 // calc real frame index: |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2172 frame-=trak->editlist[trak->editlist_pos].start_frame; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2173 frame+=trak->editlist[trak->editlist_pos].start_sample; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2174 // calc pts: |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2175 pts=(float)(trak->samples[frame].pts+ |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2176 trak->editlist[trak->editlist_pos].pts_offset)/(float)trak->timescale; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2177 } else { |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2178 if(frame>=trak->samples_size) return 0; // EOF |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2179 pts=(float)trak->samples[frame].pts/(float)trak->timescale; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2180 } |
2101 | 2181 // read sample: |
6664
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2182 stream_seek(demuxer->stream,trak->samples[frame].pos); |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2183 x=trak->samples[frame].size; |
b802dd0812f1
edit-list support for video - fixes various A-V sync problems (TODO: seeking)
arpi
parents:
6655
diff
changeset
|
2184 pos=trak->samples[frame].pos; |
2115 | 2185 } |
5252 | 2186 if(trak->pos==0 && trak->stream_header_len>0){ |
2187 // we have to append the stream header... | |
2188 demux_packet_t* dp=new_demux_packet(x+trak->stream_header_len); | |
2189 memcpy(dp->buffer,trak->stream_header,trak->stream_header_len); | |
2190 stream_read(demuxer->stream,dp->buffer+trak->stream_header_len,x); | |
5307
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
2191 free(trak->stream_header); |
fb58b4a8fb18
Use esds parser for movie esds atom and only pass decoder specific configuration into the stream_header.
atmos4
parents:
5305
diff
changeset
|
2192 trak->stream_header = NULL; |
10849
9c472c2c60fb
Fixed seeking in MPEG4 files. Patch by Uwe Reder <Uwe.Reder@3SOFT.de>.
mosu
parents:
10796
diff
changeset
|
2193 trak->stream_header_len = 0; |
5252 | 2194 dp->pts=pts; |
2195 dp->flags=0; | |
2196 dp->pos=pos; // FIXME? | |
2197 ds_add_packet(ds,dp); | |
2198 } else | |
2199 ds_read_packet(ds,demuxer->stream,x,pts,pos,0); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2200 |
2101 | 2201 ++trak->pos; |
2115 | 2202 |
22315 | 2203 trak = NULL; |
2204 if (demuxer->sub->id >= 0 && demuxer->sub->id < priv->track_db) | |
2205 trak = priv->tracks[demuxer->sub->id]; | |
2206 if (trak) { | |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2207 int samplenr = 0; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2208 while (samplenr < trak->samples_size) { |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2209 double subpts = (double)trak->samples[samplenr].pts / (double)trak->timescale; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2210 if (subpts >= pts) break; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2211 samplenr++; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2212 } |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2213 samplenr--; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2214 if (samplenr < 0) |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2215 vo_sub = NULL; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2216 else if (samplenr != priv->current_sub) { |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2217 off_t pos = trak->samples[samplenr].pos; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2218 int len = trak->samples[samplenr].size; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2219 double subpts = (double)trak->samples[samplenr].pts / (double)trak->timescale; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2220 stream_seek(demuxer->stream, pos); |
21827
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
21421
diff
changeset
|
2221 ds_read_packet(demuxer->sub, demuxer->stream, len, subpts, pos, 0); |
20877
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2222 priv->current_sub = samplenr; |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2223 } |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2224 } |
80f8846c7df0
Incomplete support for vobsub (missing palette support) and
reimar
parents:
19363
diff
changeset
|
2225 |
2101 | 2226 return 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2227 |
2101 | 2228 } |
2227 | 2229 |
2230 static float mov_seek_track(mov_track_t* trak,float pts,int flags){ | |
2231 | |
2232 // printf("MOV track seek called %5.3f \n",pts); | |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25855
diff
changeset
|
2233 if(flags&SEEK_FACTOR) pts*=trak->length; else pts*=(float)trak->timescale; |
2227 | 2234 |
2235 if(trak->samplesize){ | |
2236 int sample=pts/trak->duration; | |
2237 // printf("MOV track seek - chunk: %d (pts: %5.3f dur=%d) \n",sample,pts,trak->duration); | |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25855
diff
changeset
|
2238 if(!(flags&SEEK_ABSOLUTE)) sample+=trak->chunks[trak->pos].sample; // relative |
2227 | 2239 trak->pos=0; |
2240 while(trak->pos<trak->chunks_size && trak->chunks[trak->pos].sample<sample) ++trak->pos; | |
16613
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2241 if (trak->pos == trak->chunks_size) return -1; |
2227 | 2242 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; |
2243 } else { | |
2545 | 2244 unsigned int ipts; |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25855
diff
changeset
|
2245 if(!(flags&SEEK_ABSOLUTE)) pts+=trak->samples[trak->pos].pts; |
2545 | 2246 if(pts<0) pts=0; |
2247 ipts=pts; | |
2248 //printf("MOV track seek - sample: %d \n",ipts); | |
2544 | 2249 for(trak->pos=0;trak->pos<trak->samples_size;++trak->pos){ |
2250 if(trak->samples[trak->pos].pts>=ipts) break; // found it! | |
2251 } | |
16613
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2252 if (trak->pos == trak->samples_size) return -1; |
2544 | 2253 if(trak->keyframes_size){ |
2254 // find nearest keyframe | |
2255 int i; | |
2256 for(i=0;i<trak->keyframes_size;i++){ | |
2257 if(trak->keyframes[i]>=trak->pos) break; | |
2258 } | |
16613
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2259 if (i == trak->keyframes_size) return -1; |
2546
c9485365537d
added edit atom (edit list), some comments and typos fixes
alex
parents:
2545
diff
changeset
|
2260 if(i>0 && (trak->keyframes[i]-trak->pos) > (trak->pos-trak->keyframes[i-1])) |
c9485365537d
added edit atom (edit list), some comments and typos fixes
alex
parents:
2545
diff
changeset
|
2261 --i; |
2544 | 2262 trak->pos=trak->keyframes[i]; |
2263 // printf("nearest keyframe: %d \n",trak->pos); | |
2264 } | |
2227 | 2265 pts=(float)trak->samples[trak->pos].pts/(float)trak->timescale; |
2266 } | |
2267 | |
2268 // printf("MOV track seek done: %5.3f \n",pts); | |
2269 | |
2270 return pts; | |
2271 } | |
2272 | |
17636 | 2273 static void demux_seek_mov(demuxer_t *demuxer,float pts,float audio_delay,int flags){ |
2227 | 2274 mov_priv_t* priv=demuxer->priv; |
2275 demux_stream_t* ds; | |
14198 | 2276 mov_track_t* trak; |
2227 | 2277 |
2278 // printf("MOV seek called %5.3f flag=%d \n",pts,flags); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
2279 |
2227 | 2280 ds=demuxer->video; |
14198 | 2281 trak = stream_track(priv, ds); |
2282 if (trak) { | |
2227 | 2283 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; |
2284 //if(!(flags&1)) pts+=ds->pts; | |
16613
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2285 ds->pts=mov_seek_track(trak,pts,flags); |
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2286 if (ds->pts < 0) ds->eof = 1; |
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2287 else pts = ds->pts; |
2227 | 2288 flags=1; // absolute seconds |
2289 } | |
2290 | |
2291 ds=demuxer->audio; | |
14198 | 2292 trak = stream_track(priv, ds); |
2293 if (trak) { | |
2227 | 2294 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; |
2295 //if(!(flags&1)) pts+=ds->pts; | |
2296 ds->pts=mov_seek_track(trak,pts,flags); | |
16613
465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
reimar
parents:
16611
diff
changeset
|
2297 if (ds->pts < 0) ds->eof = 1; |
2227 | 2298 } |
2299 | |
2300 } | |
2301 | |
16175 | 2302 static int demux_mov_control(demuxer_t *demuxer, int cmd, void *arg){ |
14198 | 2303 mov_track_t* track; |
2304 | |
2305 // try the video track | |
2306 track = stream_track(demuxer->priv, demuxer->video); | |
2307 if (!track || !track->length) | |
2308 // otherwise try to get the info from the audio track | |
2309 track = stream_track(demuxer->priv, demuxer->audio); | |
2310 | |
2311 if (!track || !track->length) | |
2312 return DEMUXER_CTRL_DONTKNOW; | |
2313 | |
2314 switch(cmd) { | |
2315 case DEMUXER_CTRL_GET_TIME_LENGTH: | |
2316 if (!track->timescale) | |
2317 return DEMUXER_CTRL_DONTKNOW; | |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16326
diff
changeset
|
2318 *((double *)arg) = (double)track->length / track->timescale; |
14198 | 2319 return DEMUXER_CTRL_OK; |
2320 | |
2321 case DEMUXER_CTRL_GET_PERCENT_POS: | |
2322 { | |
2323 off_t pos = track->pos; | |
2324 if (track->durmap_size >= 1) | |
2325 pos *= track->durmap[0].dur; | |
2326 *((int *)arg) = (int)(100 * pos / track->length); | |
2327 return DEMUXER_CTRL_OK; | |
2328 } | |
2329 } | |
2330 return DEMUXER_CTRL_NOTIMPL; | |
2331 } | |
2332 | |
16175 | 2333 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25630
diff
changeset
|
2334 const demuxer_desc_t demuxer_desc_mov = { |
16175 | 2335 "Quicktime/MP4 demuxer", |
2336 "mov", | |
2337 "Quicktime/MOV", | |
2338 "Arpi, Al3x, Atmos, others", | |
2339 "Handles Quicktime, MP4, 3GP", | |
2340 DEMUXER_TYPE_MOV, | |
2341 0, // slow autodetect | |
2342 mov_check_file, | |
2343 demux_mov_fill_buffer, | |
2344 mov_read_header, | |
2345 demux_close_mov, | |
2346 demux_seek_mov, | |
2347 demux_mov_control | |
2348 }; |