[vlc-devel] [PATCH] [RFC] decoder: flush the packtizer when we flush the decoders
Steve Lhomme
robux4 at videolabs.io
Tue Nov 17 08:48:52 CET 2015
Some packetizers may buffer some block_t, resulting in unneeded blocks
when there's a discontinuity, eg when seeking.
--
Most packetizers already handle the BLOCK_FLAG_DISCONTINUITY, I'll submit
patches for the others
---
src/input/decoder.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index cacf7f2..64ec3a7 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -705,6 +705,23 @@ static int DecoderPlaySout( decoder_t *p_dec, block_t *p_sout_block )
return sout_InputSendBuffer( p_owner->p_sout_input, p_sout_block );
}
+static void FlushPacketizer( decoder_t *p_dec )
+{
+ /* Flush the packetizer using the special flush block_t */
+ block_t *p_null = DecoderBlockFlushNew();
+ if( p_null )
+ {
+ block_t *p_sout_block = p_dec->pf_packetize( p_dec, &p_null );
+ while ( p_sout_block != NULL )
+ {
+ block_t *p_next = p_sout_block->p_next;
+ p_sout_block->p_next = NULL;
+ block_ChainRelease(p_sout_block);
+ p_sout_block = p_next;
+ }
+ }
+}
+
/* This function process a block for sout
*/
static void DecoderProcessSout( decoder_t *p_dec, block_t *p_block )
@@ -950,6 +967,9 @@ static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block, bool b_flus
block_t *p_packetized_block;
decoder_t *p_packetizer = p_owner->p_packetizer;
+ if( b_flush )
+ FlushPacketizer( p_dec );
+
while( (p_packetized_block =
p_packetizer->pf_packetize( p_packetizer, p_block ? &p_block : NULL )) )
{
@@ -1105,6 +1125,9 @@ static void DecoderProcessAudio( decoder_t *p_dec, block_t *p_block, bool b_flus
block_t *p_packetized_block;
decoder_t *p_packetizer = p_owner->p_packetizer;
+ if( b_flush )
+ FlushPacketizer( p_dec );
+
while( (p_packetized_block =
p_packetizer->pf_packetize( p_packetizer, p_block ? &p_block : NULL )) )
{
--
2.6.2
More information about the vlc-devel
mailing list