annotate libmpdemux/demux_mov.c @ 3804:53ed66a4f0bf

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