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