From: Thiago Santos Date: Mon, 20 Sep 2010 14:54:20 +0000 (-0300) Subject: camerabin: Store app preferred capture parameters separately X-Git-Tag: 1.19.3~507^2~16254 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6ee256d462346a4e8c9bc2a92d24e06cf945342d;p=platform%2Fupstream%2Fgstreamer.git camerabin: Store app preferred capture parameters separately Store width/height/fps for video captures in a separate variable than the one that stores the currently used value. This prevents the user preferences to be lost when resetting the currently used dimensions for night mode, for example --- diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c index 713a18d..2422d3b 100644 --- a/gst/camerabin/gstcamerabin.c +++ b/gst/camerabin/gstcamerabin.c @@ -354,6 +354,9 @@ gst_camerabin_set_image_capture_caps (GstCameraBin * camera, gint width, static void gst_camerabin_set_video_resolution_fps (GstCameraBin * camera, gint width, gint height, gint fps_n, gint fps_d); +static void +do_set_video_resolution_fps (GstCameraBin * camera, gint width, + gint height, gint fps_n, gint fps_d); static void gst_camerabin_set_image_resolution (GstCameraBin * camera, gint width, @@ -481,21 +484,22 @@ camerabin_setup_src_elements (GstCameraBin * camera) gst_camerabin_monitor_video_source_properties (camera); - if (camera->width > 0 && camera->height > 0) { + if (camera->app_width > 0 && camera->app_height > 0) { gst_structure_set (st, - "width", G_TYPE_INT, camera->width, - "height", G_TYPE_INT, camera->height, NULL); + "width", G_TYPE_INT, camera->app_width, + "height", G_TYPE_INT, camera->app_height, NULL); } - if (camera->fps_n > 0 && camera->fps_d > 0) { + if (camera->app_fps_n > 0 && camera->app_fps_d > 0) { if (camera->night_mode) { GST_INFO_OBJECT (camera, "night mode, lowest allowed fps will be forced"); - camera->pre_night_fps_n = camera->fps_n; - camera->pre_night_fps_d = camera->fps_d; + camera->pre_night_fps_n = camera->app_fps_n; + camera->pre_night_fps_d = camera->app_fps_d; detect_framerate = TRUE; } else { gst_structure_set (st, - "framerate", GST_TYPE_FRACTION, camera->fps_n, camera->fps_d, NULL); + "framerate", GST_TYPE_FRACTION, camera->app_fps_n, + camera->app_fps_d, NULL); new_caps = gst_caps_new_full (st, NULL); } } else { @@ -2486,8 +2490,7 @@ gst_camerabin_handle_scene_mode (GstCameraBin * camera, GstSceneMode scene_mode) /* Remember frame rate before setting night mode */ camera->pre_night_fps_n = camera->fps_n; camera->pre_night_fps_d = camera->fps_d; - g_signal_emit_by_name (camera, "set-video-resolution-fps", camera->width, - camera->height, 0, 1, NULL); + do_set_video_resolution_fps (camera, camera->width, camera->height, 0, 1); } else { GST_DEBUG ("night mode already enabled"); } @@ -2496,8 +2499,8 @@ gst_camerabin_handle_scene_mode (GstCameraBin * camera, GstSceneMode scene_mode) GST_DEBUG ("disabling night mode, restoring fps to %d/%d", camera->pre_night_fps_n, camera->pre_night_fps_d); camera->night_mode = FALSE; - g_signal_emit_by_name (camera, "set-video-resolution-fps", camera->width, - camera->height, camera->pre_night_fps_n, camera->pre_night_fps_d, 0); + do_set_video_resolution_fps (camera, camera->width, camera->height, + camera->pre_night_fps_n, camera->pre_night_fps_d); } } } @@ -3196,10 +3199,10 @@ gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass) camera->night_mode = FALSE; camera->eos_handled = FALSE; - camera->width = DEFAULT_WIDTH; - camera->height = DEFAULT_HEIGHT; - camera->fps_n = DEFAULT_FPS_N; - camera->fps_d = DEFAULT_FPS_D; + camera->app_width = camera->width = DEFAULT_WIDTH; + camera->app_height = camera->height = DEFAULT_HEIGHT; + camera->app_fps_n = camera->fps_n = DEFAULT_FPS_N; + camera->app_fps_d = camera->fps_d = DEFAULT_FPS_D; camera->image_capture_width = 0; camera->image_capture_height = 0; camera->base_crop_left = 0; @@ -3539,6 +3542,8 @@ gst_camerabin_set_property (GObject * object, guint prop_id, { gint width = g_value_get_int (value); + camera->app_width = width; + if (width != camera->width) { camera->width = width; camera->video_capture_caps_update = TRUE; @@ -3549,6 +3554,8 @@ gst_camerabin_set_property (GObject * object, guint prop_id, { gint height = g_value_get_int (value); + camera->app_height = height; + if (height != camera->height) { camera->height = height; camera->video_capture_caps_update = TRUE; @@ -3562,6 +3569,9 @@ gst_camerabin_set_property (GObject * object, guint prop_id, fps_n = gst_value_get_fraction_numerator (value); fps_d = gst_value_get_fraction_denominator (value); + camera->app_fps_n = fps_n; + camera->app_fps_d = fps_d; + if (fps_n != camera->fps_n || fps_d != camera->fps_d) { camera->fps_n = fps_n; camera->fps_d = fps_d; @@ -3677,13 +3687,13 @@ gst_camerabin_get_property (GObject * object, guint prop_id, g_value_set_int (value, camera->image_capture_height); break; case ARG_VIDEO_CAPTURE_WIDTH: - g_value_set_int (value, camera->width); + g_value_set_int (value, camera->app_width); break; case ARG_VIDEO_CAPTURE_HEIGHT: - g_value_set_int (value, camera->height); + g_value_set_int (value, camera->app_height); break; case ARG_VIDEO_CAPTURE_FRAMERATE: - gst_value_set_fraction (value, camera->fps_n, camera->fps_d); + gst_value_set_fraction (value, camera->app_fps_n, camera->app_fps_d); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -3972,6 +3982,38 @@ gst_camerabin_capture_pause (GstCameraBin * camera) } } +/* + * Updates the properties (excluding the user preferred width/height/fps) and + * tells camerabin to update the video capture caps. + */ +static void +do_set_video_resolution_fps (GstCameraBin * camera, gint width, + gint height, gint fps_n, gint fps_d) +{ + if (height != camera->height) { + camera->height = height; + camera->video_capture_caps_update = TRUE; + } + if (width != camera->width) { + camera->width = width; + camera->video_capture_caps_update = TRUE; + } + if (fps_n != camera->fps_n) { + camera->fps_n = fps_n; + camera->video_capture_caps_update = TRUE; + } + if (fps_d != camera->fps_d) { + camera->fps_d = fps_d; + camera->video_capture_caps_update = TRUE; + } + + reset_video_capture_caps (camera); +} + +/* + * Updates the properties (including the user preferred width/height/fps) and + * tells camerabin to update the video capture caps. + */ static void gst_camerabin_set_video_resolution_fps (GstCameraBin * camera, gint width, gint height, gint fps_n, gint fps_d) diff --git a/gst/camerabin/gstcamerabin.h b/gst/camerabin/gstcamerabin.h index 0074fdc..a3de885 100644 --- a/gst/camerabin/gstcamerabin.h +++ b/gst/camerabin/gstcamerabin.h @@ -91,6 +91,12 @@ struct _GstCameraBin gint fps_n; gint fps_d; + /* app configured resolution/framerate */ + gint app_width; + gint app_height; + gint app_fps_n; + gint app_fps_d; + gboolean video_capture_caps_update; /* Image capture resolution */