[vlc-devel] [PATCH 1/9] demux:mkv: simplify Demux() by using vlc_mutex_locker

Steve Lhomme robux4 at videolabs.io
Tue Mar 15 15:45:54 CET 2016


also the loop was not necessary
---
 modules/demux/mkv/mkv.cpp | 137 ++++++++++++++++++++--------------------------
 1 file changed, 58 insertions(+), 79 deletions(-)

diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 93ad241..4d7b6b4 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -710,109 +710,88 @@ static int Demux( demux_t *p_demux)
 {
     demux_sys_t        *p_sys = p_demux->p_sys;
 
-    vlc_mutex_lock( &p_sys->lock_demuxer );
+    vlc_mutex_locker( &p_sys->lock_demuxer );
 
     virtual_segment_c  *p_vsegment = p_sys->p_current_segment;
     matroska_segment_c *p_segment = p_vsegment->CurrentSegment();
     if ( p_segment == NULL )
-    {
-        vlc_mutex_unlock( &p_sys->lock_demuxer );
         return 0;
-    }
-    int i_return = 0;
 
-    do
-    {
-        if( p_sys->i_pts >= p_sys->i_start_pts  )
-            if ( p_vsegment->UpdateCurrentToChapter( *p_demux ) )
-            {
-                i_return = 1;
-                break;
-            }
+    if( p_sys->i_pts >= p_sys->i_start_pts  )
+        if ( p_vsegment->UpdateCurrentToChapter( *p_demux ) )
+            return 1;
 
-        if ( p_vsegment->CurrentEdition() &&
-             p_vsegment->CurrentEdition()->b_ordered &&
-             p_vsegment->CurrentChapter() == NULL )
-            /* nothing left to read in this ordered edition */
-            break;
+    if ( p_vsegment->CurrentEdition() &&
+         p_vsegment->CurrentEdition()->b_ordered &&
+         p_vsegment->CurrentChapter() == NULL )
+        /* nothing left to read in this ordered edition */
+        return 0;
 
-        KaxBlock *block;
-        KaxSimpleBlock *simpleblock;
-        int64_t i_block_duration = 0;
-        bool b_key_picture;
-        bool b_discardable_picture;
-        if( p_segment->BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
+    KaxBlock *block;
+    KaxSimpleBlock *simpleblock;
+    int64_t i_block_duration = 0;
+    bool b_key_picture;
+    bool b_discardable_picture;
+    if( p_segment->BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
+    {
+        if ( p_vsegment->CurrentEdition() && p_vsegment->CurrentEdition()->b_ordered )
         {
-            if ( p_vsegment->CurrentEdition() && p_vsegment->CurrentEdition()->b_ordered )
+            const virtual_chapter_c *p_chap = p_vsegment->CurrentChapter();
+            // check if there are more chapters to read
+            if ( p_chap != NULL )
             {
-                const virtual_chapter_c *p_chap = p_vsegment->CurrentChapter();
-                // check if there are more chapters to read
-                if ( p_chap != NULL )
-                {
-                    /* TODO handle successive chapters with the same user_start_time/user_end_time
-                    */
-                    p_sys->i_pts = p_chap->i_mk_virtual_stop_time + VLC_TS_0;
-                    p_sys->i_pts++; // trick to avoid staying on segments with no duration and no content
+                /* TODO handle successive chapters with the same user_start_time/user_end_time
+                */
+                p_sys->i_pts = p_chap->i_mk_virtual_stop_time + VLC_TS_0;
+                p_sys->i_pts++; // trick to avoid staying on segments with no duration and no content
 
-                    i_return = 1;
-                }
-
-                break;
-            }
-            else
-            {
-                msg_Warn( p_demux, "cannot get block EOF?" );
-                break;
+                return 1;
             }
         }
 
-        if( simpleblock != NULL )
-            p_sys->i_pts = (mtime_t)simpleblock->GlobalTimecode() / INT64_C(1000);
-        else
-            p_sys->i_pts = (mtime_t)block->GlobalTimecode() / INT64_C(1000);
-        p_sys->i_pts += p_sys->i_mk_chapter_time + VLC_TS_0;
+        msg_Warn( p_demux, "cannot get block EOF?" );
+        return 0;
+    }
 
-        mtime_t i_pcr = VLC_TS_INVALID;
-        for( size_t i = 0; i < p_segment->tracks.size(); i++)
-            if( p_segment->tracks[i]->i_last_dts > VLC_TS_INVALID &&
-                ( p_segment->tracks[i]->i_last_dts < i_pcr || i_pcr == VLC_TS_INVALID ))
-                i_pcr = p_segment->tracks[i]->i_last_dts;
+    if( simpleblock != NULL )
+        p_sys->i_pts = (mtime_t)simpleblock->GlobalTimecode() / INT64_C(1000);
+    else
+        p_sys->i_pts = (mtime_t)block->GlobalTimecode() / INT64_C(1000);
+    p_sys->i_pts += p_sys->i_mk_chapter_time + VLC_TS_0;
 
-        if( i_pcr > p_sys->i_pcr + 300000 )
-        {
-            es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + p_sys->i_pcr );
-            p_sys->i_pcr = i_pcr;
-        }
+    mtime_t i_pcr = VLC_TS_INVALID;
+    for( size_t i = 0; i < p_segment->tracks.size(); i++)
+        if( p_segment->tracks[i]->i_last_dts > VLC_TS_INVALID &&
+            ( p_segment->tracks[i]->i_last_dts < i_pcr || i_pcr == VLC_TS_INVALID ))
+            i_pcr = p_segment->tracks[i]->i_last_dts;
 
-        if( p_sys->i_pts >= p_sys->i_start_pts  )
-        {
-            if ( p_vsegment->UpdateCurrentToChapter( *p_demux ) )
-            {
-                i_return = 1;
-                delete block;
-                break;
-            }
-        }
+    if( i_pcr > p_sys->i_pcr + 300000 )
+    {
+        es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + p_sys->i_pcr );
+        p_sys->i_pcr = i_pcr;
+    }
 
-        if ( p_vsegment->CurrentEdition() &&
-             p_vsegment->CurrentEdition()->b_ordered &&
-             p_vsegment->CurrentChapter() == NULL )
+    if( p_sys->i_pts >= p_sys->i_start_pts  )
+    {
+        if ( p_vsegment->UpdateCurrentToChapter( *p_demux ) )
         {
-            /* nothing left to read in this ordered edition */
             delete block;
-            break;
+            return 1;
         }
+    }
 
-        BlockDecode( p_demux, block, simpleblock, p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
-
+    if ( p_vsegment->CurrentEdition() &&
+         p_vsegment->CurrentEdition()->b_ordered &&
+         p_vsegment->CurrentChapter() == NULL )
+    {
+        /* nothing left to read in this ordered edition */
         delete block;
-
-        vlc_mutex_unlock( &p_sys->lock_demuxer );
-        return 1;
+        return 0;
     }
-    while (0);
 
-    vlc_mutex_unlock( &p_sys->lock_demuxer );
+    BlockDecode( p_demux, block, simpleblock, p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
+
+    delete block;
 
-    return i_return;
+    return 1;
 }
-- 
2.7.2.windows.1



More information about the vlc-devel mailing list