fix filename self-references
[vlc.git] / modules / demux / mkv / matroska_segment_parse.cpp
index 2da64be..1a5ec21 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * mkv.cpp : matroska demuxer
+ * matroska_segment_parse.cpp : matroska demuxer
  *****************************************************************************
  * Copyright (C) 2003-2010 the VideoLAN team
  * $Id$
@@ -28,6 +28,8 @@
 
 #include "demux.hpp"
 
+#include "Ebml_parser.hpp"
+
 /*****************************************************************************
  * Some functions to manipulate memory
  *****************************************************************************/
@@ -57,7 +59,7 @@ void matroska_segment_c::ParseSeekHead( KaxSeekHead *seekhead )
     {
         if( MKV_IS_ID( l, KaxSeek ) )
         {
-            EbmlId id = EbmlVoid::ClassInfos.GlobalId;
+            EbmlId id = EBML_ID(EbmlVoid);
             int64_t i_pos = -1;
 
 #ifdef MKV_DEBUG
@@ -88,40 +90,40 @@ void matroska_segment_c::ParseSeekHead( KaxSeekHead *seekhead )
 
             if( i_pos >= 0 )
             {
-                if( id == KaxCues::ClassInfos.GlobalId )
+                if( id == EBML_ID(KaxCues) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - cues at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxCues::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxCues), i_pos );
                 }
-                else if( id == KaxInfo::ClassInfos.GlobalId )
+                else if( id == EBML_ID(KaxInfo) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - info at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxInfo::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxInfo), i_pos );
                 }
-                else if( id == KaxChapters::ClassInfos.GlobalId )
+                else if( id == EBML_ID(KaxChapters) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - chapters at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxChapters::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxChapters), i_pos );
                 }
-                else if( id == KaxTags::ClassInfos.GlobalId )
+                else if( id == EBML_ID(KaxTags) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - tags at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxTags::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxTags), i_pos );
                 }
-                else if( id == KaxSeekHead::ClassInfos.GlobalId )
+                else if( id == EBML_ID(KaxSeekHead) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - chained seekhead at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxSeekHead::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxSeekHead), i_pos );
                 }
-                else if( id == KaxTracks::ClassInfos.GlobalId )
+                else if( id == EBML_ID(KaxTracks) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - tracks at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxTracks::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxTracks), i_pos );
                 }
-                else if( id == KaxAttachments::ClassInfos.GlobalId )
+                else if( id == EBML_ID(KaxAttachments) )
                 {
                     msg_Dbg( &sys.demuxer, "|   - attachments at %"PRId64, i_pos );
-                    LoadSeekHeadItem( KaxAttachments::ClassInfos, i_pos );
+                    LoadSeekHeadItem( EBML_INFO(KaxAttachments), i_pos );
                 }
 #ifdef MKV_DEBUG
                 else
@@ -439,21 +441,21 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m )
                 }
             }
         }
-//        else if( EbmlId( *l ) == KaxCodecSettings::ClassInfos.GlobalId ) DEPRECATED by matroska
+//        else if( MKV_IS_ID( l, KaxCodecSettings) ) DEPRECATED by matroska
 //        {
 //            KaxCodecSettings &cset = *(KaxCodecSettings*)l;
 
 //            tk->psz_codec_settings = ToUTF8( UTFstring( cset ) );
 //            msg_Dbg( &sys.demuxer, "|   |   |   + Track Codec Settings=%s", tk->psz_codec_settings );
 //        }
-//        else if( EbmlId( *l ) == KaxCodecInfoURL::ClassInfos.GlobalId ) DEPRECATED by matroska
+//        else if( MKV_IS_ID( l, KaxCodecInfoURL) ) DEPRECATED by matroska
 //        {
 //            KaxCodecInfoURL &ciurl = *(KaxCodecInfoURL*)l;
 
 //            tk->psz_codec_info_url = strdup( string( ciurl ).c_str() );
 //            msg_Dbg( &sys.demuxer, "|   |   |   + Track Codec Info URL=%s", tk->psz_codec_info_url );
 //        }
