annotate libmpdemux/demux_mkv.cpp @ 11656:1bd451a6d4ae

make outfmt=uyvy work with rivatv patch by Stephen Beahm
author faust3
date Thu, 18 Dec 2003 10:39:55 +0000
parents f9fccf97d588
children 060b6c86cf31
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
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
469 static void handle_subtitles(demuxer_t *d, KaxBlock *block, int64_t duration) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
470 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)d->priv;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
471 int len, line, state, i;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
472 char *s1, *s2, *buffer;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
473
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
474 if (duration == -1) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
475 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Warning: No KaxBlockDuration "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
476 "element for subtitle track found.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
477 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
478 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
479
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
480 DataBuffer &data = block->GetBuffer(0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
481 len = data.Size();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
482
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
483 buffer = (char *)data.Buffer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
484 s1 = buffer;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
485
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
486 while (((*s1 == '\n') || (*s1 == '\r')) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
487 ((unsigned int)(s1 - buffer) <= data.Size()))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
488 s1++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
489
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
490 line = 0;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
491 mkv_d->subs.lines++;
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
492 if (mkv_d->subs.lines> SUB_MAX_TEXT - 1 )
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
493 {
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
494 mp_msg(MSGT_DEMUX, MSGL_WARN,"[mkv] Warning: too many sublines to render, skipping\n");
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
495 mkv_d->subs.lines--;
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
496 return;
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
497 }
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
498 s2 = mkv_d->subs.text[mkv_d->subs.lines - 1];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
499 state = 0;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
500
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
501 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
502 /* 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
503 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
504 and duration. */
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
505
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
506 /* Find text section. */
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
507 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
508 if (*s1 == ',')
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
509 i++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
510
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
511 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
512 mkv_d->subs.lines--;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
513 return;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
514 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
515
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
516 /* Load text. */
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
517 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
518 if (*s1 == '{')
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
519 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
520 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
521 state = 2;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
522
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
523 if (state == 0) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
524 *s2 = *s1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
525 s2++;
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
526 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
527 break;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
528 }
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
529 s1++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
530
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
531 /* 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
532 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
533 ((*(s1 + 1) == 'N') || (*(s1 + 1) == 'n'))) {
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
534 mkv_d->clear_subs_at[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
535 block->GlobalTimecode() / 1000000 - mkv_d->first_tc + duration;
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
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
537 mkv_d->subs.lines++;
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 *s2 = 0;
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
539 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
540 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
541 }
59e3d641c48c Marked SSA subs as UTF-8. Better newline handling for SSA subs. Patch by Tristan <z80@oceanfree.net>.
mosu
parents: 10860
diff changeset
542
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
543 if (state == 2)
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
544 state = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
545 }
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
546 *s2 = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
547
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
548 } else {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
549 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
550 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
551 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
552 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
553 break;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
554 *s2 = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
555 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
556 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
557 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
558 mkv_d->subs.lines++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
559 state = 1;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
560 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
561 } 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
562 state = 2;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
563 else if (*s1 == '>')
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
564 state = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
565 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
566 state = 0;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
567 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
568 *s2 = *s1;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
569 s2++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
570 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
571 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
572 s1++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
573 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
574
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
575 *s2 = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
576 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
577
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
578 #ifdef USE_ICONV
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
579 subcp_recode1(&mkv_d->subs);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
580 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
581
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
582 vo_sub = &mkv_d->subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
583 vo_osd_changed(OSDTYPE_SUBTITLE);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
584
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
585 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
586 block->GlobalTimecode() / 1000000 - mkv_d->first_tc + duration;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
587 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
588
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
589 static mkv_track_t *new_mkv_track(mkv_demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
590 mkv_track_t *t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
591
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
592 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
593 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
594 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
595 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
596 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
597 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
598 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
599 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
600
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
601 // 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
602 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
603 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
604 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
605 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
606
b4040706e1d3 Added 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 t->c_encodings = new vector<mkv_content_encoding_t>;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
608
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
609 return t;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
610 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
611
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
612 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
613 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
614 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
615
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
616 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
617 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
618 (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
619 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
620
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
621 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
622 }
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
623
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
624 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
625 mkv_track_t *c) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
626 int i;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
627
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
628 for (i = 0; i < d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
629 if ((d->tracks[i] != NULL) && (d->tracks[i]->tnum == n) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
630 (d->tracks[i] != c))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
631 return d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
632
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
633 return NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
634 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
635
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
636 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
637 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
638 int i;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
639
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
640 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
641 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
642 (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
643 !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
644 (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
645 return d->tracks[i];
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
646
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
647 return NULL;
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
648 }
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
649
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
650 static bool mkv_parse_idx(mkv_track_t *t) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
651 uint32_t i, p, things_found;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
652 int idx;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
653 string line, s1, s2;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
654 char *src;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
655
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
656 if ((t->private_data == NULL) || (t->private_size < 1))
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
657 return false;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
658
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
659 things_found = 0;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
660 i = 0;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
661 src = (char *)t->private_data;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
662 do {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
663 line = "";
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
664 while ((i < t->private_size) && (src[i] != '\n') && (src[i] != '\r')) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
665 if (!isspace(src[i]))
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
666 line += src[i];
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
667 i++;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
668 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
669 while ((i < t->private_size) && ((src[i] == '\n') || (src[i] == '\r')))
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
670 i++;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
671
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
672 if (!strncasecmp(line.c_str(), "size:", 5)) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
673 s1 = line.substr(5);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
674 idx = s1.find('x');
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
675 if (idx >= 0) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
676 s2 = s1.substr(idx + 1);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
677 s1.erase(idx);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
678 t->sh_sub.width = strtol(s1.c_str(), NULL, 10);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
679 t->sh_sub.height = strtol(s2.c_str(), NULL, 10);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
680 things_found |= 1;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
681 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
682 t->sh_sub.width, t->sh_sub.height);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
683 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
684
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
685 } else if (!strncasecmp(line.c_str(), "palette:", 8)) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
686 s1 = line.substr(8);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
687 for (p = 0; p < 15; p++) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
688 idx = s1.find(',');
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 break;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
691 s2 = s1.substr(0, idx);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
692 s1.erase(0, idx + 1);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
693 t->sh_sub.palette[p] = (unsigned int)strtol(s2.c_str(), NULL, 16);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
694 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
695 if (idx >= 0) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
696 t->sh_sub.palette[15] = (unsigned int)strtol(s1.c_str(), NULL, 16);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
697 things_found |= 2;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
698 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] VobSub IDX parser: palette: 0x%06x "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
699 "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
700 "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
701 t->sh_sub.palette[0], t->sh_sub.palette[1],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
702 t->sh_sub.palette[2], t->sh_sub.palette[3],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
703 t->sh_sub.palette[4], t->sh_sub.palette[5],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
704 t->sh_sub.palette[6], t->sh_sub.palette[7],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
705 t->sh_sub.palette[8], t->sh_sub.palette[9],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
706 t->sh_sub.palette[10], t->sh_sub.palette[11],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
707 t->sh_sub.palette[12], t->sh_sub.palette[13],
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
708 t->sh_sub.palette[14], t->sh_sub.palette[15]);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
709 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
710 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
711
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
712 } while ((i != t->private_size) && (things_found != 3));
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
713 t->sh_sub.type = 'v';
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
714
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
715 return (things_found == 3);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
716 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
717
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
718 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
719 uint32_t &size, uint32_t type) {
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
720 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
721 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
722 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
723 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
724
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
725 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
726 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
727
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
728 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
729 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
730 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
731 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
732 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
733 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
734 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
735
b4040706e1d3 Added 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 #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
737 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
738 int result;
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
739 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
740
b4040706e1d3 Added 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 old_data = new_data;
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
742
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
743 zstream.zalloc = (alloc_func)0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
744 zstream.zfree = (free_func)0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
745 zstream.opaque = (voidpf)0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
746 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
747 if (result != Z_OK) {
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
748 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
749 "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
750 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
751 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
752 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
753 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
754 }
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
755 zstream.next_in = (Bytef *)old_data;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
756 zstream.avail_in = new_size;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
757
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
758 n = 0;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
759 new_data = NULL;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
760 do {
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
761 n++;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
762 new_data = (unsigned char *)realloc(new_data, n * 4000);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
763 zstream.next_out = (Bytef *)&new_data[(n - 1) * 4000];
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
764 zstream.avail_out = 4000;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
765 result = inflate(&zstream, Z_NO_FLUSH);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
766 if ((result != Z_OK) && (result != Z_STREAM_END)) {
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
767 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Zlib decompression failed. "
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
768 "Result: %d \n", result);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
769 safefree(new_data);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
770 data = old_data;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
771 size = new_size;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
772 inflateEnd(&zstream);
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
773 return modified;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
774 }
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
775 } while ((zstream.avail_out == 0) &&
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
776 (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
777
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
778 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] zlib decompression: from %d to "
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
779 "%d \n", (int)new_size, (int)zstream.total_out);
11393
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
780 new_size = zstream.total_out;
6bacd63a80a7 Proper usage of zlib for decompression.
mosu
parents: 11329
diff changeset
781 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
782
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
783 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
784 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
785 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
786 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
787 #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
788 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
789
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
790 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
791 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
792
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
793 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
794 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
795
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
796 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
797 int i, track_num;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
798 unsigned char *c;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
799 uint32_t u, offset, length;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
800 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
801 mkv_content_encoding_t *ce;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
802 BITMAPINFOHEADER *bih;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
803 WAVEFORMATEX *wfe;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
804
10028
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
805 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
806 t = d->tracks[track_num];
10028
7ca8b302032f Loop counter was used inside for another loop as well.
mosu
parents: 10024
diff changeset
807
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
808 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
809 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
810 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
811
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
812 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
813 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
814 "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
815 "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
816 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
817 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
818 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
819
b4040706e1d3 Added 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 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
821 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
822 "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
823 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
824 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
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
b4040706e1d3 Added 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 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
828 #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
829 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
830 "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
831 "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
832 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
833 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
834 #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
835 } 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
836 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
837 "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
838 "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
839 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
840 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
841 }
b4040706e1d3 Added 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 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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 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
845 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
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
b4040706e1d3 Added 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 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
849 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
850 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
851 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
852 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
853 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
854 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
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
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
858 switch (t->type) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
859 case 'v': // video track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
860 if (t->codec_id == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
861 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
862 if (!strcmp(t->codec_id, MKV_V_MSCOMP)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
863 if ((t->private_data == NULL) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
864 (t->private_size < sizeof(BITMAPINFOHEADER))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
865 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
866 "%u is '" MKV_V_MSCOMP "', but there was no "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
867 "BITMAPINFOHEADER struct present. Therefore we don't have "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
868 "a FourCC to identify the video codec used.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
869 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
870 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
871 t->ms_compat = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
872
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
873 bih = (BITMAPINFOHEADER *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
874
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
875 u = get_uint32(&bih->biWidth);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
876 if (t->v_width != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
877 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
878 "compatibility mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
879 "Matrosa says video width is %u, but the "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
880 "BITMAPINFOHEADER says %u.\n", t->tnum, t->v_width, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
881 if (t->v_width == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
882 t->v_width = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
883 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
884
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
885 u = get_uint32(&bih->biHeight);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
886 if (t->v_height != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
887 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
888 "mode, track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
889 "Matrosa video height is %u, but the BITMAPINFOHEADER "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
890 "says %u.\n", t->tnum, t->v_height, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
891 if (t->v_height == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
892 t->v_height = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
893 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
894
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
895 memcpy(t->v_fourcc, &bih->biCompression, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
896 }
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 if (t->v_width == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
900 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The width for track %u was "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
901 "not set.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
902 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
903 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
904 if (t->v_height == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
905 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The height for track %u was "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
906 "not set.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
907 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
908 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
909
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
910 if (t->v_dwidth == 0)
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
911 t->v_dwidth = t->v_width;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
912 if (t->v_dheight == 0)
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
913 t->v_dheight = t->v_height;
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
914
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
915 // This track seems to be ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
916 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
917 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
918 "-vid %u\n", t->tnum, t->codec_id, t->xid);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
919
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
920 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
921
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
922 case 'a': // audio track
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
923 if (t->codec_id == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
924 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
925 if (!strcmp(t->codec_id, MKV_A_ACM)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
926 if ((t->private_data == NULL) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
927 (t->private_size < sizeof(WAVEFORMATEX))) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
928 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for track "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
929 "%u is '" MKV_A_ACM "', "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
930 "but there was no WAVEFORMATEX struct present. "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
931 "Therefore we don't have a format ID to identify the audio "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
932 "codec used.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
933 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
934 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
935 t->ms_compat = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
936
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
937 wfe = (WAVEFORMATEX *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
938 u = get_uint32(&wfe->nSamplesPerSec);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
939 if (((uint32_t)t->a_sfreq) != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
940 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS compatibility "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
941 "mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
942 "Matroska says that there are %u samples per second, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
943 "but WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
944 (uint32_t)t->a_sfreq, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
945 if (t->a_sfreq == 0.0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
946 t->a_sfreq = (float)u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
947 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
948
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
949 u = get_uint16(&wfe->nChannels);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
950 if (t->a_channels != u) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
951 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
952 "compatibility mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
953 "Matroska says that there are %u channels, but the "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
954 "WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
955 t->a_channels, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
956 if (t->a_channels == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
957 t->a_channels = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
958 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
959
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
960 u = get_uint16(&wfe->wBitsPerSample);
10098
ebbe39bb55ab Check with the wrong variable.
mosu
parents: 10084
diff changeset
961 if (t->a_bps != u) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
962 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: (MS "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
963 "compatibility mode for track %u) "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
964 "Matroska says that there are %u bits per sample, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
965 "but the WAVEFORMATEX says that there are %u.\n", t->tnum,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
966 t->a_bps, u);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
967 if (t->a_bps == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
968 t->a_bps = u;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
969 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
970
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
971 t->a_formattag = get_uint16(&wfe->wFormatTag);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
972 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
973 } else {
11155
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
974 if (!strcmp(t->codec_id, MKV_A_MP3) ||
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
975 !strcmp(t->codec_id, MKV_A_MP2))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
976 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
977 else if (!strncmp(t->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
978 t->a_formattag = 0x2000;
10105
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
979 else if (!strcmp(t->codec_id, MKV_A_DTS))
dc4f1b768062 Support for DTS tracks (only with -hwac3 of course).
mosu
parents: 10099
diff changeset
980 // 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
981 t->a_formattag = 0x2000;
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
982 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
983 !strcmp(t->codec_id, MKV_A_PCM_BE))
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
984 t->a_formattag = 0x0001;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
985 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
986 !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
987 strlen(MKV_A_AAC_2LC)) ||
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
988 !strcmp(t->codec_id, MKV_A_AAC_2SSR) ||
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
989 !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
990 !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
991 strlen(MKV_A_AAC_4LC)) ||
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
992 !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
993 !strcmp(t->codec_id, MKV_A_AAC_4LTP))
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
994 t->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
995 else if (!strcmp(t->codec_id, MKV_A_VORBIS)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
996 if (t->private_data == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
997 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] WARNING: CodecID for "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
998 "track %u is '" MKV_A_VORBIS
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
999 "', but there are no header packets present.", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1000 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1001 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1002
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1003 c = (unsigned char *)t->private_data;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1004 if (c[0] != 2) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1005 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Vorbis track does not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1006 "contain valid headers.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1007 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1008 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1009
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1010 offset = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1011 for (i = 0; i < 2; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1012 length = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1013 while ((c[offset] == (unsigned char )255) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1014 (length < t->private_size)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1015 length += 255;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1016 offset++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1017 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1018 if (offset >= (t->private_size - 1)) {
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 length += c[offset];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1024 offset++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1025 t->header_sizes[i] = length;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1026 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1027
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1028 t->headers[0] = &c[offset];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1029 t->headers[1] = &c[offset + t->header_sizes[0]];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1030 t->headers[2] = &c[offset + t->header_sizes[0] +
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1031 t->header_sizes[1]];
10079
7c13793dbfa0 Vorbis header packet lengths were calculated incorrectly.
mosu
parents: 10073
diff changeset
1032 t->header_sizes[2] = t->private_size - offset -
7c13793dbfa0 Vorbis header packet lengths were calculated incorrectly.
mosu
parents: 10073
diff changeset
1033 t->header_sizes[0] - t->header_sizes[1];
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1034
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1035 t->a_formattag = 0xFFFE;
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1036 } else if (!strcmp(t->codec_id, MKV_A_QDMC) ||
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1037 !strcmp(t->codec_id, MKV_A_QDMC2)) {
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1038 ;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1039 } else if (!strcmp(t->codec_id, MKV_A_FLAC)) {
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1040 if ((t->private_data == NULL) || (t->private_size == 0)) {
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1041 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] FLAC track does not "
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1042 "contain valid headers.\n");
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1043 continue;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1044 }
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
1045 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
1046 } 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
1047 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
1048 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
1049 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
1050 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
1051 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
1052 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
1053 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
1054 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
1055 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
1056 t->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1057 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1058 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
1059 "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
1060 "codec data.\n", t->codec_id, t->tnum);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1061 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1062 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1063 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1064
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1065 if (t->a_sfreq == 0.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1066 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The sampling frequency was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1067 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1068 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1069 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1070
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1071 if (t->a_channels == 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1072 mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] The number of channels was not "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1073 "set for track %u.\n", t->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1074 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1075 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1076
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1077 // This track seems to be ok.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1078 t->ok = 1;
10706
ede87804e4e6 Removed some ":" in the track output for easier cut&paste.
mosu
parents: 10705
diff changeset
1079 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
1080 "%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
1081 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
1082 t->language != NULL ? t->language : "");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1083 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1084
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1085 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
1086 if (!strcmp(t->codec_id, MKV_S_VOBSUB)) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1087 if (mkv_parse_idx(t)) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1088 t->ok = 1;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1089 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: subtitles (%s), "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1090 "-sid %u%s%s\n", t->tnum, t->codec_id,
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1091 t->xid, t->language != NULL ? ", -slang " : "",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1092 t->language != NULL ? t->language : "");
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1093 }
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1094
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1095 } else { // Text subtitles do not need any data
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1096 t->ok = 1; // except the CodecID.
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1097 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: subtitles (%s), "
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1098 "-sid %u%s%s\n", t->tnum, t->codec_id, t->xid,
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1099 t->language != NULL ? ", -slang " : "",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1100 t->language != NULL ? t->language : "");
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
1101 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1102 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1103
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1104 default: // unknown track type!? error in demuxer...
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1105 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Error in demux_mkv.cpp: unknown "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1106 "demuxer type for track %u: '%c'\n", t->tnum, t->type);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1107 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1108 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1109
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1110 if (t->ok)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1111 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
1112 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1113
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1114 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1115 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1116
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1117 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
1118 int i, k;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1119
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1120 if (d == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1121 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1122
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1123 for (i = 0; i < d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1124 if (d->tracks[i] != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1125 if (d->tracks[i]->private_data != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1126 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
1127 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
1128 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
1129 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
1130 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
1131 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
1132 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
1133 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
1134 }
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1135 delete d->tracks[i]->c_encodings;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1136 free(d->tracks[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1137 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1138
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1139 for (i = 0; i < d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1140 free(d->index[i].entries);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1141 free(d->index);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1142
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1143 if (d->es != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1144 delete d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1145 if (d->saved_l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1146 delete d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1147 if (d->in != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1148 delete d->in;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1149 if (d->segment != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1150 delete d->segment;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1151 if (d->chapters != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1152 delete d->chapters;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1153
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1154 free(d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1155 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1156
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1157 static void add_index_entry(mkv_demuxer_t *d, uint32_t tnum, uint64_t filepos,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1158 uint64_t timecode, int is_key) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1159 int i, found;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1160 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1161
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1162 for (i = 0, found = 0; i < d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1163 if (d->index[i].tnum == tnum) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1164 found = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1165 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1166 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1167
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1168 if (!found) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1169 d->index = (mkv_track_index_t *)realloc(d->index, (d->num_indexes + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1170 sizeof(mkv_track_index_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1171 if (d->index == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1172 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1173 i = d->num_indexes;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1174 memset(&d->index[i], 0, sizeof(mkv_track_index_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1175 d->index[i].tnum = tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1176 d->num_indexes++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1177 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1178
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1179 d->index[i].entries =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1180 (mkv_index_entry_t *)realloc(d->index[i].entries,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1181 (d->index[i].num_entries + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1182 sizeof(mkv_index_entry_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1183 if (d->index[i].entries == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1184 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1185 entry = &d->index[i].entries[d->index[i].num_entries];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1186 entry->filepos = filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1187 entry->timecode = timecode;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1188 entry->is_key = is_key;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1189 d->index[i].num_entries++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1190 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1191
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1192 static void add_cluster_position(mkv_demuxer_t *mkv_d, int64_t position) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1193 mkv_d->cluster_positions = (int64_t *)realloc(mkv_d->cluster_positions,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1194 (mkv_d->num_cluster_pos + 1) *
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1195 sizeof(int64_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1196 if (mkv_d->cluster_positions != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1197 mkv_d->cluster_positions[mkv_d->num_cluster_pos] = position;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1198 mkv_d->num_cluster_pos++;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1199 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1200 mkv_d->num_cluster_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1201 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1202
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1203 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
1204 unsigned int i;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1205
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1206 for (i = 0; i < vec.size(); i++)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1207 if (vec[i] == value)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1208 return 1;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1209
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1210 return 0;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1211 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1212
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
1213 #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
1214 (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
1215 #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
1216 (((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
1217 #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
1218 (((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
1219
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1220 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
1221 EbmlElement *l2 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1222 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
1223 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
1224 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
1225 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
1226 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
1227 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
1228 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
1229 KaxCueReference *cref;
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 int upper_lvl_el, i, k;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1231 uint64_t tc_scale, filepos = 0, timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1232 uint32_t tnum = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1233 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1234
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1235 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
1236 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1237
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1238 mkv_d->parsed_cues->push_back(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1239
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1240 mkv_d->in->setFilePointer(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1241
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1242 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1243 tc_scale = mkv_d->tc_scale;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1244 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1245
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1246 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1247
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
1248 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
1249 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
1250 if (cues == NULL)
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1251 return;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1252
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
1253 if (!(EbmlId(*cues) == KaxCues::ClassInfos.GlobalId)) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1254 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
1255 "[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
1256 cues->Generic().DebugName);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1257
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1258 return;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1259 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1260
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1261 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cues\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1262
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
1263 cues->Read(*es, KaxCues::ClassInfos.Context, upper_lvl_el, l2, true);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1264
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
1265 cpoint = FINDFIRST(cues, KaxCuePoint);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1266
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
1267 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
1268 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue point\n");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1269
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
1270 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
1271 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
1272 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
1273 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
1274 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1275
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1276 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
1277 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
1278 (float)timecode / 1000.0);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1279
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
1280 ctrackpos = FINDFIRST(cpoint, KaxCueTrackPositions);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1281
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
1282 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
1283 ctrack = FINDFIRST(ctrackpos, KaxCueTrack);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1284
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
1285 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
1286 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
1287 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
1288 }
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
1289
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
1290 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
1291 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] | + found cue track: %u\n", tnum);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1292
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
1293 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
1294 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
1295 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
1296 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
1297 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1298
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
1299 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
1300 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
1301 "position: %llu\n", filepos);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1302
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
1303 cref = FINDFIRST(ctrackpos, KaxCueReference);
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 add_index_entry(mkv_d, tnum, filepos, timecode,
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1305 cref == NULL ? 1 : 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
1306
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 ctrackpos = FINDNEXT(cpoint, KaxCueTrackPositions, ctrackpos);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1308 }
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
1309
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
1310 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
1311 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 delete cues;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1314
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1315 // Debug: dump the index
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1316 for (i = 0; i < mkv_d->num_indexes; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1317 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] Index for track %u contains %u "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1318 "entries.\n", mkv_d->index[i].tnum, mkv_d->index[i].num_entries);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1319 for (k = 0; k < mkv_d->index[i].num_entries; k++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1320 entry = &mkv_d->index[i].entries[k];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1321 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] %d: timecode %llu, filepos %llu, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1322 "is key: %s\n", k, entry->timecode, entry->filepos,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1323 entry->is_key ? "yes" : "no");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1324 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1325 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1326
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1327 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1328
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1329 mkv_d->cues_found = 1;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1330 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1331
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1332 static void parse_chapters(mkv_demuxer_t *mkv_d, uint64_t pos) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1333 EbmlElement *l2 = NULL;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1334 EbmlStream *es;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1335 KaxChapters *kchapters;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1336 KaxEditionEntry *keentry;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1337 KaxChapterAtom *kcatom;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1338 KaxChapterTimeStart *kctstart;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1339 KaxChapterTimeEnd *kctend;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1340 int upper_lvl_el, i, k;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1341 mkv_chapter_t chapter;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1342
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1343 if (mkv_d->chapters != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1344 return;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1345
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1346 es = mkv_d->es;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1347 upper_lvl_el = 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1348
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1349 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1350
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1351 mkv_d->in->setFilePointer(pos);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1352
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1353 kchapters =
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1354 (KaxChapters *)es->FindNextElement(mkv_d->segment->Generic().Context,
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1355 upper_lvl_el, 0xFFFFFFFFL, true, 1);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1356 if (kchapters == NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1357 return;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1358
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1359 if (!(EbmlId(*kchapters) == KaxChapters::ClassInfos.GlobalId)) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1360 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] No KaxChapters element found but %s.\n"
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1361 "[mkv] \\---- [ parsing chapters ] ---------\n",
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1362 kchapters->Generic().DebugName);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1363
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1364 return;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1365 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1366
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1367 mkv_d->chapters = new vector<mkv_chapter_t>;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1368 kchapters->Read(*es, KaxChapters::ClassInfos.Context, upper_lvl_el, l2,
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1369 true);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1370
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1371 for (i = 0; i < (int)kchapters->ListSize(); i++) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1372 keentry = (KaxEditionEntry *)(*kchapters)[i];
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1373 if (EbmlId(*keentry) == KaxEditionEntry::ClassInfos.GlobalId) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1374 for (k = 0; k < (int)keentry->ListSize(); k++) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1375 kcatom = (KaxChapterAtom *)(*keentry)[k];
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1376 if (EbmlId(*kcatom) == KaxChapterAtom::ClassInfos.GlobalId) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1377 chapter.start = 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1378 chapter.end = 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1379 kctstart = FINDFIRST(kcatom, KaxChapterTimeStart);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1380 if (kctstart != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1381 chapter.start = uint64(*kctstart) / 1000000;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1382 kctend = FINDFIRST(kcatom, KaxChapterTimeEnd);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1383 if (kctend != NULL)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1384 chapter.end = uint64(*kctend) / 1000000;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1385 mkv_d->chapters->push_back(chapter);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1386 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter %u from %02d:%02d:%02d."
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1387 "%03d to %02d:%02d:%02d.%03d\n", mkv_d->chapters->size(),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1388 (int)(chapter.start / 60 / 60 / 1000),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1389 (int)((chapter.start / 60 / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1390 (int)((chapter.start / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1391 (int)(chapter.start % 1000),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1392 (int)(chapter.end / 60 / 60 / 1000),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1393 (int)((chapter.end / 60 / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1394 (int)((chapter.end / 1000) % 60),
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1395 (int)(chapter.end % 1000));
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1396 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1397 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1398 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1399 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1400
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1401 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing chapters ] ---------\n");
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1402 delete kchapters;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1403 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1404
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1405 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
1406 EbmlElement *l2 = NULL;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1407 EbmlStream *es;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1408 KaxSeekHead *kseekhead;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1409 KaxSeek *kseek;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1410 KaxSeekID *ksid;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1411 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
1412 int upper_lvl_el, i, k, s;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1413 uint64_t seek_pos;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1414 EbmlId *id;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1415 EbmlElement *e;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1416 binary *b;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1417
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1418 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
1419 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1420
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1421 mkv_d->parsed_seekheads->push_back(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1422
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1423 es = mkv_d->es;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1424 upper_lvl_el = 0;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1425
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1426 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
1427
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1428 mkv_d->in->setFilePointer(pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1429
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1430 kseekhead =
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1431 (KaxSeekHead *)es->FindNextElement(mkv_d->segment->Generic().Context,
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1432 upper_lvl_el, 0xFFFFFFFFL, true, 1);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1433 if (kseekhead == NULL)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1434 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1435
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1436 if (!(EbmlId(*kseekhead) == KaxSeekHead::ClassInfos.GlobalId)) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1437 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
1438 "[mkv] \\---- [ parsing seek head ] ---------\n",
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1439 kseekhead->Generic().DebugName);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1440
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1441 return;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1442 }
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->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
1445 true);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1446
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1447 for (i = 0; i < (int)kseekhead->ListSize(); i++) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1448 kseek = (KaxSeek *)(*kseekhead)[i];
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1449 if (!(EbmlId(*kseek) == KaxSeek::ClassInfos.GlobalId))
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1450 continue;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1451
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1452 seek_pos = 0;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1453 id = NULL;
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 for (k = 0; k < (int)kseek->ListSize(); k++) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1456 e = (*kseek)[k];
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 if (EbmlId(*e) == KaxSeekID::ClassInfos.GlobalId) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1459 ksid = (KaxSeekID *)e;
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 b = ksid->GetBuffer();
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1462 s = ksid->GetSize();
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1463 if (id != NULL)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1464 delete id;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1465 id = new EbmlId(b, s);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1466
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1467 } else if (EbmlId(*e) == KaxSeekPosition::ClassInfos.GlobalId) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1468 kspos = (KaxSeekPosition *)e;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1469 seek_pos = mkv_d->segment->GetGlobalPosition(uint64(*kspos));
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1470
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 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1473
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1474 if ((seek_pos != 0) && (id != NULL)) {
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1475 if (*id == KaxSeekHead::ClassInfos.GlobalId)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1476 parse_seekhead(mkv_d, seek_pos);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1477 else if (*id == KaxCues::ClassInfos.GlobalId)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1478 parse_cues(mkv_d, seek_pos);
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1479 else if (*id == KaxChapters::ClassInfos.GlobalId)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1480 parse_chapters(mkv_d, seek_pos);
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1481 }
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1482
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1483 if (id != NULL)
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1484 delete id;
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 delete kseekhead;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1488
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1489 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing seek head ] ---------\n");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1490 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1491
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
1492 #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
1493 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
1494 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
1495 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
1496 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
1497 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
1498 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
1499 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
1500 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
1501 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
1502 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
1503 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
1504 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
1505 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
1506 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
1507 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
1508 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
1509 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
1510 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
1511 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
1512 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
1513 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
1514 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
1515 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
1516 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
1517 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
1518 }
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
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1520 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1521 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
1522
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1523 extern "C" int demux_mkv_open(demuxer_t *demuxer) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1524 unsigned char signature[4];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1525 stream_t *s;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1526 demux_packet_t *dp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1527 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
1528 int upper_lvl_el, exit_loop, i, vid, sid, aid;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1529 // 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
1530 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1531 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1532 mkv_track_t *track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1533 sh_audio_t *sh_a;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1534 sh_video_t *sh_v;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1535 vector<uint64_t> seekheads_to_parse;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1536 vector<uint64_t> cues_to_parse;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1537 int64_t current_pos;
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
1538 qt_image_description_t *idesc;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1539
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1540 #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
1541 subcp_open();
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1542 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1543
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1544 s = demuxer->stream;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1545 stream_seek(s, s->start_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1546 memset(signature, 0, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1547 stream_read(s, (char *)signature, 4);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1548 if ((signature[0] != 0x1A) || (signature[1] != 0x45) ||
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1549 (signature[2] != 0xDF) || (signature[3] != 0xA3))
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1550 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1551 stream_seek(s, s->start_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1552
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1553 try {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1554 // 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
1555 mkv_d = (mkv_demuxer_t *)safemalloc(sizeof(mkv_demuxer_t));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1556 memset(mkv_d, 0, sizeof(mkv_demuxer_t));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1557 mkv_d->duration = -1.0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1558
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1559 // Create the interface between MPlayer's IO system and
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1560 // libmatroska's IO system.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1561 mkv_d->in = new mpstream_io_callback(demuxer->stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1562 if (mkv_d->in == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1563 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1564 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1565 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1566 mpstream_io_callback &io = *static_cast<mpstream_io_callback *>(mkv_d->in);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1567 mkv_d->es = new EbmlStream(io);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1568 if (mkv_d->es == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1569 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1570 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1571 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1572 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1573
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1574 // Find the EbmlHead element. Must be the first one.
10638
9d0b8330a683 Fixes for compilation with gcc versions != 3.2.
mosu
parents: 10637
diff changeset
1575 l0 = es->FindNextID(EbmlHead::ClassInfos, 0xFFFFFFFFFFFFFFFFULL);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1576 if (l0 == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1577 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] no head found\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1578 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1579 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1580 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1581 // Don't verify its data for now.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1582 l0->SkipData(static_cast<EbmlStream &>(*es), l0->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1583 delete l0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1584 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1585
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1586 // Next element must be a segment
10638
9d0b8330a683 Fixes for compilation with gcc versions != 3.2.
mosu
parents: 10637
diff changeset
1587 l0 = es->FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFFFFFFFFFULL);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1588 if (l0 == NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1589 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1590 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1591 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1592 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1593 if (!(EbmlId(*l0) == KaxSegment::ClassInfos.GlobalId)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1594 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1595 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1596 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1597 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1598 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1599
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1600 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
1601 mkv_d->tc_scale = MKVD_TIMECODESCALE;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1602 mkv_d->parsed_seekheads = new vector<uint64_t>;
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1603 mkv_d->parsed_cues = new vector<uint64_t>;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1604
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
1605 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
1606 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
1607 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
1608
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1609 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1610 exit_loop = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1611 // We've got our segment, so let's find the tracks
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1612 l1 = es->FindNextElement(l0->Generic().Context, upper_lvl_el, 0xFFFFFFFFL,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1613 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
1614 while ((l1 != NULL) && (upper_lvl_el <= 0)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1615
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1616 if (EbmlId(*l1) == KaxInfo::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1617 // 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
1618 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
1619 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
1620
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1621 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1622
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
1623 l1->Read(*es, KaxInfo::ClassInfos.Context, upper_lvl_el, l2, true);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1624
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
1625 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
1626 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
1627 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
1628 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
1629 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
1630 } 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
1631 mkv_d->tc_scale = MKVD_TIMECODESCALE;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1632
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
1633 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
1634 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
1635 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
1636 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
1637 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
1638 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1639
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
1640 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1641
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1642 } else if (EbmlId(*l1) == KaxTracks::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1643 // Yep, we've found our KaxTracks element. Now find all tracks
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1644 // 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
1645
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1646 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
1647
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1648 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
1649
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1651
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1653 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
1654 // We actually found a track entry :) We're happy now.
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1655
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
1656 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
1657 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
1658 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
1659 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
1660 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
1661 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
1662 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
1663 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
1664 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
1665 #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
1666 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
1667 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
1668 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
1669 #endif
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1670
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
1671 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
1672
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1674 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
1675 return 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1676
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
1677 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
1678 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
1679 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
1680 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
1681 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
1682 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
1683 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
1684 "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
1685 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
1686 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1687
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
1688 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
1689 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
1690 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
1691 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
1692 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
1693 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
1694 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
1695 "%.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
1696 (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
1697 }
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
1698 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
1699 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1700
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
1701 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
1702 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
1703 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
1704
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
1705 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
1706 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
1707 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
1708 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
1709 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
1710 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
1711 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
1712 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
1713 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
1714 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
1715 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
1716 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
1717 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
1718 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
1719 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
1720 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
1721 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
1722 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
1723 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
1724 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
1725 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
1726 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
1727 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
1728 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1729 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1730
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 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
1732 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
1733 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
1734 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
1735 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
1736
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1738
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
1739 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
1740 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
1741 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
1742 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
1743 "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
1744 } 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
1745 track->a_sfreq = 8000.0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1746
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
1747 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
1748 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
1749 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
1750 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
1751 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
1752 } 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
1753 track->a_channels = 1;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1754
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
1755 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
1756 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
1757 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
1758 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
1759 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
1760 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1762 }
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
1763
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
1764 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
1765 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
1766 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
1767 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
1768 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
1769 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
1770 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
1771
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1773 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
1774 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
1775 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
1776 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
1777 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1780 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
1781 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
1782 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
1783 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
1784 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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_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
1787 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
1788 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
1789 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
1790 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
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_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
1794 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
1795 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
1796 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
1797 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
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 // 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
1801 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
1802 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
1803 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
1804 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
1805 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
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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1811 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
1812 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
1813 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
1814 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
1815 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1818 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
1819 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
1820 "%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
1821 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
1822 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
1823 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
1824 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
1825 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1828 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
1829 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
1830 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
1831 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
1832 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
1835 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
1836 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
1837 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
1838 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
1839 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
1840 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
1841 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
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
1843 #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
1844 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
1845 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
1846 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
1847 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
1848 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
1849
b4040706e1d3 Added support for additional content encoding (compression, encryption) in general and zlib compression in particular (to be used with VobSubs).
mosu
parents: 11155
diff changeset
1850 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
1851 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
1852 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
1853 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
1854 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
1855 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
1856 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
1857 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
1858 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
1859
b4040706e1d3 Added 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 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
1861 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
1862
b4040706e1d3 Added 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 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
1864 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
1865 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
1866
b4040706e1d3 Added 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 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
1868 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
1869 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
1870
b4040706e1d3 Added 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 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
1872 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
1873 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
1874 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
1875 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
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_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
1878 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
1879 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
1880 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
1881
b4040706e1d3 Added 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 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
1883 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
1884 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
1885
b4040706e1d3 Added 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 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
1887 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
1888 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
1889 (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
1890 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
1891 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
1892 }
b4040706e1d3 Added 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 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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 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
1896 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
1897 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
1898 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
1899 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
1900 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
1901 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
1902 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
1903
b4040706e1d3 Added 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 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
1905 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
1906 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
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 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
1909 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
1910 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
1911 (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
1912 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
1913 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
1914 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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 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
1917 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
1918 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
1919
b4040706e1d3 Added 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 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
1921 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
1922 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
1923
b4040706e1d3 Added 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 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
1925 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
1926 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
1927 (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
1928 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
1929 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
1930 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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 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
1933 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
1934 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
1935 (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
1936 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
1937 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
1938 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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_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
1943 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
1944 (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
1945 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
1946 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
1947 }
b4040706e1d3 Added 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 }
b4040706e1d3 Added 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 }
b4040706e1d3 Added 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
b4040706e1d3 Added 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 #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
1952 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
1953 } // 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
1954
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1955 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1956
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1957 } else if (EbmlId(*l1) == KaxSeekHead::ClassInfos.GlobalId) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1958 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
1959 seekheads_to_parse.push_back(l1->GetElementPosition());
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1960 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1961
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1962 } else if ((EbmlId(*l1) == KaxCues::ClassInfos.GlobalId) &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1963 !mkv_d->cues_found) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
1964 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
1965 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
1966 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1967
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1968 } else if (EbmlId(*l1) == KaxChapters::ClassInfos.GlobalId) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1969 parse_chapters(mkv_d, l1->GetElementPosition());
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1970 l1->SkipData(*es, l1->Generic().Context);
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
1971
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1972 } else if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1973 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ found cluster, headers are "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1974 "parsed completely :)\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1975 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1976 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1977 exit_loop = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1978
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1979 } 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
1980 l1->SkipData(*es, l1->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
1981
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
1982 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
1983 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
1984 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
1985 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1986
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1987 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
1988 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
1989 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
1990 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
1991 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
1992 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
1993 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
1994
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
1995 } 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
1996 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
1997 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
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
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2002 if (exit_loop) // we've found the first cluster, so get out
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2003 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2004
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
2005 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
2006 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
2007 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
2008 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
2009
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2010 } // while (l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2011
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2012 if (!exit_loop) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2013 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2014 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2015 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2016
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
2017 current_pos = io.getFilePointer();
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2018
10283
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2019 // 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
2020 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
2021 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
2022 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
2023 (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
2024 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
2025 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
2026 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
2027 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
2028 } else
21972de8631d Support for files whose first timecode is not 0 (which is the case for splitted/linked files).
mosu
parents: 10273
diff changeset
2029 mkv_d->first_tc = 0;
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2030
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2031 // Parse all cues and seek heads
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2032 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
2033 parse_cues(mkv_d, cues_to_parse[i]);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2034 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
2035 parse_seekhead(mkv_d, seekheads_to_parse[i]);
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2036
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
2037 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
2038
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2039 } catch (exception &ex) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2040 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] caught exception\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2041 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2042 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2043
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2044 if (!check_track_information(mkv_d)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2045 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2046 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2047 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2048
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2049 track = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2050 if (demuxer->video->id == -1) { // Automatically select a video track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2051 // Search for a video track that has the 'default' flag set.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2052 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2053 if ((mkv_d->tracks[i]->type == 'v') && mkv_d->tracks[i]->ok &&
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2054 mkv_d->tracks[i]->default_track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2055 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2056 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2057 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2058
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2059 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2060 // No track has the 'default' flag set - let's take the first video
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2061 // track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2062 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2063 if ((mkv_d->tracks[i]->type == 'v') && mkv_d->tracks[i]->ok) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2064 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2065 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2066 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2067 } 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
2068 track = find_track_by_num(mkv_d, demuxer->video->id, 'v');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2069
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2070 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
2071 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
2072
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2073 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
2074
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2075 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
2076 BITMAPINFOHEADER *src;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2077 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
2078 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
2079 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
2080 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
2081 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
2082 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
2083 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
2084 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
2085 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
2086 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
2087 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
2088 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
2089 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
2090 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
2091 memcpy((char *)bih + sizeof(BITMAPINFOHEADER),
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2092 (char *)src + sizeof(BITMAPINFOHEADER),
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2093 track->private_size - sizeof(BITMAPINFOHEADER));
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2094
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
2095 } else {
11329
9165908f87d3 Fixed wrong allocation of the BITMAPINFOHEADER structure which would crash mplayer in some cases.
mosu
parents: 11321
diff changeset
2096 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
2097 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
2098 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
2099 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
2100 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
2101 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
2102 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
2103
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 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
2105 (!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
2106 !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
2107 !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
2108 !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
2109 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
2110 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
2111 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
2112
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 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
2114 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
2115
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 = (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
2117 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
2118 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
2119 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
2120 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
2121 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
2122 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
2123 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
2124 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
2125 ((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
2126 ((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
2127
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 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
2129 (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
2130 // 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
2131 ((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
2132 ((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
2133 } 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
2134 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
2135 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
2136
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2137 #if defined(USE_QTX_CODECS)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2138 } 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
2139 (!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
2140 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
2141 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
2142 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
2143 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
2144 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
2145 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
2146 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
2147 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
2148 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
2149 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
2150 idesc->horizontal_resolution =
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2151 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
2152 idesc->vertical_resolution =
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2153 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
2154 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
2155 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
2156 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
2157 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
2158 bih->biPlanes = 1;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2159 bih->biCompression = idesc->codec_type;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2160 #endif // defined(USE_QTX_CODECS)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2161
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
2162 } 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
2163 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
2164 "(%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
2165 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
2166 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
2167 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2168 }
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2169
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2170 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
2171 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
2172 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
2173
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2174 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
2175 sh_v->bih = bih;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2176 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
2177 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
2178 track->v_frate = 25.0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2179 sh_v->fps = track->v_frate;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2180 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
2181 if (!track->realmedia) {
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2182 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
2183 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
2184 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
2185 } else {
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2186 // 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
2187 // 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
2188 // 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
2189 // 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
2190 // by check_track_information.
f9fccf97d588 For RealVideo the aspect ratio was overridden in vd_realvid.c. Implemented a workaround.
mosu
parents: 11557
diff changeset
2191 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
2192 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
2193 }
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2194 if (idesc != NULL)
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2195 sh_v->ImageDesc = idesc;
10081
0181d5fc8474 Support for aspect ratio set via DisplayWidth/DisplayHeight.
mosu
parents: 10079
diff changeset
2196 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2197
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2198 demuxer->video->id = track->tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2199 demuxer->video->sh = sh_v;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2200 sh_v->ds = demuxer->video;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2201
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2202 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
2203 } 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
2204 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
2205
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2206 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2207 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] No video track found/wanted.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2208 demuxer->video->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2209 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2210
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2211 track = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2212 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
2213 // 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
2214 if (audio_lang != NULL) {
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2215 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
2216 }
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2217 if (track == NULL)
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2218 // 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
2219 // 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
2220 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
2221 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
2222 mkv_d->tracks[i]->default_track) {
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2223 track = mkv_d->tracks[i];
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2224 break;
531b00ad6f2d Support for selecting the audio track in Matroska files via -alang.
mosu
parents: 10149
diff changeset
2225 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2226
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2227 if (track == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2228 // No track has the 'default' flag set - let's take the first audio
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2229 // track.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2230 for (i = 0; i < mkv_d->num_tracks; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2231 if ((mkv_d->tracks[i]->type == 'a') && mkv_d->tracks[i]->ok) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2232 track = mkv_d->tracks[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2233 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2234 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2235 } 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
2236 track = find_track_by_num(mkv_d, demuxer->audio->id, 'a');
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2237
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2238 if (track) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2239 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play audio track %u\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2240 track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2241 sh_a = new_sh_audio(demuxer, track->tnum);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2242
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2243 demuxer->audio->id = track->tnum;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2244 demuxer->audio->sh = sh_a;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2245 sh_a->ds = demuxer->audio;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2246
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2247 mkv_d->audio = track;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2248
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
2249 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
2250 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
2251 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
2252 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
2253 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
2254 memset(sh_a->wf, 0, sizeof(WAVEFORMATEX));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2255 }
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2256 sh_a->format = track->a_formattag;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2257 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
2258 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
2259 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
2260 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
2261 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
2262 sh_a->samplesize = track->a_bps / 8;
11155
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
2263 if (!strcmp(track->codec_id, MKV_A_MP3) ||
4a21e1672c91 Support for MP2 audio.
mosu
parents: 11154
diff changeset
2264 !strcmp(track->codec_id, MKV_A_MP2)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2265 sh_a->wf->nAvgBytesPerSec = 16000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2266 sh_a->wf->nBlockAlign = 1152;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2267 sh_a->wf->wBitsPerSample = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2268 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
2269
11114
d8ddd7727084 More liberal codec id recognition for AC3 codecs (needed for transcoded DNET from RM).
mosu
parents: 10984
diff changeset
2270 } else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3))) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2271 sh_a->wf->nAvgBytesPerSec = 16000;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2272 sh_a->wf->nBlockAlign = 1536;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2273 sh_a->wf->wBitsPerSample = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2274 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
2275
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2276 } 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
2277 !strcmp(track->codec_id, MKV_A_PCM_BE)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2278 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2279 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2280 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
2281 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
2282 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
2283
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2284 } 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
2285 !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
2286 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
2287 sh_a->wf->nAvgBytesPerSec = 16000;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2288 sh_a->wf->nBlockAlign = 1486;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2289 track->fix_i_bps = true;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2290 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
2291 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
2292 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
2293 track->private_size);
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2294 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
2295 }
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2296 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
2297 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
2298 else
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2299 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
2300
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2301 } 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
2302 int profile, srate_idx;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2303
10125
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2304 sh_a->wf->nAvgBytesPerSec = 16000;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2305 sh_a->wf->nBlockAlign = 1024;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2306 sh_a->wf->wBitsPerSample = 0;
252428ac7978 Added support for AAC.
mosu
parents: 10105
diff changeset
2307 sh_a->samplesize = 0;
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2308
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2309 // 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
2310 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
2311 if (!strncmp(&track->codec_id[12], "MAIN", 4))
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2312 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
2313 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
2314 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
2315 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
2316 profile = 2;
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2317 else
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2318 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
2319 sh_a->codecdata = (unsigned char *)safemalloc(5);
10133
d9c9422887ca Endian fixes and proper support for headerless AAC streams.
mosu
parents: 10125
diff changeset
2320 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
2321 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
2322 (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
2323
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 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
2325 // 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
2326 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
2327
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
2328 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
2329 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
2330 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
2331 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
2332 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
2333 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
2334 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
2335
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 } 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
2337 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
2338 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
2339 }
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
2340
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2341 } else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2342 for (i = 0; i < 3; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2343 dp = new_demux_packet(track->header_sizes[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2344 memcpy(dp->buffer, track->headers[i], track->header_sizes[i]);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2345 dp->pts = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2346 dp->flags = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2347 ds_add_packet(demuxer->audio, dp);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2348 }
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
2349
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2350 } 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
2351 !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
2352 // 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
2353 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
2354 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
2355 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
2356 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
2357
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2358 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
2359 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
2360
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2361 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
2362 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
2363 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
2364
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 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
2366
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 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
2368 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
2369 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
2370 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
2371 } 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
2372 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
2373
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 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
2375 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
2376 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
2377 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
2378 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
2379 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
2380 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
2381 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
2382 ((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
2383 ((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
2384 ((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
2385 ((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
2386 ((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
2387 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
2388
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
2389 track->realmedia = true;
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2390
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2391 } 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
2392 (track->a_formattag == 0xf1ac)) {
11484
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2393 unsigned char *ptr;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2394 int size;
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2395 free(sh_a->wf);
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2396 sh_a->wf = NULL;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2397
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2398 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
2399 ptr = (unsigned char *)track->private_data;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2400 size = track->private_size;
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2401 } else {
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2402 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
2403 ptr = (unsigned char *)track->private_data + sizeof(WAVEFORMATEX);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2404 size = track->private_size - sizeof(WAVEFORMATEX);
11482
a6b69309a791 Support for FLAC in Matroska written in the MS compatibility mode.
mosu
parents: 11478
diff changeset
2405 }
11484
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2406 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
2407 (ptr[2] != 'a') || (ptr[3] != 'C')) {
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2408 dp = new_demux_packet(4);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2409 memcpy(dp->buffer, "fLaC", 4);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2410 dp->pts = 0;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2411 dp->flags = 0;
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2412 ds_add_packet(demuxer->audio, dp);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2413 }
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2414 dp = new_demux_packet(size);
3abf5b7cb308 Support for FLAC tracks that already contain the "fLaC" header.
mosu
parents: 11482
diff changeset
2415 memcpy(dp->buffer, ptr, size);
11478
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2416 dp->pts = 0;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2417 dp->flags = 0;
27e5c86c968a Support for FLAC in Matroska.
mosu
parents: 11393
diff changeset
2418 ds_add_packet(demuxer->audio, dp);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2419 }
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
2420
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2421 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2422 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2423 demuxer->audio->id = -2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2424 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2425
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2426 // DO NOT automatically select a subtitle track and behave like DVD
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2427 // 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
2428 track = NULL;
4c4c2761643c Proper key frame reporting. Proper handling of "no subtitles wanted".
mosu
parents: 10060
diff changeset
2429 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
2430 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
2431 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
2432 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
2433 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
2434 if (!strcmp(track->codec_id, MKV_S_VOBSUB)) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2435 mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will display subtitle track %u\n",
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2436 track->tnum);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2437 mkv_d->subs_track = track;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2438 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
2439 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
2440 sizeof(mkv_sh_sub_t));
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2441 demuxer->sub->id = track->xid;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2442
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2443 } else if (strcmp(track->codec_id, MKV_S_TEXTASCII) &&
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2444 strcmp(track->codec_id, MKV_S_TEXTUTF8) &&
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2445 strcmp(track->codec_id, MKV_S_TEXTSSA) &&
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2446 strcmp(track->codec_id, "S_SSA") &&
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2447 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
2448 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
2449 "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
2450 else {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2451 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
2452 track->tnum);
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2453 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
2454 if (!mkv_d->subs.text[0]) {
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2455 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
2456 mkv_d->subs.text[i] = (char *)safemalloc(256);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2457
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2458 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
2459 sub_utf8 = 1; // Force UTF-8 conversion.
10984
e5f2765c6d80 Backwards compatibility fix for old SSA CodecIDs.
mosu
parents: 10930
diff changeset
2460 if (!strcmp(track->codec_id, MKV_S_TEXTSSA) ||
11276
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2461 !strcmp(track->codec_id, "S_SSA") ||
ec45f2106ec6 * fix my 100l from before
attila
parents: 11268
diff changeset
2462 !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
2463 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
2464 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
2465 } else
10845
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2466 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
2467 } else
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2468 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
2469 "subtitle track with the id %u.\n", demuxer->sub->id);
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2470 demuxer->sub->sh = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2471 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2472 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2473
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2474 demuxer->priv = mkv_d;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2475
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2476 if (mkv_d->chapters != NULL) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2477 for (i = 0; i < (int)mkv_d->chapters->size(); i++) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2478 (*mkv_d->chapters)[i].start -= mkv_d->first_tc;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2479 (*mkv_d->chapters)[i].end -= mkv_d->first_tc;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2480 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2481 if ((dvd_last_chapter > 0) &&
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2482 (dvd_last_chapter <= (int)mkv_d->chapters->size())) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2483 if ((*mkv_d->chapters)[dvd_last_chapter - 1].end != 0)
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2484 mkv_d->stop_timecode = (*mkv_d->chapters)[dvd_last_chapter - 1].end;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2485 else if ((dvd_last_chapter + 1) <= (int)mkv_d->chapters->size())
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2486 mkv_d->stop_timecode = (*mkv_d->chapters)[dvd_last_chapter].start;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2487 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2488 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2489
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2490 if (s->end_pos == 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2491 demuxer->seekable = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2492 else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2493 demuxer->movi_start = s->start_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2494 demuxer->movi_end = s->end_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2495 demuxer->seekable = 1;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2496 if ((dvd_chapter != 1) && (mkv_d->chapters != NULL) &&
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2497 (dvd_chapter <= (int)mkv_d->chapters->size()))
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2498 demux_mkv_seek(demuxer, (float)(*mkv_d->chapters)[dvd_chapter - 1].start
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2499 / 1000.0, 1);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2500 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2501
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2502 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2503 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2504
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
2505 // 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
2506 #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
2507 #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
2508
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
2509 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
2510 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
2511 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
2512 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
2513 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
2514 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
2515 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
2516
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
2517 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
2518 !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
2519
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
2520 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
2521 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
2522 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
2523 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
2524 }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
2525 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
2526 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
2527 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
2528 }
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 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
2530 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
2531 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
2532 // 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
2533 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
2534 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
2535 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
2536 } 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
2537 // 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
2538 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
2539 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
2540 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
2541 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
2542 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
2543 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
2544 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
2545 }
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 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
2547 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
2548 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
2549 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
2550 }
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 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
2552 "%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
2553 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
2554 }
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 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
2556 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
2557
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 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
2559 }
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
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
2561 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
2562 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
2563 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
2564 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
2565 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
2566 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
2567 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
2568
c2fc1c310699 Necessary changes for the upcoming libebml/libmatroska 0.5.0. Implemented support for RealAudio and RealVideo inside Matroska.
mosu
parents: 10283
diff changeset
2569 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
2570 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
2571 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
2572 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
2573 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
2574 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
2575 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
2576 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
2577 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
2578 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
2579 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
2580 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
2581
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 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
2583 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
2584 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
2585 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
2586 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
2587 } 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
2588 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
2589 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
2590 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
2591 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
2592
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 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
2594
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 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
2596 }
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
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
2598 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
2599 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
2600 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
2601 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
2602
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 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
2604
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
2605 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
2606 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
2607 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
2608 !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
2609 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
2610 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
2611 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
2612 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
2613
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
2614 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
2615 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
2616
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 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
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 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
2620 }
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
2621
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2622 extern "C" int demux_mkv_fill_buffer(demuxer_t *d) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2623 demux_packet_t *dp;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2624 demux_stream_t *ds;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2625 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
2626 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
2627 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
2628 char *texttmp;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2629 // 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
2630 EbmlElement *l0 = NULL, *l1 = NULL, *l2 = NULL, *l3 = NULL;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2631 EbmlStream *es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2632 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
2633 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
2634 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
2635 float current_pts;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2636
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2637 mkv_d = (mkv_demuxer_t *)d->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2638 es = mkv_d->es;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2639 l0 = mkv_d->segment;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2640
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2641 // End of stream
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2642 if (mkv_d->saved_l1 == NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2643 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2644
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2645 exit_loop = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2646 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2647 l1 = mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2648 mkv_d->saved_l1 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2649 found_data = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2650 try {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2651 // The idea is not to handle a complete KaxCluster with each call to
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2652 // 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
2653 while ((l1 != NULL) && (upper_lvl_el <= 0)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2654
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2655 if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2656 mkv_d->cluster = (KaxCluster *)l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2657 if (found_data) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2658 mkv_d->saved_l1 = l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2659 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2660 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2661
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2662 if (mkv_d->saved_l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2663 l2 = mkv_d->saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2664 mkv_d->saved_l2 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2665 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2666 l2 = es->FindNextElement(l1->Generic().Context, upper_lvl_el,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2667 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
2668 while ((l2 != NULL) && (upper_lvl_el <= 0)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2669
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
2670 // Handle at least one data packets in one call to
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2671 // demux_mkv_fill_buffer - but abort if we have found that.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2672 if (found_data >= 1) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2673 mkv_d->saved_l2 = l2;
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 exit_loop = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2676 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2677 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2678
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2679 if (EbmlId(*l2) == KaxClusterTimecode::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2680 KaxClusterTimecode &ctc = *static_cast<KaxClusterTimecode *>(l2);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2681 ctc.ReadData(es->I_O());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2682 mkv_d->cluster_tc = uint64(ctc);
10273
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2683 #if LIBEBML_VERSION >= 000404
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2684 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
2685 #else
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2686 mkv_d->cluster->InitTimecode(mkv_d->cluster_tc);
10273
02c2c05b7da6 Updates needed for libebml/libmatroska 0.4.4
mosu
parents: 10167
diff changeset
2687 #endif // LIBEBML_VERSION
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2688
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2689 } else if (EbmlId(*l2) == KaxBlockGroup::ClassInfos.GlobalId) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2690
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
2691 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
2692 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
2693 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
2694
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2695 block = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2696 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
2697 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
2698 block_fref = 0;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2699
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
2700 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
2701 true);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2702
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
2703 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
2704 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
2705 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
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 kblock = FINDFIRST(l2, KaxBlock);
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2708 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
2709 kblock->SetParent(*mkv_d->cluster);
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2710 if ((mkv_d->stop_timecode > 0) &&
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2711 ((kblock->GlobalTimecode() / 1000000 - mkv_d->first_tc) >=
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2712 mkv_d->stop_timecode)) {
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2713 delete l2;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2714 return 0;
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2715 }
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
2716 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2717
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
2718 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
2719 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
2720 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
2721 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
2722 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
2723 block_fref = int64(*krefblock);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2724
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 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
2726 }
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
2727
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
2728 if (kblock != NULL) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2729 // 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
2730 lines_cut = false;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2731 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
2732 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
2733 (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
2734 sl = linei;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2735 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
2736 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
2737 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
2738 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
2739 sl++;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2740 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2741 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
2742 mkv_d->subs.lines--;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2743 linei--;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2744 lines_cut = true;
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2745 }
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2746 if (lines_cut) {
71db96cf88d4 Support for SSA text subs in Matroska. Patch partially by Tristan <z80@oceanfree.net>.
mosu
parents: 10844
diff changeset
2747 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
2748 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
2749 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2750 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2751
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2752 ds = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2753 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
2754 (mkv_d->video->tnum == kblock->TrackNum())) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2755 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
2756 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
2757 } 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
2758 (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
2759 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
2760 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
2761 } 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
2762 (mkv_d->subs_track->tnum == kblock->TrackNum())) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2763 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
2764 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
2765 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2766
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
2767 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
2768
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
2769 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
2770 mkv_d->first_tc) / 1000.0;
10930
624f11cc5034 Fix for imprecise floating point calculations.
mosu
parents: 10874
diff changeset
2771 if (current_pts < 0.0)
624f11cc5034 Fix for imprecise floating point calculations.
mosu
parents: 10874
diff changeset
2772 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
2773
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
2774 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
2775 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
2776 (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
2777 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
2778
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
2779 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
2780 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
2781
10844
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2782 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
2783 uint32_t i, sum;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2784 sh_audio_t *sh;
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2785
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2786 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
2787 DataBuffer &data = kblock->GetBuffer(i);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2788 sum += data.Size();
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2789 }
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2790 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
2791 if (block_duration != -1) {
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2792 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
2793 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
2794 sh->i_bps);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2795 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
2796 } 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
2797 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
2798 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
2799 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
2800 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
2801 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
2802 sh->i_bps);
98681fdabf79 Support for Quicktime stuff in Matroska (e.g. Sorenson, QDesign Music codecs etc.).
mosu
parents: 10706
diff changeset
2803 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
2804 }
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
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
2807 } 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
2808 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
2809
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
2810 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
2811 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
2812 (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
2813 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
2814
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
2815 } 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
2816 (mkv_d->subs_track->tnum == kblock->TrackNum())) {
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2817 if (mkv_d->subtitle_type != MKV_SUBTYPE_VOBSUB) {
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2818 if (!mkv_d->v_skip_to_keyframe)
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2819 handle_subtitles(d, kblock, block_duration);
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2820 use_this_block = false;
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2821 }
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
2822
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
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 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
2827 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
2828 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
2829 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
2830 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
2831
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 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
2833 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
2834 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
2835 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
2836 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
2837
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
2838 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
2839 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
2840 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
2841
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
2842 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
2843 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
2844 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
2845
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
2846 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
2847 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
2848 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
2849
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
2850 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
2851 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
2852 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
2853 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
2854 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
2855 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
2856 found_data++;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2857 }
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
2858 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
2859 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
2860 }
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 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
2862 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
2863 mkv_d->skip_to_timecode = 0;
11154
0e9ea2a3a220 Support for uncompressed VobSubs.
mosu
parents: 11139
diff changeset
2864 } 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
2865 mkv_d->a_skip_to_keyframe = false;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2866 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2867
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2868 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
2869 } // kblock != NULL
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2870
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
2871 } 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
2872 l2->SkipData(*es, l2->Generic().Context);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2873
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
2874 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
2875 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
2876 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
2877 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2878
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2879 if (upper_lvl_el > 0) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2880 upper_lvl_el--;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2881 if (upper_lvl_el > 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2882 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
2883 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
2884 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
2885 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
2886
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2887 } 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
2888 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
2889 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
2890 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
2891
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2892 }
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
2893
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
2894 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
2895 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
2896 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
2897 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
2898
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2899 } // 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
2900
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2901 } else if (EbmlId(*l1) == KaxCues::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2902 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2903 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
2904 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
2905
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
2907 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
2908 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
2909 }
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 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
2912 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 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
2914 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
2915 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
2916 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
2917 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
2918
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. Also some fixes for handling of global elements which re-enable playback of files created with the latest VDubMod.
mosu
parents: 10438
diff changeset
2919 } 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
2920 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
2921 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
2922 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
2923
b6a31ca4f9a2 Big reorganization. Relies on libmatroska's Read() function and then processes units in memory. 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 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2925
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2926 if (exit_loop)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2927 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2928
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
2929 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
2930 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
2931 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
2932 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
2933
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2934 } // while (l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2935 } catch (exception ex) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2936 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] exception caught\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2937 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2938 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2939
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2940 if (found_data)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2941 return 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2942
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2943 return 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2944 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2945
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2946 extern "C" void resync_audio_stream(sh_audio_t *sh_audio);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2947
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2948 extern "C" void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2949 int flags) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2950 int i, k, upper_lvl_el;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2951 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2952 int64_t target_timecode, target_filepos = 0, min_diff, diff, current_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2953 int64_t cluster_pos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2954 mkv_track_index_t *index;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2955 mkv_index_entry_t *entry;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2956 EbmlElement *l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2957
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2958 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] SEEK, relss: %.3f, flags: %d\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2959 rel_seek_secs, flags);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2960
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2961 if (!mkv_d->cues_found && !mkv_d->cues_searched) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2962 // 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
2963 // elements until we either hit another segment, the end of the file
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2964 // or - suprise - some cues.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2965 current_pos = mkv_d->in->getFilePointer();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2966
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2967 // Skip the data but do not delete the element! This is our current
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2968 // cluster, and we need it later on in demux_mkv_fill_buffer.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2969 l1 = mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2970 l1->SkipData(static_cast<EbmlStream &>(*mkv_d->es), l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2971 l1 = mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2972 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2973 while (l1 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2974 if (upper_lvl_el)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2975 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2976
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2977 if (EbmlId(*l1) == KaxCues::ClassInfos.GlobalId) {
10685
f54ffeb29447 Support for linked seek heads, multiple seek heads, multiple cues.
mosu
parents: 10684
diff changeset
2978 parse_cues(mkv_d, l1->GetElementPosition());
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2979 delete l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2980 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2981 } else {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2982 if (EbmlId(*l1) == KaxCluster::ClassInfos.GlobalId)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2983 add_cluster_position(mkv_d, l1->GetElementPosition());
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2984 l1->SkipData(static_cast<EbmlStream &>(*mkv_d->es),
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2985 l1->Generic().Context);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2986 delete l1;
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 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2990 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2991
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2992 if (demuxer->stream->eof)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2993 stream_reset(demuxer->stream);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2994 mkv_d->in->setFilePointer(current_pos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2995
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2996 mkv_d->cues_searched = 1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2997 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2998
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
2999 if (!(flags & 2)) { // Time in secs
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3000 if (flags & 1) // Absolute seek
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3001 target_timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3002 else // Relative seek
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3003 target_timecode = (int64_t)(mkv_d->last_pts * 1000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3004 target_timecode += (int64_t)(rel_seek_secs * 1000.0);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3005 if (target_timecode < 0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3006 target_timecode = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3007
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3008 min_diff = 0xFFFFFFFL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3009
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3010 // Let's find the entry in the index with the smallest difference
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3011 // to the wanted timecode.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3012 entry = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3013 for (i = 0; i < mkv_d->num_indexes; i++)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3014 if (mkv_d->index[i].tnum == mkv_d->video->tnum) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3015 index = &mkv_d->index[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3016 for (k = 0; k < index->num_entries; k++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3017 if (!index->entries[k].is_key)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3018 continue;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3019 diff = target_timecode - (int64_t)index->entries[k].timecode;
11260
1c269ab5f3f6 Support for -chapter selection.
mosu
parents: 11229
diff changeset
3020 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
3021 (diff >= 0) && (diff < min_diff)) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3022 min_diff = diff;
10874
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3023 entry = &index->entries[k];
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3024 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
3025 "%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
3026 "%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
3027 (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
3028 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
3029 target_timecode) : 0, k);
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3030
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3031 } 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
3032 (diff < 0) && (-diff < min_diff)) {
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3033 min_diff = -diff;
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3034 entry = &index->entries[k];
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3035 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
3036 "%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
3037 "%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
3038 (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
3039 k < index->num_entries ?
f75ec55301c4 Different decision making for seeking which takes the direction into account.
mosu
parents: 10861
diff changeset
3040 (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
3041 0, k);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3042 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3043 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3044 break;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3045 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3046
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3047 if (mkv_d->saved_l1 != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3048 delete mkv_d->saved_l1;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3049
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3050 if (mkv_d->saved_l2 != NULL) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3051 delete mkv_d->saved_l2;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3052 mkv_d->saved_l2 = NULL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3053 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3054
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3055 if (entry != NULL) { // We've found an entry.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3056 mkv_d->in->setFilePointer(entry->filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3057 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3058 mkv_d->saved_l1 =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3059 mkv_d->es->FindNextElement(mkv_d->segment->Generic().Context,
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3060 upper_lvl_el, 0xFFFFFFFFL, true, 1);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3061 } else { // We've not found an entry --> no index?
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3062 target_filepos = (int64_t)(target_timecode * mkv_d->last_filepos /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3063 (mkv_d->last_pts * 1000.0));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3064 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
3065 "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
3066 (int64_t)(mkv_d->last_pts * 1000.0));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3067 // Let's find the nearest cluster so that libebml does not have to
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3068 // do so much work.
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3069 cluster_pos = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3070 min_diff = 0x0FFFFFFFL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3071 for (i = 0; i < mkv_d->num_cluster_pos; i++) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3072 diff = mkv_d->cluster_positions[i] - target_filepos;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3073 if (rel_seek_secs < 0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3074 if ((diff > 0) && (diff < min_diff)) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3075 cluster_pos = mkv_d->cluster_positions[i];
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3076 min_diff = diff;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3077 }
10099
71d703e35ff3 Removed the abs function as someone reported compilation problems under MacOS.
mosu
parents: 10098
diff changeset
3078 } else if ((diff < 0 ? -1 * diff : diff) < min_diff) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3079 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
3080 min_diff = diff < 0 ? -1 * diff : diff;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3081 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3082 }
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
3083 if (min_diff != 0x0FFFFFFFL) {
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3084 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
3085 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
3086 "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
3087 }
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3088 if (target_filepos >= demuxer->movi_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3089 return;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3090 mkv_d->in->setFilePointer(target_filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3091 upper_lvl_el = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3092 mkv_d->saved_l1 =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3093 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
3094 upper_lvl_el, 0xFFFFFFFFL, true, 1);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3095 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek result: target_timecode %lld, "
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3096 "did not find an entry. Calculated target_filspos: %lld\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3097 target_timecode, target_filepos);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3098 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek found %p (%s).\n",
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3099 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
3100 mkv_d->saved_l1->Generic().DebugName);
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3101 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3102
10060
f4d6cf8c6c93 Fixed seeking in audio-only files. Added support for subtitle track selection via "-slang".
mosu
parents: 10036
diff changeset
3103 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
3104 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
3105 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
3106 mkv_d->skip_to_timecode = target_timecode;
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3107
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
3108 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
3109
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3110 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
3111 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
3112 (int64_t)(mkv_d->last_pts * 1000.0));
10024
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3113
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3114 mkv_d->subs.lines = 0;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3115 vo_sub = &mkv_d->subs;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3116 vo_osd_changed(OSDTYPE_SUBTITLE);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3117
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3118 if(demuxer->audio->sh != NULL)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3119 resync_audio_stream((sh_audio_t *)demuxer->audio->sh);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3120
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3121 } else
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3122 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3123
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3124 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3125
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3126 extern "C" void demux_close_mkv(demuxer_t *demuxer) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3127 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3128
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3129 free_mkv_demuxer(mkv_d);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3130
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3131 #ifdef USE_ICONV
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3132 subcp_close();
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3133 #endif
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3134 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3135
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3136 extern "C" int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3137 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3138
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3139 switch (cmd) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3140 case DEMUXER_CTRL_GET_TIME_LENGTH:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3141 if (mkv_d->duration == -1.0)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3142 return DEMUXER_CTRL_DONTKNOW;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3143
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3144 *((unsigned long *)arg) = (unsigned long)mkv_d->duration;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3145 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3146
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3147 case DEMUXER_CTRL_GET_PERCENT_POS:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3148 if (mkv_d->duration == -1.0) {
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3149 if (demuxer->movi_start == demuxer->movi_end)
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3150 return DEMUXER_CTRL_DONTKNOW;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3151
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3152 *((int *)arg) =
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3153 (int)((demuxer->filepos - demuxer->movi_start) /
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3154 ((demuxer->movi_end - demuxer->movi_start) / 100));
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3155 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3156 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3157
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3158 *((int *)arg) = (int)(100 * mkv_d->last_pts / mkv_d->duration);
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3159 return DEMUXER_CTRL_OK;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3160
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3161 default:
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3162 return DEMUXER_CTRL_NOTIMPL;
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3163 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3164 }
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3165
c6fab860ab18 Added Matroska demuxing support.
mosu
parents:
diff changeset
3166 #endif /* HAVE_MATROSKA */