diff mbox

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

Message ID 20180503022500.76182-3-ffmpeg@tmm1.net
State Accepted
Commit a75bb5496ac6e7e194f1c6fd3b87f02a52e74adb
Headers show

Commit Message

Aman Gupta May 3, 2018, 2:24 a.m. UTC
From: Aman Gupta <aman@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@tmm1.net>
---
 libavcodec/mediacodecdec_common.c | 8 +-------
 libavcodec/mediacodecdec_common.h | 1 -
 2 files changed, 1 insertion(+), 8 deletions(-)

Comments

Matthieu Bouron May 3, 2018, 7:34 a.m. UTC | #1
On Wed, May 02, 2018 at 07:24:59PM -0700, Aman Gupta wrote:
> From: Aman Gupta <aman@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@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.
diff mbox

Patch

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;