-//        else if( EbmlId( *l ) == KaxCodecDownloadURL::ClassInfos.GlobalId ) DEPRECATED by matroska
+//        else if( MKV_IS_ID( l, KaxCodecDownloadURL) ) DEPRECATED by matroska
 //        {
 //            KaxCodecDownloadURL &cdurl = *(KaxCodecDownloadURL*)l;
 
@@ -549,7 +551,7 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m )
 
                     i_display_unit = uint8( vdmode );
                     msg_Dbg( &sys.demuxer, "|   |   |   |   + Track Video Display Unit=%s",
-                             uint8( vdmode ) == 0 ? "pixels" : ( uint8( vdmode ) == 1 ? "centimeters": "inches" ) );
+                             i_display_unit == 0 ? "pixels" : ( i_display_unit == 1 ? "centimeters": "inches" ) );
                 }
                 else if( MKV_IS_ID( l, KaxVideoAspectRatio ) ) // UNUSED
                 {
@@ -565,7 +567,7 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m )
                     tk->f_fps = float( vfps );
                     msg_Dbg( &sys.demuxer, "   |   |   |   + fps=%f", float( vfps ) );
                 }
-//                else if( EbmlId( *l ) == KaxVideoGamma::ClassInfos.GlobalId ) //DEPRECATED by Matroska
+//                else if( MKV_IS_ID( l, KaxVideoGamma) ) //DEPRECATED by Matroska
 //                {
 //                    KaxVideoGamma &gamma = *(KaxVideoGamma*)l;
 
@@ -664,7 +666,7 @@ void matroska_segment_c::ParseTracks( KaxTracks *tracks )
     int i_upper_level = 0;
 
     /* Master elements */
