1 /*****************************************************************************
2 * matroska_segment.hpp : 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_
32 class chapter_edition_c;
33 class chapter_translation_c;
39 class matroska_segment_c
42 matroska_segment_c( demux_sys_t & demuxer, EbmlStream & estream );
43 virtual ~matroska_segment_c();
51 /* duration of the segment */
56 std::vector<mkv_track_t*> tracks;
60 int64_t i_seekhead_position;
61 int64_t i_cues_position;
62 int64_t i_tracks_position;
63 int64_t i_info_position;
64 int64_t i_chapters_position;
65 int64_t i_tags_position;
66 int64_t i_attachments_position;
72 KaxSegmentUID *p_segment_uid;
73 KaxPrevUID *p_prev_segment_uid;
74 KaxNextUID *p_next_segment_uid;
79 mkv_index_t *p_indexes;
82 char *psz_muxing_application;
83 char *psz_writing_application;
84 char *psz_segment_filename;
88 /* !!!!! GCC 3.3 bug on Darwin !!!!! */
89 /* when you remove this variable the compiler issues an atomicity error */
90 /* this variable only works when using std::vector<chapter_edition_c> */
91 std::vector<chapter_edition_c*> stored_editions;
92 int i_default_edition;
94 std::vector<chapter_translation_c*> translations;
95 std::vector<KaxSegmentFamily*> families;
100 bool b_ref_external_segments;
103 bool PreloadFamily( const matroska_segment_c & segment );
104 void InformationCreate();
105 void Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_global_position );
106 int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
108 int BlockFindTrackIndex( size_t *pi_track,
109 const KaxBlock *, const KaxSimpleBlock * );
111 bool Select( mtime_t i_start_time );
114 static bool CompareSegmentUIDs( const matroska_segment_c * item_a, const matroska_segment_c * item_b );
117 void LoadCues( KaxCues *cues );
118 void LoadTags( KaxTags *tags );
119 bool LoadSeekHeadItem( const EbmlCallbacks & ClassInfos, int64_t i_element_position );
120 void ParseInfo( KaxInfo *info );
121 void ParseAttachments( KaxAttachments *attachments );
122 void ParseChapters( KaxChapters *chapters );
123 void ParseSeekHead( KaxSeekHead *seekhead );
124 void ParseTracks( KaxTracks *tracks );
125 void ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters );
126 void ParseTrackEntry( KaxTrackEntry *m );
127 void ParseCluster( bool b_update_start_time = true );
128 void ParseSimpleTags( KaxTagSimple *tag, int level = 50 );
129 void IndexAppendCluster( KaxCluster *cluster );