mkv: remove typeid code in EBML dispatcher
[vlc.git] / modules / demux / mkv / mkv.hpp
1 /*****************************************************************************
2  * mkv.hpp : matroska demuxer
3  *****************************************************************************
4  * Copyright (C) 2003-2005, 2008 VLC authors and VideoLAN
5  *
6  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
7  *          Steve Lhomme <steve.lhomme@free.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #ifndef VLC_MKV_MKV_HPP_
25 #define VLC_MKV_MKV_HPP_
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30
31 #ifdef HAVE_CONFIG_H
32 # include "config.h"
33 #endif
34
35 #include <inttypes.h>
36
37 #include <vlc_common.h>
38 #include <vlc_plugin.h>
39
40 #include <time.h>
41
42 #include <vlc_meta.h>
43 #include <vlc_charset.h>
44 #include <vlc_input.h>
45 #include <vlc_demux.h>
46 #include <vlc_aout.h> /* For reordering */
47
48 #include <iostream>
49 #include <cassert>
50 #include <typeinfo>
51 #include <string>
52 #include <vector>
53 #include <algorithm>
54 #include <map>
55 #include <stdexcept>
56
57 /* libebml and matroska */
58 #include "ebml/EbmlHead.h"
59 #include "ebml/EbmlSubHead.h"
60 #include "ebml/EbmlStream.h"
61 #include "ebml/EbmlContexts.h"
62 #include "ebml/EbmlVoid.h"
63 #include "ebml/EbmlVersion.h"
64
65 #include "matroska/KaxAttachments.h"
66 #include "matroska/KaxAttached.h"
67 #include "matroska/KaxBlock.h"
68 #include "matroska/KaxBlockData.h"
69 #include "matroska/KaxChapters.h"
70 #include "matroska/KaxCluster.h"
71 #include "matroska/KaxClusterData.h"
72 #include "matroska/KaxContexts.h"
73 #include "matroska/KaxCues.h"
74 #include "matroska/KaxCuesData.h"
75 #include "matroska/KaxInfo.h"
76 #include "matroska/KaxInfoData.h"
77 #include "matroska/KaxSeekHead.h"
78 #include "matroska/KaxSegment.h"
79 #include "matroska/KaxTag.h"
80 #include "matroska/KaxTags.h"
81 #include "matroska/KaxTracks.h"
82 #include "matroska/KaxTrackAudio.h"
83 #include "matroska/KaxTrackVideo.h"
84 #include "matroska/KaxTrackEntryData.h"
85 #include "matroska/KaxContentEncoding.h"
86 #include "matroska/KaxVersion.h"
87
88 #include "stream_io_callback.hpp"
89
90 #ifdef HAVE_ZLIB_H
91 #   include <zlib.h>
92 #endif
93
94 #ifndef NDEBUG
95 //# define MKV_DEBUG 0
96 #endif
97
98 namespace mkv {
99
100 #define MATROSKA_COMPRESSION_NONE  -1
101 #define MATROSKA_COMPRESSION_ZLIB   0
102 #define MATROSKA_COMPRESSION_BLIB   1
103 #define MATROSKA_COMPRESSION_LZOX   2
104 #define MATROSKA_COMPRESSION_HEADER 3
105
106 enum
107 {
108     MATROSKA_ENCODING_SCOPE_ALL_FRAMES = 1,
109     MATROSKA_ENCODING_SCOPE_PRIVATE = 2,
110     MATROSKA_ENCODING_SCOPE_NEXT = 4 /* unsupported */
111 };
112
113 #define MKVD_TIMECODESCALE 1000000
114
115 #define MKV_IS_ID( el, C ) ( el != NULL && (el->operator const EbmlId&()) == (C::ClassInfos.ClassId()) )
116 #define MKV_CHECKED_PTR_DECL( name, type, src ) type * name = MKV_IS_ID(src, type) ? static_cast<type*>(src) : NULL
117 #define MKV_CHECKED_PTR_DECL_CONST( name, type, src ) const type * name = MKV_IS_ID(src, type) ? static_cast<const type*>(src) : NULL
118
119
120 using namespace LIBMATROSKA_NAMESPACE;
121
122 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
123                   vlc_tick_t i_pts, vlc_tick_t i_duration, bool b_key_picture,
124                   bool b_discardable_picture );
125
126 class attachment_c
127 {
128 public:
129     attachment_c( const std::string& _str_file_name, const std::string& _str_mime_type, int _i_size )
130         :i_size(_i_size)
131         ,str_file_name( _str_file_name)
132         ,str_mime_type( _str_mime_type)
133     {
134         p_data = NULL;
135     }
136     ~attachment_c() { free( p_data ); }
137
138     /* Allocs the data space. Returns true if allocation went ok */
139     bool init()
140     {
141         p_data = malloc( i_size );
142         return (p_data != NULL);
143     }
144
145     const char* fileName() const { return str_file_name.c_str(); }
146     const char* mimeType() const { return str_mime_type.c_str(); }
147     int         size() const    { return i_size; }
148
149     void          *p_data;
150 private:
151     int            i_size;
152     std::string    str_file_name;
153     std::string    str_mime_type;
154 };
155
156 class matroska_segment_c;
157 struct matroska_stream_c
158 {
159     matroska_stream_c(stream_t *s, bool owner);
160     ~matroska_stream_c() {}
161
162     bool isUsed() const;
163
164     vlc_stream_io_callback io_callback;
165     EbmlStream         estream;
166
167     std::vector<matroska_segment_c*> segments;
168 };
169
170
171 /*****************************************************************************
172  * definitions of structures and functions used by this plugins
173  *****************************************************************************/
174 class PrivateTrackData
175 {
176 public:
177     virtual ~PrivateTrackData() {}
178     virtual int32_t Init() { return 0; }
179 };
180
181 class mkv_track_t
182 {
183     public:
184         mkv_track_t(enum es_format_category_e es_cat);
185         ~mkv_track_t();
186
187         typedef unsigned int track_id_t;
188
189         bool         b_default;
190         bool         b_enabled;
191         bool         b_forced;
192         track_id_t   i_number;
193
194         unsigned int i_extra_data;
195         uint8_t      *p_extra_data;
196
197         std::string  codec;
198         bool         b_dts_only;
199         bool         b_pts_only;
200
201         bool         b_no_duration;
202         vlc_tick_t   i_default_duration;
203         float        f_timecodescale;
204         vlc_tick_t   i_last_dts;
205         uint64_t     i_skip_until_fpos; /*< any block before this fpos should be ignored */
206
207         /* video */
208         es_format_t fmt;
209         float       f_fps;
210         es_out_id_t *p_es;
211
212         /* audio */
213         unsigned int i_original_rate;
214         uint8_t i_chans_to_reorder;            /* do we need channel reordering */
215         uint8_t pi_chan_table[AOUT_CHAN_MAX];
216
217
218         /* Private track paramters */
219         PrivateTrackData *p_sys;
220
221         bool            b_discontinuity;
222
223         /* informative */
224         std::string str_codec_name;
225
226         /* encryption/compression */
227         int                    i_compression_type;
228         uint32_t               i_encoding_scope;
229         KaxContentCompSettings *p_compression_data;
230
231         /* Matroska 4 new elements used by Opus */
232         vlc_tick_t i_seek_preroll;
233         vlc_tick_t i_codec_delay;
234 };
235
236 } // namespace
237
238 #endif /* _MKV_HPP_ */