-    tracks->Read( es, tracks->Generic().Context, i_upper_level, el, true );
+    tracks->Read( es, EBML_CONTEXT(tracks), i_upper_level, el, true );
 
     for( size_t i = 0; i < tracks->ListSize(); i++ )
     {
@@ -692,7 +694,7 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
 
     /* Master elements */
     m = static_cast<EbmlMaster *>(info);
-    m->Read( es, info->Generic().Context, i_upper_level, el, true );
+    m->Read( es, EBML_CONTEXT(info), i_upper_level, el, true );
 
     for( size_t i = 0; i < m->ListSize(); i++ )
     {
@@ -801,7 +803,7 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
             KaxChapterTranslate *p_trans = static_cast<KaxChapterTranslate*>( l );
             chapter_translation_c *p_translate = new chapter_translation_c();
 
-            p_trans->Read( es, p_trans->Generic().Context, i_upper_level, el, true );
+            p_trans->Read( es, EBML_CONTEXT(p_trans), i_upper_level, el, true );
             for( size_t j = 0; j < p_trans->ListSize(); j++ )
             {
                 EbmlElement *l = (*p_trans)[j];
@@ -855,6 +857,22 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap
 
             msg_Dbg( &sys.demuxer, "|   |   |   |   + ChapterFlagHidden: %s", chapters.b_display_seekpoint ? "no":"yes" );
         }
+        else if( MKV_IS_ID( l, KaxChapterSegmentUID ) )
+        {
+            chapters.p_segment_uid = new KaxChapterSegmentUID( *static_cast<KaxChapterSegmentUID*>(l) );
+            msg_Dbg( &sys.demuxer, "|   |   |   |   + ChapterSegmentUID= %u", *(uint32*)chapters.p_segment_uid->GetBuffer() );
+        }
+        else if( MKV_IS_ID( l, KaxChapterSegmentEditionUID ) )
+        {
+            chapters.p_segment_edition_uid = new KaxChapterSegmentEditionUID( *static_cast<KaxChapterSegmentEditionUID*>(l) );
+            msg_Dbg( &sys.demuxer, "|   |   |   |   + ChapterSegmentEditionUID= %u",
+#if LIBMATROSKA_VERSION < 0x010300
+            *(uint32*)chapters.p_segment_edition_uid->GetBuffer()
+#else
+            *(uint32*)chapters.p_segment_edition_uid
+#endif
+            );
+        }
         else if( MKV_IS_ID( l, KaxChapterTimeStart ) )
         {
             KaxChapterTimeStart &start =*(KaxChapterTimeStart*)l;
@@ -952,7 +970,7 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap
         {
             chapter_item_c *new_sub_chapter = new chapter_item_c();
             ParseChapterAtom( i_level+1, static_cast<KaxChapterAtom *>(l), *new_sub_chapter );
-            new_sub_chapter->psz_parent = &chapters;
+            new_sub_chapter->p_parent = &chapters;
             chapters.sub_chapters.push_back( new_sub_chapter );
         }
     }
@@ -966,34 +984,27 @@ void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
     EbmlElement *el;
     int i_upper_level = 0;
 
-    attachments->Read( es, attachments->Generic().Context, i_upper_level, el, true );
+    attachments->Read( es, EBML_CONTEXT(attachments), i_upper_level, el, true );
 
     KaxAttached *attachedFile = FindChild<KaxAttached>( *attachments );
 
     while( attachedFile && ( attachedFile->GetSize() > 0 ) )
     {
-        std::string psz_mime_type  = GetChild<KaxMimeType>( *attachedFile );
-        KaxFileName  &file_name    = GetChild<KaxFileName>( *attachedFile );
         KaxFileData  &img_data     = GetChild<KaxFileData>( *attachedFile );
+        attachment_c *new_attachment = new attachment_c( ToUTF8( UTFstring( GetChild<KaxFileName>( *attachedFile ) ) ),
+                                                        GetChild<KaxMimeType>( *attachedFile ),
+                                                        img_data.GetSize() );
 
-        attachment_c *new_attachment = new attachment_c();
+        msg_Dbg( &sys.demuxer, "|   |   - %s (%s)", new_attachment->fileName(), new_attachment->mimeType() );
 
-        if( new_attachment )
+        if( new_attachment->init() )
         {
-            new_attachment->psz_file_name  = ToUTF8( UTFstring( file_name ) );
-            new_attachment->psz_mime_type  = psz_mime_type;
-            new_attachment->i_size         = img_data.GetSize();
-            new_attachment->p_data         = malloc( img_data.GetSize() );
-
-            if( new_attachment->p_data )
-            {
-                memcpy( new_attachment->p_data, img_data.GetBuffer(), img_data.GetSize() );
-                sys.stored_attachments.push_back( new_attachment );
-            }
-            else
-            {
-                delete new_attachment;
-            }
+             memcpy( new_attachment->p_data, img_data.GetBuffer(), img_data.GetSize() );
+             sys.stored_attachments.push_back( new_attachment );
+        }
+        else
+        {
+            delete new_attachment;
         }
 
         attachedFile = &GetNextChild<KaxAttached>( *attachments, *attachedFile );
@@ -1007,10 +1018,9 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
 {
     EbmlElement *el;
     int i_upper_level = 0;
-    mtime_t i_dur;
 
     /* Master elements */
-    chapters->Read( es, chapters->Generic().Context, i_upper_level, el, true );
+    chapters->Read( es, EBML_CONTEXT(chapters), i_upper_level, el, true );
 
     for( size_t i = 0; i < chapters->ListSize(); i++ )
     {
@@ -1061,19 +1071,6 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
             msg_Dbg( &sys.demuxer, "|   |   + Unknown (%s)", typeid(*l).name() );
         }
     }
-
-    for( size_t i = 0; i < stored_editions.size(); i++ )
-    {
-        stored_editions[i]->RefreshChapters( );
-    }
-
-    if ( stored_editions.size() != 0 && stored_editions[i_default_edition]->b_ordered )
-    {
-        /* update the duration of the segment according to the sum of all sub chapters */
-        i_dur = stored_editions[i_default_edition]->Duration() / INT64_C(1000);
-        if (i_dur > 0)
-            i_duration = i_dur;
-    }
 }
 
 void matroska_segment_c::ParseCluster( )
@@ -1084,7 +1081,7 @@ void matroska_segment_c::ParseCluster( )
 
     /* Master elements */
     m = static_cast<EbmlMaster *>( cluster );
-    m->Read( es, cluster->Generic().Context, i_upper_level, el, true );
+    m->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true );
 
     for( unsigned int i = 0; i < m->ListSize(); i++ )
     {