]> git.sesse.net Git - vlc/blob - modules/demux/mkv/mkv.hpp
MKV: remove unnecessary include
[vlc] / modules / demux / mkv / mkv.hpp
1 /*****************************************************************************
2  * mkv.cpp : matroska demuxer
3  *****************************************************************************
4  * Copyright (C) 2003-2005, 2008 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Steve Lhomme <steve.lhomme@free.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #ifndef _MKV_H_
26 #define _MKV_H_
27
28 /*****************************************************************************
29  * Preamble
30  *****************************************************************************/
31
32
33 /* config.h may include inttypes.h, so make sure we define that option
34  * early enough. */
35 #define __STDC_FORMAT_MACROS 1
36 #define __STDC_CONSTANT_MACROS 1
37 #define __STDC_LIMIT_MACROS 1
38
39 #ifdef HAVE_CONFIG_H
40 # include "config.h"
41 #endif
42
43 #include <inttypes.h>
44
45 #include <vlc_common.h>
46 #include <vlc_plugin.h>
47
48 #ifdef HAVE_TIME_H
49 #   include <time.h>                                               /* time() */
50 #endif
51
52 #include <vlc_meta.h>
53 #include <vlc_charset.h>
54 #include <vlc_input.h>
55 #include <vlc_demux.h>
56
57 #include <iostream>
58 #include <cassert>
59 #include <typeinfo>
60 #include <string>
61 #include <vector>
62 #include <algorithm>
63
64 /* libebml and matroska */
65 #include "ebml/EbmlHead.h"
66 #include "ebml/EbmlSubHead.h"
67 #include "ebml/EbmlStream.h"
68 #include "ebml/EbmlContexts.h"
69 #include "ebml/EbmlVoid.h"
70 #include "ebml/EbmlVersion.h"
71 #include "ebml/StdIOCallback.h"
72
73 #include "matroska/KaxAttachments.h"
74 #include "matroska/KaxAttached.h"
75 #include "matroska/KaxBlock.h"
76 #include "matroska/KaxBlockData.h"
77 #include "matroska/KaxChapters.h"
78 #include "matroska/KaxCluster.h"
79 #include "matroska/KaxClusterData.h"
80 #include "matroska/KaxContexts.h"
81 #include "matroska/KaxCues.h"
82 #include "matroska/KaxCuesData.h"
83 #include "matroska/KaxInfo.h"
84 #include "matroska/KaxInfoData.h"
85 #include "matroska/KaxSeekHead.h"
86 #include "matroska/KaxSegment.h"
87 #include "matroska/KaxTag.h"
88 #include "matroska/KaxTags.h"
89 #include "matroska/KaxTagMulti.h"
90 #include "matroska/KaxTracks.h"
91 #include "matroska/KaxTrackAudio.h"
92 #include "matroska/KaxTrackVideo.h"
93 #include "matroska/KaxTrackEntryData.h"
94 #include "matroska/KaxContentEncoding.h"
95 #include "matroska/KaxVersion.h"
96
97 #include "ebml/StdIOCallback.h"
98
99 #include <vlc_keys.h>
100
101 extern "C" {
102    #include "../mp4/libmp4.h"
103 }
104 #ifdef HAVE_ZLIB_H
105 #   include <zlib.h>
106 #endif
107
108 #define MKV_DEBUG 0
109
110 #define MATROSKA_COMPRESSION_NONE  -1
111 #define MATROSKA_COMPRESSION_ZLIB   0
112 #define MATROSKA_COMPRESSION_BLIB   1
113 #define MATROSKA_COMPRESSION_LZOX   2
114 #define MATROSKA_COMPRESSION_HEADER 3
115
116 #define MKVD_TIMECODESCALE 1000000
117
118 #define MKV_IS_ID( el, C ) ( EbmlId( (*el) ) == C::ClassInfos.GlobalId )
119
120
121 using namespace LIBMATROSKA_NAMESPACE;
122 using namespace std;
123
124 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
125                          mtime_t i_pts, mtime_t i_duration, bool f_mandatory );
126
127 class attachment_c
128 {
129 public:
130     attachment_c()
131         :p_data(NULL)
132         ,i_size(0)
133     {}
134     virtual ~attachment_c()
135     {
136         free( p_data );
137     }
138
139     std::string    psz_file_name;
140     std::string    psz_mime_type;
141     void          *p_data;
142     int            i_size;
143 };
144
145 class matroska_segment_c;
146
147 class matroska_stream_c
148 {
149 public:
150     matroska_stream_c( demux_sys_t & demuxer )
151         :p_in(NULL)
152         ,p_es(NULL)
153         ,sys(demuxer)
154     {}
155
156     virtual ~matroska_stream_c()
157     {
158         delete p_in;
159         delete p_es;
160     }
161
162     IOCallback         *p_in;
163     EbmlStream         *p_es;
164
165     std::vector<matroska_segment_c*> segments;
166
167     demux_sys_t                      & sys;
168 };
169
170
171 /*****************************************************************************
172  * definitions of structures and functions used by this plugins
173  *****************************************************************************/
174 typedef struct
175 {
176 //    ~mkv_track_t();
177
178     bool         b_default;
179     bool         b_enabled;
180     unsigned int i_number;
181
182     int          i_extra_data;
183     uint8_t      *p_extra_data;
184
185     char         *psz_codec;
186     bool         b_dts_only;
187     bool         b_pts_only;
188
189     uint64_t     i_default_duration;
190     float        f_timecodescale;
191     mtime_t      i_last_dts;
192
193     /* video */
194     es_format_t fmt;
195     float       f_fps;
196     es_out_id_t *p_es;
197
198     /* audio */
199     unsigned int i_original_rate;
200
201     bool            b_inited;
202     /* data to be send first */
203     int             i_data_init;
204     uint8_t         *p_data_init;
205
206     /* hack : it's for seek */
207     bool            b_search_keyframe;
208     bool            b_silent;
209
210     /* informative */
211     const char   *psz_codec_name;
212     const char   *psz_codec_settings;
213     const char   *psz_codec_info_url;
214     const char   *psz_codec_download_url;
215
216     /* encryption/compression */
217     int                    i_compression_type;
218     KaxContentCompSettings *p_compression_data;
219
220 } mkv_track_t;
221
222 typedef struct
223 {
224     int     i_track;
225     int     i_block_number;
226
227     int64_t i_position;
228     int64_t i_time;
229
230     bool       b_key;
231 } mkv_index_t;
232
233
234 #endif /* _MKV_HPP_ */