annotate libmpdemux/demux_mkv.cpp @ 10149:bb1d5c054148

Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
author mosu
date Thu, 22 May 2003 07:49:48 +0000
parents d9c9422887ca
children 531b00ad6f2d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1 extern "C" {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2 #include "config.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
4
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
5 #ifdef HAVE_MATROSKA
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
6
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
7 extern "C" {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
8 #include <stdlib.h>
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
9 #include <stdio.h>
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
10 #include <string.h>
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
11
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
12 #include "../mp_msg.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
13 #include "../help_mp.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
14 #include "stream.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
15 #include "demuxer.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
16 #include "stheader.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
17
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
18 #include "../subreader.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
19 #include "../libvo/sub.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
20 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
21
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
22 #include <iostream>
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
23 #include <cassert>
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
24 #include <typeinfo>
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
25
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
26 #include "EbmlHead.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
27 #include "EbmlSubHead.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
28 #include "EbmlStream.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
29 #include "EbmlContexts.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
30 #include "FileKax.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
31
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
32 #include "KaxAttachements.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
33 #include "KaxBlock.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
34 #include "KaxBlockData.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
35 #include "KaxChapters.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
36 #include "KaxCluster.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
37 #include "KaxClusterData.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
38 #include "KaxContexts.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
39 #include "KaxCues.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
40 #include "KaxCuesData.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
41 #include "KaxInfo.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
42 #include "KaxInfoData.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
43 #include "KaxSeekHead.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
44 #include "KaxSegment.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
45 #include "KaxTracks.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
46 #include "KaxTrackAudio.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
47 #include "KaxTrackVideo.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
48
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
49 #include "StdIOCallback.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
50
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
51 #include "matroska.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
52
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
53 using namespace LIBMATROSKA_NAMESPACE;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
54 using namespace std;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
55
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
56 // for e.g. "-slang ger"
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
57 extern char *dvdsub_lang;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
58
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
59 // default values for Matroska elements
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
60 #define MKVD_TIMECODESCALE 1000000 // 1000000 = 1ms
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
61
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
62 class mpstream_io_callback: public IOCallback {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
63 private:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
64 stream_t *s;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
65 public:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
66 mpstream_io_callback(stream_t *stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
67
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
68 virtual uint32 read(void *buffer, size_t size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
69 virtual void setFilePointer(int64 offset, seek_mode mode = seek_beginning);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
70 virtual size_t write(const void *buffer, size_t size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
71 virtual uint64 getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
72 virtual void close();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
73 };
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
74
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
75 mpstream_io_callback::mpstream_io_callback(stream_t *stream) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
76 s = stream;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
77 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
78
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
79 uint32 mpstream_io_callback::read(void *buffer, size_t size) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
80 uint32_t result;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
81
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
82 result = stream_read(s, (char *)buffer, size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
83
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
84 return result;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
85 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
86
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
87 void mpstream_io_callback::setFilePointer(int64 offset, seek_mode mode) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
88 int64 new_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
89
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
90 if (mode == seek_beginning)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
91 new_pos = offset + s->start_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
92 else if (mode == seek_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
93 new_pos = s->end_pos - offset;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
94 else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
95 new_pos = s->pos + offset;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
96
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
97 if (new_pos > s->end_pos) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
98 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek warning: new_pos %lld > end_pos "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
99 "%lld\n", new_pos, s->end_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
100 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
101 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
102
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
103 stream_seek(s, new_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
104 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
105
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
106 size_t mpstream_io_callback::write(const void */*buffer*/, size_t /*size*/) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
107 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
108 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
109
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
110 uint64 mpstream_io_callback::getFilePointer() {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
111 return s->pos - s->buf_len + s->buf_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
112 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
113
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
114 void mpstream_io_callback::close() {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
115 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
116
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
117 typedef struct mkv_index_entry {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
118 uint64_t timecode, filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
119 int is_key;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
120 } mkv_index_entry_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
121
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
122 typedef struct mkv_track_index {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
123 uint32_t tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
124 int num_entries;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
125 mkv_index_entry_t *entries;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
126 } mkv_track_index_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
127
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
128 typedef struct mkv_track {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
129 uint32_t tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
130
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
131 char *codec_id;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
132 int ms_compat;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
133 char *language;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
134
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
135 char type; // 'v' = video, 'a' = audio, 's' = subs
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
136
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
137 char v_fourcc[5];
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
138 uint32_t v_width, v_height, v_dwidth, v_dheight;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
139 float v_frate;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
140
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
141 uint32_t a_formattag;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
142 uint32_t a_channels, a_bps;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
143 float a_sfreq;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
144
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
145 int default_track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
146
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
147 void *private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
148 unsigned int private_size;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
149
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
150 unsigned char *headers[3];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
151 uint32_t header_sizes[3];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
152
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
153 int ok;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
154 } mkv_track_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
155
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
156 typedef struct mkv_demuxer {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
157 float duration, last_pts;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
158 uint64_t last_filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
159
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
160 mkv_track_t **tracks;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
161 int num_tracks;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
162 mkv_track_t *video, *audio, *subs_track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
163
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
164 uint64_t tc_scale, cluster_tc;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
165
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
166 mpstream_io_callback *in;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
167
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
168 uint64_t clear_subs_at;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
169
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
170 subtitle subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
171
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
172 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
173 EbmlElement *saved_l1, *saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
174 KaxSegment *segment;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
175 KaxCluster *cluster;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
176
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
177 mkv_track_index_t *index;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
178 int num_indexes, cues_found, cues_searched;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
179 int64_t *cluster_positions;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
180 int num_cluster_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
181
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
182 int skip_to_keyframe;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
183 int64_t skip_to_timecode;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
184 } mkv_demuxer_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
185
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
186 static uint16_t get_uint16(const void *buf) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
187 uint16_t ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
188 unsigned char *tmp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
189
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
190 tmp = (unsigned char *) buf;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
191
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
192 ret = tmp[1] & 0xff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
193 ret = (ret << 8) + (tmp[0] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
194
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
195 return ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
196 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
197
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
198 static uint32_t get_uint32(const void *buf) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
199 uint32_t ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
200 unsigned char *tmp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
201
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
202 tmp = (unsigned char *) buf;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
203
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
204 ret = tmp[3] & 0xff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
205 ret = (ret << 8) + (tmp[2] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
206 ret = (ret << 8) + (tmp[1] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
207 ret = (ret << 8) + (tmp[0] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
208
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
209 return ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
210 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
211
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
212 static void handle_subtitles(demuxer_t *d, KaxBlock *block, int64_t duration) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
213 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)d->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
214 int len, line, state;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
215 char *s1, *s2, *buffer;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
216
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
217 if (duration == -1) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
218 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: No KaxBlockDuration "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
219 "element for subtitle track found.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
220 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
221 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
222
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
223 DataBuffer &data = block->GetBuffer(0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
224 len = data.Size();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
225
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
226 buffer = (char *)data.Buffer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
227 s1 = buffer;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
228
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
229 while (((*s1 == '\n') || (*s1 == '\r')) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
230 ((unsigned int)(s1 - buffer) <= data.Size()))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
231 s1++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
232
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
233 line = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
234 s2 = mkv_d->subs.text[0];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
235 mkv_d->subs.lines = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
236 state = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
237 while ((unsigned int)(s1 - buffer) != data.Size()) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
238 if ((*s1 == '\n') || (*s1 == '\r')) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
239 if (state == 0) { // normal char --> newline
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
240 if (mkv_d->subs.lines == SUB_MAX_TEXT)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
241 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
242 *s2 = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
243 s2 = mkv_d->subs.text[mkv_d->subs.lines];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
244 mkv_d->subs.lines++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
245 state = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
246 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
247 } else if (*s1 == '<') // skip HTML tags
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
248 state = 2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
249 else if (*s1 == '>')
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
250 state = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
251 else if (state != 2) { // normal character
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
252 state = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
253 if ((s2 - mkv_d->subs.text[mkv_d->subs.lines - 1]) < 255) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
254 *s2 = *s1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
255 s2++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
256 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
257 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
258 s1++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
259 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
260
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
261 *s2 = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
262
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
263 #ifdef USE_ICONV
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
264 subcp_recode1(&mkv_d->subs);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
265 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
266
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
267 vo_sub = &mkv_d->subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
268 vo_osd_changed(OSDTYPE_SUBTITLE);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
269
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
270 mkv_d->clear_subs_at = block->GlobalTimecode() / 1000000 + duration;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
271 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
272
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
273 static mkv_track_t *new_mkv_track(mkv_demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
274 mkv_track_t *t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
275
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
276 t = (mkv_track_t *)malloc(sizeof(mkv_track_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
277 if (t != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
278 memset(t, 0, sizeof(mkv_track_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
279 d->tracks = (mkv_track_t **)realloc(d->tracks, (d->num_tracks + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
280 sizeof(mkv_track_t *));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
281 if (d->tracks == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
282 return NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
283 d->tracks[d->num_tracks] = t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
284 d->num_tracks++;
10036
1dfe4dab4a42 Implemented some default values. The corresponding Kax elements are not stored if they are set to their default value.
mosu
parents: 10029
diff changeset
285
1dfe4dab4a42 Implemented some default values. The corresponding Kax elements are not stored if they are set to their default value.
mosu
parents: 10029
diff changeset
286 // Set default values.
1dfe4dab4a42 Implemented some default values. The corresponding Kax elements are not stored if they are set to their default value.
mosu
parents: 10029
diff changeset
287 t->default_track = 1;
1dfe4dab4a42 Implemented some default values. The corresponding Kax elements are not stored if they are set to their default value.
mosu
parents: 10029
diff changeset
288 t->a_sfreq = 8000.0;
1dfe4dab4a42 Implemented some default values. The corresponding Kax elements are not stored if they are set to their default value.
mosu
parents: 10029
diff changeset
289 t->a_channels = 1;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
290 t->language = strdup("eng");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
291 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
292
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
293 return t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
294 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
295
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
296 static mkv_track_t *find_track_by_num(mkv_demuxer_t *d, uint32_t n,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
297 mkv_track_t *c) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
298 int i;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
299
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
300 for (i = 0; i < d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
301 if ((d->tracks[i] != NULL) && (d->tracks[i]->tnum == n) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
302 (d->tracks[i] != c))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
303 return d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
304
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
305 return NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
306 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
307
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
308 static mkv_track_t *find_track_by_language(mkv_demuxer_t *d, char *language,
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
309 mkv_track_t *c, char type = 's') {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
310 int i;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
311
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
312 for (i = 0; i < d->num_tracks; i++)
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
313 if ((d->tracks[i] != NULL) && (d->tracks[i] != c) &&
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
314 (d->tracks[i]->language != NULL) &&
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
315 !strcmp(d->tracks[i]->language, language) &&
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
316 (d->tracks[i]->type == type))
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
317 return d->tracks[i];
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
318
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
319 return NULL;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
320 }
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
321
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
322 static int check_track_information(mkv_demuxer_t *d) {
10028
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
323 int i, track_num;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
324 unsigned char *c;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
325 uint32_t u, offset, length;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
326 mkv_track_t *t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
327 BITMAPINFOHEADER *bih;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
328 WAVEFORMATEX *wfe;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
329
10028
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
330 for (track_num = 0; track_num < d->num_tracks; track_num++) {
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
331
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
332 t = d->tracks[track_num];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
333 switch (t->type) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
334 case 'v': // video track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
335 if (t->codec_id == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
336 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
337 if (!strcmp(t->codec_id, MKV_V_MSCOMP)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
338 if ((t->private_data == NULL) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
339 (t->private_size < sizeof(BITMAPINFOHEADER))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
340 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
341 "%u is '" MKV_V_MSCOMP "', but there was no "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
342 "BITMAPINFOHEADER struct present. Therefore we don't have "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
343 "a FourCC to identify the video codec used.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
344 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
345 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
346 t->ms_compat = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
347
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
348 bih = (BITMAPINFOHEADER *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
349
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
350 u = get_uint32(&bih->biWidth);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
351 if (t->v_width != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
352 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
353 "compatibility mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
354 "Matrosa says video width is %u, but the "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
355 "BITMAPINFOHEADER says %u.\n", t->tnum, t->v_width, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
356 if (t->v_width == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
357 t->v_width = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
358 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
359
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
360 u = get_uint32(&bih->biHeight);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
361 if (t->v_height != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
362 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
363 "mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
364 "Matrosa video height is %u, but the BITMAPINFOHEADER "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
365 "says %u.\n", t->tnum, t->v_height, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
366 if (t->v_height == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
367 t->v_height = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
368 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
369
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
370 memcpy(t->v_fourcc, &bih->biCompression, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
371
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
372 if (t->v_frate == 0.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
373 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] ERROR: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
374 "mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
375 "No VideoFrameRate element was found.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
376 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
377 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
378 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
379 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
380 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Native CodecIDs for video "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
381 "tracks are not supported yet (track %u).\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
382 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
383 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
384
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
385 if (t->v_width == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
386 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The width for track %u was "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
387 "not set.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
388 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
389 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
390 if (t->v_height == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
391 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The height for track %u was "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
392 "not set.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
393 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
394 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
395
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
396 if (t->v_dwidth == 0)
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
397 t->v_dwidth = t->v_width;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
398 if (t->v_dheight == 0)
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
399 t->v_dheight = t->v_height;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
400
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
401 // This track seems to be ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
402 t->ok = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
403
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
404 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
405
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
406 case 'a': // audio track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
407 if (t->codec_id == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
408 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
409 if (!strcmp(t->codec_id, MKV_A_ACM)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
410 if ((t->private_data == NULL) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
411 (t->private_size < sizeof(WAVEFORMATEX))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
412 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
413 "%u is '" MKV_A_ACM "', "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
414 "but there was no WAVEFORMATEX struct present. "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
415 "Therefore we don't have a format ID to identify the audio "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
416 "codec used.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
417 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
418 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
419 t->ms_compat = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
420
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
421 wfe = (WAVEFORMATEX *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
422 u = get_uint32(&wfe->nSamplesPerSec);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
423 if (((uint32_t)t->a_sfreq) != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
424 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
425 "mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
426 "Matroska says that there are %u samples per second, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
427 "but WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
428 (uint32_t)t->a_sfreq, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
429 if (t->a_sfreq == 0.0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
430 t->a_sfreq = (float)u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
431 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
432
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
433 u = get_uint16(&wfe->nChannels);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
434 if (t->a_channels != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
435 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
436 "compatibility mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
437 "Matroska says that there are %u channels, but the "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
438 "WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
439 t->a_channels, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
440 if (t->a_channels == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
441 t->a_channels = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
442 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
443
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
444 u = get_uint16(&wfe->wBitsPerSample);
10098
ebbe39bb55ab Check with the wrong variable.
mosu
parents: 10084
diff changeset
445 if (t->a_bps != u) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
446 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
447 "compatibility mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
448 "Matroska says that there are %u bits per sample, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
449 "but the WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
450 t->a_bps, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
451 if (t->a_bps == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
452 t->a_bps = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
453 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
454
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
455 t->a_formattag = get_uint16(&wfe->wFormatTag);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
456 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
457 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
458 if (!strcmp(t->codec_id, MKV_A_MP3))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
459 t->a_formattag = 0x0055;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
460 else if (!strcmp(t->codec_id, MKV_A_AC3))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
461 t->a_formattag = 0x2000;
10105
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
462 else if (!strcmp(t->codec_id, MKV_A_DTS))
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
463 // uses same format tag as AC3, only supported with -hwac3
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
464 t->a_formattag = 0x2000;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
465 else if (!strcmp(t->codec_id, MKV_A_PCM))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
466 t->a_formattag = 0x0001;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
467 else if (!strcmp(t->codec_id, MKV_A_AAC_2MAIN) ||
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
468 !strcmp(t->codec_id, MKV_A_AAC_2LC) ||
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
469 !strcmp(t->codec_id, MKV_A_AAC_2SSR) ||
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
470 !strcmp(t->codec_id, MKV_A_AAC_4MAIN) ||
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
471 !strcmp(t->codec_id, MKV_A_AAC_4LC) ||
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
472 !strcmp(t->codec_id, MKV_A_AAC_4SSR) ||
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
473 !strcmp(t->codec_id, MKV_A_AAC_4LTP) ||
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
474 !strcmp(t->codec_id, MKV_A_AAC_4SBR))
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
475 t->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
476 else if (!strcmp(t->codec_id, MKV_A_VORBIS)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
477 if (t->private_data == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
478 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
479 "track %u is '" MKV_A_VORBIS
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
480 "', but there are no header packets present.", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
481 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
482 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
483
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
484 c = (unsigned char *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
485 if (c[0] != 2) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
486 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track does not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
487 "contain valid headers.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
488 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
489 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
490
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
491 offset = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
492 for (i = 0; i < 2; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
493 length = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
494 while ((c[offset] == (unsigned char )255) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
495 (length < t->private_size)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
496 length += 255;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
497 offset++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
498 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
499 if (offset >= (t->private_size - 1)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
500 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track does not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
501 "contain valid headers.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
502 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
503 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
504 length += c[offset];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
505 offset++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
506 t->header_sizes[i] = length;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
507 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
508
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
509 t->headers[0] = &c[offset];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
510 t->headers[1] = &c[offset + t->header_sizes[0]];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
511 t->headers[2] = &c[offset + t->header_sizes[0] +
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
512 t->header_sizes[1]];
10079
7c13793dbfa0 Vorbis header packet lengths were calculated incorrectly.
mosu
parents: 10073
diff changeset
513 t->header_sizes[2] = t->private_size - offset -
7c13793dbfa0 Vorbis header packet lengths were calculated incorrectly.
mosu
parents: 10073
diff changeset
514 t->header_sizes[0] - t->header_sizes[1];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
515
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
516 t->a_formattag = 0xFFFE;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
517 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
518 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
519 "codec ID '%s' for track %u.\n", t->codec_id, t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
520 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
521 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
522 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
523
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
524 if (t->a_sfreq == 0.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
525 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The sampling frequency was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
526 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
527 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
528 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
529
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
530 if (t->a_channels == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
531 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The number of channels was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
532 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
533 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
534 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
535
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
536 if (t->a_formattag == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
537 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The audio format tag was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
538 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
539 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
540 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
541
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
542 // This track seems to be ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
543 t->ok = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
544
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
545 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
546
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
547 case 's': // Text subtitles do not need any data
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
548 t->ok = 1; // except the CodecID.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
549 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
550
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
551 default: // unknown track type!? error in demuxer...
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
552 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Error in demux_mkv.cpp: unknown "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
553 "demuxer type for track %u: '%c'\n", t->tnum, t->type);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
554 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
555 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
556
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
557 if (t->ok)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
558 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Track %u seems to be ok.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
559 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
560
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
561 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
562 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
563
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
564 static void free_mkv_demuxer(mkv_demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
565 int i;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
566
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
567 if (d == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
568 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
569
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
570 for (i = 0; i < d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
571 if (d->tracks[i] != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
572 if (d->tracks[i]->private_data != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
573 free(d->tracks[i]->private_data);
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
574 if (d->tracks[i]->language != NULL)
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
575 free(d->tracks[i]->language);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
576 free(d->tracks[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
577 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
578
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
579 for (i = 0; i < d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
580 free(d->index[i].entries);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
581 free(d->index);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
582
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
583 if (d->es != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
584 delete d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
585 if (d->saved_l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
586 delete d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
587 if (d->in != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
588 delete d->in;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
589 if (d->segment != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
590 delete d->segment;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
591
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
592 free(d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
593 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
594
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
595 static void add_index_entry(mkv_demuxer_t *d, uint32_t tnum, uint64_t filepos,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
596 uint64_t timecode, int is_key) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
597 int i, found;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
598 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
599
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
600 for (i = 0, found = 0; i < d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
601 if (d->index[i].tnum == tnum) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
602 found = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
603 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
604 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
605
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
606 if (!found) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
607 d->index = (mkv_track_index_t *)realloc(d->index, (d->num_indexes + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
608 sizeof(mkv_track_index_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
609 if (d->index == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
610 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
611 i = d->num_indexes;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
612 memset(&d->index[i], 0, sizeof(mkv_track_index_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
613 d->index[i].tnum = tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
614 d->num_indexes++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
615 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
616
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
617 d->index[i].entries =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
618 (mkv_index_entry_t *)realloc(d->index[i].entries,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
619 (d->index[i].num_entries + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
620 sizeof(mkv_index_entry_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
621 if (d->index[i].entries == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
622 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
623 entry = &d->index[i].entries[d->index[i].num_entries];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
624 entry->filepos = filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
625 entry->timecode = timecode;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
626 entry->is_key = is_key;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
627 d->index[i].num_entries++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
628 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
629
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
630 static void add_cluster_position(mkv_demuxer_t *mkv_d, int64_t position) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
631 mkv_d->cluster_positions = (int64_t *)realloc(mkv_d->cluster_positions,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
632 (mkv_d->num_cluster_pos + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
633 sizeof(int64_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
634 if (mkv_d->cluster_positions != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
635 mkv_d->cluster_positions[mkv_d->num_cluster_pos] = position;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
636 mkv_d->num_cluster_pos++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
637 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
638 mkv_d->num_cluster_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
639 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
640
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
641 static int parse_cues(mkv_demuxer_t *mkv_d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
642 EbmlElement *l1 = NULL, *l2 = NULL, *l3 = NULL, *l4 = NULL, *l5 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
643 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
644 int upper_lvl_el, elements_found, i, k;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
645 uint64_t tc_scale, filepos = 0, timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
646 uint32_t tnum = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
647 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
648
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
649 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
650 tc_scale = mkv_d->tc_scale;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
651 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
652
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
653 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
654
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
655 l1 = es->FindNextElement(mkv_d->segment->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
656 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
657 if (l1 == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
658 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
659
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
660 if (!(EbmlId(*l1) == KaxCues::ClassInfos.GlobalId)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
661 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] No KaxCues element found but but %s.\n"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
662 "[mkv] \\---- [ parsing cues ] -----------\n", typeid(*l1).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
663
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
664 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
665 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
666
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
667 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cues\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
668
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
669 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el, 0xFFFFFFFFL,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
670 true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
671 while (l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
672 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
673 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
674
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
675 if (EbmlId(*l2) == KaxCuePoint::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
676 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue point\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
677
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
678 elements_found = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
679
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
680 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
681 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
682 while (l3 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
683 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
684 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
685
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
686 if (EbmlId(*l3) == KaxCueTime::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
687 KaxCueTime &cue_time = *static_cast<KaxCueTime *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
688 cue_time.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
689 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue time: %.3fs\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
690 ((float)uint64(cue_time)) * tc_scale / 1000000000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
691
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
692 timecode = uint64(cue_time) * tc_scale / 1000000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
693 elements_found |= 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
694
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
695 } else if (EbmlId(*l3) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
696 KaxCueTrackPositions::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
697 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
698 "positions\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
699
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
700 l4 = es->FindNextElement(l3->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
701 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
702 while (l4 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
703 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
704 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
705
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
706 if (EbmlId(*l4) == KaxCueTrack::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
707 KaxCueTrack &cue_track = *static_cast<KaxCueTrack *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
708 cue_track.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
709 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue track: "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
710 "%u\n", uint32(cue_track));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
711
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
712 tnum = uint32(cue_track);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
713 elements_found |= 2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
714
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
715 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
716 KaxCueClusterPosition::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
717 KaxCueClusterPosition &cue_cp =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
718 *static_cast<KaxCueClusterPosition *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
719 cue_cp.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
720 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue cluster "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
721 "position: %llu\n", uint64(cue_cp));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
722
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
723 filepos = mkv_d->segment->GetGlobalPosition(uint64_t(cue_cp));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
724 elements_found |= 4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
725
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
726 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
727 KaxCueBlockNumber::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
728 KaxCueBlockNumber &cue_bn =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
729 *static_cast<KaxCueBlockNumber *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
730 cue_bn.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
731 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue block "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
732 "number: %llu\n", uint64(cue_bn));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
733
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
734 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
735 KaxCueCodecState::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
736 KaxCueCodecState &cue_cs =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
737 *static_cast<KaxCueCodecState *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
738 cue_cs.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
739 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue codec "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
740 "state: %llu\n", uint64(cue_cs));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
741
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
742 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
743 KaxCueReference::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
744 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
745 "reference\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
746
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
747 elements_found |= 8;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
748
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
749 l5 = es->FindNextElement(l4->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
750 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
751 while (l5 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
752 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
753 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
754
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
755 if (EbmlId(*l5) == KaxCueRefTime::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
756 KaxCueRefTime &cue_rt =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
757 *static_cast<KaxCueRefTime *>(l5);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
758 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue ref "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
759 "time: %.3fs\n", ((float)uint64(cue_rt)) * tc_scale /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
760 1000000000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
761
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
762 } else if (EbmlId(*l5) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
763 KaxCueRefCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
764 KaxCueRefCluster &cue_rc =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
765 *static_cast<KaxCueRefCluster *>(l5);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
766 cue_rc.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
767 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue ref "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
768 "cluster: %llu\n", uint64(cue_rc));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
769
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
770 } else if (EbmlId(*l5) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
771 KaxCueRefNumber::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
772 KaxCueRefNumber &cue_rn =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
773 *static_cast<KaxCueRefNumber *>(l5);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
774 cue_rn.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
775 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue ref "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
776 "number: %llu\n", uint64(cue_rn));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
777
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
778 } else if (EbmlId(*l5) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
779 KaxCueRefCodecState::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
780 KaxCueRefCodecState &cue_rcs =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
781 *static_cast<KaxCueRefCodecState *>(l5);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
782 cue_rcs.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
783 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue ref "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
784 "codec state: %llu\n", uint64(cue_rcs));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
785
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
786 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
787 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + unknown "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
788 "element, level 5: %s\n", typeid(*l5).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
789 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
790
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
791 l5->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
792 l5->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
793 delete l5;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
794 l5 = es->FindNextElement(l4->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
795 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
796 } // while (l5 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
797
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
798 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
799 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + unknown element, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
800 "level 4: %s\n", typeid(*l4).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
801
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
802 if (upper_lvl_el > 0) { // we're coming from l5
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
803 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
804 delete l4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
805 l4 = l5;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
806 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
807 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
808
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
809 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
810 l4->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
811 l4->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
812 delete l4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
813 l4 = es->FindNextElement(l3->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
814 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
815 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
816 } // while (l4 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
817
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
818 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
819 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + unknown element, level 3: "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
820 "%s\n", typeid(*l3).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
821
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
822 if (upper_lvl_el > 0) { // we're coming from l4
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
823 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
824 delete l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
825 l3 = l4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
826 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
827 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
828
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
829 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
830 l3->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
831 l3->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
832 delete l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
833 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
834 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
835 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
836 } // while (l3 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
837
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
838 // Three elements must have been found in order for this to be a
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
839 // correct entry:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
840 // 1: cue time (timecode)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
841 // 2: cue track (tnum)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
842 // 4: cue cluster position (filepos)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
843 // If 8 is also set, then there was a reference element, and the
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
844 // current block is not an I frame. If 8 is not set then this is
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
845 // an I frame.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
846 if ((elements_found & 7) == 7)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
847 add_index_entry(mkv_d, tnum, filepos, timecode,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
848 (elements_found & 8) ? 0 : 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
849
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
850 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
851 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + unknown element, level 2: "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
852 "%s\n", typeid(*l2).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
853
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
854 if (upper_lvl_el > 0) { // we're coming from l3
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
855 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
856 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
857 l2 = l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
858 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
859 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
860
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
861 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
862 l2->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
863 l2->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
864 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
865 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
866 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
867 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
868 } // while (l2 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
869
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
870 // Debug: dump the index
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
871 for (i = 0; i < mkv_d->num_indexes; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
872 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] Index for track %u contains %u "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
873 "entries.\n", mkv_d->index[i].tnum, mkv_d->index[i].num_entries);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
874 for (k = 0; k < mkv_d->index[i].num_entries; k++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
875 entry = &mkv_d->index[i].entries[k];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
876 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] %d: timecode %llu, filepos %llu, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
877 "is key: %s\n", k, entry->timecode, entry->filepos,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
878 entry->is_key ? "yes" : "no");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
879 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
880 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
881
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
882 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
883
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
884 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
885 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
886
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
887 extern "C" int demux_mkv_open(demuxer_t *demuxer) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
888 unsigned char signature[4];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
889 stream_t *s;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
890 demux_packet_t *dp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
891 mkv_demuxer_t *mkv_d;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
892 int upper_lvl_el, exit_loop, i;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
893 // Elements for different levels
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
894 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL, *l3 = NULL, *l4 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
895 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
896 mkv_track_t *track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
897 sh_audio_t *sh_a;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
898 sh_video_t *sh_v;
10149
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
899 uint64_t seek_pos, current_pos, cues_pos;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
900 int seek_element_is_cue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
901
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
902 #ifdef USE_ICONV
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
903 subcp_open();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
904 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
905
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
906 s = demuxer->stream;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
907 stream_seek(s, s->start_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
908 memset(signature, 0, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
909 stream_read(s, (char *)signature, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
910 if ((signature[0] != 0x1A) || (signature[1] != 0x45) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
911 (signature[2] != 0xDF) || (signature[3] != 0xA3))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
912 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
913 stream_seek(s, s->start_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
914
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
915 try {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
916 // structure for storing the demuxer's private data
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
917 mkv_d = (mkv_demuxer_t *)malloc(sizeof(mkv_demuxer_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
918 if (mkv_d == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
919 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
920 memset(mkv_d, 0, sizeof(mkv_demuxer_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
921 mkv_d->duration = -1.0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
922
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
923 // Create the interface between MPlayer's IO system and
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
924 // libmatroska's IO system.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
925 mkv_d->in = new mpstream_io_callback(demuxer->stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
926 if (mkv_d->in == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
927 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
928 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
929 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
930 mpstream_io_callback &io = *static_cast<mpstream_io_callback *>(mkv_d->in);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
931 mkv_d->es = new EbmlStream(io);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
932 if (mkv_d->es == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
933 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
934 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
935 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
936 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
937
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
938 // Find the EbmlHead element. Must be the first one.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
939 l0 = es->FindNextID(EbmlHead::ClassInfos, 0xFFFFFFFFL);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
940 if (l0 == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
941 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] no head found\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
942 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
943 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
944 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
945 // Don't verify its data for now.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
946 l0->SkipData(static_cast<EbmlStream &>(*es), l0->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
947 delete l0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
948 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
949
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
950 // Next element must be a segment
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
951 l0 = es->FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFL);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
952 if (l0 == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
953 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
954 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
955 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
956 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
957 if (!(EbmlId(*l0) == KaxSegment::ClassInfos.GlobalId)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
958 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
959 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
960 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
961 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
962 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
963
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
964 mkv_d->segment = (KaxSegment *)l0;
10149
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
965 mkv_d->tc_scale = MKVD_TIMECODESCALE;
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
966 cues_pos = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
967
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
968 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
969 exit_loop = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
970 // We've got our segment, so let's find the tracks
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
971 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el, 0xFFFFFFFFL,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
972 true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
973 while (l1 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
974 if ((upper_lvl_el != 0) || exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
975 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
976
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
977 if (EbmlId(*l1) == KaxInfo::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
978 // General info about this Matroska file
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
979 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
980
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
981 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
982 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
983 while (l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
984 if ((upper_lvl_el != 0) || exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
985 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
986
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
987 if (EbmlId(*l2) == KaxTimecodeScale::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
988 KaxTimecodeScale &tc_scale = *static_cast<KaxTimecodeScale *>(l2);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
989 tc_scale.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
990 mkv_d->tc_scale = uint64(tc_scale);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
991 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + timecode scale: %llu\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
992 mkv_d->tc_scale);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
993
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
994 } else if (EbmlId(*l2) == KaxDuration::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
995 KaxDuration &duration = *static_cast<KaxDuration *>(l2);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
996 duration.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
997 mkv_d->duration = float(duration) * mkv_d->tc_scale / 1000000000.0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
998 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3fs\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
999 mkv_d->duration);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1000
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1001 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1002 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown element@2: %s\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1003 typeid(*l2).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1004
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1005 l2->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1006 l2->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1007 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1008 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1009 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1010 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1011
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1012 } else if (EbmlId(*l1) == KaxTracks::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1013 // Yep, we've found our KaxTracks element. Now find all tracks
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1014 // contained in this segment.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1015 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1016
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1017 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1018 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1019 while (l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1020 if ((upper_lvl_el != 0) || exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1021 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1022
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1023 if (EbmlId(*l2) == KaxTrackEntry::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1024 // We actually found a track entry :) We're happy now.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1025 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1026
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1027 track = new_mkv_track(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1028 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1029 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1030
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1031 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1032 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1033 while (l3 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1034 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1035 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1036
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1037 // Now evaluate the data belonging to this track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1038 if (EbmlId(*l3) == KaxTrackNumber::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1039 KaxTrackNumber &tnum = *static_cast<KaxTrackNumber *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1040 tnum.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1041 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1042 uint32(tnum));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1043 track->tnum = uint32(tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1044 if (find_track_by_num(mkv_d, track->tnum, track) != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1045 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] | + WARNING: There's "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1046 "more than one track with the number %u.\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1047 track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1048
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1049 } else if (EbmlId(*l3) == KaxTrackUID::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1050 KaxTrackUID &tuid = *static_cast<KaxTrackUID *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1051 tuid.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1052 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track UID: %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1053 uint32(tuid));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1054
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1055 } else if (EbmlId(*l3) == KaxTrackType::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1056 KaxTrackType &ttype = *static_cast<KaxTrackType *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1057 ttype.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1058 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1059
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1060 switch (uint8(ttype)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1061 case track_audio:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1062 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1063 track->type = 'a';
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1064 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1065 case track_video:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1066 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1067 track->type = 'v';
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1068 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1069 case track_subtitle:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1070 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1071 track->type = 's';
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1072 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1073 default:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1074 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1075 track->type = '?';
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1076 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1077 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1078
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1079 } else if (EbmlId(*l3) == KaxTrackAudio::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1080 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1081 l4 = es->FindNextElement(l3->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1082 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1083 while (l4 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1084 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1085 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1086
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1087 if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1088 KaxAudioSamplingFreq::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1089 KaxAudioSamplingFreq &freq =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1090 *static_cast<KaxAudioSamplingFreq*>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1091 freq.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1092 track->a_sfreq = float(freq);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1093 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Sampling "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1094 "frequency: %f\n", track->a_sfreq);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1095
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1096 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1097 KaxAudioChannels::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1098 KaxAudioChannels &channels =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1099 *static_cast<KaxAudioChannels*>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1100 channels.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1101 track->a_channels = uint8(channels);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1102 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1103 track->a_channels);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1104
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1105 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1106 KaxAudioBitDepth::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1107 KaxAudioBitDepth &bps =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1108 *static_cast<KaxAudioBitDepth*>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1109 bps.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1110 track->a_bps = uint8(bps);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1111 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1112 track->a_bps);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1113
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1114 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1115 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1116 "element@4: %s\n", typeid(*l4).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1117
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1118 l4->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1119 l4->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1120 delete l4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1121 l4 = es->FindNextElement(l3->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1122 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1123 } // while (l4 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1124
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1125 } else if (EbmlId(*l3) == KaxTrackVideo::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1126 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1127 l4 = es->FindNextElement(l3->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1128 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1129 while (l4 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1130 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1131 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1132
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1133 if (EbmlId(*l4) == KaxVideoPixelWidth::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1134 KaxVideoPixelWidth &width =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1135 *static_cast<KaxVideoPixelWidth *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1136 width.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1137 track->v_width = uint16(width);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1138 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1139 track->v_width);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1140
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1141 } else if (EbmlId(*l4) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1142 KaxVideoPixelHeight::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1143 KaxVideoPixelHeight &height =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1144 *static_cast<KaxVideoPixelHeight *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1145 height.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1146 track->v_height = uint16(height);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1147 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1148 "%u\n", track->v_height);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1149
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1150 } else if (EbmlId(*l4) ==
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1151 KaxVideoDisplayWidth::ClassInfos.GlobalId) {
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1152 KaxVideoDisplayWidth &width =
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1153 *static_cast<KaxVideoDisplayWidth *>(l4);
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1154 width.ReadData(es->I_O());
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1155 track->v_dwidth = uint16(width);
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1156 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: "
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1157 "%u\n", track->v_dwidth);
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1158
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1159 } else if (EbmlId(*l4) ==
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1160 KaxVideoDisplayHeight::ClassInfos.GlobalId) {
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1161 KaxVideoDisplayHeight &height =
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1162 *static_cast<KaxVideoDisplayHeight *>(l4);
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1163 height.ReadData(es->I_O());
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1164 track->v_dheight = uint16(height);
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1165 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: "
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1166 "%u\n", track->v_dheight);
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1167
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1168 } else if (EbmlId(*l4) ==
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1169 KaxVideoFrameRate::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1170 KaxVideoFrameRate &framerate =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1171 *static_cast<KaxVideoFrameRate *>(l4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1172 framerate.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1173 track->v_frate = float(framerate);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1174 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1175 float(framerate));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1176
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1177 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1178 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1179 "element@4: %s\n", typeid(*l4).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1180
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1181 l4->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1182 l4->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1183 delete l4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1184 l4 = es->FindNextElement(l3->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1185 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1186 } // while (l4 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1187
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1188 } else if (EbmlId(*l3) == KaxCodecID::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1189 KaxCodecID &codec_id = *static_cast<KaxCodecID*>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1190 codec_id.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1191 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1192 &binary(codec_id));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1193 track->codec_id = strdup((char *)&binary(codec_id));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1194
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1195 } else if (EbmlId(*l3) == KaxCodecPrivate::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1196 KaxCodecPrivate &c_priv = *static_cast<KaxCodecPrivate*>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1197 c_priv.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1198 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1199 "%llu\n", c_priv.GetSize());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1200 track->private_size = c_priv.GetSize();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1201 if (track->private_size > 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1202 track->private_data = malloc(track->private_size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1203 if (track->private_data == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1204 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1205 memcpy(track->private_data, c_priv.GetBuffer(),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1206 track->private_size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1207 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1208
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1209 } else if (EbmlId(*l3) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1210 KaxTrackFlagDefault::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1211 KaxTrackFlagDefault &f_default =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1212 *static_cast<KaxTrackFlagDefault *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1213 f_default.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1214 track->default_track = uint32(f_default);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1215 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1216 track->default_track);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1217
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1218 } else if (EbmlId(*l3) ==
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1219 KaxTrackLanguage::ClassInfos.GlobalId) {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1220 KaxTrackLanguage &language =
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1221 *static_cast<KaxTrackLanguage *>(l3);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1222 language.ReadData(es->I_O());
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1223 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1224 string(language).c_str());
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1225 if (track->language != NULL)
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1226 free(track->language);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1227 track->language = strdup(string(language).c_str());
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1228
10029
2d31643a3c22 Fixes for gcc 3.2
mosu
parents: 10028
diff changeset
1229 } else if ((!(EbmlId(*l3) ==
2d31643a3c22 Fixes for gcc 3.2
mosu
parents: 10028
diff changeset
1230 KaxTrackFlagLacing::ClassInfos.GlobalId)) &&
2d31643a3c22 Fixes for gcc 3.2
mosu
parents: 10028
diff changeset
1231 (!(EbmlId(*l3) ==
2d31643a3c22 Fixes for gcc 3.2
mosu
parents: 10028
diff changeset
1232 KaxTrackMinCache::ClassInfos.GlobalId)) &&
2d31643a3c22 Fixes for gcc 3.2
mosu
parents: 10028
diff changeset
1233 (!(EbmlId(*l3) ==
2d31643a3c22 Fixes for gcc 3.2
mosu
parents: 10028
diff changeset
1234 KaxTrackMaxCache::ClassInfos.GlobalId)))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1235 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown element@3: "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1236 "%s\n", typeid(*l3).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1237
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1238 if (upper_lvl_el > 0) { // we're coming from l4
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1239 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1240 delete l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1241 l3 = l4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1242 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1243 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1244 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1245 l3->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1246 l3->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1247 delete l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1248 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1249 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1250 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1251 } // while (l3 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1252
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1253 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1254 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown element@2: %s\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1255 typeid(*l2).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1256 if (upper_lvl_el > 0) { // we're coming from l3
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1257 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1258 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1259 l2 = l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1260 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1261 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1262 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1263 l2->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1264 l2->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1265 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1266 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1267 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1268 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1269 } // while (l2 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1270
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1271 } else if (EbmlId(*l1) == KaxSeekHead::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1272 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found seek head\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1273
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1274 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1275 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1276 while (l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1277 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1278 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1279
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1280 if (EbmlId(*l2) == KaxSeek::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1281 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + seek entry\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1282
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1283 seek_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1284 seek_element_is_cue = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1285
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1286 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1287 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1288 while (l3 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1289 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1290 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1291
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1292 if (EbmlId(*l3) == KaxSeekID::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1293 binary *b;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1294 int s;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1295 KaxSeekID &seek_id = static_cast<KaxSeekID &>(*l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1296 seek_id.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1297 b = seek_id.GetBuffer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1298 s = seek_id.GetSize();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1299 EbmlId id(b, s);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1300 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + seek ID: ");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1301 for (i = 0; i < s; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1302 mp_msg(MSGT_DEMUX, MSGL_V, "0x%02x ",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1303 ((unsigned char *)b)[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1304 mp_msg(MSGT_DEMUX, MSGL_V, "(%s)\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1305 (id == KaxInfo::ClassInfos.GlobalId) ?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1306 "KaxInfo" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1307 (id == KaxCluster::ClassInfos.GlobalId) ?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1308 "KaxCluster" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1309 (id == KaxTracks::ClassInfos.GlobalId) ?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1310 "KaxTracks" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1311 (id == KaxCues::ClassInfos.GlobalId) ?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1312 "KaxCues" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1313 (id == KaxAttachements::ClassInfos.GlobalId) ?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1314 "KaxAttachements" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1315 (id == KaxChapters::ClassInfos.GlobalId) ?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1316 "KaxChapters" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1317 "unknown");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1318
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1319 if (id == KaxCues::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1320 seek_element_is_cue = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1321
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1322 } else if (EbmlId(*l3) == KaxSeekPosition::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1323 KaxSeekPosition &kax_seek_pos =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1324 static_cast<KaxSeekPosition &>(*l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1325 kax_seek_pos.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1326 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + seek position: %llu\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1327 uint64(kax_seek_pos));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1328
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1329 seek_pos = uint64(kax_seek_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1330
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1331 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1332 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown element, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1333 "level 3: %s\n", typeid(*l3).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1334
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1335 l3->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1336 l3->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1337 delete l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1338 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1339 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1340 } // while (l3 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1341
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1342 if (!mkv_d->cues_found && (seek_pos > 0) &&
10149
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1343 seek_element_is_cue && (s->end_pos != 0))
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1344 cues_pos = mkv_d->segment->GetGlobalPosition(seek_pos);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1345
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1346 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1347 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + unknown element, level 2: "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1348 "%s\n", typeid(*l2).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1349
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1350 if (upper_lvl_el > 0) { // we're coming from l3
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1351 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1352 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1353 l2 = l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1354 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1355 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1356
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1357 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1358 l2->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1359 l2->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1360 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1361 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1362 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1363 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1364 } // while (l2 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1365
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1366 } else if ((EbmlId(*l1) == KaxCues::ClassInfos.GlobalId) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1367 !mkv_d->cues_found) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1368 // If the cues are up front then by all means read them now!
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1369 current_pos = io.getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1370 io.setFilePointer(l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1371 mkv_d->cues_found = parse_cues(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1372 stream_reset(s);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1373 io.setFilePointer(current_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1374
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1375 } else if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1376 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cluster, headers are "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1377 "parsed completely :)\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1378 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1379 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1380 exit_loop = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1381
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1382 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1383 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ unknown element@1: %s\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1384 typeid(*l1).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1385
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1386 if (exit_loop) // we've found the first cluster, so get out
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1387 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1388
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1389 if (upper_lvl_el > 0) { // we're coming from l2
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1390 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1391 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1392 l1 = l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1393 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1394 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1395 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1396 l1->SkipData(static_cast<EbmlStream &>(*es), l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1397 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1398 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1399 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1400 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1401 } // while (l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1402
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1403 if (!exit_loop) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1404 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1405 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1406 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1407
10149
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1408 // If we have found an entry for the cues in the meta seek data but no
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1409 // cues at the front of the file then read them now. This way the
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1410 // timecode scale will have been initialized correctly.
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1411 if (cues_pos && !mkv_d->cues_found) {
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1412 current_pos = io.getFilePointer();
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1413 io.setFilePointer(cues_pos);
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1414 mkv_d->cues_found = parse_cues(mkv_d);
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1415 if (s->eof)
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1416 stream_reset(s);
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1417 io.setFilePointer(current_pos);
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1418 }
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1419
bb1d5c054148 Delayed the parsing of the cues for the case that the KaxInfos (and therefore the timecode scale) is located after the meta seek stuff.
mosu
parents: 10133
diff changeset
1420
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1421 } catch (exception &ex) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1422 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] caught exception\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1423 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1424 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1425
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1426 if (!check_track_information(mkv_d)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1427 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1428 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1429 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1430
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1431 track = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1432 if (demuxer->video->id == -1) { // Automatically select a video track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1433 // Search for a video track that has the 'default' flag set.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1434 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1435 if ((mkv_d->tracks[i]->type == 'v') && mkv_d->tracks[i]->ok &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1436 mkv_d->tracks[i]->default_track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1437 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1438 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1439 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1440
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1441 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1442 // No track has the 'default' flag set - let's take the first video
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1443 // track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1444 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1445 if ((mkv_d->tracks[i]->type == 'v') && mkv_d->tracks[i]->ok) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1446 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1447 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1448 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1449 } else if (demuxer->video->id != -2) // -2 = no video at all
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1450 track = find_track_by_num(mkv_d, demuxer->video->id, NULL);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1451
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1452 if (track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1453 if (track->ms_compat) { // MS compatibility mode
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1454 BITMAPINFOHEADER *src, *dst;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1455 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1456 track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1457 sh_v = new_sh_video(demuxer, track->tnum);
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1458 sh_v->bih = (BITMAPINFOHEADER *)calloc(1, track->private_size);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1459 if (sh_v->bih == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1460 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1461 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1462 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1463
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1464 dst = sh_v->bih;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1465 src = (BITMAPINFOHEADER *)track->private_data;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1466 dst->biSize = get_uint32(&src->biSize);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1467 dst->biWidth = get_uint32(&src->biWidth);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1468 dst->biHeight = get_uint32(&src->biHeight);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1469 dst->biPlanes = get_uint16(&src->biPlanes);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1470 dst->biBitCount = get_uint16(&src->biBitCount);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1471 dst->biCompression = get_uint32(&src->biCompression);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1472 dst->biSizeImage = get_uint32(&src->biSizeImage);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1473 dst->biXPelsPerMeter = get_uint32(&src->biXPelsPerMeter);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1474 dst->biYPelsPerMeter = get_uint32(&src->biYPelsPerMeter);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1475 dst->biClrUsed = get_uint32(&src->biClrUsed);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1476 dst->biClrImportant = get_uint32(&src->biClrImportant);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1477 memcpy((char *)dst + sizeof(BITMAPINFOHEADER),
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1478 (char *)src + sizeof(BITMAPINFOHEADER),
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1479 track->private_size - sizeof(BITMAPINFOHEADER));
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1480
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1481 sh_v->format = sh_v->bih->biCompression;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1482 sh_v->fps = track->v_frate;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1483 sh_v->frametime = 1 / track->v_frate;
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1484 sh_v->disp_w = track->v_width;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1485 sh_v->disp_h = track->v_height;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1486 sh_v->aspect = (float)track->v_dwidth / (float)track->v_dheight;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1487 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1488
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1489 demuxer->video->id = track->tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1490 demuxer->video->sh = sh_v;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1491 sh_v->ds = demuxer->video;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1492
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1493 mkv_d->video = track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1494 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1495 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Native CodecIDs not supported at "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1496 "the moment (track %u).\n", track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1497 demuxer->video->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1498 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1499 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1500 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1501 demuxer->video->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1502 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1503
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1504 track = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1505 if (demuxer->audio->id == -1) { // Automatically select an audio track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1506 // Search for an audio track that has the 'default' flag set.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1507 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1508 if ((mkv_d->tracks[i]->type == 'a') && mkv_d->tracks[i]->ok &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1509 mkv_d->tracks[i]->default_track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1510 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1511 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1512 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1513
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1514 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1515 // No track has the 'default' flag set - let's take the first audio
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1516 // track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1517 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1518 if ((mkv_d->tracks[i]->type == 'a') && mkv_d->tracks[i]->ok) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1519 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1520 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1521 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1522 } else if (demuxer->audio->id != -2) // -2 = no audio at all
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1523 track = find_track_by_num(mkv_d, demuxer->audio->id, NULL);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1524
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1525 if (track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1526 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play audio track %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1527 track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1528 sh_a = new_sh_audio(demuxer, track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1529
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1530 demuxer->audio->id = track->tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1531 demuxer->audio->sh = sh_a;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1532 sh_a->ds = demuxer->audio;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1533
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1534 mkv_d->audio = track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1535
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1536 if (track->ms_compat) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1537 sh_a->wf = (WAVEFORMATEX *)calloc(1, track->private_size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1538 if (sh_a->wf == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1539 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1540 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1541 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1542 memcpy(sh_a->wf, track->private_data, track->private_size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1543 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1544 sh_a->wf = (WAVEFORMATEX *)calloc(1, sizeof(WAVEFORMATEX));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1545 if (sh_a->wf == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1546 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1547 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1548 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1549 }
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1550 sh_a->format = track->a_formattag;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1551 sh_a->wf->wFormatTag = track->a_formattag;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1552 sh_a->channels = sh_a->wf->nChannels = track->a_channels;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1553 sh_a->samplerate = sh_a->wf->nSamplesPerSec = (uint32_t)track->a_sfreq;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1554 if (!strcmp(track->codec_id, MKV_A_MP3)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1555 sh_a->wf->nAvgBytesPerSec = 16000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1556 sh_a->wf->nBlockAlign = 1152;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1557 sh_a->wf->wBitsPerSample = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1558 sh_a->samplesize = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1559 } else if (!strcmp(track->codec_id, MKV_A_AC3)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1560 sh_a->wf->nAvgBytesPerSec = 16000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1561 sh_a->wf->nBlockAlign = 1536;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1562 sh_a->wf->wBitsPerSample = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1563 sh_a->samplesize = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1564 } else if (!strcmp(track->codec_id, MKV_A_PCM)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1565 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1566 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1567 sh_a->wf->wBitsPerSample = track->a_bps;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1568 sh_a->samplesize = track->a_bps / 8;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1569 } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1570 int profile, srate_idx;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1571
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1572 sh_a->wf->nAvgBytesPerSec = 16000;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1573 sh_a->wf->nBlockAlign = 1024;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1574 sh_a->wf->wBitsPerSample = 0;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1575 sh_a->samplesize = 0;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1576
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1577 // Recreate the 'private data' which faad2 uses in its initialization.
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1578 // A_AAC/MPEG2/MAIN
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1579 // 0123456789012345
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1580 if (!strcmp(&track->codec_id[12], "MAIN"))
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1581 profile = 0;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1582 else if (!strcmp(&track->codec_id[12], "LC"))
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1583 profile = 1;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1584 else if (!strcmp(&track->codec_id[12], "SSR"))
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1585 profile = 2;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1586 else
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1587 profile = 3;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1588 if (92017 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1589 srate_idx = 0;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1590 else if (75132 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1591 srate_idx = 1;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1592 else if (55426 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1593 srate_idx = 2;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1594 else if (46009 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1595 srate_idx = 3;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1596 else if (37566 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1597 srate_idx = 4;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1598 else if (27713 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1599 srate_idx = 5;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1600 else if (23004 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1601 srate_idx = 6;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1602 else if (18783 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1603 srate_idx = 7;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1604 else if (13856 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1605 srate_idx = 8;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1606 else if (11502 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1607 srate_idx = 9;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1608 else if (9391 <= sh_a->samplerate)
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1609 srate_idx = 10;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1610 else
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1611 srate_idx = 11;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1612
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1613 sh_a->codecdata = (unsigned char *)calloc(1, 2);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1614 sh_a->codecdata_len = 2;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1615 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xe) >> 1);
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1616 sh_a->codecdata[1] = ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1617 } else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1618 for (i = 0; i < 3; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1619 dp = new_demux_packet(track->header_sizes[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1620 memcpy(dp->buffer, track->headers[i], track->header_sizes[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1621 dp->pts = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1622 dp->flags = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1623 ds_add_packet(demuxer->audio, dp);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1624 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1625 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1626 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1627 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1628 demuxer->audio->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1629 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1630
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1631 // DO NOT automatically select a subtitle track and behave like DVD
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1632 // playback: only show subtitles if the user explicitely wants them.
10073
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
1633 track = NULL;
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
1634 if (demuxer->sub->id >= 0)
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
1635 track = find_track_by_num(mkv_d, demuxer->sub->id, NULL);
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
1636 else if (dvdsub_lang != NULL)
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1637 track = find_track_by_language(mkv_d, dvdsub_lang, NULL);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1638 if (track) {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1639 if (strcmp(track->codec_id, MKV_S_TEXTASCII) &&
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1640 strcmp(track->codec_id, MKV_S_TEXTUTF8))
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1641 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Subtitle type '%s' is not "
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1642 "supported. Track will not be displayed.\n", track->codec_id);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1643 else {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1644 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will display subtitle track %u\n",
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1645 track->tnum);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1646 mkv_d->subs_track = track;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1647 if (!mkv_d->subs.text[0]) {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1648 for (i = 0; i < SUB_MAX_TEXT; i++)
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1649 mkv_d->subs.text[i] = (char *)malloc(256);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1650
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1651 if (!strcmp(track->codec_id, MKV_S_TEXTUTF8))
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1652 sub_utf8 = 1; // Force UTF-8 conversion.
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1653 } else
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1654 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] File does not contain a "
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1655 "subtitle track with the id %u.\n", demuxer->sub->id);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1656 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1657 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1658
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1659 if (s->end_pos == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1660 demuxer->seekable = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1661 else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1662 demuxer->movi_start = s->start_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1663 demuxer->movi_end = s->end_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1664 demuxer->seekable = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1665 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1666
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1667 demuxer->priv = mkv_d;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1668
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1669 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1670 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1671
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1672 extern "C" int demux_mkv_fill_buffer(demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1673 demux_packet_t *dp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1674 demux_stream_t *ds;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1675 mkv_demuxer_t *mkv_d;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1676 int upper_lvl_el, exit_loop, found_data, i, delete_element, elements_found;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1677 // Elements for different levels
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1678 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL, *l3 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1679 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1680 KaxBlock *block;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1681 int64_t block_duration, block_ref1, block_ref2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1682
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1683 mkv_d = (mkv_demuxer_t *)d->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1684 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1685 l0 = mkv_d->segment;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1686
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1687 // End of stream
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1688 if (mkv_d->saved_l1 == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1689 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1690
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1691 exit_loop = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1692 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1693 l1 = mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1694 mkv_d->saved_l1 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1695 found_data = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1696 try {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1697 // The idea is not to handle a complete KaxCluster with each call to
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1698 // demux_mkv_fill_buffer because those might be rather big.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1699 while (l1 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1700 if ((upper_lvl_el != 0) || exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1701 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1702
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1703 if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1704 mkv_d->cluster = (KaxCluster *)l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1705 if (found_data) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1706 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1707 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1708 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1709
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1710 if (mkv_d->saved_l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1711 l2 = mkv_d->saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1712 mkv_d->saved_l2 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1713 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1714 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1715 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1716 while (l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1717 if (upper_lvl_el != 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1718 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1719
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1720 // Handle at least one data packets in one call to
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1721 // demux_mkv_fill_buffer - but abort if we have found that.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1722 if (found_data >= 1) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1723 mkv_d->saved_l2 = l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1724 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1725 exit_loop = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1726 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1727 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1728
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1729 if (EbmlId(*l2) == KaxClusterTimecode::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1730 KaxClusterTimecode &ctc = *static_cast<KaxClusterTimecode *>(l2);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1731 ctc.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1732 mkv_d->cluster_tc = uint64(ctc);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1733 mkv_d->cluster->InitTimecode(mkv_d->cluster_tc);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1734
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1735 } else if (EbmlId(*l2) == KaxBlockGroup::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1736
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1737 block = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1738 block_duration = -1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1739 block_ref1 = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1740 block_ref2 = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1741 elements_found = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1742
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1743 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1744 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1745 while (l3 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1746 delete_element = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1747 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1748 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1749
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1750 if (EbmlId(*l3) == KaxBlock::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1751 block = static_cast<KaxBlock *>(l3);
10084
04dacb55d55d timecode scale value must be initialized before the duration is found. API change of libmatroska 0.4.2. Will not work with 0.4.1!
mosu
parents: 10081
diff changeset
1752 block->ReadData(es->I_O());
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1753 block->SetParent(*mkv_d->cluster);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1754 delete_element = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1755 elements_found |= 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1756
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1757 } else if (EbmlId(*l3) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1758 KaxBlockDuration::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1759 KaxBlockDuration &duration =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1760 *static_cast<KaxBlockDuration *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1761 duration.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1762 block_duration = (int64_t)uint64(duration);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1763 elements_found |= 2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1764
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1765 } else if (EbmlId(*l3) ==
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1766 KaxReferenceBlock::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1767 KaxReferenceBlock &ref =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1768 *static_cast<KaxReferenceBlock *>(l3);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1769 ref.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1770 if (block_ref1 == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1771 block_ref1 = int64(ref);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1772 elements_found |= 4;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1773 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1774 block_ref2 = int64(ref);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1775 elements_found |= 8;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1776 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1777
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1778 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1779
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1780 l3->SkipData(static_cast<EbmlStream &>(*es),
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1781 l3->Generic().Context);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1782 if (delete_element)
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1783 delete l3;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1784 l3 = es->FindNextElement(l2->Generic().Context, upper_lvl_el,
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1785 0xFFFFFFFFL, true, 1);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1786 } // while (l3 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1787
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1788 if (block != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1789 // Clear the subtitles if they're obsolete now.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1790 if ((mkv_d->clear_subs_at > 0) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1791 (mkv_d->clear_subs_at <=
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1792 (block->GlobalTimecode() / 1000000))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1793 mkv_d->subs.lines = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1794 vo_sub = &mkv_d->subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1795 vo_osd_changed(OSDTYPE_SUBTITLE);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1796 mkv_d->clear_subs_at = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1797 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1798
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1799 ds = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1800 if ((mkv_d->video != NULL) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1801 (mkv_d->video->tnum == block->TrackNum()))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1802 ds = d->video;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1803 else if ((mkv_d->audio != NULL) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1804 (mkv_d->audio->tnum == block->TrackNum()))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1805 ds = d->audio;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1806
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1807 if (!mkv_d->skip_to_keyframe || // Not skipping is ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1808 (((elements_found & 4) == 0) && // It's a key frame.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1809 (ds != NULL) && // Corresponding track found
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1810 (ds == d->video))) { // track is our video track
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1811 if ((ds != NULL) && ((block->GlobalTimecode() / 1000000) >=
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1812 (uint64_t)mkv_d->skip_to_timecode)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1813 for (i = 0; i < (int)block->NumberFrames(); i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1814 DataBuffer &data = block->GetBuffer(i);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1815 dp = new_demux_packet(data.Size());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1816 memcpy(dp->buffer, data.Buffer(), data.Size());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1817 dp->pts = mkv_d->last_pts;
10073
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
1818 dp->flags = (elements_found & 4) == 0 ? 1 : 0; // keyframe
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1819 ds_add_packet(ds, dp);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1820 found_data++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1821 }
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1822 mkv_d->skip_to_keyframe = 0;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1823 mkv_d->skip_to_timecode = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1824 } else if ((mkv_d->subs_track != NULL) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1825 (mkv_d->subs_track->tnum == block->TrackNum()))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1826 handle_subtitles(d, block, block_duration);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1827
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1828 d->filepos = mkv_d->in->getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1829 mkv_d->last_pts = (float)block->GlobalTimecode() /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1830 1000000000.0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1831 mkv_d->last_filepos = d->filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1832 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1833
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1834 delete block;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1835 } // block != NULL
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1836
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1837 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1838
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1839 if (upper_lvl_el > 0) { // we're coming from l3
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1840 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1841 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1842 l2 = l3;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1843 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1844 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1845 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1846 l2->SkipData(static_cast<EbmlStream &>(*es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1847 l2->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1848 delete l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1849 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1850 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1851 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1852 } // while (l2 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1853 } else if (EbmlId(*l1) == KaxCues::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1854 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1855 else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1856 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Unknown element@1: %s (stream "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1857 "position %llu)\n", typeid(*l1).name(),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1858 l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1859
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1860 if (exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1861 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1862
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1863 if (upper_lvl_el > 0) { // we're coming from l2
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1864 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1865 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1866 l1 = l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1867 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1868 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1869 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1870 l1->SkipData(static_cast<EbmlStream &>(*es), l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1871 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1872 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1873 0xFFFFFFFFL, true, 1);
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1874 if ((l1 != NULL) && (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1875 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1876 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1877 } // while (l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1878 } catch (exception ex) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1879 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] exception caught\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1880 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1881 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1882
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1883 if (found_data)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1884 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1885
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1886 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1887 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1888
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1889 extern "C" void resync_audio_stream(sh_audio_t *sh_audio);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1890
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1891 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1892 int flags) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1893 int i, k, upper_lvl_el;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1894 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1895 int64_t target_timecode, target_filepos = 0, min_diff, diff, current_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1896 int64_t cluster_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1897 mkv_track_index_t *index;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1898 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1899 EbmlElement *l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1900
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1901 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] SEEK, relss: %.3f, flags: %d\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1902 rel_seek_secs, flags);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1903
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1904 if (!mkv_d->cues_found && !mkv_d->cues_searched) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1905 // We've not found an index so far. So let's skip over all level 1
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1906 // elements until we either hit another segment, the end of the file
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1907 // or - suprise - some cues.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1908 current_pos = mkv_d->in->getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1909
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1910 // Skip the data but do not delete the element! This is our current
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1911 // cluster, and we need it later on in demux_mkv_fill_buffer.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1912 l1 = mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1913 l1->SkipData(static_cast<EbmlStream &>(*mkv_d->es), l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1914 l1 = mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1915 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1916 while (l1 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1917 if (upper_lvl_el)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1918 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1919
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1920 if (EbmlId(*l1) == KaxCues::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1921 mkv_d->in->setFilePointer(l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1922 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1923 mkv_d->cues_found = parse_cues(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1924 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1925 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1926 if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1927 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1928 l1->SkipData(static_cast<EbmlStream &>(*mkv_d->es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1929 l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1930 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1931 l1 = mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1932 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1933 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1934 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1935
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1936 if (demuxer->stream->eof)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1937 stream_reset(demuxer->stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1938 mkv_d->in->setFilePointer(current_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1939
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1940 mkv_d->cues_searched = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1941 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1942
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1943 if (!(flags & 2)) { // Time in secs
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1944 if (flags & 1) // Absolute seek
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1945 target_timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1946 else // Relative seek
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1947 target_timecode = (int64_t)(mkv_d->last_pts * 1000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1948 target_timecode += (int64_t)(rel_seek_secs * 1000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1949 if (target_timecode < 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1950 target_timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1951
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1952 min_diff = 0xFFFFFFFL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1953
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1954 // Let's find the entry in the index with the smallest difference
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1955 // to the wanted timecode.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1956 entry = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1957 for (i = 0; i < mkv_d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1958 if (mkv_d->index[i].tnum == mkv_d->video->tnum) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1959 index = &mkv_d->index[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1960 for (k = 0; k < index->num_entries; k++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1961 if (!index->entries[k].is_key)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1962 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1963 diff = target_timecode - (int64_t)index->entries[k].timecode;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1964 if (diff < 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1965 diff *= -1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1966 if (diff < min_diff) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1967 min_diff = diff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1968 entry = & index->entries[k];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1969 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1970 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1971 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1972 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1973
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1974 if (mkv_d->saved_l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1975 delete mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1976
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1977 if (mkv_d->saved_l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1978 delete mkv_d->saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1979 mkv_d->saved_l2 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1980 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1981
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1982 if (entry != NULL) { // We've found an entry.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1983 mkv_d->in->setFilePointer(entry->filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1984 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1985 mkv_d->saved_l1 =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1986 mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1987 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1988 } else { // We've not found an entry --> no index?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1989 target_filepos = (int64_t)(target_timecode * mkv_d->last_filepos /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1990 (mkv_d->last_pts * 1000.0));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1991 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] No index entry found. Calculated "
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1992 "filepos %lld. Old timecode %lld.\n", target_filepos,
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
1993 (int64_t)(mkv_d->last_pts * 1000.0));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1994 // Let's find the nearest cluster so that libebml does not have to
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1995 // do so much work.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1996 cluster_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1997 min_diff = 0x0FFFFFFFL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1998 for (i = 0; i < mkv_d->num_cluster_pos; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1999 diff = mkv_d->cluster_positions[i] - target_filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2000 if (rel_seek_secs < 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2001 if ((diff > 0) && (diff < min_diff)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2002 cluster_pos = mkv_d->cluster_positions[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2003 min_diff = diff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2004 }
10099
71d703e35ff3 Removed the abs function as someone reported compilation problems under MacOS.
mosu
parents: 10098
diff changeset
2005 } else if ((diff < 0 ? -1 * diff : diff) < min_diff) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2006 cluster_pos = mkv_d->cluster_positions[i];
10099
71d703e35ff3 Removed the abs function as someone reported compilation problems under MacOS.
mosu
parents: 10098
diff changeset
2007 min_diff = diff < 0 ? -1 * diff : diff;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2008 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2009 }
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2010 if (min_diff != 0x0FFFFFFFL) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2011 target_filepos = cluster_pos;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2012 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] New target_filepos because of "
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2013 "cluster: %lld.\n", target_filepos);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2014 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2015 if (target_filepos >= demuxer->movi_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2016 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2017 mkv_d->in->setFilePointer(target_filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2018 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2019 mkv_d->saved_l1 =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2020 mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2021 upper_lvl_el, 0xFFFFFFFFL, true, 1);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2022 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek result: target_timecode %lld, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2023 "did not find an entry. Calculated target_filspos: %lld\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2024 target_timecode, target_filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2025 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek found %p (%s).\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2026 mkv_d->saved_l1, mkv_d->saved_l1 == NULL ? "null" :
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2027 typeid(*mkv_d->saved_l1).name());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2028 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2029
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2030 if (mkv_d->video != NULL)
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2031 mkv_d->skip_to_keyframe = 1;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2032 if (rel_seek_secs > 0.0)
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2033 mkv_d->skip_to_timecode = target_timecode;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2034
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2035 demux_mkv_fill_buffer(demuxer);
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2036 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] New timecode: %lld\n",
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2037 (int64_t)(mkv_d->last_pts * 1000.0));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2038
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2039 mkv_d->subs.lines = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2040 vo_sub = &mkv_d->subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2041 vo_osd_changed(OSDTYPE_SUBTITLE);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2042 mkv_d->clear_subs_at = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2043
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2044 if(demuxer->audio->sh != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2045 resync_audio_stream((sh_audio_t *)demuxer->audio->sh);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2046
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2047 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2048 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2049
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2050 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2051
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2052 extern "C" void demux_close_mkv(demuxer_t *demuxer) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2053 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2054
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2055 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2056
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2057 #ifdef USE_ICONV
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2058 subcp_close();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2059 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2060 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2061
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2062 extern "C" int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2063 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2064
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2065 switch (cmd) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2066 case DEMUXER_CTRL_GET_TIME_LENGTH:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2067 if (mkv_d->duration == -1.0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2068 return DEMUXER_CTRL_DONTKNOW;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2069
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2070 *((unsigned long *)arg) = (unsigned long)mkv_d->duration;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2071 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2072
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2073 case DEMUXER_CTRL_GET_PERCENT_POS:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2074 if (mkv_d->duration == -1.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2075 if (demuxer->movi_start == demuxer->movi_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2076 return DEMUXER_CTRL_DONTKNOW;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2077
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2078 *((int *)arg) =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2079 (int)((demuxer->filepos - demuxer->movi_start) /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2080 ((demuxer->movi_end - demuxer->movi_start) / 100));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2081 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2082 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2083
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2084 *((int *)arg) = (int)(100 * mkv_d->last_pts / mkv_d->duration);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2085 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2086
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2087 default:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2088 return DEMUXER_CTRL_NOTIMPL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2089 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2090 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2091
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2092 #endif /* HAVE_MATROSKA */