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