annotate libmpdemux/demux_mov.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 9e7e037d8969
children 080882dddb2e
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
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
2 // based on TOOLS/movinfo.c by me & Al3x
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
3 // 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
4 // References: http://openquicktime.sf.net/, http://www.heroinewarrior.com/
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
5 // http://www.geocities.com/SiliconValley/Lakes/2160/fformats/files/mov.pdf
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
6
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
7 #include <stdio.h>
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
8 #include <stdlib.h>
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
9 #include <unistd.h>
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
10
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
11 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
12 #include "mp_msg.h"
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1567
diff changeset
13 #include "help_mp.h"
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
14
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
15 #include "stream.h"
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
16 #include "demuxer.h"
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
17 #include "stheader.h"
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
18
2386
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
19 #include "bswap.h"
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
20
4332
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
21 #include "qtpalette.h"
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
22
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
23 #ifdef HAVE_ZLIB
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
24 #include <zlib.h>
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
25 #endif
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
26
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
27 #include <fcntl.h>
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
28
4129
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
29 #define BE_16(x) (be2me_16(*(unsigned short *)(x)))
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
30 #define BE_32(x) (be2me_32(*(unsigned int *)(x)))
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
31
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
32 typedef struct {
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
33 unsigned int pts; // duration
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
34 unsigned int size;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
35 off_t pos;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
36 } mov_sample_t;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
37
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
38 typedef struct {
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
39 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
40 unsigned int size; // number of samples in the chunk
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
41 int desc; // for multiple codecs mode - not used
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
42 off_t pos;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
43 } mov_chunk_t;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
44
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
45 typedef struct {
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
46 unsigned int first;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
47 unsigned int spc;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
48 unsigned int sdid;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
49 } mov_chunkmap_t;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
50
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
51 typedef struct {
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
52 unsigned int num;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
53 unsigned int dur;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
54 } mov_durmap_t;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
55
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
56 typedef struct {
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
57 int id;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
58 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
59 off_t pos;
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
60 //
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
61 int timescale;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
62 unsigned int length;
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
63 int samplesize; // 0 = variable
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
64 int duration; // 0 = variable
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
65 int width,height; // for video
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
66 unsigned int fourcc;
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
67 //
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
68 int tkdata_len; // track data
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
69 unsigned char* tkdata;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
70 int stdata_len; // stream data
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
71 unsigned char* stdata;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
72 int samples_size;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
73 mov_sample_t* samples;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
74 int chunks_size;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
75 mov_chunk_t* chunks;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
76 int chunkmap_size;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
77 mov_chunkmap_t* chunkmap;
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
78 int durmap_size;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
79 mov_durmap_t* durmap;
2544
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
80 int keyframes_size;
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
81 unsigned int* keyframes;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
82 } mov_track_t;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
83
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
84 void mov_build_index(mov_track_t* trak){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
85 int i,j,s;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
86 int last=trak->chunks_size;
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
87 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
88
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
89 #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
90 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
91 {
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
92 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
93
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
94 trak->chunks_size = trak->samples_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
95 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
96
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
97 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
98 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
99 }
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
100 #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
101
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
102 mp_msg(MSGT_DEMUX, MSGL_HINT, "MOV track: %d chunks, %d samples\n",trak->chunks_size,trak->samples_size);
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
103 mp_msg(MSGT_DEMUX, MSGL_HINT, "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
104
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
105 // process chunkmap:
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
106 i=trak->chunkmap_size;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
107 while(i>0){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
108 --i;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
109 for(j=trak->chunkmap[i].first;j<last;j++){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
110 trak->chunks[j].desc=trak->chunkmap[i].sdid;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
111 trak->chunks[j].size=trak->chunkmap[i].spc;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
112 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
113 last=trak->chunkmap[i].first;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
114 }
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
115
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
116 #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
117 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
118 {
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
119 /* 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
120 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
121 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
122 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
123 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
124 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
125 }
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
126 #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
127
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
128 // calc pts of chunks:
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
129 s=0;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
130 for(j=0;j<trak->chunks_size;j++){
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
131 trak->chunks[j].sample=s;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
132 s+=trak->chunks[j].size;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
133 }
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
134
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
135 if(!trak->samples_size){
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
136 // constant sampesize
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
137 if(trak->durmap_size==1 || (trak->durmap_size==2 && trak->durmap[1].num==1)){
2227
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
138 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
139 } 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
140 return;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
141 }
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
142
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
143 // calc pts:
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
144 s=0;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
145 for(j=0;j<trak->durmap_size;j++){
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
146 for(i=0;i<trak->durmap[j].num;i++){
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
147 trak->samples[s].pts=pts;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
148 ++s;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
149 pts+=trak->durmap[j].dur;
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
150 }
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
151 }
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
152
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
153 // calc sample offsets
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
154 s=0;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
155 for(j=0;j<trak->chunks_size;j++){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
156 off_t pos=trak->chunks[j].pos;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
157 for(i=0;i<trak->chunks[j].size;i++){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
158 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
159 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
160 trak->samples[s].pts,
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
161 (int)trak->samples[s].pos,
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
162 trak->samples[s].size);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
163 pos+=trak->samples[s].size;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
164 ++s;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
165 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
166 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
167
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
168 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
169
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
170 #define MOV_MAX_TRACKS 256
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
171
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
172 #define MOV_TRAK_UNKNOWN 0
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
173 #define MOV_TRAK_VIDEO 1
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
174 #define MOV_TRAK_AUDIO 2
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
175 #define MOV_TRAK_FLASH 3
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
176 #define MOV_TRAK_GENERIC 4
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
177 #define MOV_TRAK_CODE 5
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
178
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
179 typedef struct {
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
180 off_t moov_start;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
181 off_t moov_end;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
182 off_t mdat_start;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
183 off_t mdat_end;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
184 int track_db;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
185 mov_track_t* tracks[MOV_MAX_TRACKS];
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
186 } mov_priv_t;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
187
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
188 #warning "FIXME - mov support is only working perfectly on Little Endian systems?!"
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
189 //#ifdef WORDS_BIGENDIAN
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
190 //#define MOV_FOURCC(a,b,c,d) ((d)|(c<<8)|(b<<16)|(a<<24))
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
191 //#else
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
192 #define MOV_FOURCC(a,b,c,d) ((a<<24)|(b<<16)|(c<<8)|(d))
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
193 //#endif
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
194
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
195 int mov_check_file(demuxer_t* demuxer){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
196 int flags=0;
2879
a3410c946b54 ignore mov detection if first chunk bad
arpi
parents: 2786
diff changeset
197 int no=0;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
198 mov_priv_t* priv=malloc(sizeof(mov_priv_t));
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
199
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
200 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for MOV\n");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
201
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
202 memset(priv,0,sizeof(mov_priv_t));
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
203 demuxer->priv=priv;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
204
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
205 while(1){
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
206 int skipped=8;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
207 off_t len=stream_read_dword(demuxer->stream);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
208 unsigned int id=stream_read_dword(demuxer->stream);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
209 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
210 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
211 {
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
212 #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
213 if (stream_read_dword(demuxer->stream) != 0)
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
214 mp_msg(MSGT_DEMUX, MSGL_WARN, "64bit file, but you've MPlayer compiled without LARGEFILE support!\n");
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
215 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
216 #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
217 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
218 #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
219 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
220 }
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
221 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
222
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
223 switch(id){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
224 case MOV_FOURCC('m','o','o','v'):
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
225 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Movie header found!\n");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
226 priv->moov_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
227 priv->moov_end=priv->moov_start+len-skipped;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
228 flags|=1;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
229 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
230 case MOV_FOURCC('m','d','a','t'):
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
231 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: Movie DATA found!\n");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
232 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
233 priv->mdat_end=priv->mdat_start+len-skipped;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
234 flags|=2;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
235 break;
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
236 case MOV_FOURCC('f','r','e','e'):
2942
89b3dd86b50b added skip atom to support .mp4 files
alex
parents: 2879
diff changeset
237 case MOV_FOURCC('s','k','i','p'):
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
238 /* 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
239 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
240 case MOV_FOURCC('w','i','d','e'):
2879
a3410c946b54 ignore mov detection if first chunk bad
arpi
parents: 2786
diff changeset
241 break;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
242 default:
2879
a3410c946b54 ignore mov detection if first chunk bad
arpi
parents: 2786
diff changeset
243 if(no==0) return 0; // first chunk is bad!
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
244 id = bswap_32(id);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
245 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
246 }
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
247 if(!stream_skip(demuxer->stream,len-skipped)) break;
2879
a3410c946b54 ignore mov detection if first chunk bad
arpi
parents: 2786
diff changeset
248 ++no;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
249 }
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
250
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
251 if(flags==1)
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
252 mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing data (mdat) chunk! Maybe broken file...\n");
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
253 else if(flags==2)
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
254 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
255
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
256 return (flags==3);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
257 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
258
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
259 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
260 mov_priv_t* priv=demuxer->priv;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
261 while(1){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
262 off_t pos;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
263 off_t len;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
264 unsigned int id;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
265 //
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
266 pos=stream_tell(demuxer->stream);
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
267 // printf("stream_tell==%d\n",pos);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
268 if(pos>=endpos) return; // END
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
269 len=stream_read_dword(demuxer->stream);
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
270 // printf("len==%d\n",len);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
271 if(len<8) return; // error
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
272 len-=8;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
273 id=stream_read_dword(demuxer->stream);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
274 //
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
275 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
276 //
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
277 if(trak){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
278 switch(id){
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
279 case MOV_FOURCC('f','r','e','e'):
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
280 case MOV_FOURCC('u','d','t','a'):
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
281 /* here not supported :p */
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
282 break;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
283 case MOV_FOURCC('t','k','h','d'): {
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
284 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sTrack header!\n",level,"");
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
285 // read codec data
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
286 trak->tkdata_len=len;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
287 trak->tkdata=malloc(trak->tkdata_len);
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
288 stream_read(demuxer->stream,trak->tkdata,trak->tkdata_len);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
289 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
290 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
291 case MOV_FOURCC('m','d','h','d'): {
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
292 unsigned int tmp;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
293 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sMedia header!\n",level,"");
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
294 #if 0
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
295 tmp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
296 printf("dword1: 0x%08X (%d)\n",tmp,tmp);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
297 tmp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
298 printf("dword2: 0x%08X (%d)\n",tmp,tmp);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
299 tmp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
300 printf("dword3: 0x%08X (%d)\n",tmp,tmp);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
301 tmp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
302 printf("dword4: 0x%08X (%d)\n",tmp,tmp);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
303 tmp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
304 printf("dword5: 0x%08X (%d)\n",tmp,tmp);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
305 tmp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
306 printf("dword6: 0x%08X (%d)\n",tmp,tmp);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
307 #endif
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
308 stream_skip(demuxer->stream,12);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
309 // read timescale
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
310 trak->timescale=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
311 // read length
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
312 trak->length=stream_read_dword(demuxer->stream);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
313 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
314 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
315 case MOV_FOURCC('v','m','h','d'): {
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
316 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sVideo header!\n",level,"");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
317 trak->type=MOV_TRAK_VIDEO;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
318 // read video data
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
319 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
320 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
321 case MOV_FOURCC('s','m','h','d'): {
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
322 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSound header!\n",level,"");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
323 trak->type=MOV_TRAK_AUDIO;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
324 // read audio data
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
325 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
326 }
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
327 case MOV_FOURCC('g','m','h','d'): {
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
328 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sGeneric header!\n",level,"");
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
329 trak->type=MOV_TRAK_GENERIC;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
330 break;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
331 }
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
332 case MOV_FOURCC('s','t','s','d'): {
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
333 int i=stream_read_dword(demuxer->stream); // temp!
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
334 int count=stream_read_dword(demuxer->stream);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
335 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sDescription list! (cnt:%d)\n",level,"",count);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
336 for(i=0;i<count;i++){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
337 off_t pos=stream_tell(demuxer->stream);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
338 off_t len=stream_read_dword(demuxer->stream);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
339 unsigned int fourcc=stream_read_dword_le(demuxer->stream);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
340 if(len<8) break; // error
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
341 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*s desc #%d: %.4s",level,"",i,&fourcc);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
342 if(!i){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
343 trak->fourcc=fourcc;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
344 // read codec data
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
345 trak->stdata_len=len-8;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
346 trak->stdata=malloc(trak->stdata_len);
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
347 stream_read(demuxer->stream,trak->stdata,trak->stdata_len);
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
348 if(trak->type==MOV_TRAK_VIDEO && trak->stdata_len>43){
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
349 mp_msg(MSGT_DEMUX,MSGL_V," '%.*s'",trak->stdata_len-43,trak->stdata+43);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
350 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
351 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
352 mp_msg(MSGT_DEMUX,MSGL_V,"\n");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
353 if(fourcc!=trak->fourcc && i)
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1567
diff changeset
354 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MOVvariableFourCC);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
355 if(!stream_seek(demuxer->stream,pos+len)) break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
356 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
357 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
358 }
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
359 case MOV_FOURCC('s','t','t','s'): {
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
360 int temp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
361 int len=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
362 int i;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
363 int x=0;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
364 unsigned int pts=0;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
365 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample duration table! (%d blocks)\n",level,"",len);
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
366 trak->durmap=malloc(sizeof(mov_durmap_t)*len);
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
367 memset(trak->durmap,0,sizeof(mov_durmap_t)*len);
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
368 trak->durmap_size=len;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
369 for(i=0;i<len;i++){
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
370 trak->durmap[i].num=stream_read_dword(demuxer->stream);
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
371 trak->durmap[i].dur=stream_read_dword(demuxer->stream);
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
372 pts+=trak->durmap[i].num*trak->durmap[i].dur;
2386
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
373
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
374 if(i==0 && trak->type == MOV_TRAK_VIDEO)
2386
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
375 {
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
376 sh_video_t* sh=new_sh_video(demuxer,priv->track_db);
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
377 if (!sh->fps)
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
378 sh->fps = trak->timescale/trak->durmap[i].dur;
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
379 /* initial fps */
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
380 }
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
381 }
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
382 if(trak->length!=pts) mp_msg(MSGT_DEMUX, MSGL_WARN, "Warning! pts=%d length=%d\n",pts,trak->length);
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
383 break;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
384 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
385 case MOV_FOURCC('s','t','s','c'): {
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
386 int temp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
387 int len=stream_read_dword(demuxer->stream);
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
388 int ver = (temp << 24);
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
389 int flags = (temp << 16)|(temp<<8)|temp;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
390 int i;
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
391 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample->Chunk mapping table! (%d blocks) (ver:%d,flags:%ld)\n",
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
392 level,"",len,ver,flags);
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
393 // read data:
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
394 trak->chunkmap_size=len;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
395 trak->chunkmap=malloc(sizeof(mov_chunkmap_t)*len);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
396 for(i=0;i<len;i++){
2103
3e55202cfdab ehh. first chunk is counted from 1. fixed...
arpi
parents: 2101
diff changeset
397 trak->chunkmap[i].first=stream_read_dword(demuxer->stream)-1;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
398 trak->chunkmap[i].spc=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
399 trak->chunkmap[i].sdid=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
400 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
401 break;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
402 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
403 case MOV_FOURCC('s','t','s','z'): {
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
404 int temp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
405 int ss=stream_read_dword(demuxer->stream);
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
406 int ver = (temp << 24);
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
407 int flags = (temp << 16)|(temp<<8)|temp;
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
408 int entries=stream_read_dword(demuxer->stream);
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
409 int i;
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
410
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
411 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample size table! (entries=%d ss=%d) (ver:%d,flags:%ld)\n",
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
412 level,"",entries,ss,ver,flags);
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
413 trak->samplesize=ss;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
414 if (!ss) {
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
415 // variable samplesize
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
416 trak->samples=realloc(trak->samples,sizeof(mov_sample_t)*entries);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
417 trak->samples_size=entries;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
418 for(i=0;i<entries;i++)
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
419 trak->samples[i].size=stream_read_dword(demuxer->stream);
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
420 }
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
421 break;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
422 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
423 case MOV_FOURCC('s','t','c','o'): {
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
424 int temp=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
425 int len=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
426 int i;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
427 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sChunk offset table! (%d chunks)\n",level,"",len);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
428 // extend array if needed:
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
429 if(len>trak->chunks_size){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
430 trak->chunks=realloc(trak->chunks,sizeof(mov_chunk_t)*len);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
431 trak->chunks_size=len;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
432 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
433 // read elements:
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
434 for(i=0;i<len;i++) trak->chunks[i].pos=stream_read_dword(demuxer->stream);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
435 break;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
436 }
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
437 case MOV_FOURCC('c','o','6','4'): {
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
438 int temp=stream_read_dword(demuxer->stream);
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
439 int len=stream_read_dword(demuxer->stream);
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
440 int 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
441 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*s64bit chunk offset table! (%d chunks)\n",level,"",len);
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
442 // extend array if needed:
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
443 if(len>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
444 trak->chunks=realloc(trak->chunks,sizeof(mov_chunk_t)*len);
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
445 trak->chunks_size=len;
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
446 }
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
447 // read elements:
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
448 for(i=0;i<len;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
449 {
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
450 #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
451 if (stream_read_dword(demuxer->stream) != 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
452 mp_msg(MSGT_DEMUX, MSGL_WARN, "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", 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
453 trak->chunks[i].pos = stream_read_dword(demuxer->stream);
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
454 #else
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
455 trak->chunks[i].pos = stream_read_qword(demuxer->stream);
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
456 #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
457 }
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
458 break;
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
459 }
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
460 case MOV_FOURCC('s','t','s','s'): {
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
461 int temp=stream_read_dword(demuxer->stream);
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
462 int entries=stream_read_dword(demuxer->stream);
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
463 int ver = (temp << 24);
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
464 int flags = (temp << 16)|(temp<<8)|temp;
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
465 int i;
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
466 mp_msg(MSGT_DEMUX, MSGL_V,"MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%ld)\n",
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
467 level, "",entries, ver, flags);
2544
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
468 trak->keyframes_size=entries;
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
469 trak->keyframes=malloc(sizeof(unsigned int)*entries);
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
470 for (i=0;i<entries;i++)
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
471 trak->keyframes[i]=stream_read_dword(demuxer->stream)-1;
2544
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
472 // for (i=0;i<entries;i++) printf("%3d: %d\n",i,trak->keyframes[i]);
2533
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
473 break;
36a9317a2afc added stss (not completed)
alex
parents: 2532
diff changeset
474 }
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
475 case MOV_FOURCC('m','d','i','a'): {
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
476 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sMedia stream!\n",level,"");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
477 lschunks(demuxer,level+1,pos+len,trak);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
478 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
479 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
480 case MOV_FOURCC('m','i','n','f'): {
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
481 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sMedia info!\n",level,"");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
482 lschunks(demuxer,level+1,pos+len,trak);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
483 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
484 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
485 case MOV_FOURCC('s','t','b','l'): {
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
486 mp_msg(MSGT_DEMUX,MSGL_V,"MOV: %*sSample info!\n",level,"");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
487 lschunks(demuxer,level+1,pos+len,trak);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
488 break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
489 }
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
490 case MOV_FOURCC('e','d','t','s'): {
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
491 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sEdit atom!\n", level, "");
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
492 lschunks(demuxer,level+1,pos+len,trak);
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
493 break;
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
494 }
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
495 case MOV_FOURCC('e','l','s','t'): {
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
496 int temp=stream_read_dword(demuxer->stream);
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
497 int entries=stream_read_dword(demuxer->stream);
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
498 int ver = (temp << 24);
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
499 int flags = (temp << 16)|(temp<<8)|temp;
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
500 int i;
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
501
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
502 mp_msg(MSGT_DEMUX, MSGL_V,"MOV: %*sEdit list table (%d entries) (ver:%d,flags:%ld)\n",
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
503 level, "",entries, ver, flags);
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
504 #if 0
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
505 for (i=0;i<entries;i++)
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
506 {
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
507 printf("entry#%d: dur: %ld mtime: %ld mrate: %ld\n",
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
508 i, stream_read_dword(demuxer->stream),
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
509 stream_read_dword(demuxer->stream),
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
510 stream_read_dword(demuxer->stream));
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
511 }
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
512 #endif
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
513 break;
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
514 }
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
515 case MOV_FOURCC('c','o','d','e'):
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
516 {
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
517 #warning "Implement atom 'code' for FLASH support"
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
518 }
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
519 default:
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
520 id = bswap_32(id);
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
521 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
522 break;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
523 }//switch(id)
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
524 } else { /* not in track */
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
525 switch(id) {
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
526 case MOV_FOURCC('t','r','a','k'): {
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
527 // if(trak) printf("MOV: Warning! trak in trak?\n");
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
528 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
529 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MOVtooManyTrk);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
530 return;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
531 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
532 trak=malloc(sizeof(mov_track_t));
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
533 memset(trak,0,sizeof(mov_track_t));
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1490
diff changeset
534 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
535 trak->id=priv->track_db;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
536 priv->tracks[priv->track_db]=trak;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
537 lschunks(demuxer,level+1,pos+len,trak);
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
538 mov_build_index(trak);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
539 switch(trak->type){
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
540 case MOV_TRAK_AUDIO: {
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
541 sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db);
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
542 sh->format=trak->fourcc;
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
543 mp_msg(MSGT_DEMUX, MSGL_INFO, "Audio bits: %d chans: %d\n",trak->stdata[19],trak->stdata[17]);
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
544 mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s\n",&trak->fourcc);
2543
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
545 #if 0
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
546 { FILE* f=fopen("stdata.dat","wb");
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
547 fwrite(trak->stdata,trak->stdata_len,1,f);
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
548 fclose(f); }
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
549 { FILE* f=fopen("tkdata.dat","wb");
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
550 fwrite(trak->tkdata,trak->tkdata_len,1,f);
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
551 fclose(f); }
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
552 #endif
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
553 // Emulate WAVEFORMATEX struct:
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
554 sh->wf=malloc(sizeof(WAVEFORMATEX));
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
555 memset(sh->wf,0,sizeof(WAVEFORMATEX));
2543
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
556 sh->wf->nChannels=(trak->stdata[16]<<8)+trak->stdata[17];
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
557 sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19];
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
558 // sh->wf->nSamplesPerSec=trak->timescale;
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
559 sh->wf->nSamplesPerSec=(trak->stdata[24]<<8)+trak->stdata[25];
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
560 sh->wf->nAvgBytesPerSec=sh->wf->nChannels*sh->wf->wBitsPerSample*sh->wf->nSamplesPerSec/8;
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
561 // Selection:
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
562 if(demuxer->audio->id==-1 || demuxer->audio->id==priv->track_db){
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
563 // (auto)selected audio track:
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
564 demuxer->audio->id=priv->track_db;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
565 demuxer->audio->sh=sh; sh->ds=demuxer->audio;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
566 }
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
567 break;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
568 }
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
569 case MOV_TRAK_VIDEO: {
4129
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
570 int i, entry;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
571 int flag, start, count_flag, end, palette_count;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
572 int hdr_ptr = 43+33; // the byte just after depth
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
573 unsigned char *palette_map;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
574 sh_video_t* sh=new_sh_video(demuxer,priv->track_db);
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
575 int depth = trak->stdata[43+32]; /* requested by Mike Melanson for Apple RLE decoder -- alex */
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
576 sh->format=trak->fourcc;
2386
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
577 if(!sh->fps) sh->fps=trak->timescale;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
578 sh->frametime=1.0f/sh->fps;
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
579 sh->disp_w=trak->tkdata[77]|(trak->tkdata[76]<<8);
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
580 sh->disp_h=trak->tkdata[81]|(trak->tkdata[80]<<8);
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
581
4129
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
582 // palettized?
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
583 if ((depth == 2) || (depth == 4) || (depth == 8) ||
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
584 (depth == 34) || (depth == 36) || (depth == 40))
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
585 palette_count = (1 << (depth & 0x0F));
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
586 else
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
587 palette_count = 0;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
588
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
589 // emulate BITMAPINFOHEADER:
4129
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
590 if (palette_count)
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
591 {
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
592 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
593 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
594 sh->bih->biSize=40 + palette_count * 4;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
595 // fetch the relevant fields
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
596 flag = BE_16(&trak->stdata[hdr_ptr]);
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
597 hdr_ptr += 2;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
598 start = BE_32(&trak->stdata[hdr_ptr]);
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
599 hdr_ptr += 4;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
600 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
601 hdr_ptr += 2;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
602 end = BE_16(&trak->stdata[hdr_ptr]);
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
603 hdr_ptr += 2;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
604 palette_map = (unsigned char *)sh->bih + 40;
4332
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
605
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
606 // load default palette
4533
9e7e037d8969 reconciled one minor, nagging palette issue with the official QT spec
melanson
parents: 4371
diff changeset
607 if (flag == 0xFFFF)
4332
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
608 {
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
609 if (palette_count == 4)
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
610 memcpy(palette_map, qt_default_palette_4, 4 * 4);
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
611 else if (palette_count == 16)
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
612 memcpy(palette_map, qt_default_palette_16, 16 * 4);
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
613 if (palette_count == 256)
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
614 memcpy(palette_map, qt_default_palette_256, 256 * 4);
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
615 }
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
616 // load palette from file
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
617 else
4129
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
618 {
4332
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
619 for (i = start; i <= end; i++)
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
620 {
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
621 entry = BE_16(&trak->stdata[hdr_ptr]);
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
622 hdr_ptr += 2;
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
623 // 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
624 if (count_flag & 0x8000)
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
625 entry = i;
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
626 // only care about top 8 bits of 16-bit R, G, or B value
4371
2330366f9255 fixed (reversed) the RGB palette order
melanson
parents: 4332
diff changeset
627 palette_map[entry * 4 + 2] = trak->stdata[hdr_ptr + 0];
4332
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
628 palette_map[entry * 4 + 1] = trak->stdata[hdr_ptr + 2];
4371
2330366f9255 fixed (reversed) the RGB palette order
melanson
parents: 4332
diff changeset
629 palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4];
4332
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
630 hdr_ptr += 6;
ae889abf93cd QT demuxer now supports the default QT palettes
melanson
parents: 4129
diff changeset
631 }
4129
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
632 }
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
633 }
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
634 else
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
635 {
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
636 sh->bih=malloc(sizeof(BITMAPINFOHEADER));
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
637 memset(sh->bih,0,sizeof(BITMAPINFOHEADER));
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
638 sh->bih->biSize=40;
31cd2e0bb961 QT demuxer loads palette information from files that transport palettes in
melanson
parents: 3999
diff changeset
639 }
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
640 sh->bih->biWidth=sh->disp_w;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
641 sh->bih->biHeight=sh->disp_h;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
642 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
643 sh->bih->biBitCount=depth;
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
644 sh->bih->biCompression=trak->fourcc;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
645 sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
646
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
647 mp_msg(MSGT_DEMUX, MSGL_INFO, "Image size: %d x %d (%dbits)\n",sh->disp_w,sh->disp_h,sh->bih->biBitCount);
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
648 mp_msg(MSGT_DEMUX, MSGL_INFO, "Fourcc: %.4s Codec: '%.*s'\n",&trak->fourcc,trak->stdata_len-43,trak->stdata+43);
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
649
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
650 if(demuxer->video->id==-1 || demuxer->video->id==priv->track_db){
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
651 // (auto)selected video track:
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
652 demuxer->video->id=priv->track_db;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
653 demuxer->video->sh=sh; sh->ds=demuxer->video;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
654 }
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
655 break;
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
656 }
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
657 case MOV_TRAK_GENERIC:
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
658 mp_msg(MSGT_DEMUX, MSGL_INFO, "Generic track - not completly understood! (id: %d)\n",
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
659 trak->id);
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
660 #warning "Also this contains the FLASH data"
2786
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
661 #if 0
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
662 mp_msg(MSGT_DEMUX, MSGL_INFO, "Extracting samples to files (possibly this is an flash anim)\n");
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
663 {
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
664 int pos = stream_tell(demuxer->stream);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
665 int i;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
666 int fd;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
667 char name[20];
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
668
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
669 for (i=0; i<trak->samples_size; i++)
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
670 {
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
671 char buf[trak->samples[i].size];
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
672 stream_seek(demuxer->stream, trak->samples[i].pos);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
673 snprintf((char *)&name[0], 20, "samp%d", i);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
674 fd = open((char *)&name[0], O_CREAT|O_WRONLY);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
675 stream_read(demuxer->stream, &buf[0], trak->samples[i].size);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
676 write(fd, &buf[0], trak->samples[i].size);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
677 close(fd);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
678 }
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
679 for (i=0; i<trak->chunks_size; i++)
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
680 {
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
681 char buf[trak->length];
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
682 stream_seek(demuxer->stream, trak->chunks[i].pos);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
683 snprintf((char *)&name[0], 20, "chunk%d", i);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
684 fd = open((char *)&name[0], O_CREAT|O_WRONLY);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
685 stream_read(demuxer->stream, &buf[0], trak->length);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
686 write(fd, &buf[0], trak->length);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
687 close(fd);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
688 }
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
689 if (trak->samplesize > 0)
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
690 {
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
691 char *buf;
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
692
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
693 buf = malloc(trak->samplesize);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
694 stream_seek(demuxer->stream, trak->chunks[0].pos);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
695 snprintf((char *)&name[0], 20, "trak%d", trak->id);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
696 fd = open((char *)&name[0], O_CREAT|O_WRONLY);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
697 stream_read(demuxer->stream, buf, trak->samplesize);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
698 write(fd, buf, trak->samplesize);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
699 close(fd);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
700 }
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
701 stream_seek(demuxer->stream, pos);
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
702 }
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
703 #endif
1907e5771e81 added pre-flash detecting support ;)
alex
parents: 2555
diff changeset
704 break;
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
705 default:
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
706 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
707 break;
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
708 }
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
709 mp_msg(MSGT_DEMUX, MSGL_INFO, "--------------\n");
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
710 priv->track_db++;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
711 trak=NULL;
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
712 break;
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
713 }
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
714 #ifndef HAVE_ZLIB
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
715 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
716 mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_MOVcomprhdr);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
717 return;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
718 }
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
719 #else
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
720 case MOV_FOURCC('c','m','o','v'): {
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
721 // mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_MOVcomprhdr);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
722 lschunks(demuxer,level+1,pos+len,NULL);
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
723 break;
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
724 }
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
725 case MOV_FOURCC('d','c','o','m'): {
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
726 // int temp=stream_read_dword(demuxer->stream);
2386
a48da0b47b02 compression algo detection fix (bswap) and fps fix
alex
parents: 2338
diff changeset
727 unsigned int len=bswap_32(stream_read_dword(demuxer->stream));
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
728 mp_msg(MSGT_DEMUX, MSGL_INFO, "Compressed header uses %.4s algo!\n",&len);
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
729 break;
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
730 }
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
731 case MOV_FOURCC('c','m','v','d'): {
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
732 // int temp=stream_read_dword(demuxer->stream);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
733 unsigned int moov_sz=stream_read_dword(demuxer->stream);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
734 unsigned int cmov_sz=len-4;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
735 unsigned char* cmov_buf=malloc(cmov_sz);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
736 unsigned char* moov_buf=malloc(moov_sz+16);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
737 int zret;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
738 z_stream zstrm;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
739 stream_t* backup;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
740
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
741 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
742
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
743 stream_read(demuxer->stream,cmov_buf,cmov_sz);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
744
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
745 zstrm.zalloc = (alloc_func)0;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
746 zstrm.zfree = (free_func)0;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
747 zstrm.opaque = (voidpf)0;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
748 zstrm.next_in = cmov_buf;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
749 zstrm.avail_in = cmov_sz;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
750 zstrm.next_out = moov_buf;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
751 zstrm.avail_out = moov_sz;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
752
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
753 zret = inflateInit(&zstrm);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
754 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
755 { mp_msg(MSGT_DEMUX, MSGL_ERR, "QT cmov: inflateInit err %d\n",zret);
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
756 return;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
757 }
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
758 zret = inflate(&zstrm, Z_NO_FLUSH);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
759 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
760 { mp_msg(MSGT_DEMUX, MSGL_ERR, "QT cmov inflate: ERR %d\n",zret);
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
761 return;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
762 }
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
763 #if 0
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
764 else {
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
765 FILE *DecOut;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
766 DecOut = fopen("Out.bin", "w");
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
767 fwrite(moov_buf, 1, moov_sz, DecOut);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
768 fclose(DecOut);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
769 }
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
770 #endif
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
771 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
772 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
773 zret = inflateEnd(&zstrm);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
774
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
775 backup=demuxer->stream;
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
776 demuxer->stream=new_memory_stream(moov_buf,moov_sz);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
777 stream_skip(demuxer->stream,8);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
778 lschunks(demuxer,level+1,moov_sz,NULL); // parse uncompr. 'moov'
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
779 //free_stream(demuxer->stream);
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
780 demuxer->stream=backup;
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
781 free(cmov_buf);
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
782 free(moov_buf);
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
783 break;
2148
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
784 }
0c6cef85d507 compressed headers support
arpi
parents: 2127
diff changeset
785 #endif
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
786 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
787 {
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
788 unsigned int udta_id;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
789 off_t udta_len;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
790 off_t udta_size = len;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
791
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
792 mp_msg(MSGT_DEMUX, MSGL_DBG2, "mov: user data record found\n");
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
793 mp_msg(MSGT_DEMUX, MSGL_INFO, "Quicktime Clip Info:\n");
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
794
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
795 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
796 {
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
797 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
798 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
799 udta_size -= 8;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
800 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
801 switch (udta_id)
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
802 {
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
803 case MOV_FOURCC(0xa9,'c','p','y'):
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
804 case MOV_FOURCC(0xa9,'d','a','y'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
805 case MOV_FOURCC(0xa9,'d','i','r'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
806 /* 0xa9,'e','d','1' - '9' : edit timestamps */
146854180531 extended udta record
alex
parents: 2533
diff changeset
807 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
808 case MOV_FOURCC(0xa9,'i','n','f'):
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
809 case MOV_FOURCC(0xa9,'p','r','d'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
810 case MOV_FOURCC(0xa9,'p','r','f'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
811 case MOV_FOURCC(0xa9,'r','e','q'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
812 case MOV_FOURCC(0xa9,'s','r','c'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
813 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
814 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
815 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
816 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
817 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
818 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
819 {
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
820 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
821 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
822 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
823 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
824 switch(udta_id)
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
825 {
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
826 case MOV_FOURCC(0xa9,'a','u','t'):
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
827 demux_info_add(demuxer, "author", &text[2]);
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
828 mp_msg(MSGT_DEMUX, MSGL_INFO, " Author: %s\n", &text[2]);
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
829 break;
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
830 case MOV_FOURCC(0xa9,'c','p','y'):
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
831 demux_info_add(demuxer, "copyright", &text[2]);
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
832 mp_msg(MSGT_DEMUX, MSGL_INFO, " Copyright: %s\n", &text[2]);
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
833 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
834 case MOV_FOURCC(0xa9,'i','n','f'):
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
835 mp_msg(MSGT_DEMUX, MSGL_INFO, " Info: %s\n", &text[2]);
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
836 break;
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
837 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
838 case MOV_FOURCC(0xa9,'n','a','m'):
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
839 demux_info_add(demuxer, "name", &text[2]);
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
840 mp_msg(MSGT_DEMUX, MSGL_INFO, " Name: %s\n", &text[2]);
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
841 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
842 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
843 mp_msg(MSGT_DEMUX, MSGL_INFO, " Artist: %s\n", &text[2]);
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
844 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
845 case MOV_FOURCC(0xa9,'d','i','r'):
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
846 mp_msg(MSGT_DEMUX, MSGL_INFO, " Director: %s\n", &text[2]);
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
847 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
848 case MOV_FOURCC(0xa9,'c','m','t'):
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
849 demux_info_add(demuxer, "comments", &text[2]);
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
850 mp_msg(MSGT_DEMUX, MSGL_INFO, " Comment: %s\n", &text[2]);
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
851 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
852 case MOV_FOURCC(0xa9,'r','e','q'):
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
853 mp_msg(MSGT_DEMUX, MSGL_INFO, " 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
854 break;
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
855 case MOV_FOURCC(0xa9,'s','w','r'):
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
856 demux_info_add(demuxer, "encoder", &text[2]);
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
857 mp_msg(MSGT_DEMUX, MSGL_INFO, " Software: %s\n", &text[2]);
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
858 break;
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
859 case MOV_FOURCC(0xa9,'d','a','y'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
860 mp_msg(MSGT_DEMUX, MSGL_INFO, " Creation timestamp: %s\n", &text[2]);
146854180531 extended udta record
alex
parents: 2533
diff changeset
861 break;
146854180531 extended udta record
alex
parents: 2533
diff changeset
862 case MOV_FOURCC(0xa9,'f','m','t'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
863 mp_msg(MSGT_DEMUX, MSGL_INFO, " Format: %s\n", &text[2]);
146854180531 extended udta record
alex
parents: 2533
diff changeset
864 break;
146854180531 extended udta record
alex
parents: 2533
diff changeset
865 case MOV_FOURCC(0xa9,'p','r','d'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
866 mp_msg(MSGT_DEMUX, MSGL_INFO, " Producer: %s\n", &text[2]);
146854180531 extended udta record
alex
parents: 2533
diff changeset
867 break;
146854180531 extended udta record
alex
parents: 2533
diff changeset
868 case MOV_FOURCC(0xa9,'p','r','f'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
869 mp_msg(MSGT_DEMUX, MSGL_INFO, " Performer(s): %s\n", &text[2]);
146854180531 extended udta record
alex
parents: 2533
diff changeset
870 break;
146854180531 extended udta record
alex
parents: 2533
diff changeset
871 case MOV_FOURCC(0xa9,'s','r','c'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
872 mp_msg(MSGT_DEMUX, MSGL_INFO, " Source providers: %s\n", &text[2]);
146854180531 extended udta record
alex
parents: 2533
diff changeset
873 break;
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
874 }
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
875 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
876 break;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
877 }
2542
146854180531 extended udta record
alex
parents: 2533
diff changeset
878 /* some other shits: WLOC - window location,
146854180531 extended udta record
alex
parents: 2533
diff changeset
879 LOOP - looping style,
146854180531 extended udta record
alex
parents: 2533
diff changeset
880 SelO - play only selected frames
146854180531 extended udta record
alex
parents: 2533
diff changeset
881 AllF - play all frames
146854180531 extended udta record
alex
parents: 2533
diff changeset
882 */
146854180531 extended udta record
alex
parents: 2533
diff changeset
883 case MOV_FOURCC('W','L','O','C'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
884 case MOV_FOURCC('L','O','O','P'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
885 case MOV_FOURCC('S','e','l','O'):
146854180531 extended udta record
alex
parents: 2533
diff changeset
886 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
887 default:
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
888 {
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
889 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
890 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
891 udta_size -= udta_len;
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
892 }
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
893 }
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
894 }
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
895 break;
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
896 } /* eof udta */
2532
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
897 default:
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
898 id = bswap_32(id);
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
899 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
900 } /* endof switch */
1adeb4ce84d4 changed if's to switch in lschunks
alex
parents: 2483
diff changeset
901 } /* endof else */
2429
8d00b25169af handling free chunk (wide needs implementation) and displaying clip info (datas from udta chunk)
alex
parents: 2419
diff changeset
902
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
903 pos+=len+8;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
904 if(pos>=endpos) break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
905 if(!stream_seek(demuxer->stream,pos)) break;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
906 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
907 }
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
908
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
909 int mov_read_header(demuxer_t* demuxer){
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
910 mov_priv_t* priv=demuxer->priv;
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
911
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
912 mp_msg(MSGT_DEMUX, MSGL_DBG3, "mov_read_header!\n");
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
913
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
914 // Parse header:
2100
6f6eb4f8e7a0 finished mov header and index processing
arpi
parents: 1973
diff changeset
915 stream_reset(demuxer->stream);
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
916 if(!stream_seek(demuxer->stream,priv->moov_start)) return 0; // ???
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
917 lschunks(demuxer, 0, priv->moov_end, NULL);
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
918
2127
e6ce221dee06 .mov support can be disabled
arpi
parents: 2115
diff changeset
919 return 1;
1490
71424eb2b282 MOV file support - not works yet
arpi
parents:
diff changeset
920 }
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
921
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
922 // return value:
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
923 // 0 = EOF or no stream found
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
924 // 1 = successfully read a packet
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
925 int demux_mov_fill_buffer(demuxer_t *demuxer,demux_stream_t* ds){
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
926 mov_priv_t* priv=demuxer->priv;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
927 mov_track_t* trak=NULL;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
928 float pts;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
929
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
930 if(ds->id<0 || ds->id>=priv->track_db) return 0;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
931 trak=priv->tracks[ds->id];
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
932
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
933 if(trak->samplesize){
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
934 // read chunk:
2419
24ba3dfb8e89 compressed mov audio fixed
arpi
parents: 2386
diff changeset
935 int x;
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
936 if(trak->pos>=trak->chunks_size) return 0; // EOF
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
937 stream_seek(demuxer->stream,trak->chunks[trak->pos].pos);
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
938 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale;
3071
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
939 if(trak->samplesize!=1)
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
940 {
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
941 mp_msg(MSGT_DEMUX, MSGL_WARN, "WARNING! Samplesize(%d) != 1\n",
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
942 trak->samplesize);
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
943 x=trak->chunks[trak->pos].size*trak->samplesize;
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
944 }
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
945 else
a5f378f982cc added demux_info
alex
parents: 2942
diff changeset
946 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
947 // printf("X = %d\n", x);
2543
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
948 if(trak->stdata_len>=36){
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
949 // extended stsd header - works for CBR MP3:
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
950 x/=(trak->stdata[30]<<8)+trak->stdata[31]; // samples/packet
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
951 // x*=(trak->stdata[34]<<8)+trak->stdata[35]; // bytes/packet
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
952 x*=(trak->stdata[38]<<8)+trak->stdata[39]; // bytes/frame
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
953 } else {
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
954 // works for ima4: -- we should find this info in mov headers!
2549
3e0204ff3be0 twos pcm audio support
arpi
parents: 2546
diff changeset
955 if(ds->ss_div!=1 || ds->ss_mul!=1){
3e0204ff3be0 twos pcm audio support
arpi
parents: 2546
diff changeset
956 x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix ! HACK !
3e0204ff3be0 twos pcm audio support
arpi
parents: 2546
diff changeset
957 } else {
3e0204ff3be0 twos pcm audio support
arpi
parents: 2546
diff changeset
958 x*=(trak->stdata[18]<<8)+trak->stdata[19];x/=8; // bits/sample
3e0204ff3be0 twos pcm audio support
arpi
parents: 2546
diff changeset
959 }
2543
a28b5e54f5a6 cbr audio fix
arpi
parents: 2542
diff changeset
960 }
2419
24ba3dfb8e89 compressed mov audio fixed
arpi
parents: 2386
diff changeset
961 ds_read_packet(ds,demuxer->stream,x,pts,trak->chunks[trak->pos].pos,0);
2483
22bfa362af42 added two new clip info types, all printf's were upgraded to mp_msg
alex
parents: 2429
diff changeset
962 if(ds==demuxer->audio) mp_msg(MSGT_DEMUX, MSGL_DBG2, "sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts);
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
963 } else {
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
964 // read sample:
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
965 if(trak->pos>=trak->samples_size) return 0; // EOF
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
966 stream_seek(demuxer->stream,trak->samples[trak->pos].pos);
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
967 pts=(float)trak->samples[trak->pos].pts/(float)trak->timescale;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
968 ds_read_packet(ds,demuxer->stream,trak->samples[trak->pos].size,pts,trak->samples[trak->pos].pos,0);
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
969 }
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
970 ++trak->pos;
2115
fe1cd4a5109a optimized demuxer for fixed samplesize (raw audio)
arpi
parents: 2103
diff changeset
971
2101
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
972 return 1;
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
973
4ca146a57d17 implemented simple demuxer
arpi
parents: 2100
diff changeset
974 }
2227
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
975
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
976 static float mov_seek_track(mov_track_t* trak,float pts,int flags){
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
977
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
978 // printf("MOV track seek called %5.3f \n",pts);
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
979 if(flags&2) pts*=trak->length; else pts*=(float)trak->timescale;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
980
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
981 if(trak->samplesize){
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
982 int sample=pts/trak->duration;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
983 // 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
984 if(!(flags&1)) sample+=trak->chunks[trak->pos].sample; // relative
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
985 trak->pos=0;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
986 while(trak->pos<trak->chunks_size && trak->chunks[trak->pos].sample<sample) ++trak->pos;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
987 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
988 } else {
2545
89e3bf3c0c4e seek ebfore begin of the movie fixed
arpi
parents: 2544
diff changeset
989 unsigned int ipts;
89e3bf3c0c4e seek ebfore begin of the movie fixed
arpi
parents: 2544
diff changeset
990 if(!(flags&1)) pts+=trak->samples[trak->pos].pts;
89e3bf3c0c4e seek ebfore begin of the movie fixed
arpi
parents: 2544
diff changeset
991 if(pts<0) pts=0;
89e3bf3c0c4e seek ebfore begin of the movie fixed
arpi
parents: 2544
diff changeset
992 ipts=pts;
89e3bf3c0c4e seek ebfore begin of the movie fixed
arpi
parents: 2544
diff changeset
993 //printf("MOV track seek - sample: %d \n",ipts);
2544
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
994 for(trak->pos=0;trak->pos<trak->samples_size;++trak->pos){
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
995 if(trak->samples[trak->pos].pts>=ipts) break; // found it!
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
996 }
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
997 if(trak->keyframes_size){
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
998 // find nearest keyframe
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
999 int i;
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
1000 for(i=0;i<trak->keyframes_size;i++){
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
1001 if(trak->keyframes[i]>=trak->pos) break;
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
1002 }
2546
c9485365537d added edit atom (edit list), some comments and typos fixes
alex
parents: 2545
diff changeset
1003 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
1004 --i;
2544
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
1005 trak->pos=trak->keyframes[i];
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
1006 // printf("nearest keyframe: %d \n",trak->pos);
fd48f0d813b6 using keyframe info for seeking
arpi
parents: 2543
diff changeset
1007 }
2227
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1008 pts=(float)trak->samples[trak->pos].pts/(float)trak->timescale;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1009 }
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1010
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1011 // printf("MOV track seek done: %5.3f \n",pts);
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1012
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1013 return pts;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1014 }
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1015
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1016 void demux_seek_mov(demuxer_t *demuxer,float pts,int flags){
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1017 mov_priv_t* priv=demuxer->priv;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1018 demux_stream_t* ds;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1019
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1020 // printf("MOV seek called %5.3f flag=%d \n",pts,flags);
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1021
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1022 ds=demuxer->video;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1023 if(ds && ds->id>=0 && ds->id<priv->track_db){
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1024 mov_track_t* trak=priv->tracks[ds->id];
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1025 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1026 //if(!(flags&1)) pts+=ds->pts;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1027 pts=ds->pts=mov_seek_track(trak,pts,flags);
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1028 flags=1; // absolute seconds
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1029 }
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1030
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1031 ds=demuxer->audio;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1032 if(ds && ds->id>=0 && ds->id<priv->track_db){
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1033 mov_track_t* trak=priv->tracks[ds->id];
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1034 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1035 //if(!(flags&1)) pts+=ds->pts;
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1036 ds->pts=mov_seek_track(trak,pts,flags);
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1037 }
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1038
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1039 }
10b279d72a8f mov seeking implemented
arpi
parents: 2148
diff changeset
1040