summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2017-03-27 21:10:23 +0100
committerMark Thompson <sw@jkqxz.net>2018-02-11 22:11:10 +0000
commite4cdef00263dc8b3c8de9d34ceacd00dc68979c0 (patch)
tree20a5092d654065656d9310e901e2de085cc04dff /libavfilter
parentb128be1748f3920a14a98307265df5f2d3433e1d (diff)
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).
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/vf_scale_qsv.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c
index 8ef77835dc..c568e96259 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);
@@ -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;
}