]> git.sesse.net Git - vlc/blobdiff - modules/demux/mkv/matroska_segment.hpp
demux: mkv: fix previous type fix
[vlc] / modules / demux / mkv / matroska_segment.hpp
index 3ac9b601a6204c4fb20935e1b62a6b438edcca09..9245c587231d666b5c15bbfef604a2af20e0cf84 100644 (file)
@@ -1,25 +1,25 @@
 /*****************************************************************************
- * mkv.cpp : matroska demuxer
+ * matroska_segment.hpp : matroska demuxer
  *****************************************************************************
- * Copyright (C) 2003-2004 the VideoLAN team
+ * Copyright (C) 2003-2004 VLC authors and VideoLAN
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *          Steve Lhomme <steve.lhomme@free.fr>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 #ifndef _MATROSKA_SEGMENT_HPP_
 
 #include "mkv.hpp"
 
-
-#include "Ebml_parser.hpp"
+class EbmlParser;
 
 class chapter_edition_c;
 class chapter_translation_c;
 class chapter_item_c;
 
-class matroska_segment_c
+struct mkv_track_t;
+struct mkv_index_t;
+
+typedef enum
+{
+    WHOLE_SEGMENT,
+    TRACK_UID,
+    EDITION_UID,
+    CHAPTER_UID,
+    ATTACHMENT_UID
+} tag_target_type;
+
+class SimpleTag
+{
+public:
+    SimpleTag():
+        psz_tag_name(NULL), psz_lang(NULL), b_default(true), p_value(NULL){}
+    ~SimpleTag();
+    char *psz_tag_name;
+    char *psz_lang; /* NULL value means "undf" */
+    bool b_default;
+    char * p_value;
+    std::vector<SimpleTag *> sub_tags;
+};
+
+class Tag
 {
 public:
-    matroska_segment_c( demux_sys_t & demuxer, EbmlStream & estream )
-        :segment(NULL)
-        ,es(estream)
-        ,i_timescale(MKVD_TIMECODESCALE)
-        ,i_duration(-1)
-        ,i_start_time(0)
-        ,i_seekhead_count(0)
-        ,i_seekhead_position(-1)
-        ,i_cues_position(-1)
-        ,i_tracks_position(-1)
-        ,i_info_position(-1)
-        ,i_chapters_position(-1)
-        ,i_tags_position(-1)
-        ,i_attachments_position(-1)
-        ,cluster(NULL)
-        ,i_block_pos(0)
-        ,i_cluster_pos(0)
-        ,i_start_pos(0)
-        ,p_segment_uid(NULL)
-        ,p_prev_segment_uid(NULL)
-        ,p_next_segment_uid(NULL)
-        ,b_cues(false)
-        ,i_index(0)
-        ,i_index_max(1024)
-        ,psz_muxing_application(NULL)
-        ,psz_writing_application(NULL)
-        ,psz_segment_filename(NULL)
-        ,psz_title(NULL)
-        ,psz_date_utc(NULL)
-        ,i_default_edition(0)
-        ,sys(demuxer)
-        ,ep(NULL)
-        ,b_preloaded(false)
-    {
-        p_indexes = (mkv_index_t*)malloc( sizeof( mkv_index_t ) * i_index_max );
-    }
+    Tag():i_tag_type(WHOLE_SEGMENT),i_target_type(50),i_uid(0){}
+    ~Tag();
+    tag_target_type i_tag_type;
+    uint64_t        i_target_type;
+    uint64_t        i_uid;
+    std::vector<SimpleTag*> simple_tags;
+};
 
+class matroska_segment_c
+{
+public:
+    matroska_segment_c( demux_sys_t & demuxer, EbmlStream & estream );
     virtual ~matroska_segment_c();
 
     KaxSegment              *segment;
@@ -123,41 +122,47 @@ public:
     /* when you remove this variable the compiler issues an atomicity error */
     /* this variable only works when using std::vector<chapter_edition_c> */
     std::vector<chapter_edition_c*> stored_editions;
-    int                             i_default_edition;
+    std::vector<chapter_edition_c*>::size_type i_default_edition;
 
     std::vector<chapter_translation_c*> translations;
     std::vector<KaxSegmentFamily*>  families;
+    std::vector<Tag *>              tags;
+
     demux_sys_t                    & sys;
     EbmlParser                     *ep;
     bool                           b_preloaded;
+    bool                           b_ref_external_segments;
 
-    bool Preload( );
-    bool LoadSeekHeadItem( const EbmlCallbacks & ClassInfos, int64_t i_element_position );
+    bool Preload();
     bool PreloadFamily( const matroska_segment_c & segment );
-    void ParseInfo( KaxInfo *info );
-    void ParseAttachments( KaxAttachments *attachments );
-    void ParseChapters( KaxChapters *chapters );
-    void ParseSeekHead( KaxSeekHead *seekhead );
-    void ParseTracks( KaxTracks *tracks );
-    void ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters );
-    void ParseTrackEntry( KaxTrackEntry *m );
-    void ParseCluster( );
-    void IndexAppendCluster( KaxCluster *cluster );
-    void LoadCues( KaxCues *cues );
-    void LoadTags( KaxTags *tags );
-    void InformationCreate( );
+    void InformationCreate();
     void Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_global_position );
     int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
 
     int BlockFindTrackIndex( size_t *pi_track,
                              const KaxBlock *, const KaxSimpleBlock * );
 
-
     bool Select( mtime_t i_start_time );
-    void UnSelect( );
+    void UnSelect();
 
     static bool CompareSegmentUIDs( const matroska_segment_c * item_a, const matroska_segment_c * item_b );
+
+private:
+    void LoadCues( KaxCues *cues );
+    void LoadTags( KaxTags *tags );
+    bool LoadSeekHeadItem( const EbmlCallbacks & ClassInfos, int64_t i_element_position );
+    void ParseInfo( KaxInfo *info );
+    void ParseAttachments( KaxAttachments *attachments );
+    void ParseChapters( KaxChapters *chapters );
+    void ParseSeekHead( KaxSeekHead *seekhead );
+    void ParseTracks( KaxTracks *tracks );
+    void ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters );
+    void ParseTrackEntry( KaxTrackEntry *m );
+    void ParseCluster( bool b_update_start_time = true );
+    SimpleTag * ParseSimpleTags( KaxTagSimple *tag, int level = 50 );
+    void IndexAppendCluster( KaxCluster *cluster );
+    int32_t TrackInit( mkv_track_t * p_tk );
+    void ComputeTrackPriority();
 };