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