]> git.sesse.net Git - vlc/blobdiff - modules/demux/mkv/mkv.cpp
MKV: avoid using the last_dts of a track we know is not used anymore
[vlc] / modules / demux / mkv / mkv.cpp
index 588255b7bb65392f5bdc9eb8c79ff27c0206fa4c..5e183b9912f6c857ac1b60bb2608f9d56f19d8ed 100644 (file)
@@ -429,7 +429,6 @@ static void Seek( demux_t *p_demux, mtime_t i_date, double f_percent, virtual_ch
     demux_sys_t        *p_sys = p_demux->p_sys;
     virtual_segment_c  *p_vsegment = p_sys->p_current_segment;
     matroska_segment_c *p_segment = p_vsegment->CurrentSegment();
-    mtime_t            i_time_offset = 0;
     int64_t            i_global_position = -1;
 
     int         i_index;
@@ -468,7 +467,7 @@ static void Seek( demux_t *p_demux, mtime_t i_date, double f_percent, virtual_ch
             for( i_index = 0; i_index < p_segment->i_index; i_index++ )
             {
                 if( p_segment->p_indexes[i_index].i_position >= i_pos &&
-                    p_segment->p_indexes[i_index].i_time > 0 )
+                    p_segment->p_indexes[i_index].i_time != -1 )
                     break;
             }
             if( i_index == p_segment->i_index )
@@ -481,12 +480,13 @@ static void Seek( demux_t *p_demux, mtime_t i_date, double f_percent, virtual_ch
             }
         }
     }
-    p_vsegment->Seek( *p_demux, i_date, i_time_offset, p_chapter, i_global_position );
+    p_vsegment->Seek( *p_demux, i_date, p_chapter, i_global_position );
 }
 
 /* Needed by matroska_segment::Seek() and Seek */
 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
-                         mtime_t i_pts, mtime_t i_duration, bool f_mandatory )
+                  mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
+                  bool b_discardable_picture )
 {
     demux_sys_t        *p_sys = p_demux->p_sys;
     matroska_segment_c *p_segment = p_sys->p_current_segment->CurrentSegment();
@@ -519,7 +519,7 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
         {
             tk->b_inited = false;
             if( tk->fmt.i_cat == VIDEO_ES || tk->fmt.i_cat == AUDIO_ES )
-                tk->i_last_dts = i_pts;
+                tk->i_last_dts = VLC_TS_INVALID;
             return;
         }
     }
@@ -547,20 +547,17 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
  
     const unsigned int i_number_frames = block != NULL ? block->NumberFrames() :
             ( simpleblock != NULL ? simpleblock->NumberFrames() : 0 );
-    for( unsigned int i = 0; i < i_number_frames; i++ )
+    for( unsigned int i_frame = 0; i_frame < i_number_frames; i_frame++ )
     {
         block_t *p_block;
         DataBuffer *data;
         if( simpleblock != NULL )
         {
-            data = &simpleblock->GetBuffer(i);
-            // condition when the DTS is correct (keyframe or B frame == NOT P frame)
-            f_mandatory = simpleblock->IsDiscardable() || simpleblock->IsKeyframe();
+            data = &simpleblock->GetBuffer(i_frame);
         }
         else
         {
-            data = &block->GetBuffer(i);
-            // condition when the DTS is correct (keyframe or B frame == NOT P frame)
+            data = &block->GetBuffer(i_frame);
         }
         frame_size += data->Size();
         if( !data->Buffer() || data->Size() > frame_size || frame_size > block_size  )
@@ -606,7 +603,7 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
             handle_real_audio(p_demux, tk, p_block, i_pts);
             block_Release(p_block);
             i_pts = ( tk->i_default_duration )?
-                i_pts + ( mtime_t )( tk->i_default_duration / 1000 ):
+                i_pts + ( mtime_t )tk->i_default_duration:
                 VLC_TS_INVALID;
             continue;
          }
@@ -633,6 +630,8 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
             break;
         }
 
+        if ( b_key_picture )
+            p_block->i_flags |= BLOCK_FLAG_TYPE_I;
         
         if( tk->fmt.i_cat != VIDEO_ES )
         {
@@ -669,10 +668,11 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
             else
             {
                 p_block->i_pts = i_pts;
-                if ( f_mandatory )
+                // condition when the DTS is correct (keyframe or B frame == NOT P frame)
+                if ( b_key_picture || b_discardable_picture )
                     p_block->i_dts = p_block->i_pts;
                 else
-                    p_block->i_dts = min( i_pts, tk->i_last_dts + ( mtime_t )( tk->i_default_duration / 1000 ) );
+                    p_block->i_dts = min( i_pts, tk->i_last_dts + ( mtime_t )tk->i_default_duration );
             }
         }
         if( p_block->i_dts > VLC_TS_INVALID &&
@@ -682,7 +682,7 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
         }
 
 #if 0
-msg_Dbg( p_demux, "block i_dts: %"PRId64" / i_pts: %"PRId64, p_block->i_dts, p_block->i_pts);
+msg_Dbg( p_demux, "block (track=%d) i_dts: %"PRId64" / i_pts: %"PRId64, tk->i_number, p_block->i_dts, p_block->i_pts);
 #endif
         if( !tk->b_no_duration )
         {
@@ -691,16 +691,16 @@ msg_Dbg( p_demux, "block i_dts: %"PRId64" / i_pts: %"PRId64, p_block->i_dts, p_b
         }
 
         /* FIXME remove when VLC_TS_INVALID work is done */
-        if( i == 0 || p_block->i_dts > VLC_TS_INVALID )
+        if( i_frame == 0 || p_block->i_dts > VLC_TS_INVALID )
             p_block->i_dts += VLC_TS_0;
-        if( !tk->b_dts_only && ( i == 0 || p_block->i_pts > VLC_TS_INVALID ) )
+        if( !tk->b_dts_only && ( i_frame == 0 || p_block->i_pts > VLC_TS_INVALID ) )
             p_block->i_pts += VLC_TS_0;
 
         es_out_Send( p_demux->out, tk->p_es, p_block );
 
         /* use time stamp only for first block */
         i_pts = ( tk->i_default_duration )?
-                 i_pts + ( mtime_t )( tk->i_default_duration / 1000 ):
+                 i_pts + ( mtime_t )tk->i_default_duration:
                  VLC_TS_INVALID;
     }
 }
@@ -806,7 +806,7 @@ static int Demux( demux_t *p_demux)
             break;
         }
 
-        BlockDecode( p_demux, block, simpleblock, p_sys->i_pts, i_block_duration, b_key_picture || b_discardable_picture );
+        BlockDecode( p_demux, block, simpleblock, p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
 
         delete block;