summaryrefslogtreecommitdiff
path: root/libavcodec/qsvdec.c
diff options
context:
space:
mode:
authorIvan Uskov <ivan.uskov@nablet.com>2015-07-23 05:14:41 -0400
committerMichael Niedermayer <michael@niedermayer.cc>2015-07-23 17:10:39 +0200
commitd50ab820dacf0d070805889ff69ec1f03401d835 (patch)
tree25c9a540119e666610f870314509430a4ea1f660 /libavcodec/qsvdec.c
parentfd7eadd25c77307ef8398b5f0307b18050ee070a (diff)
libavcodec/qsvdec_h264.c: refactoring: functionality of qsv_process_data() has been moved into qsvdec.c
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/qsvdec.c')
-rw-r--r--libavcodec/qsvdec.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 8b06611f1d..4e7a0ac271 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -92,7 +92,10 @@ int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt)
ret = MFXVideoDECODE_DecodeHeader(q->session, &bs, &param);
if (MFX_ERR_MORE_DATA==ret) {
- return AVERROR(EAGAIN);
+ /* this code means that header not found so we return packet size to skip
+ a current packet
+ */
+ return avpkt->size;
} else if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Decode header error %d\n", ret);
return ff_qsv_error(ret);
@@ -123,6 +126,7 @@ int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt)
if (!q->async_fifo)
return AVERROR(ENOMEM);
+ q->engine_ready = 1;
return 0;
}
@@ -230,6 +234,11 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
mfxBitstream bs = { { { 0 } } };
int ret;
+ if (!q->engine_ready) {
+ ret = ff_qsv_decode_init(avctx, q, avpkt);
+ if (ret)
+ return ret;
+ }
if (avpkt->size) {
bs.Data = avpkt->data;
bs.DataLength = avpkt->size;
@@ -325,5 +334,7 @@ int ff_qsv_decode_close(QSVContext *q)
ff_qsv_close_internal_session(&q->internal_qs);
+ q->engine_ready = 0;
+
return 0;
}