Browse Source

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).
tags/n4.0
Mark Thompson 9 years ago
parent
commit
e4cdef0026
1 changed files with 11 additions and 15 deletions
  1. +11
    -15
      libavfilter/vf_scale_qsv.c

+ 11
- 15
libavfilter/vf_scale_qsv.c 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;
}



Loading…
Cancel
Save