From f92e2fa55011e542dff432e7280366932db9556a Mon Sep 17 00:00:00 2001 From: Marko Ollonen Date: Tue, 2 Oct 2012 11:09:12 +0300 Subject: [PATCH] Add support for request negotiation. Change-Id: I255f4176a69375670f8d322cb9fb76a658a2b87c --- gst-libs/gst/camera/gstmfldcameraphotoiface.h | 3 +- gst-libs/gst/camera/gstmfldcamerasrc.c | 56 +++++++++++++++++++++++++++ gst-libs/gst/camera/gstmfldcamerasrc.h | 5 +++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/gst-libs/gst/camera/gstmfldcameraphotoiface.h b/gst-libs/gst/camera/gstmfldcameraphotoiface.h index 5882fa3..dc3c06d 100644 --- a/gst-libs/gst/camera/gstmfldcameraphotoiface.h +++ b/gst-libs/gst/camera/gstmfldcameraphotoiface.h @@ -56,7 +56,8 @@ typedef enum { PROP_NOISE_REDUCTION, PROP_CAPTURE_WIDTH, PROP_CAPTURE_HEIGHT, - PROP_CAPTURE_FOURCC + PROP_CAPTURE_FOURCC, + PROP_REQ_NEGOTIATION } GstCameraSrcProperties; diff --git a/gst-libs/gst/camera/gstmfldcamerasrc.c b/gst-libs/gst/camera/gstmfldcamerasrc.c index 0cef15c..5cffbd0 100644 --- a/gst-libs/gst/camera/gstmfldcamerasrc.c +++ b/gst-libs/gst/camera/gstmfldcamerasrc.c @@ -169,6 +169,17 @@ GST_IMPLEMENT_CAMERA_SRC_COLOR_BALANCE_METHODS (GstCameraSrc, gst_camsrc); GST_IMPLEMENT_CAMERA_SRC_PHOTO_METHODS (GstCameraSrc, gst_camsrc); GST_IMPLEMENT_CAMERA_SRC_CAMERA_CONTROL_METHODS (GstCameraSrc, gst_camsrc); + +/* Enumerations */ +enum { + /*signal*/ + SIGNAL_STILL_CAPTURE, + SIGNAL_NEGO_COMPLETE, + LAST_SIGNAL +}; + +static guint gst_camerasrc_signals[LAST_SIGNAL] = { 0 }; + static gboolean gst_camerasrc_iface_supported (GstImplementsInterface * iface, GType iface_type) { @@ -385,6 +396,12 @@ gst_camerasrc_class_init (GstCameraSrcClass * klass) G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + g_object_class_install_property(gobject_class, PROP_REQ_NEGOTIATION, + g_param_spec_boolean("req-negotiation", "Request re-negotiation", + "Request to negotiate while on playing", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE )); + /** * GstCameraSrc:capture-mode: * @@ -411,6 +428,24 @@ gst_camerasrc_class_init (GstCameraSrcClass * klass) GST_CAMERA_SRC_VIEWFINDER_MODE_STILL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /* wh01.cho:req-negotiation:+:To notify user of camerasrc, after changing resolution. */ + /** + * GstCameraSrc::nego-complete: + * @camerasrc: the camerasrc instance + * @start: when re-negotiation is finished. + * + */ + gst_camerasrc_signals[SIGNAL_NEGO_COMPLETE] = + g_signal_new("nego-complete", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GstCameraSrcClass, nego_complete), + NULL, + NULL, + gst_marshal_VOID__VOID, + G_TYPE_NONE, 0); + gst_camerasrc_override_photo_properties (gobject_class); basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_camerasrc_get_caps); @@ -464,6 +499,7 @@ gst_camerasrc_init (GstCameraSrc * camerasrc, GstCameraSrcClass * klass) camerasrc->viewfinder_mode = GST_CAMERA_SRC_VIEWFINDER_MODE_STILL; camerasrc->capture_resolution_set = FALSE; camerasrc->preview_resolution_set = FALSE; + camerasrc->req_negotiation = FALSE; camerasrc->capture_w = 0; camerasrc->capture_h = 0; @@ -627,6 +663,11 @@ gst_camerasrc_set_property (GObject * object, GST_DEBUG_OBJECT (camerasrc, "Capture fourcc: %d", camerasrc->capture_fourcc); break; + case PROP_REQ_NEGOTIATION: + camerasrc->req_negotiation = g_value_get_boolean(value); + GST_DEBUG_OBJECT (camerasrc, "negotaion request %d", + camerasrc->req_negotiation); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -666,6 +707,9 @@ gst_camerasrc_get_property (GObject * object, case PROP_CAPTURE_FOURCC: g_value_set_uint (value, camerasrc->capture_fourcc); break; + case PROP_REQ_NEGOTIATION: + g_value_set_boolean(value, camerasrc->req_negotiation); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1543,11 +1587,23 @@ gst_camerasrc_create (GstPushSrc * src, GstBuffer ** buf) { GstCameraSrcClass *bclass; GstCameraSrc *camerasrc; + GstBaseSrcClass *basesrc_class; + GstFlowReturn ret = GST_FLOW_OK; GstBuffer *temp; camerasrc = GST_CAMERA_SRC_CAST (src); bclass = GST_CAMERA_SRC_GET_CLASS (camerasrc); + basesrc_class = GST_BASE_SRC_CLASS (bclass); + + if (camerasrc->req_negotiation) { + GST_DEBUG_OBJECT(camerasrc, "negotiation start"); + basesrc_class->negotiate(GST_BASE_SRC(camerasrc)); + camerasrc->req_negotiation = FALSE; + g_signal_emit(G_OBJECT(camerasrc), gst_camerasrc_signals[SIGNAL_NEGO_COMPLETE], (GQuark)NULL); + GST_DEBUG_OBJECT (camerasrc, "negotiation stop"); + } + start_over: diff --git a/gst-libs/gst/camera/gstmfldcamerasrc.h b/gst-libs/gst/camera/gstmfldcamerasrc.h index 6c8bb0c..96dfa95 100644 --- a/gst-libs/gst/camera/gstmfldcamerasrc.h +++ b/gst-libs/gst/camera/gstmfldcamerasrc.h @@ -200,6 +200,7 @@ struct _GstCameraSrc { guint capture_w, capture_h; guint capture_fps_n, capture_fps_d; guint32 capture_fourcc; + gboolean req_negotiation; gboolean capture_resolution_set; /* Is capture resolution set already? */ /* Preview image format */ @@ -367,6 +368,10 @@ struct _GstCameraSrcClass gboolean (*set_flash_mode)(GstCameraSrc *camsrc, int value); + /* signals */ + void (*nego_complete) (GstElement *element); + + /*< private >*/ gpointer _gst_reserved[GST_PADDING_LARGE]; }; -- 2.7.4