1 /*****************************************************************************
2 * matroska_segment.hpp : matroska demuxer
3 *****************************************************************************
4 * Copyright (C) 2003-2004 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 *****************************************************************************/
25 #ifndef _MATROSKA_SEGMENT_HPP_
26 #define _MATROSKA_SEGMENT_HPP_
32 class chapter_edition_c;
33 class chapter_translation_c;
52 psz_tag_name(NULL), psz_lang(NULL), b_default(true), p_value(NULL){}
55 char *psz_lang; /* NULL value means "undf" */
58 std::vector<SimpleTag *> sub_tags;
64 Tag():i_tag_type(WHOLE_SEGMENT),i_target_type(50),i_uid(0){}
66 tag_target_type i_tag_type;
67 uint64_t i_target_type;
69 std::vector<SimpleTag*> simple_tags;
72 class matroska_segment_c
75 matroska_segment_c( demux_sys_t & demuxer, EbmlStream & estream );
76 virtual ~matroska_segment_c();
84 /* duration of the segment */
89 std::vector<mkv_track_t*> tracks;
93 int64_t i_seekhead_position;
94 int64_t i_cues_position;
95 int64_t i_tracks_position;
96 int64_t i_info_position;
97 int64_t i_chapters_position;
98 int64_t i_tags_position;
99 int64_t i_attachments_position;
103 uint64 i_cluster_pos;
105 KaxSegmentUID *p_segment_uid;
106 KaxPrevUID *p_prev_segment_uid;
107 KaxNextUID *p_next_segment_uid;
112 mkv_index_t *p_indexes;
115 char *psz_muxing_application;
116 char *psz_writing_application;
117 char *psz_segment_filename;
121 /* !!!!! GCC 3.3 bug on Darwin !!!!! */
122 /* when you remove this variable the compiler issues an atomicity error */
123 /* this variable only works when using std::vector<chapter_edition_c> */
124 std::vector<chapter_edition_c*> stored_editions;
125 std::vector<chapter_edition_c*>::size_type i_default_edition;
127 std::vector<chapter_translation_c*> translations;
128 std::vector<KaxSegmentFamily*> families;
129 std::vector<Tag *> tags;
134 bool b_ref_external_segments;
137 bool PreloadFamily( const matroska_segment_c & segment );
138 void InformationCreate();
139 void Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_global_position );
140 int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
142 int BlockFindTrackIndex( size_t *pi_track,
143 const KaxBlock *, const KaxSimpleBlock * );
145 bool Select( mtime_t i_start_time );
148 static bool CompareSegmentUIDs( const matroska_segment_c * item_a, const matroska_segment_c * item_b );
151 void LoadCues( KaxCues *cues );
152 void LoadTags( KaxTags *tags );
153 bool LoadSeekHeadItem( const EbmlCallbacks & ClassInfos, int64_t i_element_position );
154 void ParseInfo( KaxInfo *info );
155 void ParseAttachments( KaxAttachments *attachments );
156 void ParseChapters( KaxChapters *chapters );
157 void ParseSeekHead( KaxSeekHead *seekhead );
158 void ParseTracks( KaxTracks *tracks );
159 void ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters );
160 void ParseTrackEntry( KaxTrackEntry *m );
161 void ParseCluster( bool b_update_start_time = true );
162 SimpleTag * ParseSimpleTags( KaxTagSimple *tag, int level = 50 );
163 void IndexAppendCluster( KaxCluster *cluster );
164 int32_t TrackInit( mkv_track_t * p_tk );
165 void ComputeTrackPriority();