[vlc-commits] MKV: privatize methods in virtual_segment_t

Jean-Baptiste Kempf git at videolan.org
Sun May 22 02:21:10 CEST 2011


vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Sun May 22 02:18:03 2011 +0200| [c42f411638b51c95276c627b7917a866856324fc] | committer: Jean-Baptiste Kempf

MKV: privatize methods in virtual_segment_t

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c42f411638b51c95276c627b7917a866856324fc
---

 modules/demux/mkv/demux.cpp           |   26 +++--------------
 modules/demux/mkv/virtual_segment.cpp |   49 ++++++++++++++++++++++-----------
 modules/demux/mkv/virtual_segment.hpp |   34 +++++++++++++---------
 3 files changed, 58 insertions(+), 51 deletions(-)

diff --git a/modules/demux/mkv/demux.cpp b/modules/demux/mkv/demux.cpp
index 13ae5e0..2afeceb 100644
--- a/modules/demux/mkv/demux.cpp
+++ b/modules/demux/mkv/demux.cpp
@@ -660,23 +660,23 @@ void demux_sys_t::PreloadLinked( matroska_segment_c *p_segment )
     for ( i=0; i< used_segments.size(); i++ )
     {
         p_seg = used_segments[i];
-        if ( p_seg->p_editions != NULL )
+        if ( p_seg->Editions() != NULL )
         {
             input_title_t *p_title = vlc_input_title_New();
             p_seg->i_sys_title = i;
             int i_chapters;
 
             // TODO use a name for each edition, let the TITLE deal with a codec name
-            for ( j=0; j<p_seg->p_editions->size(); j++ )
+            for ( j=0; j<p_seg->Editions()->size(); j++ )
             {
                 if ( p_title->psz_name == NULL )
                 {
-                    const char* psz_tmp = (*p_seg->p_editions)[j]->GetMainName().c_str();
+                    const char* psz_tmp = (*p_seg->Editions())[j]->GetMainName().c_str();
                     if( *psz_tmp != '\0' )
                         p_title->psz_name = strdup( psz_tmp );
                 }
 
-                chapter_edition_c *p_edition = (*p_seg->p_editions)[j];
+                chapter_edition_c *p_edition = (*p_seg->Editions())[j];
 
                 i_chapters = 0;
                 p_edition->PublishChapters( *p_title, i_chapters, 0 );
@@ -708,24 +708,8 @@ bool demux_sys_t::IsUsedSegment( matroska_segment_c &segment ) const
 
 virtual_segment_c *demux_sys_t::VirtualFromSegments( matroska_segment_c *p_segment ) const
 {
-    size_t i_preloaded, i;
-
     virtual_segment_c *p_result = new virtual_segment_c( p_segment );
-
-    // fill our current virtual segment with all hard linked segments
-    do {
-        i_preloaded = 0;
-        for ( i=0; i< opened_segments.size(); i++ )
-        {
-            i_preloaded += p_result->AddSegment( opened_segments[i] );
-        }
-    } while ( i_preloaded ); // worst case: will stop when all segments are found as linked
-
-    p_result->Sort( );
-
-    p_result->PreloadLinked( );
-
-    p_result->PrepareChapters( );
+    p_result->AddSegments( opened_segments );
 
     return p_result;
 }
diff --git a/modules/demux/mkv/virtual_segment.cpp b/modules/demux/mkv/virtual_segment.cpp
index a0bf289..c3bfc7b 100644
--- a/modules/demux/mkv/virtual_segment.cpp
+++ b/modules/demux/mkv/virtual_segment.cpp
@@ -54,50 +54,50 @@ void virtual_segment_c::PrepareChapters( )
 bool virtual_segment_c::UpdateCurrentToChapter( demux_t & demux )
 {
     demux_sys_t & sys = *demux.p_sys;
-    chapter_item_c *psz_curr_chapter;
+    chapter_item_c *p_curr_chapter;
     bool b_has_seeked = false;
 
     /* update current chapter/seekpoint */
     if ( p_editions->size() )
     {
         /* 1st, we need to know in which chapter we are */
-        psz_curr_chapter = (*p_editions)[i_current_edition]->FindTimecode( sys.i_pts, psz_current_chapter );
+        p_curr_chapter = (*p_editions)[i_current_edition]->FindTimecode( sys.i_pts, p_current_chapter );
 
         /* we have moved to a new chapter */
-        if (psz_curr_chapter != NULL && psz_current_chapter != psz_curr_chapter)
+        if (p_curr_chapter != NULL && p_current_chapter != p_curr_chapter)
         {
             if ( (*p_editions)[i_current_edition]->b_ordered )
             {
                 // Leave/Enter up to the link point
-                b_has_seeked = psz_curr_chapter->EnterAndLeave( psz_current_chapter );
+                b_has_seeked = p_curr_chapter->EnterAndLeave( p_current_chapter );
                 if ( !b_has_seeked )
                 {
                     // only physically seek if necessary
-                    if ( psz_current_chapter == NULL || (psz_current_chapter->i_end_time != psz_curr_chapter->i_start_time) )
-                        Seek( demux, sys.i_pts, 0, psz_curr_chapter, -1 );
+                    if ( p_current_chapter == NULL || (p_current_chapter->i_end_time != p_curr_chapter->i_start_time) )
+                        Seek( demux, sys.i_pts, 0, p_curr_chapter, -1 );
                 }
             }
- 
+
             if ( !b_has_seeked )
             {
-                psz_current_chapter = psz_curr_chapter;
-                if ( psz_curr_chapter->i_seekpoint_num > 0 )
+                p_current_chapter = p_curr_chapter;
+                if ( p_curr_chapter->i_seekpoint_num > 0 )
                 {
                     demux.info.i_update |= INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT;
                     demux.info.i_title = sys.i_current_title = i_sys_title;
-                    demux.info.i_seekpoint = psz_curr_chapter->i_seekpoint_num - 1;
+                    demux.info.i_seekpoint = p_curr_chapter->i_seekpoint_num - 1;
                 }
             }
 
             return true;
         }
-        else if (psz_curr_chapter == NULL)
+        else if (p_curr_chapter == NULL)
         {
             // out of the scope of the data described by chapters, leave the edition
-            if ( (*p_editions)[i_current_edition]->b_ordered && psz_current_chapter != NULL )
+            if ( (*p_editions)[i_current_edition]->b_ordered && p_current_chapter != NULL )
             {
-                if ( !(*p_editions)[i_current_edition]->EnterAndLeave( psz_current_chapter, false ) )
-                    psz_current_chapter = NULL;
+                if ( !(*p_editions)[i_current_edition]->EnterAndLeave( p_current_chapter, false ) )
+                    p_current_chapter = NULL;
                 else
                     return true;
             }
@@ -214,13 +214,13 @@ void virtual_segment_c::Seek( demux_t & demuxer, mtime_t i_date, mtime_t i_time_
         if ( Edition() && Edition()->b_ordered )
         {
             /* 1st, we need to know in which chapter we are */
-            psz_chapter = (*p_editions)[i_current_edition]->FindTimecode( i_date, psz_current_chapter );
+            psz_chapter = (*p_editions)[i_current_edition]->FindTimecode( i_date, p_current_chapter );
         }
     }
 
     if ( psz_chapter != NULL )
     {
-        psz_current_chapter = psz_chapter;
+        p_current_chapter = psz_chapter;
         p_sys->i_chapter_time = i_time_offset = psz_chapter->i_user_start_time - psz_chapter->i_start_time;
         if ( psz_chapter->i_seekpoint_num > 0 )
         {
@@ -262,3 +262,20 @@ chapter_item_c *virtual_segment_c::FindChapter( int64_t i_find_uid )
     }
     return NULL;
 }
+
+void virtual_segment_c::AddSegments(std::vector<matroska_segment_c *> segments)
+{
+    // fill our current virtual segment with all hard linked segments
+    size_t i_preloaded;
+    do {
+        i_preloaded = 0;
+        for ( size_t i=0; i < segments.size(); i++ )
+        {
+            i_preloaded += AddSegment( segments[i] );
+        }
+    } while ( i_preloaded ); // worst case: will stop when all segments are found as linked
+
+    Sort();
+    PreloadLinked( );
+    PrepareChapters( );
+}
diff --git a/modules/demux/mkv/virtual_segment.hpp b/modules/demux/mkv/virtual_segment.hpp
index bafbb58..0c1775e 100644
--- a/modules/demux/mkv/virtual_segment.hpp
+++ b/modules/demux/mkv/virtual_segment.hpp
@@ -36,11 +36,11 @@ class virtual_segment_c
 {
 public:
     virtual_segment_c( matroska_segment_c *p_segment )
-        :p_editions(NULL)
-        ,i_sys_title(0)
+        :i_sys_title(0)
         ,i_current_segment(0)
         ,i_current_edition(-1)
-        ,psz_current_chapter(NULL)
+        ,p_current_chapter(NULL)
+        ,p_editions(NULL)
     {
         linked_segments.push_back( p_segment );
 
@@ -49,18 +49,19 @@ public:
         AppendUID( p_segment->p_next_segment_uid );
     }
 
-    void Sort();
-    size_t AddSegment( matroska_segment_c *p_segment );
-    void PreloadLinked( );
-    mtime_t Duration( ) const;
+    void AddSegments( std::vector<matroska_segment_c*> segments );
+
     void Seek( demux_t & demuxer, mtime_t i_date, mtime_t i_time_offset, chapter_item_c *psz_chapter, int64_t i_global_position );
 
+    mtime_t Duration() const;
+
     inline chapter_edition_c *Edition()
     {
         if ( i_current_edition >= 0 && size_t(i_current_edition) < p_editions->size() )
             return (*p_editions)[i_current_edition];
         return NULL;
     }
+    std::vector<chapter_edition_c*>*  Editions() const { return p_editions; };
 
     matroska_segment_c * Segment() const
     {
@@ -69,9 +70,7 @@ public:
         return linked_segments[i_current_segment];
     }
 
-    inline chapter_item_c *CurrentChapter() {
-        return psz_current_chapter;
-    }
+    chapter_item_c *CurrentChapter() { return p_current_chapter; }
 
     bool SelectNext()
     {
@@ -93,16 +92,15 @@ public:
         return false;
     }
 
+    chapter_item_c *FindChapter( int64_t i_find_uid );
+
     bool UpdateCurrentToChapter( demux_t & demux );
-    void PrepareChapters( );
 
     chapter_item_c *BrowseCodecPrivate( unsigned int codec_id,
                                         bool (*match)(const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size ),
                                         const void *p_cookie,
                                         size_t i_cookie_size );
-    chapter_item_c *FindChapter( int64_t i_find_uid );
 
-    std::vector<chapter_edition_c*>  *p_editions;
     int                              i_sys_title;
 
 protected:
@@ -111,9 +109,17 @@ protected:
     size_t                           i_current_segment;
 
     int                              i_current_edition;
-    chapter_item_c                   *psz_current_chapter;
+    chapter_item_c                   *p_current_chapter;
+
+    std::vector<chapter_edition_c*>  *p_editions;
 
     void                             AppendUID( const EbmlBinary * UID );
+
+private:
+    void Sort();
+    size_t AddSegment( matroska_segment_c *p_segment );
+    void PreloadLinked( );
+    void PrepareChapters( );
 };
 
 #endif



More information about the vlc-commits mailing list