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