---
libavcodec/qsv.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index aaa3291..8dc68ab 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -275,17 +275,21 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
mfxFrameSurface1 *insurf;
mfxFrameSurface1 *outsurf;
mfxSyncPoint sync;
- int ret, i = 0;
- int size = avpkt->size;
+ mfxBitstream *bs = &q->bs;
+ int size = avpkt->size;
+ int ret, i;
*got_frame = 0;
- ff_packet_list_put(&q->pending, &q->pending_end, avpkt);
+ if (size)
+ ff_packet_list_put(&q->pending, &q->pending_end, avpkt);
ret = q->last_ret;
do {
if (ret == MFX_ERR_MORE_DATA) {
- if (q->pending) {
+ if (!bs) {
+ break;
+ } else if (q->pending) {
AVPacket pkt = { 0 };
ff_packet_list_get(&q->pending, &q->pending_end, &pkt);
@@ -300,6 +304,9 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
if (ret < 0)
return ret;
+ } else if (!size) {
+ // Flush cached frames when EOF
+ bs = NULL;
} else {
break;
}
@@ -308,7 +315,7 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
if (!(insurf = get_surface(q)))
break;
- ret = MFXVideoDECODE_DecodeFrameAsync(q->session, &q->bs,
+ ret = MFXVideoDECODE_DecodeFrameAsync(q->session, bs,
insurf, &outsurf, &sync);
} while (ret == MFX_ERR_MORE_SURFACE || ret == MFX_ERR_MORE_DATA);
--
1.8.3.msysgit.0
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel