static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAspectRatioCrop *aspect_ratio_crop; gboolean recheck = FALSE; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); GST_OBJECT_LOCK (aspect_ratio_crop); switch (prop_id) { case ARG_ASPECT_RATIO_CROP: if (GST_VALUE_HOLDS_FRACTION (value)) { aspect_ratio_crop->ar_num = gst_value_get_fraction_numerator (value); aspect_ratio_crop->ar_denom = gst_value_get_fraction_denominator (value); recheck = (GST_PAD_CAPS (aspect_ratio_crop->sink) != NULL); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (aspect_ratio_crop); if (recheck) { gst_aspect_ratio_crop_set_caps (aspect_ratio_crop->sink, GST_PAD_CAPS (aspect_ratio_crop->sink)); } }
static GstCaps * gst_aspect_ratio_crop_get_caps (GstPad * pad) { GstPad *peer; GstAspectRatioCrop *aspect_ratio_crop; GstCaps *return_caps; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); g_mutex_lock (aspect_ratio_crop->crop_lock); peer = gst_pad_get_peer (aspect_ratio_crop->sink); if (peer == NULL) { return_caps = gst_static_pad_template_get_caps (&src_template); gst_caps_ref (return_caps); } else { GstCaps *peer_caps; peer_caps = gst_pad_get_caps (peer); return_caps = gst_aspect_ratio_crop_transform_caps (aspect_ratio_crop, peer_caps); gst_caps_unref (peer_caps); gst_object_unref (peer); } g_mutex_unlock (aspect_ratio_crop->crop_lock); gst_object_unref (aspect_ratio_crop); return return_caps; }
static gboolean gst_aspect_ratio_crop_sink_event (GstPad * pad, GstObject * parent, GstEvent * evt) { gboolean ret; GstAspectRatioCrop *aspect_ratio_crop = GST_ASPECT_RATIO_CROP (parent); ret = aspect_ratio_crop->sinkpad_old_eventfunc (pad, parent, gst_event_ref (evt)); switch (GST_EVENT_TYPE (evt)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (evt, &caps); ret = gst_aspect_ratio_crop_set_caps (aspect_ratio_crop, caps); break; } default: break; } gst_event_unref (evt); return ret; }
static void gst_aspect_ratio_crop_finalize (GObject * object) { GstAspectRatioCrop *aspect_ratio_crop; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); g_mutex_clear (&aspect_ratio_crop->crop_lock); G_OBJECT_CLASS (parent_class)->finalize (object); }
static void gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAspectRatioCrop *aspect_ratio_crop; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); GST_OBJECT_LOCK (aspect_ratio_crop); switch (prop_id) { case ARG_ASPECT_RATIO_CROP: gst_value_set_fraction (value, aspect_ratio_crop->ar_num, aspect_ratio_crop->ar_denom); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } GST_OBJECT_UNLOCK (aspect_ratio_crop); }
static gboolean gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps) { GstAspectRatioCrop *aspect_ratio_crop; GstPad *peer_pad; GstStructure *structure; gboolean ret; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); g_mutex_lock (aspect_ratio_crop->crop_lock); structure = gst_caps_get_structure (caps, 0); gst_aspect_ratio_transform_structure (aspect_ratio_crop, structure, NULL, TRUE); peer_pad = gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), "sink"); ret = gst_pad_set_caps (peer_pad, caps); gst_object_unref (peer_pad); gst_object_unref (aspect_ratio_crop); g_mutex_unlock (aspect_ratio_crop->crop_lock); return ret; }
static GstCaps * gst_aspect_ratio_crop_get_caps (GstPad * pad, GstCaps * filter) { GstPad *peer; GstAspectRatioCrop *aspect_ratio_crop; GstCaps *return_caps; aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); g_mutex_lock (&aspect_ratio_crop->crop_lock); peer = gst_pad_get_peer (aspect_ratio_crop->sink); if (peer == NULL) { return_caps = gst_static_pad_template_get_caps (&src_template); } else { GstCaps *peer_caps; peer_caps = gst_pad_query_caps (peer, filter); return_caps = gst_aspect_ratio_crop_transform_caps (aspect_ratio_crop, peer_caps); gst_caps_unref (peer_caps); gst_object_unref (peer); } g_mutex_unlock (&aspect_ratio_crop->crop_lock); gst_object_unref (aspect_ratio_crop); if (return_caps && filter) { GstCaps *tmp = gst_caps_intersect_full (filter, return_caps, GST_CAPS_INTERSECT_FIRST); gst_caps_replace (&return_caps, tmp); gst_caps_unref (tmp); } return return_caps; }