[FFmpeg-devel] [PATCH 3/4] lavc/mediacodec: rely on buffer flags to detect end of stream

Matthieu Bouron matthieu.bouron at gmail.com
Tue Jun 21 14:41:22 CEST 2016


From: Matthieu Bouron <matthieu.bouron at stupeflix.com>

---
 libavcodec/mediacodecdec.c | 17 ++++++++---------
 libavcodec/mediacodecdec.h |  3 +--
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index 75933fc..7cef90b 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -396,7 +396,7 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
         need_flushing = 1;
     }
 
-    if (s->flushing && need_flushing && s->queued_buffer_nb <= 0) {
+    if (s->flushing && s->eos) {
         return 0;
     }
 
@@ -443,10 +443,6 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
                 av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status);
                 return AVERROR_EXTERNAL;
             }
-
-            s->queued_buffer_nb++;
-            if (s->queued_buffer_nb > s->queued_buffer_max)
-                s->queued_buffer_max = s->queued_buffer_nb;
         }
     }
 
@@ -474,6 +470,10 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
                 " flags=%" PRIu32 "\n", index, info.offset, info.size,
                 info.presentationTimeUs, info.flags);
 
+        if (info.flags & ff_AMediaCodec_getBufferFlagEndOfStream(codec)) {
+            s->eos = 1;
+        }
+
         if (info.size) {
             data = ff_AMediaCodec_getOutputBuffer(codec, index, &size);
             if (!data) {
@@ -487,7 +487,6 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
             }
 
             *got_frame = 1;
-            s->queued_buffer_nb--;
             s->dequeued_buffer_nb++;
         } else {
             status = ff_AMediaCodec_releaseOutputBuffer(codec, index, 0);
@@ -528,8 +527,8 @@ int ff_mediacodec_dec_decode(AVCodecContext *avctx, MediaCodecDecContext *s,
     } else if (ff_AMediaCodec_infoTryAgainLater(codec, index)) {
         if (s->flushing) {
             av_log(avctx, AV_LOG_ERROR, "Failed to dequeue output buffer within %" PRIi64 "ms "
-                                        "while flushing remaining frames, output will probably lack last %d frames\n",
-                                        output_dequeue_timeout_us / 1000, s->queued_buffer_nb);
+                                        "while flushing remaining frames, output will probably lack frames\n",
+                                        output_dequeue_timeout_us / 1000);
         } else {
             av_log(avctx, AV_LOG_DEBUG, "No output buffer available, try again later\n");
         }
@@ -546,10 +545,10 @@ int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
     FFAMediaCodec *codec = s->codec;
     int status;
 
-    s->queued_buffer_nb = 0;
     s->dequeued_buffer_nb = 0;
 
     s->flushing = 0;
+    s->eos = 0;
 
     status = ff_AMediaCodec_flush(codec);
     if (status < 0) {
diff --git a/libavcodec/mediacodecdec.h b/libavcodec/mediacodecdec.h
index 36fdbf5..646b628 100644
--- a/libavcodec/mediacodecdec.h
+++ b/libavcodec/mediacodecdec.h
@@ -41,6 +41,7 @@ typedef struct MediaCodecDecContext {
 
     int started;
     int flushing;
+    int eos;
 
     int width;
     int height;
@@ -53,8 +54,6 @@ typedef struct MediaCodecDecContext {
     int crop_left;
     int crop_right;
 
-    int queued_buffer_nb;
-    int queued_buffer_max;
     uint64_t dequeued_buffer_nb;
 
     int first_buffer;
-- 
2.8.3



More information about the ffmpeg-devel mailing list