[vlc-devel] [RFC PATCH 4/6] decoder: UnloadDecoder: clean fmt_in when requested

Thomas Guillem thomas at gllm.fr
Fri Jul 1 18:14:53 CEST 2016


---
 src/input/decoder.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index ea49175..5cf2b63 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -150,7 +150,8 @@ static int LoadDecoder( decoder_t *p_dec, bool b_packetizer,
     p_dec->pf_packetize = NULL;
     p_dec->pf_flush = NULL;
 
-    es_format_Copy( &p_dec->fmt_in, p_fmt );
+    if( p_fmt != NULL )
+        es_format_Copy( &p_dec->fmt_in, p_fmt );
     es_format_Init( &p_dec->fmt_out, UNKNOWN_ES, 0 );
 
     /* Find a suitable decoder/packetizer module */
@@ -171,7 +172,7 @@ static int LoadDecoder( decoder_t *p_dec, bool b_packetizer,
 /**
  * Unload a decoder module
  */
-static void UnloadDecoder( decoder_t *p_dec )
+static void UnloadDecoder( decoder_t *p_dec, bool b_clean_fmt_in )
 {
     if( p_dec->p_module )
     {
@@ -185,7 +186,8 @@ static void UnloadDecoder( decoder_t *p_dec )
         p_dec->p_description = NULL;
     }
 
-    es_format_Clean( &p_dec->fmt_in );
+    if( b_clean_fmt_in )
+        es_format_Clean( &p_dec->fmt_in );
     es_format_Clean( &p_dec->fmt_out );
 }
 
@@ -1009,7 +1011,7 @@ static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block )
                 /* Drain the decoder module */
                 DecoderDecodeVideo( p_dec, NULL );
                 /* Restart the decoder module */
-                UnloadDecoder( p_dec );
+                UnloadDecoder( p_dec, true );
                 if( LoadDecoder( p_dec, false, &p_packetizer->fmt_out ) )
                 {
                     decoder_SetErrorGeneric( p_dec );
@@ -1192,7 +1194,7 @@ static void DecoderProcessAudio( decoder_t *p_dec, block_t *p_block )
                 /* Drain the decoder module */
                 DecoderDecodeAudio( p_dec, NULL );
                 /* Restart the decoder module */
-                UnloadDecoder( p_dec );
+                UnloadDecoder( p_dec, true );
                 if( LoadDecoder( p_dec, false, &p_packetizer->fmt_out ) )
                 {
                     decoder_SetErrorGeneric( p_dec );
@@ -1687,7 +1689,7 @@ static void DeleteDecoder( decoder_t * p_dec )
              (unsigned)block_FifoCount( p_owner->p_fifo ) );
 
     const bool b_flush_spu = p_dec->fmt_out.i_cat == SPU_ES;
-    UnloadDecoder( p_dec );
+    UnloadDecoder( p_dec, true );
 
     /* Free all packets still in the decoder fifo. */
     block_FifoRelease( p_owner->p_fifo );
@@ -1739,7 +1741,7 @@ static void DeleteDecoder( decoder_t * p_dec )
 
     if( p_owner->p_packetizer )
     {
-        UnloadDecoder( p_owner->p_packetizer );
+        UnloadDecoder( p_owner->p_packetizer, true );
         vlc_object_release( p_owner->p_packetizer );
     }
 
-- 
2.8.1



More information about the vlc-devel mailing list