summaryrefslogtreecommitdiff
path: root/libavfilter/vf_scale_qsv.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2018-02-12 22:55:24 +0000
committerMark Thompson <sw@jkqxz.net>2018-02-12 22:55:24 +0000
commit6e050e0085b3f6f1109a0593aad63ec6e6bf23ff (patch)
treef93214750c1d5775df01ef29f6769b01b9374e4c /libavfilter/vf_scale_qsv.c
parenta5ed07940c6929cadc44073f355cd15cfba7161e (diff)
parente4cdef00263dc8b3c8de9d34ceacd00dc68979c0 (diff)
Merge commit 'e4cdef00263dc8b3c8de9d34ceacd00dc68979c0'
* commit 'e4cdef00263dc8b3c8de9d34ceacd00dc68979c0': vf_scale_qsv: Support increasing hardware frame pool size Merged-by: Mark Thompson <sw@jkqxz.net>
Diffstat (limited to 'libavfilter/vf_scale_qsv.c')
-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 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;
}