mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-04 21:42:25 +00:00
gst/base/gstbasesink.c: Prepare for more accurate position reporting and query handling.
Original commit message from CVS: * gst/base/gstbasesink.c: (gst_base_sink_class_init), (gst_base_sink_send_event), (gst_base_sink_peer_query), (gst_base_sink_query): Prepare for more accurate position reporting and query handling. * gst/gstelement.c: (gst_element_send_event), (gst_element_set_state): Add some comment.
This commit is contained in:
parent
1901cd0471
commit
43c8433a07
4 changed files with 172 additions and 0 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2005-09-22 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/base/gstbasesink.c: (gst_base_sink_class_init),
|
||||||
|
(gst_base_sink_send_event), (gst_base_sink_peer_query),
|
||||||
|
(gst_base_sink_query):
|
||||||
|
Prepare for more accurate position reporting and query
|
||||||
|
handling.
|
||||||
|
|
||||||
|
* gst/gstelement.c: (gst_element_send_event),
|
||||||
|
(gst_element_set_state):
|
||||||
|
Add some comment.
|
||||||
|
|
||||||
2005-09-22 Wim Taymans <wim@fluendo.com>
|
2005-09-22 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* gst/gstquery.c: (gst_query_new_segment), (gst_query_set_segment),
|
* gst/gstquery.c: (gst_query_new_segment), (gst_query_set_segment),
|
||||||
|
|
|
@ -105,6 +105,10 @@ static void gst_base_sink_set_property (GObject * object, guint prop_id,
|
||||||
static void gst_base_sink_get_property (GObject * object, guint prop_id,
|
static void gst_base_sink_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
|
static gboolean gst_base_sink_send_event (GstElement * element,
|
||||||
|
GstEvent * event);
|
||||||
|
static gboolean gst_base_sink_query (GstElement * element, GstQuery * query);
|
||||||
|
|
||||||
static GstCaps *gst_base_sink_get_caps (GstBaseSink * sink);
|
static GstCaps *gst_base_sink_get_caps (GstBaseSink * sink);
|
||||||
static gboolean gst_base_sink_set_caps (GstBaseSink * sink, GstCaps * caps);
|
static gboolean gst_base_sink_set_caps (GstBaseSink * sink, GstCaps * caps);
|
||||||
static GstFlowReturn gst_base_sink_buffer_alloc (GstBaseSink * sink,
|
static GstFlowReturn gst_base_sink_buffer_alloc (GstBaseSink * sink,
|
||||||
|
@ -162,6 +166,8 @@ gst_base_sink_class_init (GstBaseSinkClass * klass)
|
||||||
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_base_sink_set_clock);
|
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_base_sink_set_clock);
|
||||||
gstelement_class->change_state =
|
gstelement_class->change_state =
|
||||||
GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
|
GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
|
||||||
|
gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_base_sink_send_event);
|
||||||
|
gstelement_class->query = GST_DEBUG_FUNCPTR (gst_base_sink_query);
|
||||||
|
|
||||||
klass->get_caps = GST_DEBUG_FUNCPTR (gst_base_sink_get_caps);
|
klass->get_caps = GST_DEBUG_FUNCPTR (gst_base_sink_get_caps);
|
||||||
klass->set_caps = GST_DEBUG_FUNCPTR (gst_base_sink_set_caps);
|
klass->set_caps = GST_DEBUG_FUNCPTR (gst_base_sink_set_caps);
|
||||||
|
@ -1291,6 +1297,79 @@ gst_base_sink_activate_pull (GstPad * pad, gboolean active)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_base_sink_send_event (GstElement * element, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstPad *pad;
|
||||||
|
GstBaseSink *basesink = GST_BASE_SINK (element);
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
GST_LOCK (element);
|
||||||
|
pad = basesink->sinkpad;
|
||||||
|
gst_object_ref (pad);
|
||||||
|
GST_UNLOCK (element);
|
||||||
|
|
||||||
|
result = gst_pad_push_event (pad, event);
|
||||||
|
|
||||||
|
gst_object_unref (pad);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_base_sink_peer_query (GstBaseSink * sink, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstPad *peer;
|
||||||
|
gboolean res = FALSE;
|
||||||
|
|
||||||
|
if ((peer = gst_pad_get_peer (sink->sinkpad))) {
|
||||||
|
res = gst_pad_query (peer, query);
|
||||||
|
gst_object_unref (peer);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_base_sink_query (GstElement * element, GstQuery * query)
|
||||||
|
{
|
||||||
|
gboolean res = FALSE;
|
||||||
|
|
||||||
|
GstBaseSink *basesink = GST_BASE_SINK (element);
|
||||||
|
|
||||||
|
switch (GST_QUERY_TYPE (query)) {
|
||||||
|
case GST_QUERY_POSITION:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
case GST_QUERY_LATENCY:
|
||||||
|
break;
|
||||||
|
case GST_QUERY_JITTER:
|
||||||
|
break;
|
||||||
|
case GST_QUERY_RATE:
|
||||||
|
//gst_query_set_rate (query, basesink->segment_rate);
|
||||||
|
res = TRUE;
|
||||||
|
break;
|
||||||
|
case GST_QUERY_SEEKING:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
case GST_QUERY_SEGMENT:
|
||||||
|
{
|
||||||
|
gst_query_set_segment (query, basesink->segment_rate,
|
||||||
|
GST_FORMAT_TIME, basesink->segment_start, basesink->segment_stop,
|
||||||
|
basesink->segment_base);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_QUERY_CONVERT:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
case GST_QUERY_FORMATS:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_base_sink_change_state (GstElement * element, GstStateChange transition)
|
gst_base_sink_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1780,6 +1780,8 @@ gst_element_set_state (GstElement * element, GstState state)
|
||||||
/* this is the state we should go to */
|
/* this is the state we should go to */
|
||||||
GST_STATE_FINAL (element) = state;
|
GST_STATE_FINAL (element) = state;
|
||||||
if (ret == GST_STATE_CHANGE_ASYNC) {
|
if (ret == GST_STATE_CHANGE_ASYNC) {
|
||||||
|
/* force next state keeping ASYNC, this is atomic as we hold
|
||||||
|
* the STATE_LOCK */
|
||||||
gst_element_commit_state (element);
|
gst_element_commit_state (element);
|
||||||
gst_element_lost_state (element);
|
gst_element_lost_state (element);
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,10 @@ static void gst_base_sink_set_property (GObject * object, guint prop_id,
|
||||||
static void gst_base_sink_get_property (GObject * object, guint prop_id,
|
static void gst_base_sink_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
|
static gboolean gst_base_sink_send_event (GstElement * element,
|
||||||
|
GstEvent * event);
|
||||||
|
static gboolean gst_base_sink_query (GstElement * element, GstQuery * query);
|
||||||
|
|
||||||
static GstCaps *gst_base_sink_get_caps (GstBaseSink * sink);
|
static GstCaps *gst_base_sink_get_caps (GstBaseSink * sink);
|
||||||
static gboolean gst_base_sink_set_caps (GstBaseSink * sink, GstCaps * caps);
|
static gboolean gst_base_sink_set_caps (GstBaseSink * sink, GstCaps * caps);
|
||||||
static GstFlowReturn gst_base_sink_buffer_alloc (GstBaseSink * sink,
|
static GstFlowReturn gst_base_sink_buffer_alloc (GstBaseSink * sink,
|
||||||
|
@ -162,6 +166,8 @@ gst_base_sink_class_init (GstBaseSinkClass * klass)
|
||||||
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_base_sink_set_clock);
|
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_base_sink_set_clock);
|
||||||
gstelement_class->change_state =
|
gstelement_class->change_state =
|
||||||
GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
|
GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
|
||||||
|
gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_base_sink_send_event);
|
||||||
|
gstelement_class->query = GST_DEBUG_FUNCPTR (gst_base_sink_query);
|
||||||
|
|
||||||
klass->get_caps = GST_DEBUG_FUNCPTR (gst_base_sink_get_caps);
|
klass->get_caps = GST_DEBUG_FUNCPTR (gst_base_sink_get_caps);
|
||||||
klass->set_caps = GST_DEBUG_FUNCPTR (gst_base_sink_set_caps);
|
klass->set_caps = GST_DEBUG_FUNCPTR (gst_base_sink_set_caps);
|
||||||
|
@ -1291,6 +1297,79 @@ gst_base_sink_activate_pull (GstPad * pad, gboolean active)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_base_sink_send_event (GstElement * element, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstPad *pad;
|
||||||
|
GstBaseSink *basesink = GST_BASE_SINK (element);
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
GST_LOCK (element);
|
||||||
|
pad = basesink->sinkpad;
|
||||||
|
gst_object_ref (pad);
|
||||||
|
GST_UNLOCK (element);
|
||||||
|
|
||||||
|
result = gst_pad_push_event (pad, event);
|
||||||
|
|
||||||
|
gst_object_unref (pad);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_base_sink_peer_query (GstBaseSink * sink, GstQuery * query)
|
||||||
|
{
|
||||||
|
GstPad *peer;
|
||||||
|
gboolean res = FALSE;
|
||||||
|
|
||||||
|
if ((peer = gst_pad_get_peer (sink->sinkpad))) {
|
||||||
|
res = gst_pad_query (peer, query);
|
||||||
|
gst_object_unref (peer);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_base_sink_query (GstElement * element, GstQuery * query)
|
||||||
|
{
|
||||||
|
gboolean res = FALSE;
|
||||||
|
|
||||||
|
GstBaseSink *basesink = GST_BASE_SINK (element);
|
||||||
|
|
||||||
|
switch (GST_QUERY_TYPE (query)) {
|
||||||
|
case GST_QUERY_POSITION:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
case GST_QUERY_LATENCY:
|
||||||
|
break;
|
||||||
|
case GST_QUERY_JITTER:
|
||||||
|
break;
|
||||||
|
case GST_QUERY_RATE:
|
||||||
|
//gst_query_set_rate (query, basesink->segment_rate);
|
||||||
|
res = TRUE;
|
||||||
|
break;
|
||||||
|
case GST_QUERY_SEEKING:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
case GST_QUERY_SEGMENT:
|
||||||
|
{
|
||||||
|
gst_query_set_segment (query, basesink->segment_rate,
|
||||||
|
GST_FORMAT_TIME, basesink->segment_start, basesink->segment_stop,
|
||||||
|
basesink->segment_base);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_QUERY_CONVERT:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
case GST_QUERY_FORMATS:
|
||||||
|
res = gst_base_sink_peer_query (basesink, query);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_base_sink_change_state (GstElement * element, GstStateChange transition)
|
gst_base_sink_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue