annotate libmpdemux/demux_mkv_old.cpp @ 12314:c81c4930cadc

dvb_set_channel now has two parameters, patch by Nico Sabbi.
author diego
date Tue, 27 Apr 2004 07:21:35 +0000
parents 33351e4ce3de
children 8904d42e00ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10860
472c5531b695 Improved backwards seeking for small seek steps. Patch by matthieu <mat100@ifrance.com>.
mosu
parents: 10845
diff changeset
1 // Matroska demuxer
472c5531b695 Improved backwards seeking for small seek steps. Patch by matthieu <mat100@ifrance.com>.
mosu
parents: 10845
diff changeset
2 // written by Moritz Bunkus <moritz@bunkus.org>
472c5531b695 Improved backwards seeking for small seek steps. Patch by matthieu <mat100@ifrance.com>.
mosu
parents: 10845
diff changeset
3 // License: GPL of course ;)
472c5531b695 Improved backwards seeking for small seek steps. Patch by matthieu <mat100@ifrance.com>.
mosu
parents: 10845
diff changeset
4
472c5531b695 Improved backwards seeking for small seek steps. Patch by matthieu <mat100@ifrance.com>.
mosu
parents: 10845
diff changeset
5 // $Id$
472c5531b695 Improved backwards seeking for small seek steps. Patch by matthieu <mat100@ifrance.com>.
mosu
parents: 10845
diff changeset
6
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
7 extern "C" {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
8 #include "config.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
9 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
10
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
11 #ifdef HAVE_MATROSKA
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
12
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
13 #include <vector>
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
14
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
15 #include <ebml/EbmlHead.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
16 #include <ebml/EbmlSubHead.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
17 #include <ebml/EbmlStream.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
18 #include <ebml/EbmlContexts.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
19 #include <ebml/EbmlVersion.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
20 #include <ebml/StdIOCallback.h>
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
21
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
22 #include <matroska/KaxVersion.h>
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
23
10437
3c7cd3196cf4 Fixed spelling mistakes that were present in libmatroska until now.
mosu
parents: 10434
diff changeset
24 #include <matroska/KaxAttachments.h>
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
25 #include <matroska/KaxBlock.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
26 #include <matroska/KaxBlockData.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
27 #include <matroska/KaxChapters.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
28 #include <matroska/KaxCluster.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
29 #include <matroska/KaxClusterData.h>
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
30 #if LIBMATROSKA_VERSION >= 000503
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
31 #include <matroska/KaxContentEncoding.h>
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
32 #endif
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
33 #include <matroska/KaxContexts.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
34 #include <matroska/KaxCues.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
35 #include <matroska/KaxCuesData.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
36 #include <matroska/KaxInfo.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
37 #include <matroska/KaxInfoData.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
38 #include <matroska/KaxSeekHead.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
39 #include <matroska/KaxSegment.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
40 #include <matroska/KaxTracks.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
41 #include <matroska/KaxTrackAudio.h>
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
42 #include <matroska/KaxTrackVideo.h>
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
43 #include <matroska/KaxTrackEntryData.h>
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
44 #include <matroska/FileKax.h>
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
45
11139
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
46 extern "C" {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
47 #include <ctype.h>
11139
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
48 #include <stdlib.h>
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
49 #include <stdio.h>
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
50 #include <string.h>
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
51
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
52 #ifdef HAVE_ZLIB
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
53 #include <zlib.h>
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
54 #endif
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
55
11139
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
56 #include "../mp_msg.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
57 #include "../help_mp.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
58 #include "stream.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
59 #include "demuxer.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
60 #include "stheader.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
61
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
62 #include "../subreader.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
63 #include "../libvo/sub.h"
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
64
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
65 }
970e9c6471f4 Fix for compilation on mingw32/cygwin. Patch by Goodwu <goodwu@21cn.com>.
mosu
parents: 11114
diff changeset
66
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
67 #include "matroska.h"
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
68
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
69 using namespace libebml;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
70 using namespace libmatroska;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
71 using namespace std;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
72
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
73 #if LIBEBML_VERSION < 000500
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
74 #error libebml version too old - need at least 0.5.0
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
75 #endif
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
76
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
77 // 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
78 extern char *dvdsub_lang;
10167
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
79 extern char *audio_lang;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
80 // for "-chapter x-y"
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
81 extern int dvd_chapter;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
82 extern int dvd_last_chapter;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
83
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
84 // default values for Matroska elements
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
85 #define MKVD_TIMECODESCALE 1000000 // 1000000 = 1ms
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
86
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
87 #define MKV_SUBTYPE_TEXT 1
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
88 #define MKV_SUBTYPE_SSA 2
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
89 #define MKV_SUBTYPE_VOBSUB 3
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
90
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
91 #define MKV_SUBCOMPRESSION_NONE 0
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
92 #define MKV_SUBCOMPRESSION_ZLIB 1
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
93
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
94 #define safefree(m) { if (m != NULL) free(m); }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
95 void *safemalloc(int bytes) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
96 void *dst;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
97
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
98 dst = malloc(bytes);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
99 if (dst == NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
100 mp_msg(MSGT_DEMUX, MSGL_FATAL, "[mkv] Could not allocate %d bytes of "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
101 "memory.\n", bytes);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
102 exit(1);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
103 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
104
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
105 return dst;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
106 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
107
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
108 void *safememdup(const void *src, int bytes) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
109 void *dst;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
110
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
111 dst = safemalloc(bytes);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
112 memcpy(dst, src, bytes);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
113
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
114 return dst;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
115 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
116
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
117 class mpstream_io_callback: public IOCallback {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
118 private:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
119 stream_t *s;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
120 public:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
121 mpstream_io_callback(stream_t *stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
122
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
123 virtual uint32 read(void *buffer, size_t size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
124 virtual void setFilePointer(int64 offset, seek_mode mode = seek_beginning);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
125 virtual size_t write(const void *buffer, size_t size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
126 virtual uint64 getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
127 virtual void close();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
128 };
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
129
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
130 mpstream_io_callback::mpstream_io_callback(stream_t *stream) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
131 s = stream;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
132 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
133
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
134 uint32 mpstream_io_callback::read(void *buffer, size_t size) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
135 uint32_t result;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
136
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
137 result = stream_read(s, (char *)buffer, size);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
138
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
139 return result;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
140 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
141
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
142 void mpstream_io_callback::setFilePointer(int64 offset, seek_mode mode) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
143 int64 new_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
144
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
145 if (mode == seek_beginning)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
146 new_pos = offset + s->start_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
147 else if (mode == seek_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
148 new_pos = s->end_pos - offset;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
149 else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
150 new_pos = s->pos + offset;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
151
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
152 if (new_pos > s->end_pos) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
153 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek warning: new_pos %lld > end_pos "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
154 "%lld\n", new_pos, s->end_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
155 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
156 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
157
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
158 stream_seek(s, new_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
159 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
160
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
161 size_t mpstream_io_callback::write(const void */*buffer*/, size_t /*size*/) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
162 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
163 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
164
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
165 uint64 mpstream_io_callback::getFilePointer() {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
166 return s->pos - s->buf_len + s->buf_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
167 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
168
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
169 void mpstream_io_callback::close() {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
170 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
171
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
172 typedef struct mkv_index_entry {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
173 uint64_t timecode, filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
174 int is_key;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
175 } mkv_index_entry_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
176
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
177 typedef struct mkv_track_index {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
178 uint32_t tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
179 int num_entries;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
180 mkv_index_entry_t *entries;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
181 } mkv_track_index_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
182
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
183 typedef struct {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
184 uint32_t order, type, scope;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
185 uint32_t comp_algo;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
186 unsigned char *comp_settings;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
187 uint32_t comp_settings_len;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
188 uint32_t enc_algo, sig_algo, sig_hash_algo;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
189 unsigned char *enc_keyid, *sig_keyid, *signature;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
190 uint32_t enc_keyid_len, sig_keyid_len, signature_len;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
191 } mkv_content_encoding_t;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
192
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
193 typedef struct {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
194 int64_t start, end;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
195 } mkv_chapter_t;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
196
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
197 typedef struct mkv_track {
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
198 uint32_t tnum, xid;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
199
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
200 char *codec_id;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
201 int ms_compat;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
202 char *language;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
203
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
204 char type; // 'v' = video, 'a' = audio, 's' = subs
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
205
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
206 char v_fourcc[5];
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
207 uint32_t v_width, v_height, v_dwidth, v_dheight;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
208 float v_frate;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
209
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
210 uint32_t a_formattag;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
211 uint32_t a_channels, a_bps;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
212 float a_sfreq;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
213
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
214 float default_duration;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
215
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
216 int default_track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
217
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
218 void *private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
219 unsigned int private_size;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
220
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
221 // For Vorbis audio
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
222 unsigned char *headers[3];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
223 uint32_t header_sizes[3];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
224
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
225 int ok;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
226
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
227 // Stuff for RealMedia
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
228 bool realmedia;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
229 demux_packet_t *rm_dp;
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
230 int rm_seqnum, rv_kf_base, rv_kf_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
231 float rv_pts; // previous video timestamp
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
232 float ra_pts; // previous audio timestamp
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
233
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
234 // Stuff for QuickTime
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
235 bool fix_i_bps;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
236 float qt_last_a_pts;
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
237
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
238 // Stuff for VobSubs
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
239 mkv_sh_sub_t sh_sub;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
240
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
241 // Generic content encoding support.
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
242 vector<mkv_content_encoding_t> *c_encodings;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
243 } mkv_track_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
244
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
245 typedef struct mkv_demuxer {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
246 float duration, last_pts;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
247 uint64_t last_filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
248
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
249 mkv_track_t **tracks;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
250 int num_tracks;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
251 mkv_track_t *video, *audio, *subs_track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
252
10283
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
253 uint64_t tc_scale, cluster_tc, first_tc;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
254
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
255 mpstream_io_callback *in;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
256
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
257 uint64_t clear_subs_at[SUB_MAX_TEXT];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
258
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
259 subtitle subs;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
260 int subtitle_type;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
261
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
262 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
263 EbmlElement *saved_l1, *saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
264 KaxSegment *segment;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
265 KaxCluster *cluster;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
266
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
267 mkv_track_index_t *index;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
268 int num_indexes, cues_found, cues_searched;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
269 int64_t *cluster_positions;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
270 int num_cluster_pos;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
271 vector<uint64_t> *parsed_seekheads;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
272 vector<uint64_t> *parsed_cues;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
273
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
274 int64_t skip_to_timecode;
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
275 bool v_skip_to_keyframe, a_skip_to_keyframe;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
276
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
277 vector<mkv_chapter_t> *chapters; // No support for nested chapters atm.
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
278 uint64_t stop_timecode;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
279 } mkv_demuxer_t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
280
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
281 typedef struct {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
282 uint32_t chunks; // number of chunks
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
283 uint32_t timestamp; // timestamp from packet header
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
284 uint32_t len; // length of actual data
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
285 uint32_t chunktab; // offset to chunk offset array
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
286 } dp_hdr_t;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
287
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
288 #if __GNUC__ == 2
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
289 #pragma pack(2)
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
290 #else
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
291 #pragma pack(push,2)
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
292 #endif
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
293
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
294 typedef struct {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
295 uint32_t size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
296 uint32_t fourcc1;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
297 uint32_t fourcc2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
298 uint16_t width;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
299 uint16_t height;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
300 uint16_t bpp;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
301 uint32_t unknown1;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
302 uint32_t fps;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
303 uint32_t type1;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
304 uint32_t type2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
305 } real_video_props_t;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
306
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
307 typedef struct {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
308 uint32_t fourcc1; // '.', 'r', 'a', 0xfd
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
309 uint16_t version1; // 4 or 5
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
310 uint16_t unknown1; // 00 000
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
311 uint32_t fourcc2; // .ra4 or .ra5
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
312 uint32_t unknown2; // ???
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
313 uint16_t version2; // 4 or 5
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
314 uint32_t header_size; // == 0x4e
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
315 uint16_t flavor; // codec flavor id
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
316 uint32_t coded_frame_size; // coded frame size
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
317 uint32_t unknown3; // big number
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
318 uint32_t unknown4; // bigger number
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
319 uint32_t unknown5; // yet another number
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
320 uint16_t sub_packet_h;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
321 uint16_t frame_size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
322 uint16_t sub_packet_size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
323 uint16_t unknown6; // 00 00
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
324 uint16_t sample_rate;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
325 uint16_t unknown8; // 0
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
326 uint16_t sample_size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
327 uint16_t channels;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
328 } real_audio_v4_props_t;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
329
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
330 typedef struct {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
331 uint32_t fourcc1; // '.', 'r', 'a', 0xfd
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
332 uint16_t version1; // 4 or 5
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
333 uint16_t unknown1; // 00 000
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
334 uint32_t fourcc2; // .ra4 or .ra5
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
335 uint32_t unknown2; // ???
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
336 uint16_t version2; // 4 or 5
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
337 uint32_t header_size; // == 0x4e
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
338 uint16_t flavor; // codec flavor id
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
339 uint32_t coded_frame_size; // coded frame size
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
340 uint32_t unknown3; // big number
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
341 uint32_t unknown4; // bigger number
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
342 uint32_t unknown5; // yet another number
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
343 uint16_t sub_packet_h;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
344 uint16_t frame_size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
345 uint16_t sub_packet_size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
346 uint16_t unknown6; // 00 00
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
347 uint8_t unknown7[6]; // 0, srate, 0
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
348 uint16_t sample_rate;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
349 uint16_t unknown8; // 0
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
350 uint16_t sample_size;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
351 uint16_t channels;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
352 uint32_t genr; // "genr"
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
353 uint32_t fourcc3; // fourcc
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
354 } real_audio_v5_props_t;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
355
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
356 // I have to (re)define this struct here because g++ will not compile
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
357 // components.h from the qtsdk if I include it.
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
358 typedef struct {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
359 uint32_t id_size;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
360 uint32_t codec_type;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
361 uint32_t reserved1;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
362 uint16_t reserved2;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
363 uint16_t data_reference_index;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
364 uint16_t version;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
365 uint16_t revision;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
366 uint32_t vendor;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
367 uint32_t temporal_quality;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
368 uint32_t spatial_quality;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
369 uint16_t width;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
370 uint16_t height;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
371 uint32_t horizontal_resolution; // 32bit fixed-point number
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
372 uint32_t vertical_resolution; // 32bit fixed-point number
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
373 uint32_t data_size;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
374 uint16_t frame_count;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
375 char compressor_name[32];
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
376 uint16_t depth;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
377 uint16_t color_table_id;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
378 } qt_image_description_t;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
379
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
380 #if __GNUC__ == 2
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
381 #pragma pack()
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
382 #else
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
383 #pragma pack(pop)
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
384 #endif
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
385
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
386 static uint16_t get_uint16(const void *buf) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
387 uint16_t ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
388 unsigned char *tmp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
389
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
390 tmp = (unsigned char *) buf;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
391
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
392 ret = tmp[1] & 0xff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
393 ret = (ret << 8) + (tmp[0] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
394
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
395 return ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
396 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
397
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
398 static uint32_t get_uint32(const void *buf) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
399 uint32_t ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
400 unsigned char *tmp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
401
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
402 tmp = (unsigned char *) buf;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
403
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
404 ret = tmp[3] & 0xff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
405 ret = (ret << 8) + (tmp[2] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
406 ret = (ret << 8) + (tmp[1] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
407 ret = (ret << 8) + (tmp[0] & 0xff);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
408
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
409 return ret;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
410 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
411
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
412 static uint16_t get_uint16_be(const void *buf) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
413 uint16_t ret;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
414 unsigned char *tmp;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
415
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
416 tmp = (unsigned char *) buf;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
417
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
418 ret = tmp[0] & 0xff;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
419 ret = (ret << 8) + (tmp[1] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
420
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
421 return ret;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
422 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
423
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
424 static uint32_t get_uint32_be(const void *buf) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
425 uint32_t ret;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
426 unsigned char *tmp;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
427
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
428 tmp = (unsigned char *) buf;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
429
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
430 ret = tmp[0] & 0xff;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
431 ret = (ret << 8) + (tmp[1] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
432 ret = (ret << 8) + (tmp[2] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
433 ret = (ret << 8) + (tmp[3] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
434
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
435 return ret;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
436 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
437
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
438 unsigned char read_char(unsigned char *p, int &pos, int size) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
439 if ((pos + 1) > size)
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
440 throw exception();
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
441 pos++;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
442 return p[pos - 1];
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
443 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
444
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
445 unsigned short read_word(unsigned char *p, int &pos, int size) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
446 unsigned short v;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
447
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
448 if ((pos + 2) > size)
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
449 throw exception();
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
450 v = p[pos];
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
451 v = (v << 8) | (p[pos + 1] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
452 pos += 2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
453 return v;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
454 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
455
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
456 unsigned int read_dword(unsigned char *p, int &pos, int size) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
457 unsigned int v;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
458
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
459 if ((pos + 4) > size)
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
460 throw exception();
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
461 v = p[pos];
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
462 v = (v << 8) | (p[pos + 1] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
463 v = (v << 8) | (p[pos + 2] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
464 v = (v << 8) | (p[pos + 3] & 0xff);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
465 pos += 4;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
466 return v;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
467 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
468
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
469 static void
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
470 finish_text_sub_handling(mkv_demuxer_t *mkv_d, KaxBlock *block,
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
471 int64_t duration, int first_line) {
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
472 int i;
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
473
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
474 #ifdef USE_ICONV
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
475 subcp_recode1(&mkv_d->subs);
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
476 #endif
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
477
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
478 vo_sub = &mkv_d->subs;
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
479 vo_osd_changed(OSDTYPE_SUBTITLE);
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
480
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
481 for (i = first_line; i <= (mkv_d->subs.lines - 1); i++)
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
482 mkv_d->clear_subs_at[i] = block->GlobalTimecode() / 1000000 -
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
483 mkv_d->first_tc + duration;
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
484 }
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
485
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
486 static void handle_subtitles(demuxer_t *d, KaxBlock *block, int64_t duration) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
487 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)d->priv;
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
488 int len, line, state, i, first_line;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
489 char *s1, *s2, *buffer;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
490
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
491 if (duration == -1) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
492 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: No KaxBlockDuration "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
493 "element for subtitle track found.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
494 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
495 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
496
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
497 DataBuffer &data = block->GetBuffer(0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
498 len = data.Size();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
499
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
500 buffer = (char *)data.Buffer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
501 s1 = buffer;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
502
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
503 while (((*s1 == '\n') || (*s1 == '\r')) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
504 ((unsigned int)(s1 - buffer) <= data.Size()))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
505 s1++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
506
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
507 line = 0;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
508 mkv_d->subs.lines++;
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
509 if (mkv_d->subs.lines > SUB_MAX_TEXT) {
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
510 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: too many sublines to "
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
511 "render, skipping\n");
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
512 mkv_d->subs.lines = SUB_MAX_TEXT;
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
513 return;
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
514 }
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
515 first_line = mkv_d->subs.lines - 1;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
516 s2 = mkv_d->subs.text[mkv_d->subs.lines - 1];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
517 state = 0;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
518
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
519 if (mkv_d->subtitle_type == MKV_SUBTYPE_SSA) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
520 /* Matroska's SSA format does not have timecodes embedded into
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
521 the SAA line. Timescodes are encoded into the blocks timecode
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
522 and duration. */
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
523
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
524 /* Find text section. */
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
525 for (i = 0; (i < 8) && (*s1 != 0); s1++)
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
526 if (*s1 == ',')
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
527 i++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
528
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
529 if (*s1 == 0) { // Broken line?
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
530 mkv_d->subs.lines--;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
531 return;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
532 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
533
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
534 /* Load text. */
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
535 while ((unsigned int)(s1 - buffer) < data.Size()) {
10861
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
536 if (*s1 == '{')
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
537 state = 1;
10861
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
538 else if ((*s1 == '}') && (state == 1))
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
539 state = 2;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
540
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
541 if (state == 0) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
542 *s2 = *s1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
543 s2++;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
544 if ((s2 - mkv_d->subs.text[mkv_d->subs.lines - 1]) >= 255)
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
545 break;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
546 }
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
547 s1++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
548
10861
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
549 /* Newline */
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
550 if ((*s1 == '\\') && ((unsigned int)(s1 + 1 - buffer) < data.Size()) &&
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
551 ((*(s1 + 1) == 'N') || (*(s1 + 1) == 'n'))) {
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
552 *s2 = 0;
10861
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
553 mkv_d->subs.lines++;
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
554 if (mkv_d->subs.lines > SUB_MAX_TEXT) {
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
555 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: too many sublines to "
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
556 "render, skipping\n");
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
557 mkv_d->subs.lines = SUB_MAX_TEXT;
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
558 finish_text_sub_handling(mkv_d, block, duration, first_line);
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
559 return;
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
560 }
10861
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
561 s2 = mkv_d->subs.text[mkv_d->subs.lines - 1];
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
562 s1 += 2;
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
563 }
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
564
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
565 if (state == 2)
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
566 state = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
567 }
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
568 *s2 = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
569
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
570 } else {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
571 while ((unsigned int)(s1 - buffer) != data.Size()) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
572 if ((*s1 == '\n') || (*s1 == '\r')) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
573 if (state == 0) { // normal char --> newline
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
574 if (mkv_d->subs.lines == SUB_MAX_TEXT)
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
575 break;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
576 *s2 = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
577 mkv_d->clear_subs_at[mkv_d->subs.lines - 1]=
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
578 block->GlobalTimecode() / 1000000 - mkv_d->first_tc + duration;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
579 s2 = mkv_d->subs.text[mkv_d->subs.lines];
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
580 mkv_d->subs.lines++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
581 state = 1;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
582 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
583 } else if (*s1 == '<') // skip HTML tags
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
584 state = 2;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
585 else if (*s1 == '>')
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
586 state = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
587 else if (state != 2) { // normal character
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
588 state = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
589 if ((s2 - mkv_d->subs.text[mkv_d->subs.lines - 1]) < 255) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
590 *s2 = *s1;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
591 s2++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
592 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
593 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
594 s1++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
595 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
596
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
597 *s2 = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
598 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
599
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
600 finish_text_sub_handling(mkv_d, block, duration, first_line);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
601 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
602
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
603 static mkv_track_t *new_mkv_track(mkv_demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
604 mkv_track_t *t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
605
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
606 t = (mkv_track_t *)safemalloc(sizeof(mkv_track_t));
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
607 memset(t, 0, sizeof(mkv_track_t));
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
608 d->tracks = (mkv_track_t **)realloc(d->tracks, (d->num_tracks + 1) *
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
609 sizeof(mkv_track_t *));
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
610 if (d->tracks == NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
611 return NULL;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
612 d->tracks[d->num_tracks] = t;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
613 d->num_tracks++;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
614
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
615 // Set default values.
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
616 t->default_track = 1;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
617 t->a_sfreq = 8000.0;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
618 t->a_channels = 1;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
619 t->language = strdup("eng");
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
620
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
621 t->c_encodings = new vector<mkv_content_encoding_t>;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
622
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
623 return t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
624 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
625
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
626 static mkv_track_t *find_track_by_num(mkv_demuxer_t *d, uint32_t n,
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
627 char track_type) {
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
628 int i;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
629
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
630 for (i = 0; i < d->num_tracks; i++)
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
631 if ((d->tracks[i] != NULL) && (d->tracks[i]->type == track_type) &&
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
632 (d->tracks[i]->xid == n))
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
633 return d->tracks[i];
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
634
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
635 return NULL;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
636 }
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
637
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
638 static mkv_track_t *find_duplicate_track_by_num(mkv_demuxer_t *d, uint32_t n,
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
639 mkv_track_t *c) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
640 int i;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
641
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
642 for (i = 0; i < d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
643 if ((d->tracks[i] != NULL) && (d->tracks[i]->tnum == n) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
644 (d->tracks[i] != c))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
645 return d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
646
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
647 return NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
648 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
649
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
650 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
651 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
652 int i;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
653
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
654 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
655 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
656 (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
657 !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
658 (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
659 return d->tracks[i];
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
660
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
661 return NULL;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
662 }
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
663
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
664 static bool mkv_parse_idx(mkv_track_t *t) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
665 uint32_t i, p, things_found;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
666 int idx;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
667 string line, s1, s2;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
668 char *src;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
669
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
670 if ((t->private_data == NULL) || (t->private_size < 1))
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
671 return false;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
672
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
673 things_found = 0;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
674 i = 0;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
675 src = (char *)t->private_data;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
676 do {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
677 line = "";
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
678 while ((i < t->private_size) && (src[i] != '\n') && (src[i] != '\r')) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
679 if (!isspace(src[i]))
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
680 line += src[i];
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
681 i++;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
682 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
683 while ((i < t->private_size) && ((src[i] == '\n') || (src[i] == '\r')))
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
684 i++;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
685
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
686 if (!strncasecmp(line.c_str(), "size:", 5)) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
687 s1 = line.substr(5);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
688 idx = s1.find('x');
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
689 if (idx >= 0) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
690 s2 = s1.substr(idx + 1);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
691 s1.erase(idx);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
692 t->sh_sub.width = strtol(s1.c_str(), NULL, 10);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
693 t->sh_sub.height = strtol(s2.c_str(), NULL, 10);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
694 things_found |= 1;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
695 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub IDX parser: size: %d x %d\n",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
696 t->sh_sub.width, t->sh_sub.height);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
697 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
698
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
699 } else if (!strncasecmp(line.c_str(), "palette:", 8)) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
700 s1 = line.substr(8);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
701 for (p = 0; p < 15; p++) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
702 idx = s1.find(',');
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
703 if (idx < 0)
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
704 break;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
705 s2 = s1.substr(0, idx);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
706 s1.erase(0, idx + 1);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
707 t->sh_sub.palette[p] = (unsigned int)strtol(s2.c_str(), NULL, 16);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
708 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
709 if (idx >= 0) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
710 t->sh_sub.palette[15] = (unsigned int)strtol(s1.c_str(), NULL, 16);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
711 things_found |= 2;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
712 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub IDX parser: palette: 0x%06x "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
713 "0x%06x 0x%06x 0x%06x 0x%06x 0x%06x 0x%06x 0x%06x 0x%06x "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
714 "0x%06x 0x%06x 0x%06x 0x%06x 0x%06x 0x%06x 0x%06x\n",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
715 t->sh_sub.palette[0], t->sh_sub.palette[1],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
716 t->sh_sub.palette[2], t->sh_sub.palette[3],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
717 t->sh_sub.palette[4], t->sh_sub.palette[5],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
718 t->sh_sub.palette[6], t->sh_sub.palette[7],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
719 t->sh_sub.palette[8], t->sh_sub.palette[9],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
720 t->sh_sub.palette[10], t->sh_sub.palette[11],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
721 t->sh_sub.palette[12], t->sh_sub.palette[13],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
722 t->sh_sub.palette[14], t->sh_sub.palette[15]);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
723 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
724 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
725
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
726 } while ((i != t->private_size) && (things_found != 3));
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
727 t->sh_sub.type = 'v';
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
728
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
729 return (things_found == 3);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
730 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
731
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
732 static bool reverse_encodings(mkv_track_t *track, unsigned char *&data,
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
733 uint32_t &size, uint32_t type) {
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
734 int new_size, n;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
735 unsigned char *new_data, *old_data;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
736 bool modified;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
737 vector<mkv_content_encoding_t>::iterator ce;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
738
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
739 if (track->c_encodings->size() == 0)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
740 return false;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
741
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
742 new_data = data;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
743 new_size = size;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
744 modified = false;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
745 for (ce = track->c_encodings->begin(); ce < track->c_encodings->end();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
746 ce++) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
747 if ((ce->scope & type) == 0)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
748 continue;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
749
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
750 #ifdef HAVE_ZLIB
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
751 if (ce->comp_algo == 0) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
752 int result;
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
753 z_stream zstream;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
754
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
755 old_data = new_data;
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
756
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
757 zstream.zalloc = (alloc_func)0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
758 zstream.zfree = (free_func)0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
759 zstream.opaque = (voidpf)0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
760 result = inflateInit(&zstream);
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
761 if (result != Z_OK) {
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
762 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Zlib initialization failed. "
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
763 "Result: %d\n", result);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
764 safefree(new_data);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
765 data = old_data;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
766 size = new_size;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
767 return modified;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
768 }
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
769 zstream.next_in = (Bytef *)old_data;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
770 zstream.avail_in = new_size;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
771
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
772 n = 0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
773 new_data = NULL;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
774 do {
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
775 n++;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
776 new_data = (unsigned char *)realloc(new_data, n * 4000);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
777 zstream.next_out = (Bytef *)&new_data[(n - 1) * 4000];
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
778 zstream.avail_out = 4000;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
779 result = inflate(&zstream, Z_NO_FLUSH);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
780 if ((result != Z_OK) && (result != Z_STREAM_END)) {
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
781 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Zlib decompression failed. "
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
782 "Result: %d \n", result);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
783 safefree(new_data);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
784 data = old_data;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
785 size = new_size;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
786 inflateEnd(&zstream);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
787 return modified;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
788 }
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
789 } while ((zstream.avail_out == 0) &&
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
790 (zstream.avail_in != 0) && (result != Z_STREAM_END));
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
791
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
792 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] zlib decompression: from %d to "
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
793 "%d \n", (int)new_size, (int)zstream.total_out);
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
794 new_size = zstream.total_out;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
795 inflateEnd(&zstream);
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
796
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
797 if (modified)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
798 safefree(old_data);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
799 modified = true;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
800 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
801 #endif
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
802 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
803
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
804 data = new_data;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
805 size = new_size;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
806
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
807 return modified;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
808 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
809
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
810 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
811 int i, track_num;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
812 unsigned char *c;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
813 uint32_t u, offset, length;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
814 mkv_track_t *t;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
815 mkv_content_encoding_t *ce;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
816 BITMAPINFOHEADER *bih;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
817 WAVEFORMATEX *wfe;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
818
10028
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
819 for (track_num = 0; track_num < d->num_tracks; track_num++) {
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
820 t = d->tracks[track_num];
10028
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
821
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
822 t->ok = 1;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
823 for (i = 0; i < (int)t->c_encodings->size(); i++) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
824 ce = &(*t->c_encodings)[i];
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
825
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
826 if (ce->type == 1) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
827 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Track number %u has been "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
828 "encrypted and decryption has not yet been implemented. "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
829 "Skipping track.\n", t->tnum);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
830 t->ok = 0;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
831 break;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
832 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
833
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
834 if (ce->type != 0) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
835 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown content encoding type %u "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
836 "for track %u. Skipping track.\n", ce->type, t->tnum);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
837 t->ok = 0;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
838 break;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
839 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
840
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
841 if (ce->comp_algo == 0) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
842 #if !defined(HAVE_ZLIB)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
843 mp_msg(MSGT_DEMUX, MSGL_WARN, "Track %u was compressed with zlib but "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
844 "mplayer has not been compiled with support for zlib "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
845 "compression. Skipping track.\n", t->tnum);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
846 t->ok = 0;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
847 break;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
848 #endif
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
849 } else {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
850 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Track %u has been compressed "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
851 "with an unknown/unsupported compression algorithm (%u). "
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
852 "Skipping track.\n", t->tnum, ce->comp_algo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
853 t->ok = 0;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
854 break;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
855 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
856 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
857
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
858 if (!t->ok)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
859 continue;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
860 t->ok = 0;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
861
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
862 if (t->private_data != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
863 c = (unsigned char *)t->private_data;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
864 length = t->private_size;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
865 if (reverse_encodings(t, c, length, 2)) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
866 safefree(t->private_data);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
867 t->private_data = c;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
868 t->private_size = length;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
869 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
870 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
871
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
872 switch (t->type) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
873 case 'v': // video track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
874 if (t->codec_id == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
875 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
876 if (!strcmp(t->codec_id, MKV_V_MSCOMP)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
877 if ((t->private_data == NULL) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
878 (t->private_size < sizeof(BITMAPINFOHEADER))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
879 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
880 "%u is '" MKV_V_MSCOMP "', but there was no "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
881 "BITMAPINFOHEADER struct present. Therefore we don't have "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
882 "a FourCC to identify the video codec used.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
883 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
884 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
885 t->ms_compat = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
886
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
887 bih = (BITMAPINFOHEADER *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
888
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
889 u = get_uint32(&bih->biWidth);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
890 if (t->v_width != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
891 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
892 "compatibility mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
893 "Matrosa says video width is %u, but the "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
894 "BITMAPINFOHEADER says %u.\n", t->tnum, t->v_width, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
895 if (t->v_width == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
896 t->v_width = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
897 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
898
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
899 u = get_uint32(&bih->biHeight);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
900 if (t->v_height != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
901 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
902 "mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
903 "Matrosa video height is %u, but the BITMAPINFOHEADER "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
904 "says %u.\n", t->tnum, t->v_height, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
905 if (t->v_height == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
906 t->v_height = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
907 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
908
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
909 memcpy(t->v_fourcc, &bih->biCompression, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
910 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
911 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
912
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
913 if (t->v_width == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
914 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The width for track %u was "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
915 "not set.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
916 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
917 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
918 if (t->v_height == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
919 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The height for track %u was "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
920 "not set.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
921 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
922 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
923
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
924 if (t->v_dwidth == 0)
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
925 t->v_dwidth = t->v_width;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
926 if (t->v_dheight == 0)
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
927 t->v_dheight = t->v_height;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
928
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
929 // This track seems to be ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
930 t->ok = 1;
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
931 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: video (%s), "
10706
ede87804e4e6 Removed some ":" in the track output for easier cut&paste.
mosu
parents: 10705
diff changeset
932 "-vid %u\n", t->tnum, t->codec_id, t->xid);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
933
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
934 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
935
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
936 case 'a': // audio track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
937 if (t->codec_id == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
938 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
939 if (!strcmp(t->codec_id, MKV_A_ACM)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
940 if ((t->private_data == NULL) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
941 (t->private_size < sizeof(WAVEFORMATEX))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
942 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
943 "%u is '" MKV_A_ACM "', "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
944 "but there was no WAVEFORMATEX struct present. "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
945 "Therefore we don't have a format ID to identify the audio "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
946 "codec used.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
947 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
948 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
949 t->ms_compat = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
950
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
951 wfe = (WAVEFORMATEX *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
952 u = get_uint32(&wfe->nSamplesPerSec);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
953 if (((uint32_t)t->a_sfreq) != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
954 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
955 "mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
956 "Matroska says that there are %u samples per second, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
957 "but WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
958 (uint32_t)t->a_sfreq, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
959 if (t->a_sfreq == 0.0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
960 t->a_sfreq = (float)u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
961 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
962
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
963 u = get_uint16(&wfe->nChannels);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
964 if (t->a_channels != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
965 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
966 "compatibility mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
967 "Matroska says that there are %u channels, but the "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
968 "WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
969 t->a_channels, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
970 if (t->a_channels == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
971 t->a_channels = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
972 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
973
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
974 u = get_uint16(&wfe->wBitsPerSample);
10098
ebbe39bb55ab Check with the wrong variable.
mosu
parents: 10084
diff changeset
975 if (t->a_bps != u) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
976 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
977 "compatibility mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
978 "Matroska says that there are %u bits per sample, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
979 "but the WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
980 t->a_bps, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
981 if (t->a_bps == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
982 t->a_bps = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
983 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
984
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
985 t->a_formattag = get_uint16(&wfe->wFormatTag);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
986 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
987 } else {
11155
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
988 if (!strcmp(t->codec_id, MKV_A_MP3) ||
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
989 !strcmp(t->codec_id, MKV_A_MP2))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
990 t->a_formattag = 0x0055;
11114
d8ddd7727084 More liberal codec id recognition for AC3 codecs (needed for transcoded DNET from RM).
mosu
parents: 10984
diff changeset
991 else if (!strncmp(t->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
992 t->a_formattag = 0x2000;
10105
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
993 else if (!strcmp(t->codec_id, MKV_A_DTS))
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
994 // 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
995 t->a_formattag = 0x2000;
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
996 else if (!strcmp(t->codec_id, MKV_A_PCM) ||
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
997 !strcmp(t->codec_id, MKV_A_PCM_BE))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
998 t->a_formattag = 0x0001;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
999 else if (!strcmp(t->codec_id, MKV_A_AAC_2MAIN) ||
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1000 !strncmp(t->codec_id, MKV_A_AAC_2LC,
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1001 strlen(MKV_A_AAC_2LC)) ||
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1002 !strcmp(t->codec_id, MKV_A_AAC_2SSR) ||
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1003 !strcmp(t->codec_id, MKV_A_AAC_4MAIN) ||
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1004 !strncmp(t->codec_id, MKV_A_AAC_4LC,
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1005 strlen(MKV_A_AAC_4LC)) ||
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
1006 !strcmp(t->codec_id, MKV_A_AAC_4SSR) ||
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1007 !strcmp(t->codec_id, MKV_A_AAC_4LTP))
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
1008 t->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1009 else if (!strcmp(t->codec_id, MKV_A_VORBIS)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1010 if (t->private_data == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1011 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1012 "track %u is '" MKV_A_VORBIS
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1013 "', but there are no header packets present.", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1014 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1015 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1016
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1017 c = (unsigned char *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1018 if (c[0] != 2) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1019 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track does not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1020 "contain valid headers.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1021 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1022 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1023
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1024 offset = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1025 for (i = 0; i < 2; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1026 length = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1027 while ((c[offset] == (unsigned char )255) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1028 (length < t->private_size)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1029 length += 255;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1030 offset++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1031 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1032 if (offset >= (t->private_size - 1)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1033 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track does not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1034 "contain valid headers.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1035 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1036 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1037 length += c[offset];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1038 offset++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1039 t->header_sizes[i] = length;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1040 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1041
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1042 t->headers[0] = &c[offset];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1043 t->headers[1] = &c[offset + t->header_sizes[0]];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1044 t->headers[2] = &c[offset + t->header_sizes[0] +
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1045 t->header_sizes[1]];
10079
7c13793dbfa0 Vorbis header packet lengths were calculated incorrectly.
mosu
parents: 10073
diff changeset
1046 t->header_sizes[2] = t->private_size - offset -
7c13793dbfa0 Vorbis header packet lengths were calculated incorrectly.
mosu
parents: 10073
diff changeset
1047 t->header_sizes[0] - t->header_sizes[1];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1048
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1049 t->a_formattag = 0xFFFE;
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1050 } else if (!strcmp(t->codec_id, MKV_A_QDMC) ||
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1051 !strcmp(t->codec_id, MKV_A_QDMC2)) {
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1052 ;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1053 } else if (!strcmp(t->codec_id, MKV_A_FLAC)) {
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1054 if ((t->private_data == NULL) || (t->private_size == 0)) {
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1055 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] FLAC track does not "
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1056 "contain valid headers.\n");
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1057 continue;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1058 }
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1059 t->a_formattag = mmioFOURCC('f', 'L', 'a', 'C');
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1060 } else if (t->private_size >= sizeof(real_audio_v4_props_t)) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1061 if (!strcmp(t->codec_id, MKV_A_REAL28))
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1062 t->a_formattag = mmioFOURCC('2', '8', '_', '8');
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1063 else if (!strcmp(t->codec_id, MKV_A_REALATRC))
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1064 t->a_formattag = mmioFOURCC('a', 't', 'r', 'c');
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1065 else if (!strcmp(t->codec_id, MKV_A_REALCOOK))
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1066 t->a_formattag = mmioFOURCC('c', 'o', 'o', 'k');
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1067 else if (!strcmp(t->codec_id, MKV_A_REALDNET))
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1068 t->a_formattag = mmioFOURCC('d', 'n', 'e', 't');
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1069 else if (!strcmp(t->codec_id, MKV_A_REALSIPR))
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1070 t->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1071 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1072 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported audio "
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1073 "codec ID '%s' for track %u or missing/faulty private "
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1074 "codec data.\n", t->codec_id, t->tnum);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1075 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1076 }
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 if (t->a_sfreq == 0.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1080 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The sampling frequency was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1081 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1082 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1083 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1084
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1085 if (t->a_channels == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1086 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The number of channels was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1087 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1088 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1089 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1090
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1091 // This track seems to be ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1092 t->ok = 1;
10706
ede87804e4e6 Removed some ":" in the track output for easier cut&paste.
mosu
parents: 10705
diff changeset
1093 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: audio (%s), -aid "
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1094 "%u%s%s\n", t->tnum, t->codec_id, t->xid,
10706
ede87804e4e6 Removed some ":" in the track output for easier cut&paste.
mosu
parents: 10705
diff changeset
1095 t->language != NULL ? ", -alang " : "",
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1096 t->language != NULL ? t->language : "");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1097 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1098
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1099 case 's':
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1100 if (!strcmp(t->codec_id, MKV_S_VOBSUB)) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1101 if (mkv_parse_idx(t)) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1102 t->ok = 1;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1103 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: subtitles (%s), "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1104 "-sid %u%s%s\n", t->tnum, t->codec_id,
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1105 t->xid, t->language != NULL ? ", -slang " : "",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1106 t->language != NULL ? t->language : "");
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1107 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1108
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1109 } else { // Text subtitles do not need any data
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1110 t->ok = 1; // except the CodecID.
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1111 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: subtitles (%s), "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1112 "-sid %u%s%s\n", t->tnum, t->codec_id, t->xid,
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1113 t->language != NULL ? ", -slang " : "",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1114 t->language != NULL ? t->language : "");
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1115 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1116 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1117
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1118 default: // unknown track type!? error in demuxer...
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1119 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Error in demux_mkv.cpp: unknown "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1120 "demuxer type for track %u: '%c'\n", t->tnum, t->type);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1121 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1122 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1123
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1124 if (t->ok)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1125 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
1126 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1127
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1128 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1129 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1130
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1131 static void free_mkv_demuxer(mkv_demuxer_t *d) {
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1132 int i, k;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1133
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1134 if (d == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1135 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1136
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1137 for (i = 0; i < d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1138 if (d->tracks[i] != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1139 if (d->tracks[i]->private_data != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1140 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
1141 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
1142 free(d->tracks[i]->language);
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1143 for (k = 0; k < (int)d->tracks[i]->c_encodings->size(); k++) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1144 safefree((*d->tracks[i]->c_encodings)[k].comp_settings);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1145 safefree((*d->tracks[i]->c_encodings)[k].enc_keyid);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1146 safefree((*d->tracks[i]->c_encodings)[k].sig_keyid);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1147 safefree((*d->tracks[i]->c_encodings)[k].signature);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1148 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1149 delete d->tracks[i]->c_encodings;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1150 free(d->tracks[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1151 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1152
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1153 for (i = 0; i < d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1154 free(d->index[i].entries);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1155 free(d->index);
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
1156
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
1157 for (i = 0; i <= SUB_MAX_TEXT; i++)
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
1158 safefree(d->subs.text[i]);
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
1159
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1160 if (d->es != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1161 delete d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1162 if (d->saved_l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1163 delete d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1164 if (d->in != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1165 delete d->in;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1166 if (d->segment != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1167 delete d->segment;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1168 if (d->chapters != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1169 delete d->chapters;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1170
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1171 free(d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1172 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1173
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1174 static void add_index_entry(mkv_demuxer_t *d, uint32_t tnum, uint64_t filepos,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1175 uint64_t timecode, int is_key) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1176 int i, found;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1177 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1178
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1179 for (i = 0, found = 0; i < d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1180 if (d->index[i].tnum == tnum) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1181 found = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1182 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1183 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1184
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1185 if (!found) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1186 d->index = (mkv_track_index_t *)realloc(d->index, (d->num_indexes + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1187 sizeof(mkv_track_index_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1188 if (d->index == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1189 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1190 i = d->num_indexes;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1191 memset(&d->index[i], 0, sizeof(mkv_track_index_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1192 d->index[i].tnum = tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1193 d->num_indexes++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1194 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1195
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1196 d->index[i].entries =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1197 (mkv_index_entry_t *)realloc(d->index[i].entries,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1198 (d->index[i].num_entries + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1199 sizeof(mkv_index_entry_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1200 if (d->index[i].entries == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1201 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1202 entry = &d->index[i].entries[d->index[i].num_entries];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1203 entry->filepos = filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1204 entry->timecode = timecode;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1205 entry->is_key = is_key;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1206 d->index[i].num_entries++;
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 static void add_cluster_position(mkv_demuxer_t *mkv_d, int64_t position) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1210 mkv_d->cluster_positions = (int64_t *)realloc(mkv_d->cluster_positions,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1211 (mkv_d->num_cluster_pos + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1212 sizeof(int64_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1213 if (mkv_d->cluster_positions != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1214 mkv_d->cluster_positions[mkv_d->num_cluster_pos] = position;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1215 mkv_d->num_cluster_pos++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1216 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1217 mkv_d->num_cluster_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1218 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1219
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1220 static int find_in_vector(vector<uint64_t> &vec, uint64_t value) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1221 unsigned int i;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1222
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1223 for (i = 0; i < vec.size(); i++)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1224 if (vec[i] == value)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1225 return 1;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1226
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1227 return 0;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1228 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1229
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1230 #define in_parent(p) (mkv_d->in->getFilePointer() < \
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1231 (p->GetElementPosition() + p->ElementSize()))
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1232 #define FINDFIRST(p, c) (static_cast<c *> \
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1233 (((EbmlMaster *)p)->FindFirstElt(c::ClassInfos, false)))
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1234 #define FINDNEXT(p, c, e) (static_cast<c *> \
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1235 (((EbmlMaster *)p)->FindNextElt(*e, false)))
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1236
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1237 static void parse_cues(mkv_demuxer_t *mkv_d, uint64_t pos) {
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1238 EbmlElement *l2 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1239 EbmlStream *es;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1240 KaxCues *cues;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1241 KaxCuePoint *cpoint;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1242 KaxCueTime *ctime;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1243 KaxCueClusterPosition *ccpos;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1244 KaxCueTrack *ctrack;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1245 KaxCueTrackPositions *ctrackpos;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1246 int upper_lvl_el, i, k;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1247 uint64_t tc_scale, filepos = 0, timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1248 uint32_t tnum = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1249 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1250
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1251 if (find_in_vector(*mkv_d->parsed_cues, pos))
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1252 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1253
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1254 mkv_d->parsed_cues->push_back(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1255
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1256 mkv_d->in->setFilePointer(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1257
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1258 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1259 tc_scale = mkv_d->tc_scale;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1260 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1261
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1262 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1263
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1264 cues = (KaxCues *)es->FindNextElement(mkv_d->segment->Generic().Context,
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1265 upper_lvl_el, 0xFFFFFFFFL, true, 1);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1266 if (cues == NULL)
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1267 return;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1268
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1269 if (!(EbmlId(*cues) == KaxCues::ClassInfos.GlobalId)) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1270 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] No KaxCues element found but %s.\n"
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1271 "[mkv] \\---- [ parsing cues ] -----------\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1272 cues->Generic().DebugName);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1273
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1274 return;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1275 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1276
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1277 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cues\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1278
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1279 cues->Read(*es, KaxCues::ClassInfos.Context, upper_lvl_el, l2, true);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1280
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1281 cpoint = FINDFIRST(cues, KaxCuePoint);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1282
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1283 while (cpoint != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1284 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue point\n");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1285
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1286 ctime = FINDFIRST(cpoint, KaxCueTime);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1287 if (ctime == NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1288 cpoint = FINDNEXT(cues, KaxCuePoint, cpoint);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1289 continue;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1290 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1291
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1292 timecode = uint64(*ctime) * tc_scale / 1000000 - mkv_d->first_tc;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1293 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue time: %.3fs\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1294 (float)timecode / 1000.0);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1295
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1296 ctrackpos = FINDFIRST(cpoint, KaxCueTrackPositions);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1297
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1298 while (ctrackpos != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1299 ctrack = FINDFIRST(ctrackpos, KaxCueTrack);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1300
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1301 if (ctrack == NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1302 ctrackpos = FINDNEXT(cpoint, KaxCueTrackPositions, ctrackpos);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1303 continue;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1304 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1305
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1306 tnum = uint32(*ctrack);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1307 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue track: %u\n", tnum);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1308
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1309 ccpos = FINDFIRST(ctrackpos, KaxCueClusterPosition);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1310 if (ccpos == NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1311 ctrackpos = FINDNEXT(cpoint, KaxCueTrackPositions, ctrackpos);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1312 continue;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1313 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1314
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1315 filepos = mkv_d->segment->GetGlobalPosition(uint64_t(*ccpos));
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1316 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue cluster "
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1317 "position: %llu\n", filepos);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1318
11835
7d5b1df3b952 Fix for compilation with libmatroska 0.6.3.
mosu
parents: 11774
diff changeset
1319 add_index_entry(mkv_d, tnum, filepos, timecode, 1);
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1320
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1321 ctrackpos = FINDNEXT(cpoint, KaxCueTrackPositions, ctrackpos);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1322 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1323
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1324 cpoint = FINDNEXT(cues, KaxCuePoint, cpoint);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1325 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1326
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1327 delete cues;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1328
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1329 // Debug: dump the index
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1330 for (i = 0; i < mkv_d->num_indexes; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1331 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] Index for track %u contains %u "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1332 "entries.\n", mkv_d->index[i].tnum, mkv_d->index[i].num_entries);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1333 for (k = 0; k < mkv_d->index[i].num_entries; k++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1334 entry = &mkv_d->index[i].entries[k];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1335 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] %d: timecode %llu, filepos %llu, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1336 "is key: %s\n", k, entry->timecode, entry->filepos,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1337 entry->is_key ? "yes" : "no");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1338 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1339 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1340
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1341 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1342
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1343 mkv_d->cues_found = 1;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1344 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1345
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1346 static void parse_chapters(mkv_demuxer_t *mkv_d, uint64_t pos) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1347 EbmlElement *l2 = NULL;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1348 EbmlStream *es;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1349 KaxChapters *kchapters;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1350 KaxEditionEntry *keentry;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1351 KaxChapterAtom *kcatom;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1352 KaxChapterTimeStart *kctstart;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1353 KaxChapterTimeEnd *kctend;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1354 int upper_lvl_el, i, k;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1355 mkv_chapter_t chapter;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1356
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1357 if (mkv_d->chapters != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1358 return;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1359
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1360 es = mkv_d->es;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1361 upper_lvl_el = 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1362
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1363 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1364
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1365 mkv_d->in->setFilePointer(pos);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1366
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1367 kchapters =
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1368 (KaxChapters *)es->FindNextElement(mkv_d->segment->Generic().Context,
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1369 upper_lvl_el, 0xFFFFFFFFL, true, 1);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1370 if (kchapters == NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1371 return;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1372
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1373 if (!(EbmlId(*kchapters) == KaxChapters::ClassInfos.GlobalId)) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1374 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] No KaxChapters element found but %s.\n"
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1375 "[mkv] \\---- [ parsing chapters ] ---------\n",
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1376 kchapters->Generic().DebugName);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1377
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1378 return;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1379 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1380
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1381 mkv_d->chapters = new vector<mkv_chapter_t>;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1382 kchapters->Read(*es, KaxChapters::ClassInfos.Context, upper_lvl_el, l2,
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1383 true);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1384
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1385 for (i = 0; i < (int)kchapters->ListSize(); i++) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1386 keentry = (KaxEditionEntry *)(*kchapters)[i];
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1387 if (EbmlId(*keentry) == KaxEditionEntry::ClassInfos.GlobalId) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1388 for (k = 0; k < (int)keentry->ListSize(); k++) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1389 kcatom = (KaxChapterAtom *)(*keentry)[k];
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1390 if (EbmlId(*kcatom) == KaxChapterAtom::ClassInfos.GlobalId) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1391 chapter.start = 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1392 chapter.end = 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1393 kctstart = FINDFIRST(kcatom, KaxChapterTimeStart);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1394 if (kctstart != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1395 chapter.start = uint64(*kctstart) / 1000000;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1396 kctend = FINDFIRST(kcatom, KaxChapterTimeEnd);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1397 if (kctend != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1398 chapter.end = uint64(*kctend) / 1000000;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1399 mkv_d->chapters->push_back(chapter);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1400 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter %u from %02d:%02d:%02d."
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1401 "%03d to %02d:%02d:%02d.%03d\n", mkv_d->chapters->size(),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1402 (int)(chapter.start / 60 / 60 / 1000),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1403 (int)((chapter.start / 60 / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1404 (int)((chapter.start / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1405 (int)(chapter.start % 1000),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1406 (int)(chapter.end / 60 / 60 / 1000),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1407 (int)((chapter.end / 60 / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1408 (int)((chapter.end / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1409 (int)(chapter.end % 1000));
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1410 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1411 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1412 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1413 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1414
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1415 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing chapters ] ---------\n");
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1416 delete kchapters;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1417 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1418
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1419 static void parse_seekhead(mkv_demuxer_t *mkv_d, uint64_t pos) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1420 EbmlElement *l2 = NULL;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1421 EbmlStream *es;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1422 KaxSeekHead *kseekhead;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1423 KaxSeek *kseek;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1424 KaxSeekID *ksid;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1425 KaxSeekPosition *kspos;
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1426 int upper_lvl_el, i, k, s;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1427 uint64_t seek_pos;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1428 EbmlId *id;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1429 EbmlElement *e;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1430 binary *b;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1431
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1432 if (find_in_vector(*mkv_d->parsed_seekheads, pos))
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1433 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1434
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1435 mkv_d->parsed_seekheads->push_back(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1436
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1437 es = mkv_d->es;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1438 upper_lvl_el = 0;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1439
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1440 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing seek head ] ---------\n");
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1441
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1442 mkv_d->in->setFilePointer(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1443
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1444 kseekhead =
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1445 (KaxSeekHead *)es->FindNextElement(mkv_d->segment->Generic().Context,
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1446 upper_lvl_el, 0xFFFFFFFFL, true, 1);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1447 if (kseekhead == NULL)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1448 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1449
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1450 if (!(EbmlId(*kseekhead) == KaxSeekHead::ClassInfos.GlobalId)) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1451 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] No KaxSeekead element found but %s.\n"
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1452 "[mkv] \\---- [ parsing seek head ] ---------\n",
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1453 kseekhead->Generic().DebugName);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1454
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1455 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1456 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1457
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1458 kseekhead->Read(*es, KaxSeekHead::ClassInfos.Context, upper_lvl_el, l2,
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1459 true);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1460
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1461 for (i = 0; i < (int)kseekhead->ListSize(); i++) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1462 kseek = (KaxSeek *)(*kseekhead)[i];
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1463 if (!(EbmlId(*kseek) == KaxSeek::ClassInfos.GlobalId))
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1464 continue;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1465
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1466 seek_pos = 0;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1467 id = NULL;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1468
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1469 for (k = 0; k < (int)kseek->ListSize(); k++) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1470 e = (*kseek)[k];
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1471
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1472 if (EbmlId(*e) == KaxSeekID::ClassInfos.GlobalId) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1473 ksid = (KaxSeekID *)e;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1474
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1475 b = ksid->GetBuffer();
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1476 s = ksid->GetSize();
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1477 if (id != NULL)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1478 delete id;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1479 id = new EbmlId(b, s);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1480
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1481 } else if (EbmlId(*e) == KaxSeekPosition::ClassInfos.GlobalId) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1482 kspos = (KaxSeekPosition *)e;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1483 seek_pos = mkv_d->segment->GetGlobalPosition(uint64(*kspos));
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1484
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1485 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1486 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1487
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1488 if ((seek_pos != 0) && (id != NULL)) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1489 if (*id == KaxSeekHead::ClassInfos.GlobalId)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1490 parse_seekhead(mkv_d, seek_pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1491 else if (*id == KaxCues::ClassInfos.GlobalId)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1492 parse_cues(mkv_d, seek_pos);
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1493 else if (*id == KaxChapters::ClassInfos.GlobalId)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1494 parse_chapters(mkv_d, seek_pos);
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1495 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1496
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1497 if (id != NULL)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1498 delete id;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1499 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1500
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1501 delete kseekhead;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1502
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1503 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing seek head ] ---------\n");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1504 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1505
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1506 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1507 static int aac_get_sample_rate_index(uint32_t sample_rate) {
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1508 if (92017 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1509 return 0;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1510 else if (75132 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1511 return 1;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1512 else if (55426 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1513 return 2;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1514 else if (46009 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1515 return 3;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1516 else if (37566 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1517 return 4;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1518 else if (27713 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1519 return 5;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1520 else if (23004 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1521 return 6;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1522 else if (18783 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1523 return 7;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1524 else if (13856 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1525 return 8;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1526 else if (11502 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1527 return 9;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1528 else if (9391 <= sample_rate)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1529 return 10;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1530 else
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1531 return 11;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1532 }
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1533
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1534 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1535 int flags);
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1536
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1537 extern "C" int demux_mkv_open(demuxer_t *demuxer) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1538 unsigned char signature[4];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1539 stream_t *s;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1540 demux_packet_t *dp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1541 mkv_demuxer_t *mkv_d;
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1542 int upper_lvl_el, exit_loop, i, vid, sid, aid;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1543 // Elements for different levels
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1544 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1545 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1546 mkv_track_t *track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1547 sh_audio_t *sh_a;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1548 sh_video_t *sh_v;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1549 vector<uint64_t> seekheads_to_parse;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1550 vector<uint64_t> cues_to_parse;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1551 int64_t current_pos;
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
1552 qt_image_description_t *idesc;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1553
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1554 #ifdef USE_ICONV
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1555 subcp_open();
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1556 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1557
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1558 s = demuxer->stream;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1559 stream_seek(s, s->start_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1560 memset(signature, 0, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1561 stream_read(s, (char *)signature, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1562 if ((signature[0] != 0x1A) || (signature[1] != 0x45) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1563 (signature[2] != 0xDF) || (signature[3] != 0xA3))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1564 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1565 stream_seek(s, s->start_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1566
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1567 try {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1568 // structure for storing the demuxer's private data
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1569 mkv_d = (mkv_demuxer_t *)safemalloc(sizeof(mkv_demuxer_t));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1570 memset(mkv_d, 0, sizeof(mkv_demuxer_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1571 mkv_d->duration = -1.0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1572
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1573 // Create the interface between MPlayer's IO system and
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1574 // libmatroska's IO system.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1575 mkv_d->in = new mpstream_io_callback(demuxer->stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1576 if (mkv_d->in == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1577 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1578 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1579 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1580 mpstream_io_callback &io = *static_cast<mpstream_io_callback *>(mkv_d->in);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1581 mkv_d->es = new EbmlStream(io);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1582 if (mkv_d->es == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1583 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1584 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1585 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1586 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1587
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1588 // Find the EbmlHead element. Must be the first one.
10638
9d0b8330a683 Fixes for compilation with gcc versions != 3.2.
mosu
parents: 10637
diff changeset
1589 l0 = es->FindNextID(EbmlHead::ClassInfos, 0xFFFFFFFFFFFFFFFFULL);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1590 if (l0 == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1591 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] no head found\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1592 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1593 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1594 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1595 // Don't verify its data for now.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1596 l0->SkipData(static_cast<EbmlStream &>(*es), l0->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1597 delete l0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1598 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1599
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1600 // Next element must be a segment
10638
9d0b8330a683 Fixes for compilation with gcc versions != 3.2.
mosu
parents: 10637
diff changeset
1601 l0 = es->FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFFFFFFFFFULL);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1602 if (l0 == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1603 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1604 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1605 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1606 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1607 if (!(EbmlId(*l0) == KaxSegment::ClassInfos.GlobalId)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1608 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1609 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1610 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1611 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1612 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1613
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1614 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
1615 mkv_d->tc_scale = MKVD_TIMECODESCALE;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1616 mkv_d->parsed_seekheads = new vector<uint64_t>;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1617 mkv_d->parsed_cues = new vector<uint64_t>;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1618
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1619 vid = 0;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1620 aid = 0;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1621 sid = 0;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1622
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1623 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1624 exit_loop = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1625 // We've got our segment, so let's find the tracks
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1626 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el, 0xFFFFFFFFL,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1627 true, 1);
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1628 while ((l1 != NULL) && (upper_lvl_el <= 0)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1629
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1630 if (EbmlId(*l1) == KaxInfo::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1631 // General info about this Matroska file
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1632 KaxTimecodeScale *ktc_scale;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1633 KaxDuration *kduration;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1634
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1635 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1636
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1637 l1->Read(*es, KaxInfo::ClassInfos.Context, upper_lvl_el, l2, true);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1638
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1639 ktc_scale = FINDFIRST(l1, KaxTimecodeScale);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1640 if (ktc_scale != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1641 mkv_d->tc_scale = uint64(*ktc_scale);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1642 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + timecode scale: %llu\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1643 mkv_d->tc_scale);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1644 } else
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1645 mkv_d->tc_scale = MKVD_TIMECODESCALE;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1646
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1647 kduration = FINDFIRST(l1, KaxDuration);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1648 if (kduration != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1649 mkv_d->duration = float(*kduration) * mkv_d->tc_scale / 1000000000.0;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1650 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3fs\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1651 mkv_d->duration);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1652 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1653
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1654 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1655
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1656 } else if (EbmlId(*l1) == KaxTracks::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1657 // Yep, we've found our KaxTracks element. Now find all tracks
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1658 // contained in this segment.
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1659
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1660 KaxTrackEntry *ktentry;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1661
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1662 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1663
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1664 l1->Read(*es, KaxTracks::ClassInfos.Context, upper_lvl_el, l2, true);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1665
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1666 ktentry = FINDFIRST(l1, KaxTrackEntry);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1667 while (ktentry != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1668 // We actually found a track entry :) We're happy now.
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1669
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1670 KaxTrackNumber *ktnum;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1671 KaxTrackDefaultDuration *kdefdur;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1672 KaxTrackType *kttype;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1673 KaxTrackAudio *ktaudio;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1674 KaxTrackVideo *ktvideo;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1675 KaxCodecID *kcodecid;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1676 KaxCodecPrivate *kcodecpriv;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1677 KaxTrackFlagDefault *ktfdefault;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1678 KaxTrackLanguage *ktlanguage;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1679 #if LIBMATROSKA_VERSION >= 000503
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1680 KaxContentEncodings *kcencodings;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1681 int kcenc_idx;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1682 vector<mkv_content_encoding_t>::iterator ce_ins_it;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1683 #endif
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1684
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1685 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1686
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1687 track = new_mkv_track(mkv_d);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1688 if (track == NULL)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1689 return 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1690
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1691 ktnum = FINDFIRST(ktentry, KaxTrackNumber);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1692 if (ktnum != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1693 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1694 uint32(*ktnum));
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1695 track->tnum = uint32(*ktnum);
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1696 if (find_duplicate_track_by_num(mkv_d, track->tnum, track) != NULL)
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1697 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] | + WARNING: There's "
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1698 "more than one track with the number %u.\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1699 track->tnum);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1700 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1701
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1702 kdefdur = FINDFIRST(ktentry, KaxTrackDefaultDuration);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1703 if (kdefdur != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1704 if (uint64(*kdefdur) == 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1705 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: 0");
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1706 else {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1707 track->v_frate = 1000000000.0 / (float)uint64(*kdefdur);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1708 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default duration: "
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1709 "%.3fms ( = %.3f fps)\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1710 (float)uint64(*kdefdur) / 1000000.0, track->v_frate);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1711 }
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
1712 track->default_duration = (float)uint64(*kdefdur) / 1000000000.0;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1713 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1714
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1715 kttype = FINDFIRST(ktentry, KaxTrackType);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1716 if (kttype != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1717 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1718
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1719 switch (uint8(*kttype)) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1720 case track_audio:
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1721 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1722 track->type = 'a';
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1723 track->xid = aid;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1724 aid++;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1725 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1726 case track_video:
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1727 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1728 track->type = 'v';
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1729 track->xid = vid;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1730 vid++;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1731 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1732 case track_subtitle:
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1733 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1734 track->type = 's';
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1735 track->xid = sid;
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
1736 sid++;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1737 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1738 default:
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1739 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1740 track->type = '?';
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1741 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1742 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1743 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1744
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1745 ktaudio = FINDFIRST(ktentry, KaxTrackAudio);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1746 if (ktaudio != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1747 KaxAudioSamplingFreq *ka_sfreq;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1748 KaxAudioChannels *ka_channels;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1749 KaxAudioBitDepth *ka_bitdepth;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1750
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1751 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1752
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1753 ka_sfreq = FINDFIRST(ktaudio, KaxAudioSamplingFreq);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1754 if (ka_sfreq != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1755 track->a_sfreq = float(*ka_sfreq);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1756 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Sampling "
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1757 "frequency: %f\n", track->a_sfreq);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1758 } else
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1759 track->a_sfreq = 8000.0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1760
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1761 ka_channels = FINDFIRST(ktaudio, KaxAudioChannels);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1762 if (ka_channels != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1763 track->a_channels = uint8(*ka_channels);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1764 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1765 track->a_channels);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1766 } else
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1767 track->a_channels = 1;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1768
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1769 ka_bitdepth = FINDFIRST(ktaudio, KaxAudioBitDepth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1770 if (ka_bitdepth != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1771 track->a_bps = uint8(*ka_bitdepth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1772 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1773 track->a_bps);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1774 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1775
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1776 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
1777
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1778 ktvideo = FINDFIRST(ktentry, KaxTrackVideo);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1779 if (ktvideo != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1780 KaxVideoPixelWidth *kv_pwidth;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1781 KaxVideoPixelHeight *kv_pheight;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1782 KaxVideoDisplayWidth *kv_dwidth;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1783 KaxVideoDisplayHeight *kv_dheight;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1784 KaxVideoFrameRate *kv_frate;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1785
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1786 kv_pwidth = FINDFIRST(ktvideo, KaxVideoPixelWidth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1787 if (kv_pwidth != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1788 track->v_width = uint16(*kv_pwidth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1789 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1790 track->v_width);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1791 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1792
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1793 kv_pheight = FINDFIRST(ktvideo, KaxVideoPixelHeight);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1794 if (kv_pheight != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1795 track->v_height = uint16(*kv_pheight);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1796 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1797 track->v_height);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1798 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1799
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1800 kv_dwidth = FINDFIRST(ktvideo, KaxVideoDisplayWidth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1801 if (kv_dwidth != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1802 track->v_dwidth = uint16(*kv_dwidth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1803 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1804 track->v_dwidth);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1805 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1806
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1807 kv_dheight = FINDFIRST(ktvideo, KaxVideoDisplayHeight);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1808 if (kv_dheight != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1809 track->v_dheight = uint16(*kv_dheight);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1810 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1811 track->v_dheight);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1812 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1813
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1814 // For older files.
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1815 kv_frate = FINDFIRST(ktvideo, KaxVideoFrameRate);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1816 if (kv_frate != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1817 track->v_frate = float(*kv_frate);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1818 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1819 track->v_frate);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1820 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1821
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1822 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1823
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1824 kcodecid = FINDFIRST(ktentry, KaxCodecID);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1825 if (kcodecid != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1826 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1827 string(*kcodecid).c_str());
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1828 track->codec_id = strdup(string(*kcodecid).c_str());
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1829 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1830
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1831 kcodecpriv = FINDFIRST(ktentry, KaxCodecPrivate);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1832 if (kcodecpriv != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1833 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + CodecPrivate, length "
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1834 "%llu\n", kcodecpriv->GetSize());
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1835 track->private_size = kcodecpriv->GetSize();
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1836 if (track->private_size > 0)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1837 track->private_data = safememdup(kcodecpriv->GetBuffer(),
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1838 track->private_size);
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1839 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1840
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1841 ktfdefault = FINDFIRST(ktentry, KaxTrackFlagDefault);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1842 if (ktfdefault != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1843 track->default_track = uint32(*ktfdefault);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1844 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1845 track->default_track);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1846 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1847
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1848 ktlanguage = FINDFIRST(ktentry, KaxTrackLanguage);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1849 if (ktlanguage != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1850 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1851 string(*ktlanguage).c_str());
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1852 if (track->language != NULL)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1853 free(track->language);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1854 track->language = strdup(string(*ktlanguage).c_str());
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1855 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1856
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1857 #if LIBMATROSKA_VERSION >= 000503
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1858 kcencodings = FINDFIRST(ktentry, KaxContentEncodings);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1859 if (kcencodings != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1860 for (kcenc_idx = 0; kcenc_idx < (int)kcencodings->ListSize();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1861 kcenc_idx++) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1862 EbmlElement *l3;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1863
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1864 l3 = (*kcencodings)[kcenc_idx];
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1865 if (EbmlId(*l3) == KaxContentEncoding::ClassInfos.GlobalId) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1866 KaxContentEncoding *kcenc;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1867 KaxContentEncodingOrder *ce_order;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1868 KaxContentEncodingType *ce_type;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1869 KaxContentEncodingScope *ce_scope;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1870 KaxContentCompression *ce_comp;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1871 KaxContentEncryption *ce_enc;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1872 mkv_content_encoding_t enc;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1873
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1874 memset(&enc, 0, sizeof(mkv_content_encoding_t));
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1875 kcenc = static_cast<KaxContentEncoding *>(l3);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1876
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1877 ce_order = FINDFIRST(kcenc, KaxContentEncodingOrder);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1878 if (ce_order != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1879 enc.order = uint32(*ce_order);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1880
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1881 ce_type = FINDFIRST(kcenc, KaxContentEncodingType);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1882 if (ce_type != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1883 enc.type = uint32(*ce_type);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1884
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1885 ce_scope = FINDFIRST(kcenc, KaxContentEncodingScope);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1886 if (ce_scope != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1887 enc.scope = uint32(*ce_scope);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1888 else
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1889 enc.scope = 1;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1890
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1891 ce_comp = FINDFIRST(kcenc, KaxContentCompression);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1892 if (ce_comp != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1893 KaxContentCompAlgo *cc_algo;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1894 KaxContentCompSettings *cc_settings;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1895
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1896 cc_algo = FINDFIRST(ce_comp, KaxContentCompAlgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1897 if (cc_algo != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1898 enc.comp_algo = uint32(*cc_algo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1899
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1900 cc_settings = FINDFIRST(ce_comp, KaxContentCompSettings);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1901 if (cc_settings != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1902 enc.comp_settings =
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1903 (unsigned char *)safememdup(&binary(*cc_settings),
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1904 cc_settings->GetSize());
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1905 enc.comp_settings_len = cc_settings->GetSize();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1906 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1907 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1908
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1909 ce_enc = FINDFIRST(kcenc, KaxContentEncryption);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1910 if (ce_enc != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1911 KaxContentEncAlgo *ce_ealgo;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1912 KaxContentEncKeyID *ce_ekeyid;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1913 KaxContentSigAlgo *ce_salgo;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1914 KaxContentSigHashAlgo *ce_shalgo;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1915 KaxContentSigKeyID *ce_skeyid;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1916 KaxContentSignature *ce_signature;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1917
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1918 ce_ealgo = FINDFIRST(ce_enc, KaxContentEncAlgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1919 if (ce_ealgo != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1920 enc.enc_algo = uint32(*ce_ealgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1921
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1922 ce_ekeyid = FINDFIRST(ce_enc, KaxContentEncKeyID);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1923 if (ce_ekeyid != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1924 enc.enc_keyid =
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1925 (unsigned char *)safememdup(&binary(*ce_ekeyid),
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1926 ce_ekeyid->GetSize());
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1927 enc.enc_keyid_len = ce_ekeyid->GetSize();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1928 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1929
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1930 ce_salgo = FINDFIRST(ce_enc, KaxContentSigAlgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1931 if (ce_salgo != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1932 enc.enc_algo = uint32(*ce_salgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1933
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1934 ce_shalgo = FINDFIRST(ce_enc, KaxContentSigHashAlgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1935 if (ce_shalgo != NULL)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1936 enc.enc_algo = uint32(*ce_shalgo);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1937
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1938 ce_skeyid = FINDFIRST(ce_enc, KaxContentSigKeyID);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1939 if (ce_skeyid != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1940 enc.sig_keyid =
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1941 (unsigned char *)safememdup(&binary(*ce_skeyid),
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1942 ce_skeyid->GetSize());
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1943 enc.sig_keyid_len = ce_skeyid->GetSize();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1944 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1945
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1946 ce_signature = FINDFIRST(ce_enc, KaxContentSignature);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1947 if (ce_signature != NULL) {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1948 enc.signature =
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1949 (unsigned char *)safememdup(&binary(*ce_signature),
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1950 ce_signature->GetSize());
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1951 enc.signature_len = ce_signature->GetSize();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1952 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1953
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1954 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1955
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1956 ce_ins_it = track->c_encodings->begin();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1957 while ((ce_ins_it != track->c_encodings->end()) &&
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1958 (enc.order <= (*ce_ins_it).order))
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1959 ce_ins_it++;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1960 track->c_encodings->insert(ce_ins_it, enc);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1961 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1962 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1963 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1964
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1965 #endif
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1966 ktentry = FINDNEXT(l1, KaxTrackEntry, ktentry);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1967 } // while (ktentry != NULL)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1968
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1969 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1970
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1971 } else if (EbmlId(*l1) == KaxSeekHead::ClassInfos.GlobalId) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1972 if (!find_in_vector(seekheads_to_parse, l1->GetElementPosition()))
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1973 seekheads_to_parse.push_back(l1->GetElementPosition());
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1974 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1975
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1976 } else if ((EbmlId(*l1) == KaxCues::ClassInfos.GlobalId) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1977 !mkv_d->cues_found) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1978 if (!find_in_vector(cues_to_parse, l1->GetElementPosition()))
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1979 cues_to_parse.push_back(l1->GetElementPosition());
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1980 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1981
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1982 } else if (EbmlId(*l1) == KaxChapters::ClassInfos.GlobalId) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1983 parse_chapters(mkv_d, l1->GetElementPosition());
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1984 l1->SkipData(*es, l1->Generic().Context);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1985
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1986 } else if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1987 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cluster, headers are "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1988 "parsed completely :)\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1989 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1990 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1991 exit_loop = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1992
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1993 } else
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1994 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1995
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1996 if (!in_parent(l0)) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1997 delete l1;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1998 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1999 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2000
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2001 if (upper_lvl_el > 0) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2002 upper_lvl_el--;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2003 if (upper_lvl_el > 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2004 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2005 delete l1;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2006 l1 = l2;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2007 continue;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2008
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2009 } else if (upper_lvl_el < 0) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2010 upper_lvl_el++;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2011 if (upper_lvl_el < 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2012 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2013
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2014 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2015
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2016 if (exit_loop) // we've found the first cluster, so get out
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2017 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2018
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2019 l1->SkipData(*es, l1->Generic().Context);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2020 delete l1;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2021 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el,
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2022 0xFFFFFFFFL, true);
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2023
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2024 } // while (l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2025
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2026 if (!exit_loop) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2027 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2028 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2029 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2030
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2031 current_pos = io.getFilePointer();
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2032
10283
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2033 // Try to find the very first timecode (cluster timecode).
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2034 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2035 0xFFFFFFFFL, true, 1);
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2036 if ((l2 != NULL) && !upper_lvl_el &&
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2037 (EbmlId(*l2) == KaxClusterTimecode::ClassInfos.GlobalId)) {
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2038 KaxClusterTimecode &ctc = *static_cast<KaxClusterTimecode *>(l2);
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2039 ctc.ReadData(es->I_O());
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2040 mkv_d->first_tc = uint64(ctc) * mkv_d->tc_scale / 1000000;
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2041 delete l2;
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2042 } else
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2043 mkv_d->first_tc = 0;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2044
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2045 // Parse all cues and seek heads
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2046 for (i = 0; i < (int)cues_to_parse.size(); i++)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2047 parse_cues(mkv_d, cues_to_parse[i]);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2048 for (i = 0; i < (int)seekheads_to_parse.size(); i++)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2049 parse_seekhead(mkv_d, seekheads_to_parse[i]);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2050
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2051 io.setFilePointer(current_pos);
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
2052
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2053 } catch (exception &ex) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2054 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] caught exception\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2055 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2056 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2057
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2058 if (!check_track_information(mkv_d)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2059 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2060 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2061 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2062
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2063 track = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2064 if (demuxer->video->id == -1) { // Automatically select a video track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2065 // Search for a video track that has the 'default' flag set.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2066 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2067 if ((mkv_d->tracks[i]->type == 'v') && mkv_d->tracks[i]->ok &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2068 mkv_d->tracks[i]->default_track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2069 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2070 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2071 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2072
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2073 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2074 // No track has the 'default' flag set - let's take the first video
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2075 // track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2076 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2077 if ((mkv_d->tracks[i]->type == 'v') && mkv_d->tracks[i]->ok) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2078 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2079 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2080 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2081 } else if (demuxer->video->id != -2) // -2 = no video at all
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
2082 track = find_track_by_num(mkv_d, demuxer->video->id, 'v');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2083
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2084 if (track) {
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2085 BITMAPINFOHEADER *bih;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2086
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2087 idesc = NULL;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2088
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2089 if (track->ms_compat) { // MS compatibility mode
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2090 BITMAPINFOHEADER *src;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2091 src = (BITMAPINFOHEADER *)track->private_data;
11329
9165908f87d3 Fixed wrong allocation of the BITMAPINFOHEADER structure which would crash mplayer in some cases.
mosu
parents: 11321
diff changeset
2092 bih = (BITMAPINFOHEADER *)safemalloc(track->private_size);
9165908f87d3 Fixed wrong allocation of the BITMAPINFOHEADER structure which would crash mplayer in some cases.
mosu
parents: 11321
diff changeset
2093 memset(bih, 0, track->private_size);
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2094 bih->biSize = get_uint32(&src->biSize);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2095 bih->biWidth = get_uint32(&src->biWidth);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2096 bih->biHeight = get_uint32(&src->biHeight);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2097 bih->biPlanes = get_uint16(&src->biPlanes);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2098 bih->biBitCount = get_uint16(&src->biBitCount);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2099 bih->biCompression = get_uint32(&src->biCompression);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2100 bih->biSizeImage = get_uint32(&src->biSizeImage);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2101 bih->biXPelsPerMeter = get_uint32(&src->biXPelsPerMeter);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2102 bih->biYPelsPerMeter = get_uint32(&src->biYPelsPerMeter);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2103 bih->biClrUsed = get_uint32(&src->biClrUsed);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2104 bih->biClrImportant = get_uint32(&src->biClrImportant);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2105 memcpy((char *)bih + sizeof(BITMAPINFOHEADER),
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2106 (char *)src + sizeof(BITMAPINFOHEADER),
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2107 track->private_size - sizeof(BITMAPINFOHEADER));
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2108
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2109 } else {
11329
9165908f87d3 Fixed wrong allocation of the BITMAPINFOHEADER structure which would crash mplayer in some cases.
mosu
parents: 11321
diff changeset
2110 bih = (BITMAPINFOHEADER *)safemalloc(sizeof(BITMAPINFOHEADER));
9165908f87d3 Fixed wrong allocation of the BITMAPINFOHEADER structure which would crash mplayer in some cases.
mosu
parents: 11321
diff changeset
2111 memset(bih, 0, sizeof(BITMAPINFOHEADER));
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2112 bih->biSize = sizeof(BITMAPINFOHEADER);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2113 bih->biWidth = track->v_width;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2114 bih->biHeight = track->v_height;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2115 bih->biBitCount = 24;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2116 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2117
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2118 if ((track->private_size >= sizeof(real_video_props_t)) &&
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2119 (!strcmp(track->codec_id, MKV_V_REALV10) ||
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2120 !strcmp(track->codec_id, MKV_V_REALV20) ||
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2121 !strcmp(track->codec_id, MKV_V_REALV30) ||
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2122 !strcmp(track->codec_id, MKV_V_REALV40))) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2123 unsigned char *dst, *src;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2124 real_video_props_t *rvp;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2125 uint32_t type2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2126
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2127 rvp = (real_video_props_t *)track->private_data;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2128 src = (unsigned char *)(rvp + 1);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2129
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2130 bih = (BITMAPINFOHEADER *)realloc(bih, sizeof(BITMAPINFOHEADER) + 12);
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2131 bih->biSize = 48;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2132 bih->biPlanes = 1;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2133 type2 = get_uint32_be(&rvp->type2);
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
2134 if ((type2 == 0x10003000) || (type2 == 0x10003001))
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2135 bih->biCompression = mmioFOURCC('R', 'V', '1', '3');
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2136 else
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2137 bih->biCompression = mmioFOURCC('R', 'V', track->codec_id[9], '0');
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2138 dst = (unsigned char *)(bih + 1);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2139 ((unsigned int *)dst)[0] = get_uint32_be(&rvp->type1);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2140 ((unsigned int *)dst)[1] = type2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2141
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2142 if ((bih->biCompression <= 0x30335652) &&
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2143 (type2 >= 0x20200002)) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2144 // read secondary WxH for the cmsg24[] (see vd_realvid.c)
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2145 ((unsigned short *)(bih + 1))[4] = 4 * (unsigned short)src[0];
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2146 ((unsigned short *)(bih + 1))[5] = 4 * (unsigned short)src[1];
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2147 } else
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2148 memset(&dst[8], 0, 4);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2149 track->realmedia = true;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2150
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2151 #if defined(USE_QTX_CODECS)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2152 } else if ((track->private_size >= sizeof(qt_image_description_t)) &&
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2153 (!strcmp(track->codec_id, MKV_V_QUICKTIME))) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2154 idesc = (qt_image_description_t *)track->private_data;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2155 idesc->id_size = get_uint32_be(&idesc->id_size);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2156 idesc->codec_type = get_uint32(&idesc->codec_type);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2157 idesc->version = get_uint16_be(&idesc->version);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2158 idesc->revision = get_uint16_be(&idesc->revision);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2159 idesc->vendor = get_uint32_be(&idesc->vendor);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2160 idesc->temporal_quality = get_uint32_be(&idesc->temporal_quality);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2161 idesc->spatial_quality = get_uint32_be(&idesc->spatial_quality);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2162 idesc->width = get_uint16_be(&idesc->width);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2163 idesc->height = get_uint16_be(&idesc->height);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2164 idesc->horizontal_resolution =
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2165 get_uint32_be(&idesc->horizontal_resolution);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2166 idesc->vertical_resolution =
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2167 get_uint32_be(&idesc->vertical_resolution);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2168 idesc->data_size = get_uint32_be(&idesc->data_size);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2169 idesc->frame_count = get_uint16_be(&idesc->frame_count);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2170 idesc->depth = get_uint16_be(&idesc->depth);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2171 idesc->color_table_id = get_uint16_be(&idesc->color_table_id);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2172 bih->biPlanes = 1;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2173 bih->biCompression = idesc->codec_type;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2174 #endif // defined(USE_QTX_CODECS)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2175
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2176 } else {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2177 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Unknown/unsupported CodecID "
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2178 "(%s) or missing/bad CodecPrivate data (track %u).\n",
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2179 track->codec_id, track->tnum);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2180 demuxer->video->id = -2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2181 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2182 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2183
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2184 if (demuxer->video->id != -2) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2185 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u\n",
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2186 track->tnum);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2187
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2188 sh_v = new_sh_video(demuxer, track->tnum);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2189 sh_v->bih = bih;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2190 sh_v->format = sh_v->bih->biCompression;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2191 if (track->v_frate == 0.0)
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2192 track->v_frate = 25.0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2193 sh_v->fps = track->v_frate;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2194 sh_v->frametime = 1 / track->v_frate;
11647
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2195 if (!track->realmedia) {
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2196 sh_v->disp_w = track->v_width;
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2197 sh_v->disp_h = track->v_height;
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2198 sh_v->aspect = (float)track->v_dwidth / (float)track->v_dheight;
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2199 } else {
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2200 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2201 // disp_w and disp_h from the RealVideo stream contents returned
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2202 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2203 // the Matroska file then it has already been set to PixelWidth/Height
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2204 // by check_track_information.
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2205 sh_v->disp_w = track->v_dwidth;
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2206 sh_v->disp_h = track->v_dheight;
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2207 }
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2208 if (idesc != NULL)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2209 sh_v->ImageDesc = idesc;
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
2210 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2211
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2212 demuxer->video->id = track->tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2213 demuxer->video->sh = sh_v;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2214 sh_v->ds = demuxer->video;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2215
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2216 mkv_d->video = track;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2217 } else
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2218 free(bih);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2219
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2220 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2221 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2222 demuxer->video->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2223 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2224
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2225 track = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2226 if (demuxer->audio->id == -1) { // Automatically select an audio track.
10167
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2227 // check if the user specified an audio language
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2228 if (audio_lang != NULL) {
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2229 track = find_track_by_language(mkv_d, audio_lang, NULL, 'a');
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2230 }
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2231 if (track == NULL)
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2232 // no audio language specified, or language not found
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2233 // Search for an audio track that has the 'default' flag set.
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2234 for (i = 0; i < mkv_d->num_tracks; i++)
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2235 if ((mkv_d->tracks[i]->type == 'a') && mkv_d->tracks[i]->ok &&
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2236 mkv_d->tracks[i]->default_track) {
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2237 track = mkv_d->tracks[i];
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2238 break;
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2239 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2240
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2241 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2242 // No track has the 'default' flag set - let's take the first audio
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2243 // track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2244 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2245 if ((mkv_d->tracks[i]->type == 'a') && mkv_d->tracks[i]->ok) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2246 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2247 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2248 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2249 } else if (demuxer->audio->id != -2) // -2 = no audio at all
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
2250 track = find_track_by_num(mkv_d, demuxer->audio->id, 'a');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2251
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2252 if (track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2253 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play audio track %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2254 track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2255 sh_a = new_sh_audio(demuxer, track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2256
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2257 demuxer->audio->id = track->tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2258 demuxer->audio->sh = sh_a;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2259 sh_a->ds = demuxer->audio;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2260
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2261 mkv_d->audio = track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2262
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2263 if (track->ms_compat)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2264 sh_a->wf = (WAVEFORMATEX *)safememdup(track->private_data,
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2265 track->private_size);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2266 else {
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2267 sh_a->wf = (WAVEFORMATEX *)safemalloc(sizeof(WAVEFORMATEX));
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2268 memset(sh_a->wf, 0, sizeof(WAVEFORMATEX));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2269 }
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2270 sh_a->format = track->a_formattag;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2271 sh_a->wf->wFormatTag = track->a_formattag;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2272 sh_a->channels = track->a_channels;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2273 sh_a->wf->nChannels = track->a_channels;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2274 sh_a->samplerate = (uint32_t)track->a_sfreq;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2275 sh_a->wf->nSamplesPerSec = (uint32_t)track->a_sfreq;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2276 sh_a->samplesize = track->a_bps / 8;
11155
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
2277 if (!strcmp(track->codec_id, MKV_A_MP3) ||
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
2278 !strcmp(track->codec_id, MKV_A_MP2)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2279 sh_a->wf->nAvgBytesPerSec = 16000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2280 sh_a->wf->nBlockAlign = 1152;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2281 sh_a->wf->wBitsPerSample = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2282 sh_a->samplesize = 0;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2283
11114
d8ddd7727084 More liberal codec id recognition for AC3 codecs (needed for transcoded DNET from RM).
mosu
parents: 10984
diff changeset
2284 } else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3))) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2285 sh_a->wf->nAvgBytesPerSec = 16000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2286 sh_a->wf->nBlockAlign = 1536;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2287 sh_a->wf->wBitsPerSample = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2288 sh_a->samplesize = 0;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2289
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2290 } else if (!strcmp(track->codec_id, MKV_A_PCM) ||
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2291 !strcmp(track->codec_id, MKV_A_PCM_BE)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2292 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2293 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2294 sh_a->wf->wBitsPerSample = track->a_bps;
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2295 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2296 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2297
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2298 } else if (!strcmp(track->codec_id, MKV_A_QDMC) ||
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2299 !strcmp(track->codec_id, MKV_A_QDMC2)) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2300 sh_a->wf->wBitsPerSample = track->a_bps;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2301 sh_a->wf->nAvgBytesPerSec = 16000;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2302 sh_a->wf->nBlockAlign = 1486;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2303 track->fix_i_bps = true;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2304 track->qt_last_a_pts = 0.0;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2305 if (track->private_data != NULL) {
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2306 sh_a->codecdata = (unsigned char *)safememdup(track->private_data,
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2307 track->private_size);
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2308 sh_a->codecdata_len = track->private_size;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2309 }
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2310 if (!strcmp(track->codec_id, MKV_A_QDMC))
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2311 sh_a->format = mmioFOURCC('Q', 'D', 'M', 'C');
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2312 else
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2313 sh_a->format = mmioFOURCC('Q', 'D', 'M', '2');
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2314
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2315 } 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
2316 int profile, srate_idx;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2317
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2318 sh_a->wf->nAvgBytesPerSec = 16000;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2319 sh_a->wf->nBlockAlign = 1024;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2320 sh_a->wf->wBitsPerSample = 0;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2321 sh_a->samplesize = 0;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2322
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2323 // Recreate the 'private data' which faad2 uses in its initialization.
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2324 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2325 if (!strncmp(&track->codec_id[12], "MAIN", 4))
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2326 profile = 0;
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2327 else if (!strncmp(&track->codec_id[12], "LC", 2))
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2328 profile = 1;
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2329 else if (!strncmp(&track->codec_id[12], "SSR", 3))
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2330 profile = 2;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2331 else
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2332 profile = 3;
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2333 sh_a->codecdata = (unsigned char *)safemalloc(5);
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2334 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xe) >> 1);
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2335 sh_a->codecdata[1] = ((srate_idx & 0x1) << 7) |
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2336 (track->a_channels << 3);
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2337
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2338 if (strstr(track->codec_id, "SBR") != NULL) {
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2339 // HE-AAC (aka SBR AAC)
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2340 sh_a->codecdata_len = 5;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2341
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2342 sh_a->samplerate *= 2;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2343 sh_a->wf->nSamplesPerSec *= 2;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2344 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2345 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2346 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2347 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2348 track->default_duration = 1024.0 / (float)(sh_a->samplerate / 2);
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2349
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2350 } else {
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2351 sh_a->codecdata_len = 2;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2352 track->default_duration = 1024.0 / (float)sh_a->samplerate;
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2353 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2354
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2355 } else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2356 for (i = 0; i < 3; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2357 dp = new_demux_packet(track->header_sizes[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2358 memcpy(dp->buffer, track->headers[i], track->header_sizes[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2359 dp->pts = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2360 dp->flags = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2361 ds_add_packet(demuxer->audio, dp);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2362 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2363
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2364 } else if ((track->private_size >= sizeof(real_audio_v4_props_t)) &&
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2365 !strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2366 // Common initialization for all RealAudio codecs
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2367 real_audio_v4_props_t *ra4p;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2368 real_audio_v5_props_t *ra5p;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2369 unsigned char *src;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2370 int codecdata_length, version;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2371
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2372 ra4p = (real_audio_v4_props_t *)track->private_data;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2373 ra5p = (real_audio_v5_props_t *)track->private_data;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2374
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2375 sh_a->wf->wBitsPerSample = sh_a->samplesize * 8;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2376 sh_a->wf->nAvgBytesPerSec = 0; // FIXME !?
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2377 sh_a->wf->nBlockAlign = get_uint16_be(&ra4p->frame_size);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2378
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2379 version = get_uint16_be(&ra4p->version1);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2380
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2381 if (version == 4) {
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2382 src = (unsigned char *)(ra4p + 1);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2383 src += src[0] + 1;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2384 src += src[0] + 1;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2385 } else
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2386 src = (unsigned char *)(ra5p + 1);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2387
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2388 src += 3;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2389 if (version == 5)
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2390 src++;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2391 codecdata_length = get_uint32_be(src);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2392 src += 4;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2393 sh_a->wf->cbSize = 10 + codecdata_length;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2394 sh_a->wf = (WAVEFORMATEX *)realloc(sh_a->wf, sizeof(WAVEFORMATEX) +
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2395 sh_a->wf->cbSize);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2396 ((short *)(sh_a->wf + 1))[0] = get_uint16_be(&ra4p->sub_packet_size);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2397 ((short *)(sh_a->wf + 1))[1] = get_uint16_be(&ra4p->sub_packet_h);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2398 ((short *)(sh_a->wf + 1))[2] = get_uint16_be(&ra4p->flavor);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2399 ((short *)(sh_a->wf + 1))[3] = get_uint32_be(&ra4p->coded_frame_size);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2400 ((short *)(sh_a->wf + 1))[4] = codecdata_length;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2401 memcpy(((char *)(sh_a->wf + 1)) + 10, src, codecdata_length);
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2402
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2403 track->realmedia = true;
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2404
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2405 } else if (!strcmp(track->codec_id, MKV_A_FLAC) ||
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2406 (track->a_formattag == 0xf1ac)) {
11484
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2407 unsigned char *ptr;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2408 int size;
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2409 free(sh_a->wf);
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2410 sh_a->wf = NULL;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2411
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2412 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) {
11484
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2413 ptr = (unsigned char *)track->private_data;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2414 size = track->private_size;
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2415 } else {
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2416 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
11484
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2417 ptr = (unsigned char *)track->private_data + sizeof(WAVEFORMATEX);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2418 size = track->private_size - sizeof(WAVEFORMATEX);
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2419 }
11484
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2420 if ((size < 4) || (ptr[0] != 'f') || (ptr[1] != 'L') ||
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2421 (ptr[2] != 'a') || (ptr[3] != 'C')) {
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2422 dp = new_demux_packet(4);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2423 memcpy(dp->buffer, "fLaC", 4);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2424 dp->pts = 0;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2425 dp->flags = 0;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2426 ds_add_packet(demuxer->audio, dp);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2427 }
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2428 dp = new_demux_packet(size);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2429 memcpy(dp->buffer, ptr, size);
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2430 dp->pts = 0;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2431 dp->flags = 0;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2432 ds_add_packet(demuxer->audio, dp);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2433 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2434
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2435 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2436 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2437 demuxer->audio->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2438 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2439
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2440 // DO NOT automatically select a subtitle track and behave like DVD
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2441 // 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
2442 track = NULL;
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
2443 if (demuxer->sub->id >= 0)
10705
4079bc9b15f9 Track selection uses the n-th audio/subtitle/video track as the ID, not the n-th track overall. All tracks are listed upon opening of the file along with their -aid/-sid etc.
mosu
parents: 10685
diff changeset
2444 track = find_track_by_num(mkv_d, demuxer->sub->id, 's');
10073
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
2445 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
2446 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
2447 if (track) {
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2448 if (!strcmp(track->codec_id, MKV_S_VOBSUB)) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2449 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will display subtitle track %u\n",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2450 track->tnum);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2451 mkv_d->subs_track = track;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2452 mkv_d->subtitle_type = MKV_SUBTYPE_VOBSUB;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2453 demuxer->sub->sh = (mkv_sh_sub_t *)safememdup(&track->sh_sub,
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2454 sizeof(mkv_sh_sub_t));
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2455 demuxer->sub->id = track->xid;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2456
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2457 } else if (strcmp(track->codec_id, MKV_S_TEXTASCII) &&
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2458 strcmp(track->codec_id, MKV_S_TEXTUTF8) &&
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2459 strcmp(track->codec_id, MKV_S_TEXTSSA) &&
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2460 strcmp(track->codec_id, "S_SSA") &&
11774
28b52087c48d Added more legacy CodecIDs (S_ASS).
mosu
parents: 11773
diff changeset
2461 strcmp(track->codec_id, "S_ASS") &&
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2462 strcmp(track->codec_id, "S_TEXT/ASS"))
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2463 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
2464 "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
2465 else {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2466 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
2467 track->tnum);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2468 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
2469 if (!mkv_d->subs.text[0]) {
11773
060b6c86cf31 10l off-by-one when allocating space for subs. Prevent newlines in SSA subs from overflowing the sub display.
mosu
parents: 11647
diff changeset
2470 for (i = 0; i <= SUB_MAX_TEXT; i++)
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2471 mkv_d->subs.text[i] = (char *)safemalloc(256);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2472
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2473 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
2474 sub_utf8 = 1; // Force UTF-8 conversion.
10984
e5f2765c6d80 Backwards compatibility fix for old SSA CodecIDs.
mosu
parents: 10930
diff changeset
2475 if (!strcmp(track->codec_id, MKV_S_TEXTSSA) ||
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2476 !strcmp(track->codec_id, "S_SSA") ||
11774
28b52087c48d Added more legacy CodecIDs (S_ASS).
mosu
parents: 11773
diff changeset
2477 !strcmp(track->codec_id, "S_ASS") ||
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2478 !strcmp(track->codec_id, "S_TEXT/ASS")) {
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2479 mkv_d->subtitle_type = MKV_SUBTYPE_SSA;
10861
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
2480 sub_utf8 = 1;
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
2481 } else
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2482 mkv_d->subtitle_type = MKV_SUBTYPE_TEXT;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2483 } else
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2484 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
2485 "subtitle track with the id %u.\n", demuxer->sub->id);
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2486 demuxer->sub->sh = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2487 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2488 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2489
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2490 demuxer->priv = mkv_d;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2491
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2492 if (mkv_d->chapters != NULL) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2493 for (i = 0; i < (int)mkv_d->chapters->size(); i++) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2494 (*mkv_d->chapters)[i].start -= mkv_d->first_tc;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2495 (*mkv_d->chapters)[i].end -= mkv_d->first_tc;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2496 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2497 if ((dvd_last_chapter > 0) &&
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2498 (dvd_last_chapter <= (int)mkv_d->chapters->size())) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2499 if ((*mkv_d->chapters)[dvd_last_chapter - 1].end != 0)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2500 mkv_d->stop_timecode = (*mkv_d->chapters)[dvd_last_chapter - 1].end;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2501 else if ((dvd_last_chapter + 1) <= (int)mkv_d->chapters->size())
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2502 mkv_d->stop_timecode = (*mkv_d->chapters)[dvd_last_chapter].start;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2503 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2504 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2505
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2506 if (s->end_pos == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2507 demuxer->seekable = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2508 else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2509 demuxer->movi_start = s->start_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2510 demuxer->movi_end = s->end_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2511 demuxer->seekable = 1;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2512 if ((dvd_chapter != 1) && (mkv_d->chapters != NULL) &&
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2513 (dvd_chapter <= (int)mkv_d->chapters->size()))
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2514 demux_mkv_seek(demuxer, (float)(*mkv_d->chapters)[dvd_chapter - 1].start
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2515 / 1000.0, 1);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2516 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2517
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2518 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2519 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2520
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2521 // Taken from demux_real.c. Thanks to the original developpers :)
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2522 #define SKIP_BITS(n) buffer <<= n
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2523 #define SHOW_BITS(n) ((buffer) >> (32 - (n)))
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2524
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2525 static float real_fix_timestamp(mkv_track_t *track, unsigned char *s,
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
2526 int timestamp) {
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2527 float v_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2528 uint32_t buffer = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2529 int kf = timestamp;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2530 int pict_type;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2531 int orig_kf;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2532
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2533 if (!strcmp(track->codec_id, MKV_V_REALV30) ||
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2534 !strcmp(track->codec_id, MKV_V_REALV40)) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2535
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2536 if (!strcmp(track->codec_id, MKV_V_REALV30)) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2537 SKIP_BITS(3);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2538 pict_type = SHOW_BITS(2);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2539 SKIP_BITS(2 + 7);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2540 }else{
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2541 SKIP_BITS(1);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2542 pict_type = SHOW_BITS(2);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2543 SKIP_BITS(2 + 7 + 3);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2544 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2545 kf = SHOW_BITS(13); // kf= 2*SHOW_BITS(12);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2546 orig_kf = kf;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2547 if (pict_type <= 1) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2548 // I frame, sync timestamps:
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2549 track->rv_kf_base = timestamp - kf;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2550 mp_msg(MSGT_DEMUX, MSGL_V, "\nTS: base=%08X\n", track->rv_kf_base);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2551 kf = timestamp;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2552 } else {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2553 // P/B frame, merge timestamps:
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2554 int tmp = timestamp - track->rv_kf_base;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2555 kf |= tmp & (~0x1fff); // combine with packet timestamp
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2556 if (kf < (tmp - 4096)) // workaround wrap-around problems
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2557 kf += 8192;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2558 else if (kf > (tmp + 4096))
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2559 kf -= 8192;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2560 kf += track->rv_kf_base;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2561 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2562 if (pict_type != 3) { // P || I frame -> swap timestamps
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2563 int tmp = kf;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2564 kf = track->rv_kf_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2565 track->rv_kf_pts = tmp;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2566 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2567 mp_msg(MSGT_DEMUX, MSGL_V, "\nTS: %08X -> %08X (%04X) %d %02X %02X %02X "
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2568 "%02X %5d\n", timestamp, kf, orig_kf, pict_type, s[0], s[1], s[2],
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2569 s[3], kf - (int)(1000.0 * track->rv_pts));
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2570 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2571 v_pts = kf * 0.001f;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2572 track->rv_pts = v_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2573
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2574 return v_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2575 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2576
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2577 static void handle_realvideo(demuxer_t *demuxer, unsigned char *data,
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2578 uint32_t size, bool keyframe, int &found_data) {
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2579 dp_hdr_t *hdr;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2580 int chunks, isize;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2581 mkv_demuxer_t *mkv_d;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2582 demux_stream_t *ds;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2583 demux_packet_t *dp;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2584
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2585 mkv_d = (mkv_demuxer_t *)demuxer->priv;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2586 ds = demuxer->video;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2587 chunks = data[0];
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2588 isize = size - 1 - (chunks + 1) * 8;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2589 dp = new_demux_packet(sizeof(dp_hdr_t) + isize + 8 * (chunks + 1));
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2590 memcpy(&dp->buffer[sizeof(dp_hdr_t)], &data[1 + (chunks + 1) * 8], isize);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2591 memcpy(&dp->buffer[sizeof(dp_hdr_t) + isize], &data[1], (chunks + 1) * 8);
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2592 hdr = (dp_hdr_t *)dp->buffer;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2593 hdr->len = isize;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2594 hdr->chunks = chunks;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2595 hdr->timestamp = (int)(mkv_d->last_pts * 1000);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2596 hdr->chunktab = sizeof(dp_hdr_t) + isize;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2597
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2598 dp->len = sizeof(dp_hdr_t) + isize + 8 * (chunks + 1);
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2599 if (mkv_d->v_skip_to_keyframe) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2600 dp->pts = mkv_d->last_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2601 mkv_d->video->rv_kf_base = 0;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2602 mkv_d->video->rv_kf_pts = hdr->timestamp;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2603 } else
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2604 dp->pts = real_fix_timestamp(mkv_d->video, &dp->buffer[sizeof(dp_hdr_t)],
10438
ed760986e1fd Fixes for stuff that only showed up with gcc versions other than 3.2.
mosu
parents: 10437
diff changeset
2605 hdr->timestamp);
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2606 dp->pos = demuxer->filepos;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2607 dp->flags = keyframe ? 0x10 : 0;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2608
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2609 ds_add_packet(ds, dp);
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2610
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2611 found_data++;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2612 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2613
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2614 static void handle_realaudio(demuxer_t *demuxer, unsigned char *data,
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2615 uint32_t size, bool keyframe, int &found_data) {
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2616 mkv_demuxer_t *mkv_d;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2617 demux_packet_t *dp;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2618
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2619 mkv_d = (mkv_demuxer_t *)demuxer->priv;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2620
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2621 dp = new_demux_packet(size);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2622 memcpy(dp->buffer, data, size);
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2623 if ((mkv_d->audio->ra_pts == mkv_d->last_pts) &&
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2624 !mkv_d->a_skip_to_keyframe)
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2625 dp->pts = 0;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2626 else
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2627 dp->pts = mkv_d->last_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2628 mkv_d->audio->ra_pts = mkv_d->last_pts;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2629
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2630 dp->pos = demuxer->filepos;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2631 dp->flags = keyframe ? 0x10 : 0;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2632
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2633 ds_add_packet(demuxer->audio, dp);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2634
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2635 found_data++;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2636 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2637
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2638 extern "C" int demux_mkv_fill_buffer(demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2639 demux_packet_t *dp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2640 demux_stream_t *ds;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2641 mkv_demuxer_t *mkv_d;
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2642 mkv_track_t *t = NULL;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2643 int upper_lvl_el, exit_loop, found_data, i, linei, sl;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2644 char *texttmp;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2645 // 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
2646 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL, *l3 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2647 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2648 KaxBlock *block;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2649 int64_t block_duration, block_bref, block_fref;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2650 bool use_this_block, lines_cut;
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2651 float current_pts;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2652
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2653 mkv_d = (mkv_demuxer_t *)d->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2654 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2655 l0 = mkv_d->segment;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2656
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2657 // End of stream
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2658 if (mkv_d->saved_l1 == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2659 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2660
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2661 exit_loop = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2662 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2663 l1 = mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2664 mkv_d->saved_l1 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2665 found_data = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2666 try {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2667 // The idea is not to handle a complete KaxCluster with each call to
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2668 // demux_mkv_fill_buffer because those might be rather big.
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2669 while ((l1 != NULL) && (upper_lvl_el <= 0)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2670
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2671 if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2672 mkv_d->cluster = (KaxCluster *)l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2673 if (found_data) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2674 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2675 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2676 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2677
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2678 if (mkv_d->saved_l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2679 l2 = mkv_d->saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2680 mkv_d->saved_l2 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2681 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2682 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2683 0xFFFFFFFFL, true, 1);
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2684 while ((l2 != NULL) && (upper_lvl_el <= 0)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2685
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2686 // Handle at least one data packets in one call to
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2687 // demux_mkv_fill_buffer - but abort if we have found that.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2688 if (found_data >= 1) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2689 mkv_d->saved_l2 = l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2690 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2691 exit_loop = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2692 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2693 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2694
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2695 if (EbmlId(*l2) == KaxClusterTimecode::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2696 KaxClusterTimecode &ctc = *static_cast<KaxClusterTimecode *>(l2);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2697 ctc.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2698 mkv_d->cluster_tc = uint64(ctc);
10273
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2699 #if LIBEBML_VERSION >= 000404
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2700 mkv_d->cluster->InitTimecode(mkv_d->cluster_tc, mkv_d->tc_scale);
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2701 #else
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2702 mkv_d->cluster->InitTimecode(mkv_d->cluster_tc);
10273
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2703 #endif // LIBEBML_VERSION
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2704
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2705 } else if (EbmlId(*l2) == KaxBlockGroup::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2706
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2707 KaxBlockDuration *kbdur;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2708 KaxReferenceBlock *krefblock;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2709 KaxBlock *kblock;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2710
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2711 block = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2712 block_duration = -1;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2713 block_bref = 0;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2714 block_fref = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2715
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2716 l2->Read(*es, KaxBlockGroup::ClassInfos.Context, upper_lvl_el, l3,
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2717 true);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2718
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2719 kbdur = FINDFIRST(l2, KaxBlockDuration);
10684
99eb26749a14 Re-added block duration parsing, needed for subtitles. Got lost in the last update. Patch by Bruno Lecointre.
mosu
parents: 10638
diff changeset
2720 if (kbdur != NULL)
99eb26749a14 Re-added block duration parsing, needed for subtitles. Got lost in the last update. Patch by Bruno Lecointre.
mosu
parents: 10638
diff changeset
2721 block_duration = uint64(*kbdur);
99eb26749a14 Re-added block duration parsing, needed for subtitles. Got lost in the last update. Patch by Bruno Lecointre.
mosu
parents: 10638
diff changeset
2722
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2723 kblock = FINDFIRST(l2, KaxBlock);
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2724 if (kblock != NULL) {
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2725 kblock->SetParent(*mkv_d->cluster);
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2726 if ((mkv_d->stop_timecode > 0) &&
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2727 ((kblock->GlobalTimecode() / 1000000 - mkv_d->first_tc) >=
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2728 mkv_d->stop_timecode)) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2729 delete l2;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2730 return 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2731 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2732 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2733
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2734 krefblock = FINDFIRST(l2, KaxReferenceBlock);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2735 while (krefblock != NULL) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2736 if (int64(*krefblock) < 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2737 block_bref = int64(*krefblock);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2738 else
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2739 block_fref = int64(*krefblock);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2740
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2741 krefblock = FINDNEXT(l2, KaxReferenceBlock, krefblock);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2742 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2743
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2744 if (kblock != NULL) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2745 // Clear the subtitles if they're obsolete now.
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2746 lines_cut = false;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2747 for (linei = 0; linei < mkv_d->subs.lines; linei++) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2748 if (mkv_d->clear_subs_at[linei] <=
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2749 (kblock->GlobalTimecode() / 1000000 - mkv_d->first_tc)) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2750 sl = linei;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2751 texttmp = mkv_d->subs.text[sl];
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2752 while (sl < mkv_d->subs.lines) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2753 mkv_d->subs.text[sl] = mkv_d->subs.text[sl + 1];
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2754 mkv_d->clear_subs_at[sl] = mkv_d->clear_subs_at[sl + 1];
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2755 sl++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2756 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2757 mkv_d->subs.text[sl] = texttmp;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2758 mkv_d->subs.lines--;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2759 linei--;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2760 lines_cut = true;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2761 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2762 if (lines_cut) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2763 vo_sub = &mkv_d->subs;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2764 vo_osd_changed(OSDTYPE_SUBTITLE);
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2765 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2766 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2767
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2768 ds = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2769 if ((mkv_d->video != NULL) &&
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2770 (mkv_d->video->tnum == kblock->TrackNum())) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2771 ds = d->video;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2772 t = mkv_d->video;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2773 } else if ((mkv_d->audio != NULL) &&
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2774 (mkv_d->audio->tnum == kblock->TrackNum())) {
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2775 ds = d->audio;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2776 t = mkv_d->audio;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2777 } else if ((mkv_d->subs_track != NULL) &&
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2778 (mkv_d->subs_track->tnum == kblock->TrackNum())) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2779 ds = d->sub;
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2780 t = mkv_d->subs_track;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2781 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2782
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2783 use_this_block = true;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2784
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2785 current_pts = (float)(kblock->GlobalTimecode() / 1000000.0 -
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2786 mkv_d->first_tc) / 1000.0;
10930
624f11cc5034 Fix for imprecise floating point calculations.
mosu
parents: 10874
diff changeset
2787 if (current_pts < 0.0)
624f11cc5034 Fix for imprecise floating point calculations.
mosu
parents: 10874
diff changeset
2788 current_pts = 0.0;
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2789
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2790 if (ds == d->audio) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2791 if (mkv_d->a_skip_to_keyframe &&
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2792 (block_bref != 0))
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2793 use_this_block = false;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2794
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2795 else if (mkv_d->v_skip_to_keyframe)
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2796 use_this_block = false;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2797
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2798 if (mkv_d->audio->fix_i_bps && use_this_block) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2799 uint32_t i, sum;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2800 sh_audio_t *sh;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2801
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2802 for (i = 0, sum = 0; i < kblock->NumberFrames(); i++) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2803 DataBuffer &data = kblock->GetBuffer(i);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2804 sum += data.Size();
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2805 }
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2806 sh = (sh_audio_t *)ds->sh;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2807 if (block_duration != -1) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2808 sh->i_bps = sum * 1000 / block_duration;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2809 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Changed i_bps to %d.\n",
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2810 sh->i_bps);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2811 mkv_d->audio->fix_i_bps = false;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2812 } else if (mkv_d->audio->qt_last_a_pts == 0.0)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2813 mkv_d->audio->qt_last_a_pts = current_pts;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2814 else if (mkv_d->audio->qt_last_a_pts != current_pts) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2815 sh->i_bps = (int)(sum / (current_pts -
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2816 mkv_d->audio->qt_last_a_pts));
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2817 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Changed i_bps to %d.\n",
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2818 sh->i_bps);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2819 mkv_d->audio->fix_i_bps = false;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2820 }
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2821 }
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2822
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2823 } else if ((current_pts * 1000) < mkv_d->skip_to_timecode)
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2824 use_this_block = false;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2825
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2826 else if (ds == d->video) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2827 if (mkv_d->v_skip_to_keyframe &&
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2828 (block_bref != 0))
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2829 use_this_block = false;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2830
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2831 } else if ((mkv_d->subs_track != NULL) &&
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2832 (mkv_d->subs_track->tnum == kblock->TrackNum())) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2833 if (mkv_d->subtitle_type != MKV_SUBTYPE_VOBSUB) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2834 if (!mkv_d->v_skip_to_keyframe)
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2835 handle_subtitles(d, kblock, block_duration);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2836 use_this_block = false;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2837 }
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2838
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2839 } else
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2840 use_this_block = false;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2841
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2842 if (use_this_block) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2843 mkv_d->last_pts = current_pts;
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2844 ds->pts = current_pts;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2845 d->filepos = mkv_d->in->getFilePointer();
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2846 mkv_d->last_filepos = d->filepos;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2847
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2848 for (i = 0; i < (int)kblock->NumberFrames(); i++) {
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2849 unsigned char *re_buffer;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2850 uint32_t re_size;
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2851 bool re_modified;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2852 DataBuffer &data = kblock->GetBuffer(i);
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2853
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2854 re_buffer = data.Buffer();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2855 re_size = data.Size();
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2856 re_modified = reverse_encodings(t, re_buffer, re_size, 1);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2857
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2858 if ((ds == d->video) && mkv_d->video->realmedia)
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2859 handle_realvideo(d, re_buffer, re_size, block_bref == 0,
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2860 found_data);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2861
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2862 else if ((ds == d->audio) && mkv_d->audio->realmedia)
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2863 handle_realaudio(d, re_buffer, re_size, block_bref == 0,
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2864 found_data);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2865
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2866 else {
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2867 dp = new_demux_packet(re_size);
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2868 memcpy(dp->buffer, re_buffer, re_size);
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2869 dp->flags = block_bref == 0 ? 1 : 0;
11557
32411c15cebc Support for HE-AAC in Matroska. Also only set ds->pts to the first pts of a laced block, and set dp->pts to the current pts taking default_duration into account.
mosu
parents: 11484
diff changeset
2870 dp->pts = mkv_d->last_pts + i * t->default_duration;
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2871 ds_add_packet(ds, dp);
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2872 found_data++;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2873 }
11229
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2874 if (re_modified)
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
2875 safefree(re_buffer);
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2876 }
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2877 if (ds == d->video) {
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2878 mkv_d->v_skip_to_keyframe = false;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2879 mkv_d->skip_to_timecode = 0;
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2880 } else if (ds == d->audio)
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
2881 mkv_d->a_skip_to_keyframe = false;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2882 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2883
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2884 delete block;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2885 } // kblock != NULL
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2886
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2887 } else
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2888 l2->SkipData(*es, l2->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2889
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2890 if (!in_parent(l1)) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2891 delete l2;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2892 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2893 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2894
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2895 if (upper_lvl_el > 0) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2896 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2897 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2898 break;
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2899 delete l2;
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2900 l2 = l3;
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2901 continue;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2902
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2903 } else if (upper_lvl_el < 0) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2904 upper_lvl_el++;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2905 if (upper_lvl_el < 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2906 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2907
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2908 }
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2909
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2910 l2->SkipData(*es, l2->Generic().Context);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2911 delete l2;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2912 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2913 0xFFFFFFFFL, true);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2914
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2915 } // while (l2 != NULL)
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2916
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2917 } else if (EbmlId(*l1) == KaxCues::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2918 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2919 else
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2920 l1->SkipData(*es, l1->Generic().Context);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2921
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2922 if (!in_parent(l0)) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2923 delete l1;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2924 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2925 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2926
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2927 if (upper_lvl_el > 0) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2928 upper_lvl_el--;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2929 if (upper_lvl_el > 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2930 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2931 delete l1;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2932 l1 = l2;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2933 continue;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2934
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2935 } else if (upper_lvl_el < 0) {
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2936 upper_lvl_el++;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2937 if (upper_lvl_el < 0)
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2938 break;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2939
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2940 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2941
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2942 if (exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2943 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2944
10637
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2945 l1->SkipData(*es, l1->Generic().Context);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2946 delete l1;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2947 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el,
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2948 0xFFFFFFFFL, true);
10410
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2949
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2950 } // while (l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2951 } catch (exception ex) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2952 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] exception caught\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2953 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2954 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2955
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2956 if (found_data)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2957 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2958
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2959 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2960 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2961
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2962 extern "C" void resync_audio_stream(sh_audio_t *sh_audio);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2963
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2964 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2965 int flags) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2966 int i, k, upper_lvl_el;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2967 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2968 int64_t target_timecode, target_filepos = 0, min_diff, diff, current_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2969 int64_t cluster_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2970 mkv_track_index_t *index;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2971 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2972 EbmlElement *l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2973
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2974 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] SEEK, relss: %.3f, flags: %d\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2975 rel_seek_secs, flags);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2976
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2977 if (!mkv_d->cues_found && !mkv_d->cues_searched) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2978 // 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
2979 // elements until we either hit another segment, the end of the file
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2980 // or - suprise - some cues.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2981 current_pos = mkv_d->in->getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2982
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2983 // Skip the data but do not delete the element! This is our current
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2984 // cluster, and we need it later on in demux_mkv_fill_buffer.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2985 l1 = mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2986 l1->SkipData(static_cast<EbmlStream &>(*mkv_d->es), l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2987 l1 = mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2988 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2989 while (l1 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2990 if (upper_lvl_el)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2991 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2992
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2993 if (EbmlId(*l1) == KaxCues::ClassInfos.GlobalId) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2994 parse_cues(mkv_d, l1->GetElementPosition());
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2995 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2996 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2997 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2998 if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2999 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3000 l1->SkipData(static_cast<EbmlStream &>(*mkv_d->es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3001 l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3002 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3003 l1 = mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3004 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3005 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3006 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3007
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3008 if (demuxer->stream->eof)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3009 stream_reset(demuxer->stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3010 mkv_d->in->setFilePointer(current_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3011
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3012 mkv_d->cues_searched = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3013 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3014
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3015 if (!(flags & 2)) { // Time in secs
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3016 if (flags & 1) // Absolute seek
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3017 target_timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3018 else // Relative seek
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3019 target_timecode = (int64_t)(mkv_d->last_pts * 1000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3020 target_timecode += (int64_t)(rel_seek_secs * 1000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3021 if (target_timecode < 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3022 target_timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3023
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3024 min_diff = 0xFFFFFFFL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3025
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3026 // Let's find the entry in the index with the smallest difference
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3027 // to the wanted timecode.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3028 entry = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3029 for (i = 0; i < mkv_d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3030 if (mkv_d->index[i].tnum == mkv_d->video->tnum) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3031 index = &mkv_d->index[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3032 for (k = 0; k < index->num_entries; k++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3033 if (!index->entries[k].is_key)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3034 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3035 diff = target_timecode - (int64_t)index->entries[k].timecode;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
3036 if (((flags & 1) || (target_timecode <= (mkv_d->last_pts * 1000))) &&
10874
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3037 (diff >= 0) && (diff < min_diff)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3038 min_diff = diff;
10874
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3039 entry = &index->entries[k];
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3040 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek BACK, solution: last_pts: "
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3041 "%d, target: %d, diff: %d, entry->timecode: %d, PREV diff: "
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3042 "%d, k: %d\n", (int)(mkv_d->last_pts * 1000),
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3043 (int)target_timecode, (int)diff, (int)entry->timecode,
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3044 k > 0 ? (int)(index->entries[k - 1].timecode -
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3045 target_timecode) : 0, k);
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3046
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3047 } else if ((target_timecode > (mkv_d->last_pts * 1000)) &&
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3048 (diff < 0) && (-diff < min_diff)) {
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3049 min_diff = -diff;
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3050 entry = &index->entries[k];
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3051 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek FORW, solution: last_pts: "
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3052 "%d, target: %d, diff: %d, entry->timecode: %d, NEXT diff: "
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3053 "%d, k: %d\n", (int)(mkv_d->last_pts * 1000),
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3054 (int)target_timecode, (int)diff, (int)entry->timecode,
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3055 k < index->num_entries ?
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3056 (int)(index->entries[k + 1].timecode - target_timecode) :
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3057 0, k);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3058 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3059 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3060 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3061 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3062
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3063 if (mkv_d->saved_l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3064 delete mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3065
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3066 if (mkv_d->saved_l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3067 delete mkv_d->saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3068 mkv_d->saved_l2 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3069 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3070
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3071 if (entry != NULL) { // We've found an entry.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3072 mkv_d->in->setFilePointer(entry->filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3073 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3074 mkv_d->saved_l1 =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3075 mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3076 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3077 } else { // We've not found an entry --> no index?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3078 target_filepos = (int64_t)(target_timecode * mkv_d->last_filepos /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3079 (mkv_d->last_pts * 1000.0));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3080 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
3081 "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
3082 (int64_t)(mkv_d->last_pts * 1000.0));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3083 // Let's find the nearest cluster so that libebml does not have to
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3084 // do so much work.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3085 cluster_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3086 min_diff = 0x0FFFFFFFL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3087 for (i = 0; i < mkv_d->num_cluster_pos; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3088 diff = mkv_d->cluster_positions[i] - target_filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3089 if (rel_seek_secs < 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3090 if ((diff > 0) && (diff < min_diff)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3091 cluster_pos = mkv_d->cluster_positions[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3092 min_diff = diff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3093 }
10099
71d703e35ff3 Removed the abs function as someone reported compilation problems under MacOS.
mosu
parents: 10098
diff changeset
3094 } else if ((diff < 0 ? -1 * diff : diff) < min_diff) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3095 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
3096 min_diff = diff < 0 ? -1 * diff : diff;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3097 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3098 }
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
3099 if (min_diff != 0x0FFFFFFFL) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3100 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
3101 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
3102 "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
3103 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3104 if (target_filepos >= demuxer->movi_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3105 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3106 mkv_d->in->setFilePointer(target_filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3107 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3108 mkv_d->saved_l1 =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3109 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
3110 upper_lvl_el, 0xFFFFFFFFL, true, 1);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3111 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek result: target_timecode %lld, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3112 "did not find an entry. Calculated target_filspos: %lld\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3113 target_timecode, target_filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3114 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek found %p (%s).\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3115 mkv_d->saved_l1, mkv_d->saved_l1 == NULL ? "null" :
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
3116 mkv_d->saved_l1->Generic().DebugName);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3117 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3118
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
3119 if (mkv_d->video != NULL)
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
3120 mkv_d->v_skip_to_keyframe = true;
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
3121 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
3122 mkv_d->skip_to_timecode = target_timecode;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3123
10434
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
3124 mkv_d->a_skip_to_keyframe = true;
dd64e1fe919d Better support for RealVideo/RealAudio in Matroska. Includes the timestamp fixes from demux_real.c. Seeking is working. Added Matroska to the formats with variable FPS in video.c.
mosu
parents: 10410
diff changeset
3125
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3126 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
3127 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
3128 (int64_t)(mkv_d->last_pts * 1000.0));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3129
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3130 mkv_d->subs.lines = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3131 vo_sub = &mkv_d->subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3132 vo_osd_changed(OSDTYPE_SUBTITLE);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3133
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3134 if(demuxer->audio->sh != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3135 resync_audio_stream((sh_audio_t *)demuxer->audio->sh);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3136
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3137 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3138 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3139
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3140 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3141
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3142 extern "C" void demux_close_mkv(demuxer_t *demuxer) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3143 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3144
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3145 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3146
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3147 #ifdef USE_ICONV
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3148 subcp_close();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3149 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3150 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3151
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3152 extern "C" int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3153 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3154
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3155 switch (cmd) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3156 case DEMUXER_CTRL_GET_TIME_LENGTH:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3157 if (mkv_d->duration == -1.0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3158 return DEMUXER_CTRL_DONTKNOW;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3159
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3160 *((unsigned long *)arg) = (unsigned long)mkv_d->duration;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3161 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3162
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3163 case DEMUXER_CTRL_GET_PERCENT_POS:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3164 if (mkv_d->duration == -1.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3165 if (demuxer->movi_start == demuxer->movi_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3166 return DEMUXER_CTRL_DONTKNOW;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3167
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3168 *((int *)arg) =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3169 (int)((demuxer->filepos - demuxer->movi_start) /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3170 ((demuxer->movi_end - demuxer->movi_start) / 100));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3171 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3172 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3173
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3174 *((int *)arg) = (int)(100 * mkv_d->last_pts / mkv_d->duration);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3175 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3176
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3177 default:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3178 return DEMUXER_CTRL_NOTIMPL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3179 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3180 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3181
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3182 #endif /* HAVE_MATROSKA */