|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef AVFILTER_QSVVPP_H |
|
#define AVFILTER_QSVVPP_H |
|
|
|
#include <mfxvideo.h> |
|
|
|
#include "avfilter.h" |
|
#include "libavutil/fifo.h" |
|
#include "libavutil/hwcontext.h" |
|
#include "libavutil/hwcontext_qsv.h" |
|
|
|
#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 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))) |
|
|
|
#define QSV_ONEVPL QSV_VERSION_ATLEAST(2, 0) |
|
#define QSV_HAVE_OPAQUE !QSV_ONEVPL |
|
|
|
typedef struct QSVFrame { |
|
AVFrame *frame; |
|
mfxFrameSurface1 surface; |
|
struct QSVFrame *next; |
|
int queued; |
|
} QSVFrame; |
|
|
|
#define QSVVPP_MAX_FRAME_EXTBUFS 8 |
|
|
|
typedef struct QSVVPPFrameParam { |
|
|
|
int num_ext_buf; |
|
mfxExtBuffer **ext_buf; |
|
} QSVVPPFrameParam; |
|
|
|
typedef struct QSVVPPContext { |
|
const AVClass *class; |
|
|
|
mfxSession session; |
|
int (*filter_frame) (AVFilterLink *outlink, AVFrame *frame); |
|
int (*set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp); |
|
enum AVPixelFormat out_sw_format; |
|
mfxVideoParam vpp_param; |
|
mfxFrameInfo *frame_infos; |
|
|
|
|
|
int in_mem_mode; |
|
int out_mem_mode; |
|
QSVFrame *in_frame_list; |
|
QSVFrame *out_frame_list; |
|
int nb_surface_ptrs_in; |
|
int nb_surface_ptrs_out; |
|
mfxFrameSurface1 **surface_ptrs_in; |
|
mfxFrameSurface1 **surface_ptrs_out; |
|
|
|
#if QSV_HAVE_OPAQUE |
|
|
|
mfxExtOpaqueSurfaceAlloc opaque_alloc; |
|
#endif |
|
|
|
mfxExtBuffer **seq_buffers; |
|
int nb_seq_buffers; |
|
|
|
|
|
mfxExtBuffer **ext_buffers; |
|
int nb_ext_buffers; |
|
|
|
int got_frame; |
|
int async_depth; |
|
int eof; |
|
|
|
AVFifo *async_fifo; |
|
|
|
mfxVersion ver; |
|
int vpp_initted; |
|
} QSVVPPContext; |
|
|
|
typedef struct QSVVPPCrop { |
|
int in_idx; |
|
int x, y, w, h; |
|
} QSVVPPCrop; |
|
|
|
typedef struct QSVVPPParam { |
|
|
|
int (*filter_frame)(AVFilterLink *outlink, AVFrame *frame); |
|
int (*set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp); |
|
|
|
|
|
int num_ext_buf; |
|
mfxExtBuffer **ext_buf; |
|
|
|
|
|
enum AVPixelFormat out_sw_format; |
|
|
|
|
|
int num_crop; |
|
QSVVPPCrop *crop; |
|
} QSVVPPParam; |
|
|
|
|
|
int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param); |
|
|
|
|
|
int ff_qsvvpp_close(AVFilterContext *avctx); |
|
|
|
|
|
int ff_qsvvpp_filter_frame(QSVVPPContext *vpp, AVFilterLink *inlink, AVFrame *frame); |
|
|
|
int ff_qsvvpp_print_iopattern(void *log_ctx, int mfx_iopattern, |
|
const char *extra_string); |
|
|
|
int ff_qsvvpp_print_error(void *log_ctx, mfxStatus err, |
|
const char *error_string); |
|
|
|
int ff_qsvvpp_print_warning(void *log_ctx, mfxStatus err, |
|
const char *warning_string); |
|
|
|
int ff_qsvvpp_create_mfx_session(void *ctx, void *loader, mfxIMPL implementation, |
|
mfxVersion *pver, mfxSession *psession); |
|
|
|
AVFrame *ff_qsvvpp_get_video_buffer(AVFilterLink *inlink, int w, int h); |
|
#endif |
|
|