]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/qsvdec.c
avcodec/mpeg12enc: extend QP range to 28 for non linear quantizers
[ffmpeg] / libavcodec / qsvdec.c
index 9d69c1afe9faa0df926429c6584056c9208e28da..8fa44b5ca1d6b3fe047c4164beff6855f7929199 100644 (file)
@@ -66,7 +66,8 @@ int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt)
             q->nb_ext_buffers = qsv->nb_ext_buffers;
         }
         if (!q->session) {
-            ret = ff_qsv_init_internal_session(avctx, &q->internal_qs, NULL);
+            ret = ff_qsv_init_internal_session(avctx, &q->internal_qs,
+                                               q->load_plugins);
             if (ret < 0)
                 return ret;
 
@@ -125,10 +126,12 @@ int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt)
        HEVC which is 16 for both cases.
        So weare  pre-allocating fifo big enough for 17 elements:
      */
-    q->async_fifo = av_fifo_alloc((1 + 16) *
-                                  (sizeof(mfxSyncPoint) + sizeof(QSVFrame*)));
-    if (!q->async_fifo)
-        return AVERROR(ENOMEM);
+    if (!q->async_fifo) {
+        q->async_fifo = av_fifo_alloc((1 + 16) *
+                                      (sizeof(mfxSyncPoint) + sizeof(QSVFrame*)));
+        if (!q->async_fifo)
+            return AVERROR(ENOMEM);
+    }
 
     q->input_fifo = av_fifo_alloc(1024*16);
     if (!q->input_fifo)
@@ -313,7 +316,7 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
                                                   insurf, &outsurf, &sync);
             if (ret != MFX_WRN_DEVICE_BUSY)
                 break;
-            av_usleep(1);
+            av_usleep(500);
         } while (1);
 
         if (MFX_WRN_VIDEO_PARAM_CHANGED==ret) {
@@ -339,6 +342,13 @@ int ff_qsv_decode(AVCodecContext *avctx, QSVContext *q,
             break;
     }
 
+    /* make sure we do not enter an infinite loop if the SDK
+     * did not consume any data and did not return anything */
+    if (!sync && !bs.DataOffset) {
+        av_log(avctx, AV_LOG_WARNING, "A decode call did not consume any data\n");
+        bs.DataOffset = avpkt->size;
+    }
+
     if (buffered) {
         qsv_fifo_relocate(q->input_fifo, bs.DataOffset);
     } else if (bs.DataOffset!=avpkt->size) {