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; }
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; }
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; }
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"); }