mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-12-01 07:20:58 +00:00
lavf/vf_deinterlace_qsv: Enable the qsv deinterlace vpp
The current qsv deinterlace module does not work at all because MSDK needs user to pass extra parameters to enable hint functions,such as denoise,deinterlace,composition and so on. Usage:-hwaccel qsv -r 25 -c:v h264_qsv -i in -vf deinterlace_qsv=bob -b 2M -maxrate 3M -c:v h264_qsv -y out.h264 Signed-off-by: ChaoX A Liu <chaox.a.liu@gmail.com> Signed-off-by: Zhengxu Huang <zhengxu.maxwell@gmail.com> Signed-off-by: Andrew Zhang <huazh407@gmail.com> Change-Id: I9e7ddcf884f2788c2820f6c98affacfb9d8f3287 Signed-off-by: Maxym Dmytrychenko <maxim.d33@gmail.com>
This commit is contained in:
parent
2fd6e7d077
commit
550cb6a85d
@ -68,7 +68,9 @@ typedef struct QSVDeintContext {
|
||||
int nb_surface_ptrs;
|
||||
|
||||
mfxExtOpaqueSurfaceAlloc opaque_alloc;
|
||||
mfxExtBuffer *ext_buffers[1];
|
||||
mfxExtVPPDeinterlacing deint_conf;
|
||||
mfxExtBuffer *ext_buffers[2];
|
||||
int num_ext_buffers;
|
||||
|
||||
QSVFrame *work_frames;
|
||||
|
||||
@ -76,6 +78,9 @@ typedef struct QSVDeintContext {
|
||||
|
||||
int got_output_frame;
|
||||
int eof;
|
||||
|
||||
/* option for Deinterlacing algorithm to be used */
|
||||
int mode;
|
||||
} QSVDeintContext;
|
||||
|
||||
static void qsvdeint_uninit(AVFilterContext *ctx)
|
||||
@ -211,6 +216,12 @@ static int init_out_session(AVFilterContext *ctx)
|
||||
|
||||
memset(&par, 0, sizeof(par));
|
||||
|
||||
s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING;
|
||||
s->deint_conf.Header.BufferSz = sizeof(s->deint_conf);
|
||||
s->deint_conf.Mode = s->mode;
|
||||
|
||||
s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->deint_conf;
|
||||
|
||||
if (opaque) {
|
||||
s->surface_ptrs = av_mallocz_array(hw_frames_hwctx->nb_surfaces,
|
||||
sizeof(*s->surface_ptrs));
|
||||
@ -229,10 +240,7 @@ static int init_out_session(AVFilterContext *ctx)
|
||||
s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
|
||||
s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
|
||||
|
||||
s->ext_buffers[0] = (mfxExtBuffer*)&s->opaque_alloc;
|
||||
|
||||
par.ExtParam = s->ext_buffers;
|
||||
par.NumExtParam = FF_ARRAY_ELEMS(s->ext_buffers);
|
||||
s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->opaque_alloc;
|
||||
|
||||
par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
|
||||
} else {
|
||||
@ -260,6 +268,9 @@ static int init_out_session(AVFilterContext *ctx)
|
||||
par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
|
||||
}
|
||||
|
||||
par.ExtParam = s->ext_buffers;
|
||||
par.NumExtParam = s->num_ext_buffers;
|
||||
|
||||
par.AsyncDepth = 1; // TODO async
|
||||
|
||||
par.vpp.In = hw_frames_hwctx->surfaces[0].Info;
|
||||
@ -534,6 +545,9 @@ static int qsvdeint_request_frame(AVFilterLink *outlink)
|
||||
#define OFFSET(x) offsetof(QSVDeintContext, x)
|
||||
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM
|
||||
static const AVOption options[] = {
|
||||
{ "mode", "set deinterlace mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"},
|
||||
{ "bob", "bob algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"},
|
||||
{ "advanced", "Motion adaptive algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"},
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user