1 /*****************************************************************************
2 * mkv.cpp : matroska demuxer
3 *****************************************************************************
4 * Copyright (C) 2003-2004 the VideoLAN team
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
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.
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.
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 *****************************************************************************/
25 #ifndef _MATROSKA_SEGMENT_HPP_
26 #define _MATROSKA_SEGMENT_HPP_
31 #include "Ebml_parser.hpp"
33 class chapter_edition_c;
34 class chapter_translation_c;
37 class matroska_segment_c
40 matroska_segment_c( demux_sys_t & demuxer, EbmlStream & estream )
43 ,i_timescale(MKVD_TIMECODESCALE)
47 ,i_seekhead_position(-1)
49 ,i_tracks_position(-1)
51 ,i_chapters_position(-1)
53 ,i_attachments_position(-1)
59 ,p_prev_segment_uid(NULL)
60 ,p_next_segment_uid(NULL)
64 ,psz_muxing_application(NULL)
65 ,psz_writing_application(NULL)
66 ,psz_segment_filename(NULL)
74 p_indexes = (mkv_index_t*)malloc( sizeof( mkv_index_t ) * i_index_max );
77 virtual ~matroska_segment_c();
85 /* duration of the segment */
90 std::vector<mkv_track_t*> tracks;
94 int64_t i_seekhead_position;
95 int64_t i_cues_position;
96 int64_t i_tracks_position;
97 int64_t i_info_position;
98 int64_t i_chapters_position;
99 int64_t i_tags_position;
100 int64_t i_attachments_position;
104 uint64 i_cluster_pos;
106 KaxSegmentUID *p_segment_uid;
107 KaxPrevUID *p_prev_segment_uid;
108 KaxNextUID *p_next_segment_uid;
113 mkv_index_t *p_indexes;
116 char *psz_muxing_application;
117 char *psz_writing_application;
118 char *psz_segment_filename;
122 /* !!!!! GCC 3.3 bug on Darwin !!!!! */
123 /* when you remove this variable the compiler issues an atomicity error */
124 /* this variable only works when using std::vector<chapter_edition_c> */
125 std::vector<chapter_edition_c*> stored_editions;
126 int i_default_edition;
128 std::vector<chapter_translation_c*> translations;
129 std::vector<KaxSegmentFamily*> families;
136 bool LoadSeekHeadItem( const EbmlCallbacks & ClassInfos, int64_t i_element_position );
137 bool PreloadFamily( const matroska_segment_c & segment );
138 void ParseInfo( KaxInfo *info );
139 void ParseAttachments( KaxAttachments *attachments );
140 void ParseChapters( KaxChapters *chapters );
141 void ParseSeekHead( KaxSeekHead *seekhead );
142 void ParseTracks( KaxTracks *tracks );
143 void ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters );
144 void ParseTrackEntry( KaxTrackEntry *m );
145 void ParseCluster( );
146 void IndexAppendCluster( KaxCluster *cluster );
147 void LoadCues( KaxCues *cues );
148 void LoadTags( KaxTags *tags );
149 void ParseSimpleTags( KaxTagSimple *tag );
150 void InformationCreate( );
151 void Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_global_position );
152 int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
154 int BlockFindTrackIndex( size_t *pi_track,
155 const KaxBlock *, const KaxSimpleBlock * );
158 bool Select( mtime_t i_start_time );
161 static bool CompareSegmentUIDs( const matroska_segment_c * item_a, const matroska_segment_c * item_b );