From: Yukinori Yamazoe <[email protected]>

Signed-off-by: Luca Barbato <[email protected]>
---

I'm not convinced it is an improvement.

 libavcodec/qsv.c      | 37 ++++++++++++++++++++++++++++++++++---
 libavcodec/qsv_h264.c | 25 ++-----------------------
 2 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 4634bcc..ea09281 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -84,6 +84,28 @@ static int codec_id_to_mfx(enum AVCodecID codec_id)
     return AVERROR(ENOSYS);
 }

+static int pix_fmt_to_mfx_chroma(enum AVPixelFormat pix_fmt)
+{
+    switch (pix_fmt) {
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUV420P9:
+    case AV_PIX_FMT_YUV420P10:
+        return MFX_CHROMAFORMAT_YUV420;
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUV422P9:
+    case AV_PIX_FMT_YUV422P10:
+        return MFX_CHROMAFORMAT_YUV422;
+    case AV_PIX_FMT_YUV444P:
+    case AV_PIX_FMT_YUV444P9:
+    case AV_PIX_FMT_YUV444P10:
+        return MFX_CHROMAFORMAT_YUV444;
+    default:
+        break;
+    }
+
+    return AVERROR(ENOSYS);
+}
+
 static void reset_timestamps(QSVContext *q)
 {
     for (int i = 0; i < q->nb_timestamps; i++)
@@ -103,6 +125,18 @@ int ff_qsv_init(AVCodecContext *c, QSVContext *q)

     q->param.mfx.CodecId = ret;

+    // replacement for MFXVideoDECODE_DecodeHeader()
+    if ((ret = pix_fmt_to_mfx_chroma(c->pix_fmt)) < 0)
+        return ret;
+    q->param.mfx.FrameInfo.ChromaFormat  = ret;
+    q->param.mfx.FrameInfo.FourCC        = MFX_FOURCC_NV12;
+    q->param.mfx.FrameInfo.Width         = FFALIGN(c->width, 16);
+    q->param.mfx.FrameInfo.Height        = FFALIGN(c->height, 32);
+    q->param.mfx.FrameInfo.FrameRateExtN = c->time_base.den;
+    q->param.mfx.FrameInfo.FrameRateExtD = c->time_base.num * 
c->ticks_per_frame;
+
+    c->pix_fmt = AV_PIX_FMT_NV12;
+
     if ((ret = MFXInit(impl, &ver, &q->session)) < 0)
         return ff_qsv_error(ret);

@@ -121,9 +155,6 @@ int ff_qsv_init(AVCodecContext *c, QSVContext *q)
     q->param.IOPattern  = MFX_IOPATTERN_OUT_SYSTEM_MEMORY;
     q->param.AsyncDepth = ASYNC_DEPTH_DEFAULT;

-    if ((ret = MFXVideoDECODE_DecodeHeader(q->session, bs, &q->param)) < 0)
-        return ff_qsv_error(ret);
-
     bs->DataFlag   = MFX_BITSTREAM_COMPLETE_FRAME;
     bs->DataLength = bs->DataOffset = 0;

diff --git a/libavcodec/qsv_h264.c b/libavcodec/qsv_h264.c
index f07e770..e696427 100644
--- a/libavcodec/qsv_h264.c
+++ b/libavcodec/qsv_h264.c
@@ -36,42 +36,21 @@ typedef struct QSVH264Context {
     AVBitStreamFilterContext *bsf;
 } QSVH264Context;

-static const uint8_t fake_idr[] = { 0x00, 0x00, 0x01, 0x65 };
-
 static av_cold int qsv_dec_init(AVCodecContext *avctx)
 {
-    QSVH264Context *q        = avctx->priv_data;
-    mfxBitstream *bs         = &q->qsv.bs;
+    QSVH264Context *q = avctx->priv_data;
     int ret;

     if (avctx->ticks_per_frame == 1)
         avctx->time_base.den *= 2;
     avctx->ticks_per_frame = 2;

-    avctx->pix_fmt = AV_PIX_FMT_NV12;
-
     if (!(q->bsf = av_bitstream_filter_init("h264_mp4toannexb")))
         return AVERROR(ENOMEM);

-    // Data and DataLength passed as dummy pointers
-    av_bitstream_filter_filter(q->bsf, avctx, NULL,
-                               &bs->Data, &bs->DataLength,
-                               NULL, 0, 0);
-
-    //FIXME feed it a fake IDR directly
-    bs->Data = av_malloc(avctx->extradata_size + sizeof(fake_idr));
-    bs->DataLength = avctx->extradata_size;
-
-    memcpy(bs->Data, avctx->extradata, avctx->extradata_size);
-    memcpy(bs->Data + bs->DataLength, fake_idr, sizeof(fake_idr));
-
-    bs->DataLength += sizeof(fake_idr);
-
-    bs->MaxLength = bs->DataLength;
-
     ret = ff_qsv_init(avctx, &q->qsv);
     if (ret < 0) {
-        av_freep(bs->Data);
+        av_freep(&q->qsv.bs.Data);
         av_bitstream_filter_close(q->bsf);
     }

--
1.8.3.2

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to