void update() { m_rebuild = false; if (m_buffers.size() == m_filters.size()) { int i = 0; for (auto it = m_filters.begin(); it != m_filters.end(); ++it, ++i) { if (m_buffers[i] != *it) break; } if (i == m_filters.size()) return; } m_available = false; m_buffers.resize(m_filters.size()); if (m_buffers.isEmpty()) return; auto it = m_filters.begin(); for (int i=0; i<m_buffers.size(); ++i, ++it) m_buffers[i] = *it; m_caps.num_input_color_standards = VAProcColorStandardCount; m_caps.num_output_color_standards = VAProcColorStandardCount; if (!isSuccess(vaQueryVideoProcPipelineCaps(VaApi::glx(), m_context, m_buffers.data(), m_buffers.size(), &m_caps))) return; if ((int)m_caps.num_forward_references > m_forward_refs.size()) m_forward_refs.resize(m_caps.num_forward_references); if ((int)m_caps.num_backward_references > m_backward_refs.size()) m_backward_refs.resize(m_caps.num_backward_references); m_available = true; }
static int deint_vaapi_build_filter_params(AVFilterContext *avctx) { DeintVAAPIContext *ctx = avctx->priv; VAStatus vas; VAProcFilterParameterBufferDeinterlacing params; int i; ctx->nb_deint_caps = VAProcDeinterlacingCount; vas = vaQueryVideoProcFilterCaps(ctx->hwctx->display, ctx->va_context, VAProcFilterDeinterlacing, &ctx->deint_caps, &ctx->nb_deint_caps); if (vas != VA_STATUS_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Failed to query deinterlacing " "caps: %d (%s).\n", vas, vaErrorStr(vas)); return AVERROR(EIO); } if (ctx->mode == VAProcDeinterlacingNone) { for (i = 0; i < ctx->nb_deint_caps; i++) { if (ctx->deint_caps[i].type > ctx->mode) ctx->mode = ctx->deint_caps[i].type; } av_log(avctx, AV_LOG_VERBOSE, "Picking %d (%s) as default " "deinterlacing mode.\n", ctx->mode, deint_vaapi_mode_name(ctx->mode)); } else { for (i = 0; i < ctx->nb_deint_caps; i++) { if (ctx->deint_caps[i].type == ctx->mode) break; } if (i >= ctx->nb_deint_caps) { av_log(avctx, AV_LOG_ERROR, "Deinterlacing mode %d (%s) is " "not supported.\n", ctx->mode, deint_vaapi_mode_name(ctx->mode)); } } params.type = VAProcFilterDeinterlacing; params.algorithm = ctx->mode; params.flags = 0; av_assert0(ctx->filter_buffer == VA_INVALID_ID); vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, VAProcFilterParameterBufferType, sizeof(params), 1, ¶ms, &ctx->filter_buffer); if (vas != VA_STATUS_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Failed to create deinterlace " "parameter buffer: %d (%s).\n", vas, vaErrorStr(vas)); return AVERROR(EIO); } vas = vaQueryVideoProcPipelineCaps(ctx->hwctx->display, ctx->va_context, &ctx->filter_buffer, 1, &ctx->pipeline_caps); if (vas != VA_STATUS_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Failed to query pipeline " "caps: %d (%s).\n", vas, vaErrorStr(vas)); return AVERROR(EIO); } ctx->extra_delay_for_timestamps = ctx->field_rate == 2 && ctx->pipeline_caps.num_backward_references == 0; ctx->queue_depth = ctx->pipeline_caps.num_backward_references + ctx->pipeline_caps.num_forward_references + ctx->extra_delay_for_timestamps + 1; if (ctx->queue_depth > MAX_REFERENCES) { av_log(avctx, AV_LOG_ERROR, "Pipeline requires too many " "references (%u forward, %u back).\n", ctx->pipeline_caps.num_forward_references, ctx->pipeline_caps.num_backward_references); return AVERROR(ENOSYS); } return 0; }