]> git.sesse.net Git - vlc/commitdiff
demux: mkv: fix opus block truncation (fix #10176)
authorFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 13 Mar 2014 22:40:37 +0000 (23:40 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 13 Mar 2014 22:59:29 +0000 (23:59 +0100)
modules/demux/mkv/matroska_segment.cpp
modules/demux/mkv/mkv.cpp

index 1d6ccaa37c0ba1c27aa233b23ae211a30e03d3e2..81657ca280ed7423b4e20d1a2ca5757b7dbc0fe8 100644 (file)
@@ -1431,7 +1431,11 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
                     else if( MKV_IS_ID( el, KaxDiscardPadding ) )
                     {
                         KaxDiscardPadding &dp = *(KaxDiscardPadding*) el;
-                        *pi_duration -= int64(dp);
+                        dp.ReadData( es.I_O() );
+                        if ( *pi_duration < int64(dp) )
+                            *pi_duration = 0;
+                        else
+                            *pi_duration -= int64(dp);
                     }
 #endif
                     break;
index ac2c977d60cf213b838a8bf996ef838c0bf4f85f..4b49f4c1afa4deccb240f67b8a81b2a038243d00 100644 (file)
@@ -601,20 +601,11 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
             continue;
          }
          case VLC_CODEC_OPUS:
-            if( i_duration > 0 )
-            {
-                mtime_t i_length = i_duration * tk-> f_timecodescale *
+            mtime_t i_length = i_duration * tk-> f_timecodescale *
                     (double) p_segment->i_timescale / 1000.0;
-                p_block->i_nb_samples = i_length * tk->fmt.audio.i_rate
-                     / CLOCK_FREQ;
-                break;
-            }
-            else if( i_duration < 0 )
-            {
-                /* Opus uses p_block->i_length to handle discard padding */
-                p_block->i_length = -1 * i_duration * tk->fmt.audio.i_rate
+            if ( i_length < 0 ) i_length = 0;
+            p_block->i_nb_samples = i_length * tk->fmt.audio.i_rate
                     / CLOCK_FREQ;
-            }
             break;
         }