1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-28 20:53:54 +02:00

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).
This commit is contained in:
Mark Thompson 2017-03-27 21:10:23 +01:00
parent b128be1748
commit e4cdef0026

View File

@ -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;
}