]> git.sesse.net Git - vlc/commitdiff
Free unused resources when using linked mkvs
authorDenis Charmet <typx@dinauz.org>
Mon, 11 Feb 2013 22:18:42 +0000 (23:18 +0100)
committerDenis Charmet <typx@dinauz.org>
Mon, 11 Feb 2013 22:20:42 +0000 (23:20 +0100)
modules/demux/mkv/demux.cpp
modules/demux/mkv/demux.hpp
modules/demux/mkv/mkv.cpp

index 4077405586310cf63cfba4d8cec1755e321d36de..60f1b2e8f27c631a73e4004f841a1361885db34c 100644 (file)
@@ -713,6 +713,38 @@ bool demux_sys_t::PreloadLinked()
     return true;
 }
 
+void demux_sys_t::FreeUnused()
+{
+    size_t i;
+    for( i = 0; i < streams.size(); i++ )
+    {
+        bool used = false;
+        struct matroska_stream_c *p_s = streams[i];
+        for( size_t j = 0; j < p_s->segments.size(); j++ )
+        {
+            if( p_s->segments[j]->b_preloaded )
+            {
+                used = true;
+                break;
+            }
+        }
+        if( !used )
+        {
+            streams[i] = NULL;
+            delete p_s;
+        }
+        
+    }
+    for( i = 0; i < opened_segments.size(); i++)
+    {
+        if( !opened_segments[i]->b_preloaded )
+        {
+            delete opened_segments[i];
+            opened_segments[i] = NULL;
+        }
+    }
+}
+
 virtual_segment_c *demux_sys_t::VirtualFromSegments( std::vector<matroska_segment_c*> *p_segments ) const
 {
     if ( p_segments->empty() )
index 3cb5f60cba938728f964fdaed4ef64ed5cd5bdaa..c295f13d13d07292a49724fe7257dacfc486f6d2 100644 (file)
@@ -382,6 +382,7 @@ public:
 
     void PreloadFamily( const matroska_segment_c & of_segment );
     bool PreloadLinked();
+    void FreeUnused();
     bool PreparePlayback( virtual_segment_c *p_new_segment );
     matroska_stream_c *AnalyseAllSegmentsFound( demux_t *p_demux, EbmlStream *p_estream, bool b_initial = false );
     void JumpTo( virtual_segment_c & p_segment, virtual_chapter_c * p_chapter );
index c2d547895044304cde6c8142421316f49fc55f86..7238ff251f0f18f72098e421f6fda77d8306b4b0 100644 (file)
@@ -247,6 +247,8 @@ static int Open( vlc_object_t * p_this )
         goto error;
     }
 
+    p_sys->FreeUnused();
+
     p_sys->InitUi();
 
     return VLC_SUCCESS;