Browse Source

Merge commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42'

* commit 'cca5e4f040971db6de0bfe6968f00c021d8a9c42':
  qsv: adding Multi Frame Encode support

Merged-by: James Almer <jamrial@gmail.com>
tags/n4.0
James Almer 7 years ago
parent
commit
f790410b6b
10 changed files with 72 additions and 9 deletions
  1. +6
    -4
      libavcodec/qsv.c
  2. +4
    -0
      libavcodec/qsv_internal.h
  3. +14
    -0
      libavcodec/qsvenc.c
  4. +11
    -2
      libavcodec/qsvenc.h
  5. +4
    -0
      libavcodec/qsvenc_h264.c
  6. +6
    -3
      libavfilter/qsvvpp.c
  7. +8
    -0
      libavfilter/qsvvpp.h
  8. +7
    -0
      libavfilter/vf_deinterlace_qsv.c
  9. +7
    -0
      libavfilter/vf_scale_qsv.c
  10. +5
    -0
      libavutil/hwcontext_qsv.c

+ 6
- 4
libavcodec/qsv.c View File

@@ -617,10 +617,12 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
"Error setting a HW handle"); "Error setting a HW handle");
} }


err = MFXJoinSession(parent_session, session);
if (err != MFX_ERR_NONE)
return ff_qsv_print_error(avctx, err,
"Error joining session");
if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
err = MFXJoinSession(parent_session, session);
if (err != MFX_ERR_NONE)
return ff_qsv_print_error(avctx, err,
"Error joining session");
}


ret = qsv_load_plugins(session, load_plugins, avctx); ret = qsv_load_plugins(session, load_plugins, avctx);
if (ret < 0) { if (ret < 0) {


+ 4
- 0
libavcodec/qsv_internal.h View File

@@ -38,6 +38,10 @@
(MFX_VERSION_MAJOR > (MAJOR) || \ (MFX_VERSION_MAJOR > (MAJOR) || \
MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR)) MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))


#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
(MFX_VERSION.Major > (MAJOR)) || \
(MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))

typedef struct QSVMid { typedef struct QSVMid {
AVBufferRef *hw_frames_ref; AVBufferRef *hw_frames_ref;
mfxHDL handle; mfxHDL handle;


+ 14
- 0
libavcodec/qsvenc.c View File

@@ -651,6 +651,20 @@ FF_ENABLE_DEPRECATION_WARNINGS


q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2; q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2;
} }
#endif
#if QSV_HAVE_MF
if (avctx->codec_id == AV_CODEC_ID_H264) {
mfxVersion ver;
ret = MFXQueryVersion(q->session,&ver);
if (ret >= MFX_ERR_NONE && QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
q->extmfp.Header.BufferId = MFX_EXTBUFF_MULTI_FRAME_PARAM;
q->extmfp.Header.BufferSz = sizeof(q->extmfp);

q->extmfp.MFMode = q->mfmode;
av_log(avctx,AV_LOG_VERBOSE,"MFMode:%d\n", q->extmfp.MFMode);
q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extmfp;
}
}
#endif #endif
} }




+ 11
- 2
libavcodec/qsvenc.h View File

@@ -50,11 +50,13 @@
#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8) #define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8)
#define QSV_HAVE_VCM QSV_VERSION_ATLEAST(1, 8) #define QSV_HAVE_VCM QSV_VERSION_ATLEAST(1, 8)
#define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 11) #define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 11)
#define QSV_HAVE_MF 0
#else #else
#define QSV_HAVE_AVBR 0 #define QSV_HAVE_AVBR 0
#define QSV_HAVE_ICQ 0 #define QSV_HAVE_ICQ 0
#define QSV_HAVE_VCM 0 #define QSV_HAVE_VCM 0
#define QSV_HAVE_QVBR 0 #define QSV_HAVE_QVBR 0
#define QSV_HAVE_MF QSV_VERSION_ATLEAST(1, 25)
#endif #endif


#if !QSV_HAVE_LA_DS #if !QSV_HAVE_LA_DS
@@ -108,12 +110,15 @@ typedef struct QSVEncContext {
#if QSV_HAVE_CO2 #if QSV_HAVE_CO2
mfxExtCodingOption2 extco2; mfxExtCodingOption2 extco2;
#endif #endif

#if QSV_HAVE_MF
mfxExtMultiFrameParam extmfp;
mfxExtMultiFrameControl extmfc;
#endif
mfxExtOpaqueSurfaceAlloc opaque_alloc; mfxExtOpaqueSurfaceAlloc opaque_alloc;
mfxFrameSurface1 **opaque_surfaces; mfxFrameSurface1 **opaque_surfaces;
AVBufferRef *opaque_alloc_buf; AVBufferRef *opaque_alloc_buf;


mfxExtBuffer *extparam_internal[2 + QSV_HAVE_CO2];
mfxExtBuffer *extparam_internal[2 + QSV_HAVE_CO2 + (QSV_HAVE_MF * 2)];
int nb_extparam_internal; int nb_extparam_internal;


mfxExtBuffer **extparam; mfxExtBuffer **extparam;
@@ -158,6 +163,10 @@ typedef struct QSVEncContext {
int recovery_point_sei; int recovery_point_sei;


int a53_cc; int a53_cc;

#if QSV_HAVE_MF
int mfmode;
#endif
char *load_plugins; char *load_plugins;
SetEncodeCtrlCB *set_encode_ctrl_cb; SetEncodeCtrlCB *set_encode_ctrl_cb;
} QSVEncContext; } QSVEncContext;


