annotate libmpdemux/demux_mov.c @ 16529:d320720fe74e

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