[vlc-devel] [PATCH 2/3] input/decoder.c: fixed code-duplication

Filip Roséen filip at videolabs.io
Mon May 23 15:57:54 CEST 2016


DecoderProcessVideo and DecoderProcessAudio had identical implementation
with the only difference being the function they called in order to
decode the passed block.

This patch introduces DecoderDispatchBlock, to which you pass a
pointer-to-function that is responsible for the decoding of the passed block.

Given that there is no longer a need for DecoderProcessVideo and
DecoderProcessAudio, both functions have been removed.
---
 src/input/decoder.c | 166 +++++++++++++++++++---------------------------------
 1 file changed, 59 insertions(+), 107 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 113c105..e7f4a75 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -985,60 +985,6 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
     DecoderUpdateStatVideo( p_dec, i_decoded, i_lost );
 }
 
-/* This function process a video block
- */
-static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block )
-{
-    decoder_owner_sys_t *p_owner = p_dec->p_owner;
-
-    if( p_owner->p_packetizer )
-    {
-        block_t *p_packetized_block;
-        block_t **pp_block = p_block ? &p_block : NULL;
-        decoder_t *p_packetizer = p_owner->p_packetizer;
-
-        while( (p_packetized_block =
-                p_packetizer->pf_packetize( p_packetizer, pp_block ) ) )
-        {
-            if( !es_format_IsSimilar( &p_dec->fmt_in, &p_packetizer->fmt_out ) )
-            {
-                msg_Dbg( p_dec, "restarting module due to input format change");
-
-                /* Drain the decoder module */
-                DecoderDecodeVideo( p_dec, NULL );
-                /* Restart the decoder module */
-                UnloadDecoder( p_dec );
-                if( LoadDecoder( p_dec, false, &p_packetizer->fmt_out ) )
-                {
-                    p_dec->b_error = true;
-                    block_ChainRelease( p_packetized_block );
-                    return;
-                }
-            }
-
-            if( p_packetizer->pf_get_cc )
-                DecoderGetCc( p_dec, p_packetizer );
-
-            while( p_packetized_block )
-            {
-                block_t *p_next = p_packetized_block->p_next;
-                p_packetized_block->p_next = NULL;
-
-                DecoderDecodeVideo( p_dec, p_packetized_block );
-
-                p_packetized_block = p_next;
-            }
-        }
-        /* Drain the decoder after the packetizer is drained */
-        if( !pp_block )
-            DecoderDecodeVideo( p_dec, NULL );
-    }
-    else
-    {
-        DecoderDecodeVideo( p_dec, p_block );
-    }
-}
-
 static int DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio,
                              unsigned *restrict pi_lost_sum )
 {
@@ -1163,57 +1109,6 @@ static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block )
     DecoderUpdateStatAudio( p_dec, decoded, lost );
 }
 
-/* This function process a audio block
- */
-static void DecoderProcessAudio( decoder_t *p_dec, block_t *p_block )
-{
-    decoder_owner_sys_t *p_owner = p_dec->p_owner;
-
-    if( p_owner->p_packetizer )
-    {
-        block_t *p_packetized_block;
-        block_t **pp_block = p_block ? &p_block : NULL;
-        decoder_t *p_packetizer = p_owner->p_packetizer;
-
-        while( (p_packetized_block =
-                p_packetizer->pf_packetize( p_packetizer, pp_block ) ) )
-        {
-            if( !es_format_IsSimilar( &p_dec->fmt_in, &p_packetizer->fmt_out ) )
-            {
-                msg_Dbg( p_dec, "restarting module due to input format change");
-
-                /* Drain the decoder module */
-                DecoderDecodeAudio( p_dec, NULL );
-                /* Restart the decoder module */
-                UnloadDecoder( p_dec );
-                if( LoadDecoder( p_dec, false, &p_packetizer->fmt_out ) )
-                {
-                    p_dec->b_error = true;
-                    block_ChainRelease( p_packetized_block );
-                    return;
-                }
-            }
-
-            while( p_packetized_block )
-            {
-                block_t *p_next = p_packetized_block->p_next;
-                p_packetized_block->p_next = NULL;
-
-                DecoderDecodeAudio( p_dec, p_packetized_block );
-
-                p_packetized_block = p_next;
-            }
-        }
-        /* Drain the decoder after the packetizer is drained */
-        if( !pp_block )
-            DecoderDecodeAudio( p_dec, NULL );
-    }
-    else
-    {
-        DecoderDecodeAudio( p_dec, p_block );
-    }
-}
-
 static void DecoderPlaySpu( decoder_t *p_dec, subpicture_t *p_subpic )
 {
     decoder_owner_sys_t *p_owner = p_dec->p_owner;
@@ -1305,6 +1200,63 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block )
 }
 
 /**
+ * Dispatch a block to the relevant decode-callback
+ *
+ * \param pf_decode pointer-to-function responsible for decoding the passed block
+ * \param p_dec the decoder object
+ * \param p_block the block to decode
+ **/
+static void DecoderDispatchBlock( void( *pf_decode )( decoder_t*, block_t* ),
+  decoder_t * p_dec, block_t * p_block )
+{
+    decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+    if( p_owner->p_packetizer )
+    {
+        block_t *p_packetized_block;
+        block_t **pp_block = p_block ? &p_block : NULL;
+        decoder_t *p_packetizer = p_owner->p_packetizer;
+
+        while( (p_packetized_block =
+                p_packetizer->pf_packetize( p_packetizer, pp_block ) ) )
+        {
+            if( !es_format_IsSimilar( &p_dec->fmt_in, &p_packetizer->fmt_out ) )
+            {
+                msg_Dbg( p_dec, "restarting module due to input format change");
+
+                /* Drain the decoder module */
+                pf_decode ( p_dec, NULL );
+                /* Restart the decoder module */
+                UnloadDecoder( p_dec );
+                if( LoadDecoder( p_dec, false, &p_packetizer->fmt_out ) )
+                {
+                    p_dec->b_error = true;
+                    block_ChainRelease( p_packetized_block );
+                    return;
+                }
+            }
+
+            while( p_packetized_block )
+            {
+                block_t *p_next = p_packetized_block->p_next;
+                p_packetized_block->p_next = NULL;
+
+                pf_decode ( p_dec, p_packetized_block );
+
+                p_packetized_block = p_next;
+            }
+        }
+        /* Drain the decoder after the packetizer is drained */
+        if( !pp_block )
+            pf_decode ( p_dec, NULL );
+    }
+    else
+    {
+        pf_decode ( p_dec, p_block );
+    }
+}
+
+/**
  * Decode a block
  *
  * \param p_dec the decoder object
@@ -1335,8 +1287,8 @@ static void DecoderProcess( decoder_t *p_dec, block_t *p_block )
 
     switch( p_dec->fmt_out.i_cat )
     {
-        case VIDEO_ES: return DecoderProcessVideo( p_dec, p_block );
-        case AUDIO_ES: return DecoderProcessAudio( p_dec, p_block );
+        case VIDEO_ES: return DecoderDispatchBlock( &DecoderDecodeVideo, p_dec, p_block );
+        case AUDIO_ES: return DecoderDispatchBlock( &DecoderDecodeAudio, p_dec, p_block );
         case   SPU_ES: return DecoderProcessSpu( p_dec, p_block );
 
         default:
-- 
2.8.2



More information about the vlc-devel mailing list