+ 4
- 0
libavcodec/qsvenc_h264.c View File

@@ -145,6 +145,10 @@ static const AVOption options[] = {


{ "aud", "Insert the Access Unit Delimiter NAL", OFFSET(qsv.aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE}, { "aud", "Insert the Access Unit Delimiter NAL", OFFSET(qsv.aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE},


#if QSV_HAVE_MF
{ "mfmode", "Multi-Frame Mode", OFFSET(qsv.mfmode), AV_OPT_TYPE_INT, { .i64 = MFX_MF_AUTO }, 0, INT_MAX, VE },
#endif

{ NULL }, { NULL },
}; };




+ 6
- 3
libavfilter/qsvvpp.c View File

@@ -515,9 +515,12 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
if (ret != MFX_ERR_NONE) if (ret != MFX_ERR_NONE)
return AVERROR_UNKNOWN; return AVERROR_UNKNOWN;
} }
ret = MFXJoinSession(device_hwctx->session, s->session);
if (ret != MFX_ERR_NONE)
return AVERROR_UNKNOWN;

if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
ret = MFXJoinSession(device_hwctx->session, s->session);
if (ret != MFX_ERR_NONE)
return AVERROR_UNKNOWN;
}


if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) { if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) {
s->opaque_alloc.In.Surfaces = s->surface_ptrs_in; s->opaque_alloc.In.Surfaces = s->surface_ptrs_in;


+ 8
- 0
libavfilter/qsvvpp.h View File

@@ -31,6 +31,14 @@
#define FF_INLINK_IDX(link) ((int)((link)->dstpad - (link)->dst->input_pads)) #define FF_INLINK_IDX(link) ((int)((link)->dstpad - (link)->dst->input_pads))
#define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads)) #define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads))


#define QSV_VERSION_ATLEAST(MAJOR, MINOR) \
(MFX_VERSION_MAJOR > (MAJOR) || \
MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))

#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
(MFX_VERSION.Major > (MAJOR)) || \
(MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))

typedef struct QSVVPPContext QSVVPPContext; typedef struct QSVVPPContext QSVVPPContext;


typedef struct QSVVPPCrop { typedef struct QSVVPPCrop {


+ 7
- 0
libavfilter/vf_deinterlace_qsv.c View File

@@ -35,6 +35,7 @@
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "libavutil/time.h" #include "libavutil/time.h"
#include "libavfilter/qsvvpp.h"


#include "avfilter.h" #include "avfilter.h"
#include "formats.h" #include "formats.h"
@@ -215,6 +216,12 @@ static int init_out_session(AVFilterContext *ctx)
return AVERROR_UNKNOWN; return AVERROR_UNKNOWN;
} }


if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
err = MFXJoinSession(device_hwctx->session, s->session);
if (err != MFX_ERR_NONE)
return AVERROR_UNKNOWN;
}

memset(&par, 0, sizeof(par)); memset(&par, 0, sizeof(par));


s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING;


+ 7
- 0
libavfilter/vf_scale_qsv.c View File

@@ -36,6 +36,7 @@
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "libavutil/time.h" #include "libavutil/time.h"
#include "libavfilter/qsvvpp.h"


#include "avfilter.h" #include "avfilter.h"
#include "formats.h" #include "formats.h"
@@ -315,6 +316,12 @@ static int init_out_session(AVFilterContext *ctx)
return AVERROR_UNKNOWN; return AVERROR_UNKNOWN;
} }


if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
err = MFXJoinSession(device_hwctx->session, s->session);
if (err != MFX_ERR_NONE)
return AVERROR_UNKNOWN;
}

memset(&par, 0, sizeof(par)); memset(&par, 0, sizeof(par));


if (opaque) { if (opaque) {


+ 5
- 0
libavutil/hwcontext_qsv.c View File

@@ -1058,6 +1058,11 @@ static int qsv_device_derive_from_child(AVHWDeviceContext *ctx,
goto fail; goto fail;
} }


ret = MFXQueryVersion(hwctx->session,&ver);
if (ret == MFX_ERR_NONE) {
av_log(ctx, AV_LOG_VERBOSE, "MFX compile/runtime API: %d.%d/%d.%d\n",
MFX_VERSION_MAJOR, MFX_VERSION_MINOR, ver.Major, ver.Minor);
}
return 0; return 0;


fail: fail:


Loading…
Cancel
Save