camerabin: clean up and fix assertion fail when setting zoom in NULL state

This commit is contained in:
Lasse Laukkanen 2009-03-09 18:22:28 +02:00 committed by René Stadler
parent 9b0fa11a5d
commit 78b208125a

View file

@ -948,46 +948,40 @@ gst_camerabin_change_filename (GstCameraBin * camera, const gchar * name)
} }
} }
/* static gboolean
* gst_camerabin_setup_zoom: gst_camerabin_set_photo_iface_zoom (GstCameraBin * camera, gint zoom)
* @camera: camerabin object
*
* Apply zoom configured to camerabin to capture.
*/
static void
gst_camerabin_setup_zoom (GstCameraBin * camera)
{ {
gint zoom; GstPhotography *photo = NULL;
gboolean done = FALSE; GstPhotoCaps pcaps = GST_PHOTOGRAPHY_CAPS_NONE;
gboolean ret = FALSE;
g_return_if_fail (camera != NULL);
g_return_if_fail (camera->src_zoom_crop != NULL);
zoom = g_atomic_int_get (&camera->zoom);
g_return_if_fail (zoom);
if (GST_IS_ELEMENT (camera->src_vid_src) && if (GST_IS_ELEMENT (camera->src_vid_src) &&
gst_element_implements_interface (camera->src_vid_src, gst_element_implements_interface (camera->src_vid_src,
GST_TYPE_PHOTOGRAPHY)) { GST_TYPE_PHOTOGRAPHY)) {
/* Try setting (hardware) zoom using photography interface */ /* Try setting zoom using photography interface */
GstPhotography *photo;
GstPhotoCaps pcaps;
photo = GST_PHOTOGRAPHY (camera->src_vid_src); photo = GST_PHOTOGRAPHY (camera->src_vid_src);
pcaps = gst_photography_get_capabilities (photo); if (photo) {
pcaps = gst_photography_get_capabilities (photo);
}
if (pcaps & GST_PHOTOGRAPHY_CAPS_ZOOM) { if (pcaps & GST_PHOTOGRAPHY_CAPS_ZOOM) {
done = gst_photography_set_zoom (photo, (gfloat) zoom / 100.0); GST_DEBUG_OBJECT (camera, "setting zoom %d using photography interface",
zoom);
ret = gst_photography_set_zoom (photo, (gfloat) zoom / 100.0);
} }
} }
return ret;
}
if (!done) { static gboolean
/* Update capsfilters to apply the (software) zoom */ gst_camerabin_set_element_zoom (GstCameraBin * camera, gint zoom)
gint w2_crop = 0; {
gint h2_crop = 0; gint w2_crop = 0;
GstPad *pad_zoom_sink = NULL; gint h2_crop = 0;
GstPad *pad_zoom_sink = NULL;
gboolean ret = FALSE;
if (camera->src_zoom_crop) {
/* Update capsfilters to apply the zoom */
GST_INFO_OBJECT (camera, "zoom: %d, orig size: %dx%d", zoom, GST_INFO_OBJECT (camera, "zoom: %d, orig size: %dx%d", zoom,
camera->width, camera->height); camera->width, camera->height);
@ -1005,11 +999,39 @@ gst_camerabin_setup_zoom (GstCameraBin * camera)
GST_PAD_STREAM_LOCK (pad_zoom_sink); GST_PAD_STREAM_LOCK (pad_zoom_sink);
g_object_set (camera->src_zoom_crop, "left", w2_crop, "right", w2_crop, g_object_set (camera->src_zoom_crop, "left", w2_crop, "right", w2_crop,
"top", h2_crop, "bottom", h2_crop, NULL); "top", h2_crop, "bottom", h2_crop, NULL);
GST_PAD_STREAM_UNLOCK (pad_zoom_sink); GST_PAD_STREAM_UNLOCK (pad_zoom_sink);
gst_object_unref (pad_zoom_sink); gst_object_unref (pad_zoom_sink);
ret = TRUE;
}
return ret;
}
/*
* gst_camerabin_setup_zoom:
* @camera: camerabin object
*
* Apply zoom configured to camerabin to capture.
*/
static void
gst_camerabin_setup_zoom (GstCameraBin * camera)
{
gint zoom;
g_return_if_fail (camera != NULL);
zoom = g_atomic_int_get (&camera->zoom);
g_return_if_fail (zoom);
GST_INFO_OBJECT (camera, "setting zoom %d", zoom);
if (gst_camerabin_set_photo_iface_zoom (camera, zoom)) {
GST_INFO_OBJECT (camera, "zoom set using photography interface");
} else if (gst_camerabin_set_element_zoom (camera, zoom)) {
GST_INFO_OBJECT (camera, "zoom set using gst elements");
} else {
GST_INFO_OBJECT (camera, "setting zoom failed");
} }
GST_LOG_OBJECT (camera, "zoom set");
} }
/* /*