annotate libmpdemux/demux_mov.c @ 30290:af1d6d36850d

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