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