From 4542ac05ed5dbce40d9adcb3feb320a76b62a1c2 Mon Sep 17 00:00:00 2001
From: Ivan Uskov <ivan.uskov@nablet.com>
Date: Mon, 20 Jul 2015 12:42:16 -0400
Subject: [PATCH 2/4] libavcodec/qsvdec_h264.c: refactoring: functional of
 qsv_process_data() has been moved into qsvdec.c

---
 libavcodec/qsvdec.c      | 19 +++++++++++++++++++
 libavcodec/qsvdec.h      |  2 ++
 libavcodec/qsvdec_h264.c | 20 +-------------------
 3 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 8b06611..3be1c75 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -123,6 +123,7 @@ int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt)
     if (!q->async_fifo)
         return AVERROR(ENOMEM);
 
+    q->ready = 1;
 
     return 0;
 }
@@ -218,6 +219,17 @@ static QSVFrame *find_frame(QSVContext *q, mfxFrameSurface1 *surf)
     }
     return NULL;
 }
+static int ff_qsv_prepare(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt)
+{
+    int ret;
+
+    ret = ff_qsv_decode_init(avctx, q, avpkt);
+    /* consume packet without a header */
+    if (AVERROR(EAGAIN)==ret)
+        return avpkt->size;
+
+    return ret;
+}
 
 int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
                   AVFrame *frame, int *got_frame,
@@ -230,6 +242,11 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
     mfxBitstream bs = { { { 0 } } };
     int ret;
 
+    if (!q->ready) {
+        ret = ff_qsv_prepare(avctx, q, avpkt);
+        if (ret)
+            return ret;
+    }
     if (avpkt->size) {
         bs.Data       = avpkt->data;
         bs.DataLength = avpkt->size;
@@ -325,5 +342,7 @@ int ff_qsv_decode_close(QSVContext *q)
 
     ff_qsv_close_internal_session(&q->internal_qs);
 
+    q->ready = 0;
+
     return 0;
 }
diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h
index 4d3c505..24c565c 100644
--- a/libavcodec/qsvdec.h
+++ b/libavcodec/qsvdec.h
@@ -50,6 +50,8 @@ typedef struct QSVContext {
 
     AVFifoBuffer *async_fifo;
 
+    int ready;
+
     // options set by the caller
     int async_depth;
     int iopattern;
diff --git a/libavcodec/qsvdec_h264.c b/libavcodec/qsvdec_h264.c
index 8b3f916..314eb6c 100644
--- a/libavcodec/qsvdec_h264.c
+++ b/libavcodec/qsvdec_h264.c
@@ -101,24 +101,6 @@ fail:
     return ret;
 }
 
-static int qsv_process_data(AVCodecContext *avctx, AVFrame *frame,
-                            int *got_frame, AVPacket *pkt)
-{
-    QSVH264Context *s = avctx->priv_data;
-    int ret;
-
-    if (!s->qsv.session || AV_PIX_FMT_NONE==avctx->pix_fmt) {
-        ret = ff_qsv_decode_init(avctx, &s->qsv, pkt);
-        /* consume packet without a header */
-        if (AVERROR(EAGAIN)==ret)
-            return pkt->size;
-        if (ret < 0)
-            return ret;
-    }
-
-    return ff_qsv_decode(avctx, &s->qsv, frame, got_frame, pkt);
-}
-
 static int qsv_decode_frame(AVCodecContext *avctx, void *data,
                             int *got_frame, AVPacket *avpkt)
 {
@@ -171,7 +153,7 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data,
             s->pkt_filtered.size = size;
         }
 
-        ret = qsv_process_data(avctx, frame, got_frame, &s->pkt_filtered);
+        ret = ff_qsv_decode(avctx, &s->qsv, frame, got_frame, &s->pkt_filtered);
         if (ret < 0)
             return ret;
 
-- 
1.8.3.1

