[FFmpeg-cvslog] lavc/mediacodec: rely on buffer flags to detect end of stream
Matthieu Bouron
git at videolan.org
Thu Jun 23 14:17:02 CEST 2016
ffmpeg | branch: master | Matthieu Bouron <matthieu.bouron at stupeflix.com> | Mon Jun 20 16:41:21 2016 +0200| [b316ebf46dd6b025bf116751cd6e0c6b0149f48c] | committer: Matthieu Bouron
lavc/mediacodec: rely on buffer flags to detect end of stream
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b316ebf46dd6b025bf116751cd6e0c6b0149f48c
---
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;
More information about the ffmpeg-cvslog
mailing list