static gboolean
ensure_vpp (GstVaapiDecodeBin * vaapidecbin)
{
  GstVaapiDisplay *display;

  if (vaapidecbin->has_vpp != HAS_VPP_UNKNOWN)
    return TRUE;

  display = GST_VAAPI_PLUGIN_BASE_DISPLAY (vaapidecbin->decoder);
  if (display) {
    GST_INFO_OBJECT (vaapidecbin, "Got display from vaapidecode");
    gst_vaapi_display_ref (display);
  } else {
    GST_INFO_OBJECT (vaapidecbin, "Creating a dummy display to test for vpp");
    display = gst_vaapi_create_test_display ();
  }
  if (!display)
    return FALSE;

  vaapidecbin->has_vpp = gst_vaapi_display_has_video_processing (display) ?
    HAS_VPP_YES : HAS_VPP_NO;

  gst_vaapi_display_unref (display);

  return TRUE;
}
Пример #2
0
static gboolean
plugin_init (GstPlugin * plugin)
{
  GstVaapiDisplay *display;
  GArray *decoders;
  guint rank;

  plugin_add_dependencies (plugin);

  display = gst_vaapi_create_test_display ();
  if (!display)
    goto error_no_display;
  if (!gst_vaapi_driver_is_whitelisted (display))
    goto unsupported_driver;

  _gst_vaapi_has_video_processing =
      gst_vaapi_display_has_video_processing (display);

  decoders = display_get_decoder_codecs (display);
  if (decoders) {
    gst_vaapidecode_register (plugin, decoders);
    g_array_unref (decoders);
  }

  gst_element_register (plugin, "vaapipostproc",
      GST_RANK_PRIMARY, GST_TYPE_VAAPIPOSTPROC);

  gst_element_register (plugin, "vaapidecodebin",
      GST_RANK_PRIMARY + 2, GST_TYPE_VAAPI_DECODE_BIN);

  rank = GST_RANK_PRIMARY;
  if (g_getenv ("WAYLAND_DISPLAY"))
    rank = GST_RANK_MARGINAL;
  gst_element_register (plugin, "vaapisink", rank, GST_TYPE_VAAPISINK);

#if USE_ENCODERS
  gst_vaapiencode_register (plugin, display);
#endif

  gst_object_unref (display);

  return TRUE;

  /* ERRORS: */
error_no_display:
  {
    GST_ERROR ("Cannot create a VA display");
    /* Avoid blacklisting: failure to create a display could be a
     * transient condition */
    return TRUE;
  }
unsupported_driver:
  {
    gst_object_unref (display);
    return TRUE;                /* return TRUE to avoid get blacklisted */
  }
}
static void
gst_vaapi_decode_bin_handle_message (GstBin * bin, GstMessage * message)
{
  GstVaapiDecodeBin *vaapidecbin = GST_VAAPI_DECODE_BIN (bin);
  GstMessageType type;
  GstContext *context = NULL;
  const gchar *context_type;
  GstVaapiDisplay *display = NULL;

  type = GST_MESSAGE_TYPE (message);
  if (type != GST_MESSAGE_HAVE_CONTEXT)
    goto bail;
  gst_message_parse_have_context (message, &context);
  if (!context)
    goto bail;
  context_type = gst_context_get_context_type (context);
  if (g_strcmp0 (context_type, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME) != 0)
    goto bail;
  if (!gst_vaapi_video_context_get_display (context, &display))
    goto bail;

  vaapidecbin->has_vpp = gst_vaapi_display_has_video_processing (display) ?
    HAS_VPP_YES : HAS_VPP_NO;

  /* the underlying VA driver implementation doesn't support video
   * post-processing, hence we have to disable it */
  if (vaapidecbin->has_vpp != HAS_VPP_YES) {
    GST_WARNING_OBJECT (vaapidecbin, "VA driver doesn't support VPP");
    if (!vaapidecbin->disable_vpp) {
      vaapidecbin->disable_vpp = TRUE;
      g_object_notify_by_pspec (G_OBJECT (vaapidecbin),
          properties[PROP_DISABLE_VPP]);
    }
  }

bail:
  if (display)
    gst_vaapi_display_unref (display);

  if (context)
    gst_context_unref (context);

  GST_BIN_CLASS (gst_vaapi_decode_bin_parent_class)->handle_message (bin,
      message);
}