[vlc-commits] codec: avcodec: use decoder_QueueAudio in loop

Francois Cartegnie git at videolan.org
Mon Jun 12 19:50:22 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jun 12 19:42:48 2017 +0200| [256a0e572184e808c1bbf02247e48c6fbb8511bf] | committer: Francois Cartegnie

codec: avcodec: use decoder_QueueAudio in loop

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

 modules/codec/avcodec/audio.c | 67 ++++++++++++-------------------------------
 1 file changed, 19 insertions(+), 48 deletions(-)

diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index 884e4e357b..d61385fabc 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -51,9 +51,6 @@ struct decoder_sys_t
 {
     AVCODEC_COMMON_MEMBERS
 
-    block_t *p_decoded;
-    block_t **pp_decoded_last;
-
     /*
      * Output properties
      */
@@ -192,16 +189,6 @@ static block_t *vlc_av_frame_Wrap(AVFrame *frame)
     return block;
 }
 
-static block_t * DequeueOneDecodedFrame( decoder_sys_t *p_sys )
-{
-    block_t *p_decoded = p_sys->p_decoded;
-    p_sys->p_decoded = p_sys->p_decoded->p_next;
-    if( p_sys->p_decoded == NULL )
-        p_sys->pp_decoded_last = &p_sys->p_decoded;
-    p_decoded->p_next = NULL;
-    return p_decoded;
-}
-
 /*****************************************************************************
  * EndAudio: decoder destruction
  *****************************************************************************
@@ -210,13 +197,6 @@ static block_t * DequeueOneDecodedFrame( decoder_sys_t *p_sys )
  *****************************************************************************/
 void EndAudioDec( decoder_t *p_dec )
 {
-    decoder_sys_t *p_sys = p_dec->p_sys;
-    if( p_sys->p_decoded )
-    {
-        block_ChainRelease( p_sys->p_decoded );
-        p_sys->p_decoded = NULL;
-        p_sys->pp_decoded_last = &p_sys->p_decoded;
-    }
     ffmpeg_CloseCodec( p_dec );
 }
 
@@ -236,9 +216,6 @@ int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
         return VLC_ENOMEM;
     }
 
-    p_sys->p_decoded = NULL;
-    p_sys->pp_decoded_last = &p_sys->p_decoded;
-
     p_context->refcounted_frames = true;
     p_sys->p_context = p_context;
     p_sys->p_codec = p_codec;
@@ -290,24 +267,18 @@ static void Flush( decoder_t *p_dec )
     if( ctx->codec_id == AV_CODEC_ID_MP2 ||
         ctx->codec_id == AV_CODEC_ID_MP3 )
         p_sys->i_reject_count = 3;
-
-    if( p_sys->p_decoded )
-    {
-        block_ChainRelease( p_sys->p_decoded );
-        p_sys->p_decoded = NULL;
-        p_sys->pp_decoded_last = &p_sys->p_decoded;
-    }
 }
 
 /*****************************************************************************
  * DecodeBlock: Called to decode one frame
  *****************************************************************************/
-static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error )
+static int DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     AVCodecContext *ctx = p_sys->p_context;
     AVFrame *frame = NULL;
     block_t *p_block = NULL;
+    bool b_error = false;
 
     if( !ctx->extradata_size && p_dec->fmt_in.i_extra && p_sys->b_delayed_open)
     {
@@ -322,10 +293,6 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error )
         goto drop;
     }
 
-    /* Flushing or decoding, we return any block ready from multiple frames output */
-    if( p_sys->p_decoded )
-        return DequeueOneDecodedFrame( p_sys );
-
     if( pp_block == NULL ) /* Drain request */
     {
         /* we don't need to care about return val */
@@ -358,10 +325,9 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error )
 
         if( (p_block->i_flags & BLOCK_FLAG_PRIVATE_REALLOCATED) == 0 )
         {
-            p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
+            *pp_block = p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
             if( !p_block )
-                return NULL;
-            *pp_block = p_block;
+                goto end;
             p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
             memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE );
 
@@ -439,7 +405,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error )
                 p_converted->i_length = date_Increment( &p_sys->end_date,
                                                       p_converted->i_nb_samples ) - p_converted->i_pts;
 
-                block_ChainLastAppend( &p_sys->pp_decoded_last, p_converted );
+                decoder_QueueAudio( p_dec, p_converted );
             }
 
             /* Prepare new frame */
@@ -456,30 +422,35 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error )
         }
     };
 
-    return ( p_sys->p_decoded ) ? DequeueOneDecodedFrame( p_sys ) : NULL;
+    return VLCDEC_SUCCESS;
 
 end:
-    *error = true;
+    b_error = true;
+drop:
     if( pp_block )
     {
         assert( *pp_block == p_block );
         *pp_block = NULL;
     }
-drop:
     if( p_block != NULL )
         block_Release(p_block);
     if( frame != NULL )
         av_frame_free( &frame );
-    return NULL;
+
+    return (b_error) ? VLCDEC_ECRITICAL : VLCDEC_SUCCESS;
 }
 
 static int DecodeAudio( decoder_t *p_dec, block_t *p_block )
 {
-    bool error = false;
-    block_t **pp_block = p_block ? &p_block : NULL, *p_out;
-    while( ( p_out = DecodeBlock( p_dec, pp_block, &error ) ) != NULL )
-        decoder_QueueAudio( p_dec, p_out );
-    return error ? VLCDEC_ECRITICAL : VLCDEC_SUCCESS;
+    block_t **pp_block = p_block ? &p_block : NULL;
+    int i_ret;
+    do
+    {
+        i_ret = DecodeBlock( p_dec, pp_block );
+    }
+    while( i_ret == VLCDEC_SUCCESS && pp_block && *pp_block );
+
+    return i_ret;
 }
 
 static block_t * ConvertAVFrame( decoder_t *p_dec, AVFrame *frame )



More information about the vlc-commits mailing list