Commit e4cdef00 authored by Mark Thompson's avatar Mark Thompson

vf_scale_qsv: Support increasing hardware frame pool size

The deinterlacer does not change, because it does not allocate any new
frames (for output it uses the same pool as the input).
parent b128be17
......@@ -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);
......@@ -163,6 +161,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;
......@@ -183,21 +182,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;
......@@ -264,7 +267,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;
......@@ -405,8 +408,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);
......@@ -419,11 +420,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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment