[vlc-devel] [PATCH 5/6] codec: don't drop discontinue blocks

Ilkka Ollakka ileoo at videolan.org
Sat Oct 31 15:05:55 CET 2015


Most of the cases it's enought just to set pts so codec resyncs itself.
Also flushing on discontinue isn't good idea.
---
 modules/codec/a52.c              |  6 +++++-
 modules/codec/avcodec/audio.c    |  7 ++++++-
 modules/codec/avcodec/subtitle.c |  4 +++-
 modules/codec/bpg.c              |  2 +-
 modules/codec/cdg.c              |  2 +-
 modules/codec/crystalhd.c        |  2 +-
 modules/codec/daala.c            |  2 +-
 modules/codec/ddummy.c           |  2 +-
 modules/codec/dts.c              | 11 +++++------
 modules/codec/faad.c             |  2 +-
 modules/codec/flac.c             |  2 +-
 modules/codec/gstdecode.c        |  7 +++++--
 modules/codec/jpeg.c             |  2 +-
 modules/codec/kate.c             |  9 ++++++---
 modules/codec/libass.c           |  2 +-
 modules/codec/libmpeg2.c         |  2 +-
 modules/codec/mft.c              |  5 ++---
 modules/codec/mpeg_audio.c       | 17 ++++++++---------
 modules/codec/mpg123.c           |  2 +-
 modules/codec/png.c              |  2 +-
 modules/codec/scte27.c           |  2 +-
 modules/codec/sdl_image.c        |  2 +-
 modules/codec/stl.c              |  2 +-
 modules/codec/subsdec.c          |  2 +-
 modules/codec/substx3g.c         |  2 +-
 modules/codec/svcdsub.c          |  2 +-
 modules/codec/svg.c              |  2 +-
 modules/codec/uleaddvaudio.c     |  7 ++++---
 modules/codec/videotoolbox.m     |  2 +-
 modules/codec/vpx.c              |  2 +-
 30 files changed, 65 insertions(+), 50 deletions(-)

diff --git a/modules/codec/a52.c b/modules/codec/a52.c
index 4fec50c..6a9d9ba 100644
--- a/modules/codec/a52.c
+++ b/modules/codec/a52.c
@@ -174,7 +174,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
     if( !pp_block || !*pp_block ) return NULL;
 
