1 /*****************************************************************************
2 * mkv.hpp : matroska demuxer
3 *****************************************************************************
4 * Copyright (C) 2003-2005, 2008 VLC authors and VideoLAN
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Steve Lhomme <steve.lhomme@free.fr>
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation; either version 2.1 of the License, or
13 * (at your option) any later version.
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 Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this program; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
28 /*****************************************************************************
30 *****************************************************************************/
33 /* config.h may include inttypes.h, so make sure we define that option
35 #define __STDC_FORMAT_MACROS 1
36 #define __STDC_CONSTANT_MACROS 1
37 #define __STDC_LIMIT_MACROS 1
45 #include <vlc_common.h>
46 #include <vlc_plugin.h>
51 #include <vlc_charset.h>
52 #include <vlc_input.h>
53 #include <vlc_demux.h>
54 #include <vlc_aout.h> /* For reordering */
63 /* libebml and matroska */
64 #include "ebml/EbmlHead.h"
65 #include "ebml/EbmlSubHead.h"
66 #include "ebml/EbmlStream.h"
67 #include "ebml/EbmlContexts.h"
68 #include "ebml/EbmlVoid.h"
69 #include "ebml/EbmlVersion.h"
70 #include "ebml/StdIOCallback.h"
72 #include "matroska/KaxAttachments.h"
73 #include "matroska/KaxAttached.h"
74 #include "matroska/KaxBlock.h"
75 #include "matroska/KaxBlockData.h"
76 #include "matroska/KaxChapters.h"
77 #include "matroska/KaxCluster.h"
78 #include "matroska/KaxClusterData.h"
79 #include "matroska/KaxContexts.h"
80 #include "matroska/KaxCues.h"
81 #include "matroska/KaxCuesData.h"
82 #include "matroska/KaxInfo.h"
83 #include "matroska/KaxInfoData.h"
84 #include "matroska/KaxSeekHead.h"
85 #include "matroska/KaxSegment.h"
86 #include "matroska/KaxTag.h"
87 #include "matroska/KaxTags.h"
88 //#include "matroska/KaxTagMulti.h"
89 #include "matroska/KaxTracks.h"
90 #include "matroska/KaxTrackAudio.h"
91 #include "matroska/KaxTrackVideo.h"
92 #include "matroska/KaxTrackEntryData.h"
93 #include "matroska/KaxContentEncoding.h"
94 #include "matroska/KaxVersion.h"
96 #include "ebml/StdIOCallback.h"
104 #define MATROSKA_COMPRESSION_NONE -1
105 #define MATROSKA_COMPRESSION_ZLIB 0
106 #define MATROSKA_COMPRESSION_BLIB 1
107 #define MATROSKA_COMPRESSION_LZOX 2
108 #define MATROSKA_COMPRESSION_HEADER 3
112 MATROSKA_ENCODING_SCOPE_ALL_FRAMES = 1,
113 MATROSKA_ENCODING_SCOPE_PRIVATE = 2,
114 MATROSKA_ENCODING_SCOPE_NEXT = 4 /* unsupported */
117 #define MKVD_TIMECODESCALE 1000000
119 #define MKV_IS_ID( el, C ) ( el != NULL && typeid( *el ) == typeid( C ) )
122 using namespace LIBMATROSKA_NAMESPACE;
125 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
126 mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
127 bool b_discardable_picture );
132 attachment_c( const std::string& _psz_file_name, const std::string& _psz_mime_type, int _i_size )
134 ,psz_file_name( _psz_file_name)
135 ,psz_mime_type( _psz_mime_type)
139 ~attachment_c() { free( p_data ); }
141 /* Allocs the data space. Returns true if allocation went ok */
144 p_data = malloc( i_size );
145 return (p_data != NULL);
148 const char* fileName() const { return psz_file_name.c_str(); }
149 const char* mimeType() const { return psz_mime_type.c_str(); }
150 int size() const { return i_size; }
155 std::string psz_file_name;
156 std::string psz_mime_type;
159 class matroska_segment_c;
160 struct matroska_stream_c
162 matroska_stream_c() :p_io_callback(NULL) ,p_estream(NULL) {}
165 delete p_io_callback;
169 IOCallback *p_io_callback;
170 EbmlStream *p_estream;
172 std::vector<matroska_segment_c*> segments;
176 /*****************************************************************************
177 * definitions of structures and functions used by this plugins
178 *****************************************************************************/
179 class PrivateTrackData
182 virtual ~PrivateTrackData() {}
183 virtual int32_t Init() { return 0; }
191 unsigned int i_number;
193 unsigned int i_extra_data;
194 uint8_t *p_extra_data;
201 uint64_t i_default_duration;
202 float f_timecodescale;
211 unsigned int i_original_rate;
212 uint8_t i_chans_to_reorder; /* do we need channel reordering */
213 uint8_t pi_chan_table[AOUT_CHAN_MAX];
216 /* Private track paramters */
217 PrivateTrackData *p_sys;
220 /* data to be send first */
222 uint8_t *p_data_init;
224 /* hack : it's for seek */
225 bool b_search_keyframe;
229 const char *psz_codec_name;
230 const char *psz_codec_settings;
231 const char *psz_codec_info_url;
232 const char *psz_codec_download_url;
234 /* encryption/compression */
235 int i_compression_type;
236 uint32_t i_encoding_scope;
237 KaxContentCompSettings *p_compression_data;
239 /* Matroska 4 new elements used by Opus */
240 mtime_t i_seek_preroll;
241 mtime_t i_codec_delay;
257 #endif /* _MKV_HPP_ */