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