[vlc-commits] codec: avcodec: flush decoder on eof

Francois Cartegnie git at videolan.org
Thu Jun 8 14:34:28 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Jun  8 10:54:47 2017 +0200| [c202faa3cfa37e74f80f1c7ea25eac81f27bd405] | committer: Francois Cartegnie

codec: avcodec: flush decoder on eof

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c202faa3cfa37e74f80f1c7ea25eac81f27bd405
---

 modules/codec/avcodec/audio.c | 8 +++++++-
 modules/codec/avcodec/video.c | 3 +++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index dc79c3807b..884e4e357b 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -447,7 +447,13 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error )
             if (unlikely(frame == NULL))
                 break;
         }
-        else av_frame_free( &frame );
+        else
+        {
+            /* After draining, we need to reset decoder with a flush */
+            if( ret == AVERROR_EOF )
+                avcodec_flush_buffers( p_sys->p_context );
+            av_frame_free( &frame );
+        }
     };
 
     return ( p_sys->p_decoded ) ? DequeueOneDecodedFrame( p_sys ) : NULL;
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 52736c119b..55aae2d2da 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -917,6 +917,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
                 *error = true;
             }
             av_frame_free(&frame);
+            /* After draining, we need to reset decoder with a flush */
+            if( ret == AVERROR_EOF )
+                avcodec_flush_buffers( p_sys->p_context );
             break;
         }
         bool not_received_frame = ret;



More information about the vlc-commits mailing list