-    if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( (*pp_block)->i_flags&(BLOCK_FLAG_CORRUPTED) )
     {
         if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
         {
@@ -185,6 +185,10 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         block_Release( *pp_block );
         return NULL;
     }
+    if( (*pp_block)->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    {
+        date_Set( &p_sys->end_date, 0 );
+    }
 
     if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID)
     {
diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index 08255b8..841060b 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -261,7 +261,7 @@ static block_t *DecodeAudio( decoder_t *p_dec, block_t **pp_block )
     if( p_sys->b_delayed_open )
         goto end;
 
-    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
     {
         avcodec_flush_buffers( ctx );
         date_Set( &p_sys->end_date, VLC_TS_INVALID );
@@ -272,6 +272,11 @@ static block_t *DecodeAudio( decoder_t *p_dec, block_t **pp_block )
 
         goto end;
     }
+    if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    {
+        avcodec_flush_buffers( ctx );
+        date_Set( &p_sys->end_date, VLC_TS_INVALID );
+    }
 
     /* We've just started the stream, wait for the first PTS. */
     if( !date_Get( &p_sys->end_date ) && p_block->i_pts <= VLC_TS_INVALID )
diff --git a/modules/codec/avcodec/subtitle.c b/modules/codec/avcodec/subtitle.c
index 5db71bd..c867e8a 100644
--- a/modules/codec/avcodec/subtitle.c
+++ b/modules/codec/avcodec/subtitle.c
@@ -124,11 +124,13 @@ static subpicture_t *DecodeSubtitle(decoder_t *dec, block_t **block_ptr)
 
     block_t *block = *block_ptr;
 
-    if (block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
+    if (block->i_flags & (BLOCK_FLAG_CORRUPTED)) {
         block_Release(block);
         avcodec_flush_buffers(sys->p_context);
         return NULL;
     }
+    if (block->i_flags & BLOCK_FLAG_DISCONTINUITY)
+        avcodec_flush_buffers(sys->p_context);
 
     if (block->i_buffer <= 0) {
         block_Release(block);
diff --git a/modules/codec/bpg.c b/modules/codec/bpg.c
index 6ec49c7..255ab4a 100644
--- a/modules/codec/bpg.c
+++ b/modules/codec/bpg.c
@@ -102,7 +102,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
     p_block = *pp_block;
 
-    if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
     {
         block_Release(p_block);
         *pp_block = NULL;
diff --git a/modules/codec/cdg.c b/modules/codec/cdg.c
index 5a28a33..7bcaad9 100644
--- a/modules/codec/cdg.c
+++ b/modules/codec/cdg.c
@@ -143,7 +143,7 @@ static picture_t *Decode( decoder_t *p_dec, block_t **pp_block )
         return NULL;
     p_block = *pp_block;
 
-    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
     {
         p_sys->i_packet = 0;
         goto exit;
diff --git a/modules/codec/crystalhd.c b/modules/codec/crystalhd.c
index 87c2134..2cc43fb 100644
--- a/modules/codec/crystalhd.c
+++ b/modules/codec/crystalhd.c
@@ -443,7 +443,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     p_block = *pp_block;
     if( p_block )
     {
-        if( ( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) == 0 )
+        if( ( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) ) == 0 )
         {
             /* Valid input block, so we can send to HW to decode */
 
diff --git a/modules/codec/daala.c b/modules/codec/daala.c
index 5d7685b..ae790dd 100644
--- a/modules/codec/daala.c
+++ b/modules/codec/daala.c
@@ -404,7 +404,7 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket,
     block_t *p_block = *pp_block;
     void *p_buf;
 
-    if( ( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) != 0 )
+    if( ( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) ) != 0 )
     {
         /* Don't send the the first packet after a discontinuity to
          * daala_decode, otherwise we get purple/green display artifacts
diff --git a/modules/codec/ddummy.c b/modules/codec/ddummy.c
index 91289d1..9bcdf97 100644
--- a/modules/codec/ddummy.c
+++ b/modules/codec/ddummy.c
@@ -130,7 +130,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
     if( stream != NULL
      && p_block->i_buffer > 0
-     && !(p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) )
+     && !(p_block->i_flags & (BLOCK_FLAG_CORRUPTED)) )
     {
         fwrite( p_block->p_buffer, 1, p_block->i_buffer, stream );
         msg_Dbg( p_dec, "dumped %zu bytes", p_block->i_buffer );
diff --git a/modules/codec/dts.c b/modules/codec/dts.c
index 991412c..ebe5414 100644
--- a/modules/codec/dts.c
+++ b/modules/codec/dts.c
@@ -174,17 +174,16 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     if( !pp_block || !*pp_block )
         return NULL;
 
-    if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( (*pp_block)->i_flags&(BLOCK_FLAG_CORRUPTED) )
     {
-        if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
-        {
-            p_sys->i_state = STATE_NOSYNC;
-            block_BytestreamEmpty( &p_sys->bytestream );
-        }
+        p_sys->i_state = STATE_NOSYNC;
+        block_BytestreamEmpty( &p_sys->bytestream );
         date_Set( &p_sys->end_date, 0 );
         block_Release( *pp_block );
         return NULL;
     }
+    if( (*pp_block)->i_flags & BLOCK_FLAG_DISCONTINUITY )
+        date_Set( &p_sys->end_date, 0 );
 
     if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID )
     {
diff --git a/modules/codec/faad.c b/modules/codec/faad.c
index ae8fed8..944c376 100644
--- a/modules/codec/faad.c
+++ b/modules/codec/faad.c
@@ -210,7 +210,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
     p_block = *pp_block;
 
-    if( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) )
     {
         block_Release( p_block );
         return NULL;
diff --git a/modules/codec/flac.c b/modules/codec/flac.c
index 9fc69f8..8ed2b5c 100644
--- a/modules/codec/flac.c
+++ b/modules/codec/flac.c
@@ -500,7 +500,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
     if( !pp_block || !*pp_block )
         return NULL;
-    if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( (*pp_block)->i_flags&(BLOCK_FLAG_CORRUPTED) )
     {
         block_Release( *pp_block );
         return NULL;
diff --git a/modules/codec/gstdecode.c b/modules/codec/gstdecode.c
index a2acf69..7615b45 100644
--- a/modules/codec/gstdecode.c
+++ b/modules/codec/gstdecode.c
@@ -679,8 +679,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             p_sys->b_prerolled = false;
         }
 
-        block_Release( p_block );
-        goto done;
+        if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
+        {
+            block_Release( p_block );
+            goto done;
+        }
     }
 
     if( likely( p_block->i_buffer ) )
diff --git a/modules/codec/jpeg.c b/modules/codec/jpeg.c
index 454ae95..c9053ae 100644
--- a/modules/codec/jpeg.c
+++ b/modules/codec/jpeg.c
@@ -199,7 +199,7 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
 
     p_block = *pp_block;
 
-    if (p_block->i_flags & BLOCK_FLAG_DISCONTINUITY)
+    if (p_block->i_flags & BLOCK_FLAG_CORRUPTED )
     {
         block_Release(p_block);
         *pp_block = NULL;
diff --git a/modules/codec/kate.c b/modules/codec/kate.c
index 73c5bce..eea28b3 100644
--- a/modules/codec/kate.c
+++ b/modules/codec/kate.c
@@ -480,9 +480,12 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             vlc_mutex_unlock( &p_sys->lock );
         }
 #endif
-        p_sys->i_max_stop = VLC_TS_INVALID;
-        block_Release( p_block );
-        return NULL;
+        if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
+        {
+            p_sys->i_max_stop = VLC_TS_INVALID;
+            block_Release( p_block );
+            return NULL;
+        }
     }
 
     /* Block to Kate packet */
diff --git a/modules/codec/libass.c b/modules/codec/libass.c
index 92e7085..b171142 100644
--- a/modules/codec/libass.c
+++ b/modules/codec/libass.c
@@ -307,7 +307,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         return NULL;
 
     p_block = *pp_block;
-    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
     {
         p_sys->i_max_stop = VLC_TS_INVALID;
         block_Release( p_block );
diff --git a/modules/codec/libmpeg2.c b/modules/codec/libmpeg2.c
index ff5a56e..85c4b6f 100644
--- a/modules/codec/libmpeg2.c
+++ b/modules/codec/libmpeg2.c
@@ -261,7 +261,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         return NULL;
 
     p_block = *pp_block;
-    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
         Reset( p_dec );
 
     while( 1 )
diff --git a/modules/codec/mft.c b/modules/codec/mft.c
index 696319a..e95c4ca 100644
--- a/modules/codec/mft.c
+++ b/modules/codec/mft.c
@@ -777,7 +777,7 @@ static void *DecodeSync(decoder_t *p_dec, block_t **pp_block)
         return NULL;
 
     block_t *p_block = *pp_block;
-    if (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED))
+    if (p_block->i_flags & (BLOCK_FLAG_CORRUPTED))
     {
         block_Release(p_block);
         return NULL;
@@ -839,10 +839,9 @@ static void *DecodeAsync(decoder_t *p_dec, block_t **pp_block)
         return NULL;
 
     block_t *p_block = *pp_block;
-    if (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED))
+    if (p_block->i_flags & (BLOCK_FLAG_CORRUPTED))
     {
         block_Release(p_block);
-
         return NULL;
     }
 
diff --git a/modules/codec/mpeg_audio.c b/modules/codec/mpeg_audio.c
index 0abf6b4..9956091 100644
--- a/modules/codec/mpeg_audio.c
+++ b/modules/codec/mpeg_audio.c
@@ -201,18 +201,19 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     block_t *p_block = pp_block ? *pp_block : NULL;
 
     if (p_block) {
-        if( p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+        if( p_block->i_flags&(BLOCK_FLAG_CORRUPTED) )
         {
-            if( p_block->i_flags&BLOCK_FLAG_CORRUPTED )
-            {
-                p_sys->i_state = STATE_NOSYNC;
-                block_BytestreamEmpty( &p_sys->bytestream );
-            }
+            p_sys->i_state = STATE_NOSYNC;
+            block_BytestreamEmpty( &p_sys->bytestream );
             date_Set( &p_sys->end_date, 0 );
             block_Release( p_block );
-            p_sys->b_discontinuity = true;
             return NULL;
         }
+        if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
+        {
+            date_Set( &p_sys->end_date, 0 );
+            p_sys->b_discontinuity = true;
+        }
 
         if( !date_Get( &p_sys->end_date ) && p_block->i_pts <= VLC_TS_INVALID )
         {
@@ -292,7 +293,6 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 msg_Dbg( p_dec, "emulated startcode" );
                 block_SkipByte( &p_sys->bytestream );
                 p_sys->i_state = STATE_NOSYNC;
-                p_sys->b_discontinuity = true;
                 break;
             }
 
@@ -367,7 +367,6 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                     msg_Dbg( p_dec, "emulated startcode on next frame" );
                     block_SkipByte( &p_sys->bytestream );
                     p_sys->i_state = STATE_NOSYNC;
-                    p_sys->b_discontinuity = true;
                     break;
                 }
 
diff --git a/modules/codec/mpg123.c b/modules/codec/mpg123.c
index 35096b1..aefbe6d 100644
--- a/modules/codec/mpg123.c
+++ b/modules/codec/mpg123.c
@@ -93,7 +93,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         goto error;
     }
 
-    if( p_block->i_flags & ( BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED ) )
+    if( p_block->i_flags & ( BLOCK_FLAG_CORRUPTED ) )
     {
         date_Set( &p_sys->end_date, 0 );
         goto error;
diff --git a/modules/codec/png.c b/modules/codec/png.c
index 36ed444..85ab75b 100644
--- a/modules/codec/png.c
+++ b/modules/codec/png.c
@@ -205,7 +205,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     p_block = *pp_block;
     p_sys->b_error = false;
 
-    if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
     {
         block_Release( p_block ); *pp_block = NULL;
         return NULL;
diff --git a/modules/codec/scte27.c b/modules/codec/scte27.c
index 527e4e4..8696710 100644
--- a/modules/codec/scte27.c
+++ b/modules/codec/scte27.c
@@ -416,7 +416,7 @@ static subpicture_t *Decode(decoder_t *dec, block_t **block)
     subpicture_t *sub_first = NULL;
     subpicture_t **sub_last = &sub_first;
 
-    if (b->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED))
+    if (b->i_flags & (BLOCK_FLAG_CORRUPTED))
         goto exit;
 
     while (b->i_buffer > 3) {
diff --git a/modules/codec/sdl_image.c b/modules/codec/sdl_image.c
index e3d7bc6..2e0fe3a 100644
--- a/modules/codec/sdl_image.c
+++ b/modules/codec/sdl_image.c
@@ -137,7 +137,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     if( pp_block == NULL || *pp_block == NULL ) return NULL;
     p_block = *pp_block;
 
-    if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
     {
         block_Release( p_block ); *pp_block = NULL;
         return NULL;
diff --git a/modules/codec/stl.c b/modules/codec/stl.c
index e2f8a20..4bfa25e 100644
--- a/modules/codec/stl.c
+++ b/modules/codec/stl.c
@@ -113,7 +113,7 @@ static subpicture_t *Decode(decoder_t *dec, block_t **block)
     subpicture_t *sub = NULL;
 
     block_t *b = *block; *block = NULL;
-    if (b->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED))
+    if (b->i_flags & (BLOCK_FLAG_CORRUPTED))
         goto exit;
     if (b->i_buffer < 128)
         goto exit;
diff --git a/modules/codec/subsdec.c b/modules/codec/subsdec.c
index 22037f7..c005192 100644
--- a/modules/codec/subsdec.c
+++ b/modules/codec/subsdec.c
@@ -329,7 +329,7 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         return NULL;
 
     p_block = *pp_block;
-    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
     {
         block_Release( p_block );
         return NULL;
diff --git a/modules/codec/substx3g.c b/modules/codec/substx3g.c
index 39bb410..b4b08d6 100644
--- a/modules/codec/substx3g.c
+++ b/modules/codec/substx3g.c
@@ -282,7 +282,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
     p_block = *pp_block;
     *pp_block = NULL;
 
-    if( ( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) ||
+    if( ( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) ) ||
           p_block->i_buffer < sizeof(uint16_t) )
     {
         block_Release( p_block );
diff --git a/modules/codec/svcdsub.c b/modules/codec/svcdsub.c
index a18fa69..df33209 100644
--- a/modules/codec/svcdsub.c
+++ b/modules/codec/svcdsub.c
@@ -234,7 +234,7 @@ static block_t *Reassemble( decoder_t *p_dec, block_t *p_block )
     uint16_t i_expected_image;
     uint8_t  i_packet, i_expected_packet;
 
-    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED) )
     {
         block_Release( p_block );
         return NULL;
diff --git a/modules/codec/svg.c b/modules/codec/svg.c
index 47274fb..dae8faf 100644
--- a/modules/codec/svg.c
+++ b/modules/codec/svg.c
@@ -136,7 +136,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     p_block = *pp_block;
     *pp_block = NULL;
 
-    if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    if( p_block->i_flags & BLOCK_FLAG_CORRUPTED)
     {
         block_Release( p_block );
         return NULL;
diff --git a/modules/codec/uleaddvaudio.c b/modules/codec/uleaddvaudio.c
index dbbd0b4..6f698fe 100644
--- a/modules/codec/uleaddvaudio.c
+++ b/modules/codec/uleaddvaudio.c
@@ -62,13 +62,14 @@ static block_t *Decode(decoder_t *dec, block_t **block_ptr)
         return NULL;
 
     block_t *block = *block_ptr;
-    if (block->i_flags & (BLOCK_FLAG_DISCONTINUITY | BLOCK_FLAG_CORRUPTED)) {
-        if (block->i_flags & BLOCK_FLAG_CORRUPTED) {
-        }
+    if (block->i_flags & BLOCK_FLAG_CORRUPTED) {
         date_Set(&sys->end_date, 0);
         block_Release(block);
         return NULL;
     }
+    if (block->i_flags & BLOCK_FLAG_DISCONTINUITY) {
+        date_Set(&sys->end_date, 0);
+    }
 
     if (block->i_pts > VLC_TS_INVALID &&
         block->i_pts != date_Get(&sys->end_date))
diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index 1e59271..0b3ded2 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -929,7 +929,7 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
     p_block = *pp_block;
 
     if (likely(p_block != NULL)) {
-        if (unlikely(p_block->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED))) {
+        if (unlikely(p_block->i_flags&(BLOCK_FLAG_CORRUPTED))) {
             if (likely(p_sys->b_started)) {
                 @synchronized(p_sys->outputTimeStamps) {
                     [p_sys->outputTimeStamps removeAllObjects];
diff --git a/modules/codec/vpx.c b/modules/codec/vpx.c
index 5b19958..90180b8 100644
--- a/modules/codec/vpx.c
+++ b/modules/codec/vpx.c
@@ -72,7 +72,7 @@ static picture_t *Decode(decoder_t *dec, block_t **pp_block)
     if (!block)
         return NULL;
 
-    if (block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
+    if (block->i_flags & (BLOCK_FLAG_CORRUPTED)) {
         block_Release(block);
         return NULL;
     }
-- 
2.6.2



More information about the vlc-devel mailing list