[FFmpeg-devel] [PATCH v2 3/4] avcodec/mediacodecdec: wait on first frame after input buffers are full

Matthieu Bouron matthieu.bouron at gmail.com
Thu May 3 10:34:10 EEST 2018


On Wed, May 02, 2018 at 07:24:59PM -0700, Aman Gupta wrote:
> From: Aman Gupta <aman at tmm1.net>
> 
> The output_buffer_count==0 special case is no longer required, and
> can cause spurious EAGAIN to surface to the user when input buffers
> are filled up. Since the caller now knows if the decoder is accepting
> new input (via current_input_buffer>=0), let the wait parameter
> control whether we block or not.
> 
> Signed-off-by: Aman Gupta <aman at tmm1.net>
> ---
>  libavcodec/mediacodecdec_common.c | 8 +-------
>  libavcodec/mediacodecdec_common.h | 1 -
>  2 files changed, 1 insertion(+), 8 deletions(-)
> 
> diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
> index 887865a281..40a2ee6778 100644
> --- a/libavcodec/mediacodecdec_common.c
> +++ b/libavcodec/mediacodecdec_common.c
> @@ -443,8 +443,6 @@ static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContex
>      FFAMediaCodec *codec = s->codec;
>      int status;
>  
> -    s->output_buffer_count = 0;
> -
>      s->draining = 0;
>      s->flushing = 0;
>      s->eos = 0;
> @@ -672,10 +670,7 @@ int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s,
>          /* If the codec is flushing or need to be flushed, block for a fair
>           * amount of time to ensure we got a frame */
>          output_dequeue_timeout_us = OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US;
> -    } else if (s->output_buffer_count == 0 || !wait) {
> -        /* If the codec hasn't produced any frames, do not block so we
> -         * can push data to it as fast as possible, and get the first
> -         * frame */
> +    } else if (!wait) {
>          output_dequeue_timeout_us = 0;
>      }
>  
> @@ -709,7 +704,6 @@ int ff_mediacodec_dec_receive(AVCodecContext *avctx, MediaCodecDecContext *s,
>                  }
>              }
>  
> -            s->output_buffer_count++;
>              return 0;
>          } else {
>              status = ff_AMediaCodec_releaseOutputBuffer(codec, index, 0);
> diff --git a/libavcodec/mediacodecdec_common.h b/libavcodec/mediacodecdec_common.h
> index 0b21129fee..d280236b8e 100644
> --- a/libavcodec/mediacodecdec_common.h
> +++ b/libavcodec/mediacodecdec_common.h
> @@ -64,7 +64,6 @@ typedef struct MediaCodecDecContext {
>      int display_width;
>      int display_height;
>  
> -    uint64_t output_buffer_count;
>      ssize_t current_input_buffer;
>  
>      bool delay_flush;
> -- 
> 2.14.2
> 

LGTM.

-- 
Matthieu B.


More information about the ffmpeg-devel mailing list