[vlc-devel] [PATCH 2/3] input/decoder.c: fixed code-duplication
Thomas Guillem
thomas at gllm.fr
Mon May 23 16:19:38 CEST 2016
On Mon, May 23, 2016, at 15:57, Filip Roséen wrote:
> 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 );
You forgot DecoderGetCc that is done only for Video.
I don't know if it can be done for audio too.
> -
> - 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 )
Maybe put p_dec as the first argument (because every DecoderFoo use a
decoder_t as a first arg)?
> +{
> + 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
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list