Пример #1
0
/*
 * cheese_camera_device_add_format:
 * @device: a #CheeseCameraDevice
 * @format: the #CheeseVideoFormatFull to add
 *
 * Add the supplied @format to the list of formats supported by the @device.
 */
static void
cheese_camera_device_add_format (CheeseCameraDevice *device,
                                 CheeseVideoFormatFull *format,
                                 const GValue *framerate)
{
  CheeseCameraDevicePrivate *priv = device->priv;
  CheeseVideoFormatFull *existing;

  existing = cheese_camera_device_find_full_format (device,
                                                    (CheeseVideoFormat *)format);

  if (existing)
  {
    g_slice_free (CheeseVideoFormatFull, format);
    cheese_camera_device_format_update_framerate (existing, framerate);
    return;
  }

  cheese_camera_device_get_highest_framerate (framerate, &format->fr_numerator,
                                              &format->fr_denominator);
  GST_INFO ("%dx%d framerate %d/%d", format->width, format->height,
            format->fr_numerator, format->fr_denominator);

  priv->formats = g_list_insert_sorted (priv->formats, format,
                                        compare_formats);
}
/**
 * cheese_camera_device_get_caps_for_format:
 * @device: a #CheeseCameraDevice
 * @format: a #CheeseVideoFormat
 *
 * Get the #GstCaps for the given @format on the @device.
 *
 * Returns: (transfer full): the #GstCaps for the given @format
 */
GstCaps *
cheese_camera_device_get_caps_for_format (CheeseCameraDevice *device,
                                          CheeseVideoFormat  *format)
{
    CheeseCameraDevicePrivate *priv;
  CheeseVideoFormatFull *full_format;
  GstCaps *desired_caps;
  GstCaps *subset_caps;
  gsize i;

  g_return_val_if_fail (CHEESE_IS_CAMERA_DEVICE (device), NULL);

  full_format = cheese_camera_device_find_full_format (device, format);

  if (!full_format)
  {
    GST_INFO ("Getting caps for %dx%d: no such format!",
              format->width, format->height);
    return gst_caps_new_empty ();
  }

  GST_INFO ("Getting caps for %dx%d @ %d/%d fps",
            full_format->width, full_format->height,
            full_format->fr_numerator, full_format->fr_denominator);

  desired_caps = gst_caps_new_empty ();

  for (i = 0; supported_formats[i] != NULL; i++)
  {
    gst_caps_append (desired_caps,
                     cheese_camera_device_format_to_caps (supported_formats[i],
                                                          full_format));
  }

    priv = cheese_camera_device_get_instance_private (device);
    subset_caps = gst_caps_intersect (desired_caps, priv->caps);
  subset_caps = gst_caps_simplify (subset_caps);
  gst_caps_unref (desired_caps);

  GST_INFO ("Got %" GST_PTR_FORMAT, subset_caps);

  return subset_caps;
}