This allows we add mfxExtBuffer per frame later.
Showing the changes to libavfilter (2 of 2 files). Show all
Unified · Split
| @@ -736,6 +736,11 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) · 735 unmodified lines | ||
| 736 | 736 | return 0; |
| 737 | 737 | } |
| 738 | 738 | |
| 739 | +static int set_frame_ext_params_null(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp) | |
| 740 | +{ | |
| 741 | + return 0; | |
| 742 | +} | |
| 743 | + | |
| 739 | 744 | int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param) |
| 740 | 745 | { |
| 741 | 746 | int i; |
| @@ -747,6 +752,10 @@ int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param) · 5 unmodified lines | ||
| 747 | 752 | s->filter_frame = ff_filter_frame; |
| 748 | 753 | s->out_sw_format = param->out_sw_format; |
| 749 | 754 | |
| 755 | + s->set_frame_ext_params = param->set_frame_ext_params; | |
| 756 | + if (!s->set_frame_ext_params) | |
| 757 | + s->set_frame_ext_params = set_frame_ext_params_null; | |
| 758 | + | |
| 750 | 759 | /* create the vpp session */ |
| 751 | 760 | ret = init_vpp_session(avctx, s); |
| 752 | 761 | if (ret < 0) |
| @@ -873,27 +882,53 @@ failed: · 120 unmodified lines | ||
| 873 | 882 | static int qsvvpp_init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s, const QSVFrame *in, QSVFrame *out) |
| 874 | 883 | { |
| 875 | 884 | int ret; |
| 885 | + mfxExtBuffer *ext_param[QSVVPP_MAX_FRAME_EXTBUFS]; | |
| 886 | + QSVVPPFrameParam fp = { 0, ext_param }; | |
| 876 | 887 | |
| 877 | − if (s->vpp_initted) | |
| 878 | − return 0; | |
| 888 | + ret = s->set_frame_ext_params(avctx, in->frame, out->frame, &fp); | |
| 889 | + if (ret) | |
| 890 | + return ret; | |
| 879 | 891 | |
| 880 | − s->vpp_param.vpp.In.PicStruct = in->surface.Info.PicStruct; | |
| 881 | − s->vpp_param.vpp.Out.PicStruct = out->surface.Info.PicStruct; | |
| 892 | + if (fp.num_ext_buf) { | |
| 893 | + av_freep(&s->ext_buffers); | |
| 894 | + s->nb_ext_buffers = s->nb_seq_buffers + fp.num_ext_buf; | |
| 882 | 895 | |
| 883 | − /* Query VPP params again, including params for frame */ | |
| 884 | − ret = MFXVideoVPP_Query(s->session, &s->vpp_param, &s->vpp_param); | |
| 885 | − if (ret < 0) | |
| 886 | − return ff_qsvvpp_print_error(avctx, ret, "Error querying VPP params"); | |
| 887 | − else if (ret > 0) | |
| 888 | − ff_qsvvpp_print_warning(avctx, ret, "Warning When querying VPP params"); | |
| 896 | + s->ext_buffers = av_calloc(s->nb_ext_buffers, sizeof(*s->ext_buffers)); | |
| 897 | + if (!s->ext_buffers) | |
| 898 | + return AVERROR(ENOMEM); | |
| 889 | 899 | |
| 890 | − ret = MFXVideoVPP_Init(s->session, &s->vpp_param); | |
| 891 | − if (ret < 0) | |
| 892 | − return ff_qsvvpp_print_error(avctx, ret, "Failed to create a qsvvpp"); | |
| 893 | − else if (ret > 0) | |
| 894 | − ff_qsvvpp_print_warning(avctx, ret, "Warning When creating qsvvpp"); | |
| 900 | + memcpy(&s->ext_buffers[0], s->seq_buffers, s->nb_seq_buffers * sizeof(*s->seq_buffers)); | |
| 901 | + memcpy(&s->ext_buffers[s->nb_seq_buffers], fp.ext_buf, fp.num_ext_buf * sizeof(*fp.ext_buf)); | |
| 902 | + s->vpp_param.ExtParam = s->ext_buffers; | |
| 903 | + s->vpp_param.NumExtParam = s->nb_ext_buffers; | |
| 904 | + } | |
| 905 | + | |
| 906 | + if (!s->vpp_initted) { | |
| 907 | + s->vpp_param.vpp.In.PicStruct = in->surface.Info.PicStruct; | |
| 908 | + s->vpp_param.vpp.Out.PicStruct = out->surface.Info.PicStruct; | |
| 909 | + | |
| 910 | + /* Query VPP params again, including params for frame */ | |
| 911 | + ret = MFXVideoVPP_Query(s->session, &s->vpp_param, &s->vpp_param); | |
| 912 | + if (ret < 0) | |
| 913 | + return ff_qsvvpp_print_error(avctx, ret, "Error querying VPP params"); | |
| 914 | + else if (ret > 0) | |
| 915 | + ff_qsvvpp_print_warning(avctx, ret, "Warning When querying VPP params"); | |
| 916 | + | |
| 917 | + ret = MFXVideoVPP_Init(s->session, &s->vpp_param); | |
| 918 | + if (ret < 0) | |
| 919 | + return ff_qsvvpp_print_error(avctx, ret, "Failed to create a qsvvpp"); | |
| 920 | + else if (ret > 0) | |
| 921 | + ff_qsvvpp_print_warning(avctx, ret, "Warning When creating qsvvpp"); | |
| 895 | 922 | |
| 896 | − s->vpp_initted = 1; | |
| 923 | + s->vpp_initted = 1; | |
| 924 | + } else if (fp.num_ext_buf) { | |
| 925 | + ret = MFXVideoVPP_Reset(s->session, &s->vpp_param); | |
| 926 | + if (ret < 0) { | |
| 927 | + ret = ff_qsvvpp_print_error(avctx, ret, "Failed to reset session for qsvvpp"); | |
| 928 | + return ret; | |
| 929 | + } else if (ret > 0) | |
| 930 | + ff_qsvvpp_print_warning(avctx, ret, "Warning When resetting session for qsvvpp"); | |
| 931 | + } | |
| 897 | 932 | |
| 898 | 933 | return 0; |
| 899 | 934 | } |
| @@ -52,11 +52,20 @@ typedef struct QSVFrame { · 51 unmodified lines | ||
| 52 | 52 | int queued; |
| 53 | 53 | } QSVFrame; |
| 54 | 54 | |
| 55 | +#define QSVVPP_MAX_FRAME_EXTBUFS 8 | |
| 56 | + | |
| 57 | +typedef struct QSVVPPFrameParam { | |
| 58 | + /* To fill with MFX enhanced filter configurations */ | |
| 59 | + int num_ext_buf; | |
| 60 | + mfxExtBuffer **ext_buf; | |
| 61 | +} QSVVPPFrameParam; | |
| 62 | + | |
| 55 | 63 | typedef struct QSVVPPContext { |
| 56 | 64 | const AVClass *class; |
| 57 | 65 | |
| 58 | 66 | mfxSession session; |
| 59 | 67 | int (*filter_frame) (AVFilterLink *outlink, AVFrame *frame); /**< callback */ |
| 68 | + int (*set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp); /**< callbak */ | |
| 60 | 69 | enum AVPixelFormat out_sw_format; /**< Real output format */ |
| 61 | 70 | mfxVideoParam vpp_param; |
| 62 | 71 | mfxFrameInfo *frame_infos; /**< frame info for each input */ |
| @@ -101,6 +110,7 @@ typedef struct QSVVPPCrop { · 38 unmodified lines | ||
| 101 | 110 | typedef struct QSVVPPParam { |
| 102 | 111 | /* default is ff_filter_frame */ |
| 103 | 112 | int (*filter_frame)(AVFilterLink *outlink, AVFrame *frame); |
| 113 | + int (*set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp); /**< callbak */ | |
| 104 | 114 | |
| 105 | 115 | /* To fill with MFX enhanced filter configurations */ |
| 106 | 116 | int num_ext_buf; |