Ejemplo n.º 1
0
gboolean
gst_droidcamsrc_dev_restart (GstDroidCamSrcDev * dev)
{
  gboolean ret = FALSE;

  g_rec_mutex_lock (dev->lock);

  GST_DEBUG ("dev restart");

  if (dev->running) {
    gst_droidcamsrc_dev_stop (dev);
    ret = gst_droidcamsrc_dev_start (dev, TRUE);
  } else {
    ret = TRUE;
  }

  g_rec_mutex_unlock (dev->lock);

  return ret;
}
Ejemplo n.º 2
0
gboolean
gst_droidcamsrc_mode_activate (GstDroidCamSrcMode * mode)
{
  gboolean ret;
  gboolean running;

  g_rec_mutex_lock (&mode->src->dev_lock);

  if (!mode->src->dev) {
    GST_INFO_OBJECT (mode->src, "dev not ready. deferring caps negotiation");

    g_rec_mutex_unlock (&mode->src->dev_lock);
    return TRUE;
  }

  running = gst_droidcamsrc_dev_is_running (mode->src->dev);

  if (running) {
    gst_droidcamsrc_dev_stop (mode->src->dev);
  }

  gst_droidcamsrc_mode_negotiate_pad (mode, mode->modesrc, FALSE);
  gst_droidcamsrc_mode_negotiate_pad (mode, mode->vfsrc, TRUE);

  if (running) {
    ret = gst_droidcamsrc_dev_start (mode->src->dev, FALSE);
  } else {
    ret = gst_droidcamsrc_apply_params (mode->src);
  }

  /* now update max-zoom that we have a preview size */
  gst_droidcamsrc_dev_update_params (mode->src->dev);
  gst_droidcamsrc_update_max_zoom (mode->src);

  g_rec_mutex_unlock (&mode->src->dev_lock);

  return ret;
}
Ejemplo n.º 3
0
gboolean
gst_droidcamsrc_mode_negotiate (GstDroidCamSrcMode * mode, GstPad * pad)
{
  gboolean ret;
  gboolean running;

  g_rec_mutex_lock (&mode->src->dev_lock);

  running = gst_droidcamsrc_dev_is_running (mode->src->dev);

  if (running && pad == mode->vfsrc) {
    /* stop preview */
    gst_droidcamsrc_dev_stop (mode->src->dev);
  }

  gst_droidcamsrc_mode_negotiate_pad (mode, pad, FALSE);

  if (pad == mode->vfsrc) {
    /* start which will also apply the settings */
    if (running) {
      ret = gst_droidcamsrc_dev_start (mode->src->dev, FALSE);
    } else {
      ret = gst_droidcamsrc_apply_params (mode->src);
    }

    /* now update max-zoom that we have a preview size */
    gst_droidcamsrc_dev_update_params (mode->src->dev);
    gst_droidcamsrc_update_max_zoom (mode->src);
  } else {
    /* apply settings */
    ret = gst_droidcamsrc_dev_set_params (mode->src->dev);
  }

  g_rec_mutex_unlock (&mode->src->dev_lock);

  return ret;
}
Ejemplo n.º 4
0
static void
gst_droidcamsrc_dev_compressed_image_callback (void *user, DroidMediaData * mem)
{
  GstDroidCamSrcDev *dev = (GstDroidCamSrcDev *) user;
  GstDroidCamSrc *src = GST_DROIDCAMSRC (GST_PAD_PARENT (dev->imgsrc->pad));
  size_t size = mem->size;
  void *data = mem->data;
  GstBuffer *buffer;
  GstTagList *tags;
  GstEvent *event = NULL;
  void *d;

  GST_DEBUG_OBJECT (src, "dev compressed image callback");

  if (!data) {
    GST_ERROR_OBJECT (src, "invalid memory from camera hal");
    return;
  }

  /* TODO: research a way to get rid of the memcpy */
  d = g_malloc (size);
  memcpy (d, data, size);
  buffer = gst_buffer_new_wrapped (d, size);
  if (!dev->img->image_preview_sent) {
    gst_droidcamsrc_post_message (src,
        gst_structure_new_empty (GST_DROIDCAMSRC_CAPTURE_END));
    /* TODO: generate and send preview if we don't get it from HAL */
    dev->img->image_preview_sent = TRUE;
  }

  gst_droidcamsrc_timestamp (src, buffer);

  tags = gst_droidcamsrc_exif_tags_from_jpeg_data (d, size);
  if (tags) {
    GST_INFO_OBJECT (src, "pushing tags %" GST_PTR_FORMAT, tags);
    event = gst_event_new_tag (tags);
  }

  g_mutex_lock (&dev->imgsrc->lock);

  // TODO: get the correct lock
  if (event) {
    src->imgsrc->pending_events =
        g_list_append (src->imgsrc->pending_events, event);
  }

  g_queue_push_tail (dev->imgsrc->queue, buffer);
  g_cond_signal (&dev->imgsrc->cond);
  g_mutex_unlock (&dev->imgsrc->lock);

  /* we need to start restart the preview
   * android demands this but GStreamer does not know about it.
   */
  g_rec_mutex_lock (dev->lock);
  dev->running = FALSE;
  g_rec_mutex_unlock (dev->lock);

  gst_droidcamsrc_dev_start (dev, TRUE);

  g_mutex_lock (&src->capture_lock);
  --src->captures;
  g_mutex_unlock (&src->capture_lock);

  g_object_notify (G_OBJECT (src), "ready-for-capture");
}