From: Yukinori Yamazoe <[email protected]>
Signed-off-by: Luca Barbato <[email protected]>
---
When does it happen?
libavcodec/qsv.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 180302e..cd6c7b3 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -275,13 +275,15 @@ 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;
AVPacket pkt;
*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_decode_status;
do {
@@ -300,6 +302,9 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
if (ret < 0)
return ret;
+ } else if (!size && bs) {
+ // Flush any internally cached frames because avpkt->size is
zero
+ bs = NULL;
} else {
break;
}
@@ -308,7 +313,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.2
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel