diff options
author | Mark Thompson <sw@jkqxz.net> | 2018-02-12 22:55:24 +0000 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2018-02-12 22:55:24 +0000 |
commit | 6e050e0085b3f6f1109a0593aad63ec6e6bf23ff (patch) | |
tree | f93214750c1d5775df01ef29f6769b01b9374e4c | |
parent | a5ed07940c6929cadc44073f355cd15cfba7161e (diff) | |
parent | e4cdef00263dc8b3c8de9d34ceacd00dc68979c0 (diff) | |
download | ffmpeg-6e050e0085b3f6f1109a0593aad63ec6e6bf23ff.tar.gz |
Merge commit 'e4cdef00263dc8b3c8de9d34ceacd00dc68979c0'
* commit 'e4cdef00263dc8b3c8de9d34ceacd00dc68979c0':
vf_scale_qsv: Support increasing hardware frame pool size
Merged-by: Mark Thompson <sw@jkqxz.net>
-rw-r--r-- | libavfilter/vf_scale_qsv.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index a5f5be7d66..c6f683e6fa 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -71,7 +71,6 @@ enum var_name { typedef struct QSVScaleContext { const AVClass *class; - AVBufferRef *out_frames_ref; /* a clone of the main session, used internally for scaling */ mfxSession session; @@ -134,7 +133,6 @@ static void qsvscale_uninit(AVFilterContext *ctx) MFXClose(s->session); s->session = NULL; } - av_buffer_unref(&s->out_frames_ref); av_freep(&s->mem_ids_in); av_freep(&s->mem_ids_out); @@ -165,6 +163,7 @@ static int init_out_pool(AVFilterContext *ctx, int out_width, int out_height) { QSVScaleContext *s = ctx->priv; + AVFilterLink *outlink = ctx->outputs[0]; AVHWFramesContext *in_frames_ctx; AVHWFramesContext *out_frames_ctx; @@ -185,21 +184,25 @@ static int init_out_pool(AVFilterContext *ctx, in_format = in_frames_ctx->sw_format; out_format = (s->format == AV_PIX_FMT_NONE) ? in_format : s->format; - s->out_frames_ref = av_hwframe_ctx_alloc(in_frames_ctx->device_ref); - if (!s->out_frames_ref) + outlink->hw_frames_ctx = av_hwframe_ctx_alloc(in_frames_ctx->device_ref); + if (!outlink->hw_frames_ctx) return AVERROR(ENOMEM); - out_frames_ctx = (AVHWFramesContext*)s->out_frames_ref->data; + out_frames_ctx = (AVHWFramesContext*)outlink->hw_frames_ctx->data; out_frames_hwctx = out_frames_ctx->hwctx; out_frames_ctx->format = AV_PIX_FMT_QSV; out_frames_ctx->width = FFALIGN(out_width, 32); out_frames_ctx->height = FFALIGN(out_height, 32); out_frames_ctx->sw_format = out_format; - out_frames_ctx->initial_pool_size = 32; + out_frames_ctx->initial_pool_size = 4; out_frames_hwctx->frame_type = in_frames_hwctx->frame_type; - ret = av_hwframe_ctx_init(s->out_frames_ref); + ret = ff_filter_init_hw_frames(ctx, outlink, 32); + if (ret < 0) + return ret; + + ret = av_hwframe_ctx_init(outlink->hw_frames_ctx); if (ret < 0) return ret; @@ -266,7 +269,7 @@ static int init_out_session(AVFilterContext *ctx) QSVScaleContext *s = ctx->priv; AVHWFramesContext *in_frames_ctx = (AVHWFramesContext*)ctx->inputs[0]->hw_frames_ctx->data; - AVHWFramesContext *out_frames_ctx = (AVHWFramesContext*)s->out_frames_ref->data; + AVHWFramesContext *out_frames_ctx = (AVHWFramesContext*)ctx->outputs[0]->hw_frames_ctx->data; AVQSVFramesContext *in_frames_hwctx = in_frames_ctx->hwctx; AVQSVFramesContext *out_frames_hwctx = out_frames_ctx->hwctx; AVQSVDeviceContext *device_hwctx = in_frames_ctx->device_ctx->hwctx; @@ -407,8 +410,6 @@ static int init_out_session(AVFilterContext *ctx) static int init_scale_session(AVFilterContext *ctx, int in_width, int in_height, int out_width, int out_height) { - QSVScaleContext *s = ctx->priv; - int ret; qsvscale_uninit(ctx); @@ -421,11 +422,6 @@ static int init_scale_session(AVFilterContext *ctx, int in_width, int in_height, if (ret < 0) return ret; - av_buffer_unref(&ctx->outputs[0]->hw_frames_ctx); - ctx->outputs[0]->hw_frames_ctx = av_buffer_ref(s->out_frames_ref); - if (!ctx->outputs[0]->hw_frames_ctx) - return AVERROR(ENOMEM); - return 0; } |