mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +00:00
event: Make SEGMENT event parsing API more consistent with the others
This commit is contained in:
parent
ad0693f47d
commit
a46c9c2a62
19 changed files with 61 additions and 60 deletions
|
@ -632,49 +632,49 @@ gst_event_new_segment (GstSegment * segment)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_event_get_segment:
|
* gst_event_parse_segment:
|
||||||
* @event: The event
|
* @event: The event to parse
|
||||||
|
* @segment: (out) (transfer none): a pointer to a #GstSegment
|
||||||
*
|
*
|
||||||
* Get the segment from @event. The segment remains valid as long as @event remains
|
* Parses a segment @event and stores the result in the given @segment location.
|
||||||
* valid.
|
* @segment remains valid only until the @event is freed. Don't modify the segment
|
||||||
*
|
* and make a copy if you want to modify it or store it for later use.
|
||||||
* Returns: the #GstSegment. The segment stays valid for as long as @event is
|
|
||||||
* valid.
|
|
||||||
*/
|
*/
|
||||||
const GstSegment *
|
void
|
||||||
gst_event_get_segment (GstEvent * event)
|
gst_event_parse_segment (GstEvent * event, const GstSegment ** segment)
|
||||||
{
|
{
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
GstSegment *segment;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_EVENT (event), NULL);
|
g_return_if_fail (GST_IS_EVENT (event));
|
||||||
g_return_val_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT, NULL);
|
g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
|
||||||
|
|
||||||
structure = GST_EVENT_STRUCTURE (event);
|
if (segment) {
|
||||||
segment = g_value_get_boxed (gst_structure_id_get_value (structure,
|
structure = GST_EVENT_STRUCTURE (event);
|
||||||
GST_QUARK (SEGMENT)));
|
*segment = g_value_get_boxed (gst_structure_id_get_value (structure,
|
||||||
|
GST_QUARK (SEGMENT)));
|
||||||
return segment;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_event_parse_segment:
|
* gst_event_copy_segment:
|
||||||
* @event: The event to parse
|
* @event: The event to parse
|
||||||
* @segment: a #GstSegment
|
* @segment: a pointer to a #GstSegment
|
||||||
*
|
*
|
||||||
* Copy the segment values from @event into @segment.
|
* Parses a segment @event and copies the #GstSegment into the location
|
||||||
|
* given by @segment.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
gst_event_parse_segment (GstEvent * event, GstSegment * segment)
|
gst_event_copy_segment (GstEvent * event, GstSegment * segment)
|
||||||
{
|
{
|
||||||
const GstSegment *src;
|
const GstSegment *src;
|
||||||
|
|
||||||
g_return_if_fail (segment != NULL);
|
g_return_if_fail (GST_IS_EVENT (event));
|
||||||
|
g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
|
||||||
|
|
||||||
src = gst_event_get_segment (event);
|
if (segment) {
|
||||||
g_return_if_fail (src != NULL);
|
gst_event_parse_segment (event, &src);
|
||||||
|
gst_segment_copy_into (src, segment);
|
||||||
gst_segment_copy_into (src, segment);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -410,9 +410,8 @@ void gst_event_parse_caps (GstEvent *event, GstCaps **caps
|
||||||
|
|
||||||
/* segment event */
|
/* segment event */
|
||||||
GstEvent* gst_event_new_segment (GstSegment *segment);
|
GstEvent* gst_event_new_segment (GstSegment *segment);
|
||||||
const GstSegment *
|
void gst_event_parse_segment (GstEvent *event, const GstSegment **segment);
|
||||||
gst_event_get_segment (GstEvent *event);
|
void gst_event_copy_segment (GstEvent *event, GstSegment *segment);
|
||||||
void gst_event_parse_segment (GstEvent *event, GstSegment *segment);
|
|
||||||
|
|
||||||
/* tag event */
|
/* tag event */
|
||||||
GstEvent* gst_event_new_tag (GstTagList *taglist);
|
GstEvent* gst_event_new_tag (GstTagList *taglist);
|
||||||
|
|
|
@ -926,7 +926,7 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
gboolean update;
|
gboolean update;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in_segment = gst_event_get_segment (event);
|
gst_event_parse_segment (event, &in_segment);
|
||||||
gst_segment_init (&out_segment, GST_FORMAT_TIME);
|
gst_segment_init (&out_segment, GST_FORMAT_TIME);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (parse, "segment %" GST_SEGMENT_FORMAT, in_segment);
|
GST_DEBUG_OBJECT (parse, "segment %" GST_SEGMENT_FORMAT, in_segment);
|
||||||
|
|
|
@ -1454,7 +1454,7 @@ gst_base_sink_configure_segment (GstBaseSink * basesink, GstPad * pad,
|
||||||
GST_OBJECT_LOCK (basesink);
|
GST_OBJECT_LOCK (basesink);
|
||||||
/* the newsegment event is needed to bring the buffer timestamps to the
|
/* the newsegment event is needed to bring the buffer timestamps to the
|
||||||
* stream time and to drop samples outside of the playback segment. */
|
* stream time and to drop samples outside of the playback segment. */
|
||||||
gst_event_parse_segment (event, segment);
|
gst_event_copy_segment (event, segment);
|
||||||
GST_DEBUG_OBJECT (basesink, "configured SEGMENT %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (basesink, "configured SEGMENT %" GST_SEGMENT_FORMAT,
|
||||||
segment);
|
segment);
|
||||||
GST_OBJECT_UNLOCK (basesink);
|
GST_OBJECT_UNLOCK (basesink);
|
||||||
|
|
|
@ -1583,7 +1583,7 @@ gst_base_transform_sink_eventfunc (GstBaseTransform * trans, GstEvent * event)
|
||||||
}
|
}
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
{
|
{
|
||||||
gst_event_parse_segment (event, &trans->segment);
|
gst_event_copy_segment (event, &trans->segment);
|
||||||
trans->have_segment = TRUE;
|
trans->have_segment = TRUE;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (trans, "received SEGMENT %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (trans, "received SEGMENT %" GST_SEGMENT_FORMAT,
|
||||||
|
|
|
@ -1200,7 +1200,7 @@ gst_collect_pads_event (GstPad * pad, GstEvent * event)
|
||||||
}
|
}
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
{
|
{
|
||||||
gst_event_parse_segment (event, &data->segment);
|
gst_event_copy_segment (event, &data->segment);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (data->pad, "got newsegment %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (data->pad, "got newsegment %" GST_SEGMENT_FORMAT,
|
||||||
&data->segment);
|
&data->segment);
|
||||||
|
|
|
@ -540,25 +540,25 @@ gst_fd_sink_event (GstBaseSink * sink, GstEvent * event)
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
{
|
{
|
||||||
GstSegment segment;
|
const GstSegment *segment;
|
||||||
|
|
||||||
gst_event_parse_segment (event, &segment);
|
gst_event_parse_segment (event, &segment);
|
||||||
|
|
||||||
if (segment.format == GST_FORMAT_BYTES) {
|
if (segment->format == GST_FORMAT_BYTES) {
|
||||||
/* only try to seek and fail when we are going to a different
|
/* only try to seek and fail when we are going to a different
|
||||||
* position */
|
* position */
|
||||||
if (fdsink->current_pos != segment.start) {
|
if (fdsink->current_pos != segment->start) {
|
||||||
/* FIXME, the seek should be performed on the pos field, start/stop are
|
/* FIXME, the seek should be performed on the pos field, start/stop are
|
||||||
* just boundaries for valid bytes offsets. We should also fill the file
|
* just boundaries for valid bytes offsets. We should also fill the file
|
||||||
* with zeroes if the new position extends the current EOF (sparse streams
|
* with zeroes if the new position extends the current EOF (sparse streams
|
||||||
* and segment accumulation). */
|
* and segment accumulation). */
|
||||||
if (!gst_fd_sink_do_seek (fdsink, (guint64) segment.start))
|
if (!gst_fd_sink_do_seek (fdsink, (guint64) segment->start))
|
||||||
goto seek_failed;
|
goto seek_failed;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (fdsink,
|
GST_DEBUG_OBJECT (fdsink,
|
||||||
"Ignored SEGMENT event of format %u (%s)", (guint) segment.format,
|
"Ignored SEGMENT event of format %u (%s)", (guint) segment->format,
|
||||||
gst_format_get_name (segment.format));
|
gst_format_get_name (segment->format));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -543,27 +543,27 @@ gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
{
|
{
|
||||||
GstSegment segment;
|
const GstSegment *segment;
|
||||||
|
|
||||||
gst_event_parse_segment (event, &segment);
|
gst_event_parse_segment (event, &segment);
|
||||||
|
|
||||||
if (segment.format == GST_FORMAT_BYTES) {
|
if (segment->format == GST_FORMAT_BYTES) {
|
||||||
/* only try to seek and fail when we are going to a different
|
/* only try to seek and fail when we are going to a different
|
||||||
* position */
|
* position */
|
||||||
if (filesink->current_pos != segment.start) {
|
if (filesink->current_pos != segment->start) {
|
||||||
/* FIXME, the seek should be performed on the pos field, start/stop are
|
/* FIXME, the seek should be performed on the pos field, start/stop are
|
||||||
* just boundaries for valid bytes offsets. We should also fill the file
|
* just boundaries for valid bytes offsets. We should also fill the file
|
||||||
* with zeroes if the new position extends the current EOF (sparse streams
|
* with zeroes if the new position extends the current EOF (sparse streams
|
||||||
* and segment accumulation). */
|
* and segment accumulation). */
|
||||||
if (!gst_file_sink_do_seek (filesink, (guint64) segment.start))
|
if (!gst_file_sink_do_seek (filesink, (guint64) segment->start))
|
||||||
goto seek_failed;
|
goto seek_failed;
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (filesink, "Ignored SEGMENT, no seek needed");
|
GST_DEBUG_OBJECT (filesink, "Ignored SEGMENT, no seek needed");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (filesink,
|
GST_DEBUG_OBJECT (filesink,
|
||||||
"Ignored SEGMENT event of format %u (%s)", (guint) segment.format,
|
"Ignored SEGMENT event of format %u (%s)", (guint) segment->format,
|
||||||
gst_format_get_name (segment.format));
|
gst_format_get_name (segment->format));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -315,7 +315,7 @@ gst_funnel_sink_event (GstPad * pad, GstEvent * event)
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
{
|
{
|
||||||
GST_OBJECT_LOCK (funnel);
|
GST_OBJECT_LOCK (funnel);
|
||||||
gst_event_parse_segment (event, &fpad->segment);
|
gst_event_copy_segment (event, &fpad->segment);
|
||||||
GST_OBJECT_UNLOCK (funnel);
|
GST_OBJECT_UNLOCK (funnel);
|
||||||
|
|
||||||
forward = FALSE;
|
forward = FALSE;
|
||||||
|
|
|
@ -353,7 +353,7 @@ gst_identity_event (GstBaseTransform * trans, GstEvent * event)
|
||||||
GstEvent *news;
|
GstEvent *news;
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
|
|
||||||
gst_event_parse_segment (event, &segment);
|
gst_event_copy_segment (event, &segment);
|
||||||
|
|
||||||
/* This is the first segment, send out a (0, -1) segment */
|
/* This is the first segment, send out a (0, -1) segment */
|
||||||
gst_segment_init (&segment, segment.format);
|
gst_segment_init (&segment, segment.format);
|
||||||
|
|
|
@ -400,7 +400,7 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
GST_INPUT_SELECTOR_LOCK (sel);
|
GST_INPUT_SELECTOR_LOCK (sel);
|
||||||
GST_OBJECT_LOCK (selpad);
|
GST_OBJECT_LOCK (selpad);
|
||||||
gst_event_parse_segment (event, &selpad->segment);
|
gst_event_copy_segment (event, &selpad->segment);
|
||||||
GST_DEBUG_OBJECT (pad, "configured SEGMENT %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (pad, "configured SEGMENT %" GST_SEGMENT_FORMAT,
|
||||||
&selpad->segment);
|
&selpad->segment);
|
||||||
GST_OBJECT_UNLOCK (selpad);
|
GST_OBJECT_UNLOCK (selpad);
|
||||||
|
|
|
@ -910,7 +910,7 @@ static void
|
||||||
apply_segment (GstMultiQueue * mq, GstSingleQueue * sq, GstEvent * event,
|
apply_segment (GstMultiQueue * mq, GstSingleQueue * sq, GstEvent * event,
|
||||||
GstSegment * segment)
|
GstSegment * segment)
|
||||||
{
|
{
|
||||||
gst_event_parse_segment (event, segment);
|
gst_event_copy_segment (event, segment);
|
||||||
|
|
||||||
/* now configure the values, we use these to track timestamps on the
|
/* now configure the values, we use these to track timestamps on the
|
||||||
* sinkpad. */
|
* sinkpad. */
|
||||||
|
@ -1011,13 +1011,13 @@ get_running_time (GstSegment * segment, GstMiniObject * object, gboolean end)
|
||||||
|
|
||||||
/* For newsegment events return the running time of the start position */
|
/* For newsegment events return the running time of the start position */
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
|
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
|
||||||
GstSegment new_segment = *segment;
|
const GstSegment *new_segment;
|
||||||
|
|
||||||
gst_event_parse_segment (event, &new_segment);
|
gst_event_parse_segment (event, &new_segment);
|
||||||
if (new_segment.format == GST_FORMAT_TIME) {
|
if (new_segment->format == GST_FORMAT_TIME) {
|
||||||
time =
|
time =
|
||||||
gst_segment_to_running_time (&new_segment, GST_FORMAT_TIME,
|
gst_segment_to_running_time (new_segment, GST_FORMAT_TIME,
|
||||||
new_segment.start);
|
new_segment->start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,7 +546,7 @@ gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
{
|
{
|
||||||
gst_event_parse_segment (event, &sel->segment);
|
gst_event_copy_segment (event, &sel->segment);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (sel, "configured SEGMENT update %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (sel, "configured SEGMENT update %" GST_SEGMENT_FORMAT,
|
||||||
&sel->segment);
|
&sel->segment);
|
||||||
|
|
|
@ -570,7 +570,7 @@ static void
|
||||||
apply_segment (GstQueue * queue, GstEvent * event, GstSegment * segment,
|
apply_segment (GstQueue * queue, GstEvent * event, GstSegment * segment,
|
||||||
gboolean sink)
|
gboolean sink)
|
||||||
{
|
{
|
||||||
gst_event_parse_segment (event, segment);
|
gst_event_copy_segment (event, segment);
|
||||||
|
|
||||||
/* now configure the values, we use these to track timestamps on the
|
/* now configure the values, we use these to track timestamps on the
|
||||||
* sinkpad. */
|
* sinkpad. */
|
||||||
|
|
|
@ -686,7 +686,7 @@ static void
|
||||||
apply_segment (GstQueue2 * queue, GstEvent * event, GstSegment * segment,
|
apply_segment (GstQueue2 * queue, GstEvent * event, GstSegment * segment,
|
||||||
gboolean is_sink)
|
gboolean is_sink)
|
||||||
{
|
{
|
||||||
gst_event_parse_segment (event, segment);
|
gst_event_copy_segment (event, segment);
|
||||||
|
|
||||||
if (segment->format == GST_FORMAT_BYTES) {
|
if (segment->format == GST_FORMAT_BYTES) {
|
||||||
if (QUEUE_IS_USING_TEMP_FILE (queue)) {
|
if (QUEUE_IS_USING_TEMP_FILE (queue)) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ GST_START_TEST (create_events)
|
||||||
fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
|
fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
|
||||||
fail_unless (GST_EVENT_IS_SERIALIZED (event));
|
fail_unless (GST_EVENT_IS_SERIALIZED (event));
|
||||||
|
|
||||||
gst_event_parse_segment (event, &parsed);
|
gst_event_copy_segment (event, &parsed);
|
||||||
fail_unless (parsed.rate == 0.5);
|
fail_unless (parsed.rate == 0.5);
|
||||||
fail_unless (parsed.applied_rate == 1.0);
|
fail_unless (parsed.applied_rate == 1.0);
|
||||||
fail_unless (parsed.format == GST_FORMAT_TIME);
|
fail_unless (parsed.format == GST_FORMAT_TIME);
|
||||||
|
|
|
@ -514,7 +514,7 @@ GST_START_TEST (basesrc_seek_events_rate_update)
|
||||||
GstEvent *seg_event = NULL;
|
GstEvent *seg_event = NULL;
|
||||||
GstEvent *rate_seek;
|
GstEvent *rate_seek;
|
||||||
gboolean event_ret;
|
gboolean event_ret;
|
||||||
GstSegment segment;
|
const GstSegment *segment;
|
||||||
|
|
||||||
pipe = gst_pipeline_new ("pipeline");
|
pipe = gst_pipeline_new ("pipeline");
|
||||||
sink = gst_element_factory_make ("fakesink", "sink");
|
sink = gst_element_factory_make ("fakesink", "sink");
|
||||||
|
@ -581,7 +581,7 @@ GST_START_TEST (basesrc_seek_events_rate_update)
|
||||||
fail_unless (seg_event != NULL);
|
fail_unless (seg_event != NULL);
|
||||||
|
|
||||||
gst_event_parse_segment (seg_event, &segment);
|
gst_event_parse_segment (seg_event, &segment);
|
||||||
fail_unless (segment.rate == 0.5);
|
fail_unless (segment->rate == 0.5);
|
||||||
|
|
||||||
gst_pad_remove_event_probe (probe_pad, probe);
|
gst_pad_remove_event_probe (probe_pad, probe);
|
||||||
gst_object_unref (probe_pad);
|
gst_object_unref (probe_pad);
|
||||||
|
|
|
@ -27,6 +27,7 @@ EXPORTS
|
||||||
gst_base_parse_set_duration
|
gst_base_parse_set_duration
|
||||||
gst_base_parse_set_frame_rate
|
gst_base_parse_set_frame_rate
|
||||||
gst_base_parse_set_has_timing_info
|
gst_base_parse_set_has_timing_info
|
||||||
|
gst_base_parse_set_latency
|
||||||
gst_base_parse_set_min_frame_size
|
gst_base_parse_set_min_frame_size
|
||||||
gst_base_parse_set_passthrough
|
gst_base_parse_set_passthrough
|
||||||
gst_base_parse_set_syncable
|
gst_base_parse_set_syncable
|
||||||
|
|
|
@ -381,7 +381,7 @@ EXPORTS
|
||||||
gst_element_unlink_many
|
gst_element_unlink_many
|
||||||
gst_element_unlink_pads
|
gst_element_unlink_pads
|
||||||
gst_error_get_message
|
gst_error_get_message
|
||||||
gst_event_get_segment
|
gst_event_copy_segment
|
||||||
gst_event_get_seqnum
|
gst_event_get_seqnum
|
||||||
gst_event_get_structure
|
gst_event_get_structure
|
||||||
gst_event_has_name
|
gst_event_has_name
|
||||||
|
@ -667,6 +667,7 @@ EXPORTS
|
||||||
gst_pad_get_query_types
|
gst_pad_get_query_types
|
||||||
gst_pad_get_query_types_default
|
gst_pad_get_query_types_default
|
||||||
gst_pad_get_range
|
gst_pad_get_range
|
||||||
|
gst_pad_get_sticky_event
|
||||||
gst_pad_get_type
|
gst_pad_get_type
|
||||||
gst_pad_has_current_caps
|
gst_pad_has_current_caps
|
||||||
gst_pad_is_active
|
gst_pad_is_active
|
||||||
|
|
Loading…
Reference in a new issue