docs/design/part-qos.txt: Fix typo.

Original commit message from CVS:
* docs/design/part-qos.txt:
Fix typo.
* gst/gstevent.c:
* gst/gstevent.h:
Update seek event docs regarding negative rates.
Rename @cur to @start.
* gst/gstsegment.c: (gst_segment_set_seek):
* gst/gstsegment.h:
Update set_seek docs regarding negative rates.
Correctly update last_stop to @stop when dealing with negative
rates.
Rename @cur to @start.
* tests/check/gst/gstpad.c: (GST_START_TEST):
Activate pads before trying to use them.
* tests/check/gst/gstsegment.c: (GST_START_TEST),
(gst_segment_suite):
Add simple check for segments and negative rates.
This commit is contained in:
Wim Taymans 2006-10-09 16:33:29 +00:00
parent 3a8fdc1d39
commit 89814eed61
8 changed files with 135 additions and 45 deletions

View file

@ -1,3 +1,27 @@
2006-10-09 Wim Taymans <wim@fluendo.com>
* docs/design/part-qos.txt:
Fix typo.
* gst/gstevent.c:
* gst/gstevent.h:
Update seek event docs regarding negative rates.
Rename @cur to @start.
* gst/gstsegment.c: (gst_segment_set_seek):
* gst/gstsegment.h:
Update set_seek docs regarding negative rates.
Correctly update last_stop to @stop when dealing with negative
rates.
Rename @cur to @start.
* tests/check/gst/gstpad.c: (GST_START_TEST):
Activate pads before trying to use them.
* tests/check/gst/gstsegment.c: (GST_START_TEST),
(gst_segment_suite):
Add simple check for segments and negative rates.
2006-10-09 Tim-Philipp Müller <tim at centricular dot net> 2006-10-09 Tim-Philipp Müller <tim at centricular dot net>
* gst/gsttaglist.c: (gst_tag_list_is_empty): * gst/gsttaglist.c: (gst_tag_list_is_empty):

View file

@ -32,9 +32,9 @@ The QoS event travels upstream and contains the following fields:
- timestamp: The timestamp on the buffer that generated the QoS - timestamp: The timestamp on the buffer that generated the QoS
event. These timestamps are expressed in total running time in event. These timestamps are expressed in total running time in
the sink so that the value is every increasing. the sink so that the value is ever increasing.
- jitter: The difference of that timestamp against the currentl clock time. - jitter: The difference of that timestamp against the current clock time.
Negative values mean the timestamp was on time. Positive values Negative values mean the timestamp was on time. Positive values
indicate the timestamp was late by that amount. indicate the timestamp was late by that amount.

View file

@ -785,33 +785,34 @@ gst_event_parse_qos (GstEvent * event, gdouble * proportion,
* @rate: The new playback rate * @rate: The new playback rate
* @format: The format of the seek values * @format: The format of the seek values
* @flags: The optional seek flags * @flags: The optional seek flags
* @cur_type: The type and flags for the new current position * @start_type: The type and flags for the new start position
* @cur: The value of the new current position * @start: The value of the new start position
* @stop_type: The type and flags for the new stop position * @stop_type: The type and flags for the new stop position
* @stop: The value of the new stop position * @stop: The value of the new stop position
* *
* Allocate a new seek event with the given parameters. * Allocate a new seek event with the given parameters.
* *
* The seek event configures playback of the pipeline from * The seek event configures playback of the pipeline between @start to @stop
* @cur to @stop at the speed given in @rate, also called a playback segment. * at the speed given in @rate, also called a playback segment.
* The @cur and @stop values are expressed in format @format. * The @start and @stop values are expressed in @format.
* *
* A @rate of 1.0 means normal playback rate, 2.0 means double speed. * A @rate of 1.0 means normal playback rate, 2.0 means double speed.
* Negatives values means backwards playback. A value of 0.0 for the * Negatives values means backwards playback. A value of 0.0 for the
* rate is not allowed and should be accomplished instead by PAUSING the * rate is not allowed and should be accomplished instead by PAUSING the
* pipeline. * pipeline.
* *
* A pipeline has a default playback segment configured with a current * A pipeline has a default playback segment configured with a start
* position of 0, a stop position of the total duration of the stream(s) and * position of 0, a stop position of -1 and a rate of 1.0. The currently
* a rate of 1.0. The currently configured playback segment can be queried * configured playback segment can be queried with #GST_QUERY_SEGMENT.
* with #GST_QUERY_SEGMENT.
* *
* @cur_type and @stop_type specify how to adjust the current and stop * @start_type and @stop_type specify how to adjust the currently configured
* time, relative or absolute to the last configured playback segment. A type * start and stop fields in @segment. Adjustments can be made relative or
* of #GST_SEEK_TYPE_NONE means that the position should not be updated. * absolute to the last configured values. A type of #GST_SEEK_TYPE_NONE means
* that the position should not be updated.
* *
* Updating the @cur position will actually move the current playback position * When the rate is positive and @start has been updated, playback will start
* to that new position. * from the newly configured start position. For negative rates, playback will
* start from the newly configured stop position.
* *
* It is not possible to seek relative to the current playback position, to do * It is not possible to seek relative to the current playback position, to do
* this, PAUSE the pipeline, query the current playback position with * this, PAUSE the pipeline, query the current playback position with

View file

@ -411,11 +411,11 @@ void gst_event_parse_qos (GstEvent *event, gdouble *proportion, GstClockTimeDi
GstClockTime *timestamp); GstClockTime *timestamp);
/* seek event */ /* seek event */
GstEvent* gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags, GstEvent* gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags,
GstSeekType cur_type, gint64 cur, GstSeekType start_type, gint64 start,
GstSeekType stop_type, gint64 stop); GstSeekType stop_type, gint64 stop);
void gst_event_parse_seek (GstEvent *event, gdouble *rate, GstFormat *format, void gst_event_parse_seek (GstEvent *event, gdouble *rate, GstFormat *format,
GstSeekFlags *flags, GstSeekFlags *flags,
GstSeekType *cur_type, gint64 *cur, GstSeekType *start_type, gint64 *start,
GstSeekType *stop_type, gint64 *stop); GstSeekType *stop_type, gint64 *stop);
/* navigation event */ /* navigation event */
GstEvent* gst_event_new_navigation (GstStructure *structure); GstEvent* gst_event_new_navigation (GstStructure *structure);

View file

@ -172,11 +172,11 @@ gst_segment_init (GstSegment * segment, GstFormat format)
* gst_segment_set_duration: * gst_segment_set_duration:
* @segment: a #GstSegment structure. * @segment: a #GstSegment structure.
* @format: the format of the segment. * @format: the format of the segment.
* @duration: the duration of the segment info. * @duration: the duration of the segment info or -1 if unknown.
* *
* Set the duration of the segment to @duration. This function is mainly * Set the duration of the segment to @duration. This function is mainly
* used by elements that perform seeking and know the total duration of the * used by elements that perform seeking and know the total duration of the
* segment. * segment.
* *
* This field should be set to allow seeking requests relative to the * This field should be set to allow seeking requests relative to the
* duration. * duration.
@ -226,19 +226,31 @@ gst_segment_set_last_stop (GstSegment * segment, GstFormat format,
* @rate: the rate of the segment. * @rate: the rate of the segment.
* @format: the format of the segment. * @format: the format of the segment.
* @flags: the seek flags for the segment * @flags: the seek flags for the segment
* @cur_type: the seek method * @start_type: the seek method
* @cur: the seek start value * @start: the seek start value
* @stop_type: the seek method * @stop_type: the seek method
* @stop: the seek stop value * @stop: the seek stop value
* @update: boolean holding whether start or stop were updated. * @update: boolean holding whether start or stop were updated.
* *
* Update the segment structure with the field values of a seek event. * Update the segment structure with the field values of a seek event (see
* gst_event_new_seek()).
* *
* After calling this method, the segment field last_stop will contain * After calling this method, the segment field last_stop and time will
* the requested new position in the segment. If the cur_type is different * contain the requested new position in the segment. The new requested
* from GST_SEEK_TYPE_NONE, the current position is not updated and * position in the segment depends on @rate and @start_type and @stop_type.
* streaming should continue from the last position, possibly with *
* updated rate, flags or stop position. * For positive @rate, the new position in the segment is the new @segment
* start field when it was updated with a @start_type different from
* #GST_SEEK_TYPE_NONE. If no update was performed on @segment start position
* (#GST_SEEK_TYPE_NONE), @start is ignored and @segment last_stop is
* unmodified.
*
* For negative @rate, the new position in the segment is the new @segment
* stop field when it was updated with a @stop_type different from
* #GST_SEEK_TYPE_NONE. If no stop was previously configured in the segment, the
* duration of the segment will be used to update the stop position.
* If no update was performed on @segment stop position (#GST_SEEK_TYPE_NONE),
* @stop is ignored and @segment last_stop is unmodified.
* *
* The applied rate of the segment will be set to 1.0 by default. * The applied rate of the segment will be set to 1.0 by default.
* If the caller can apply a rate change, it should update @segment * If the caller can apply a rate change, it should update @segment
@ -247,7 +259,7 @@ gst_segment_set_last_stop (GstSegment * segment, GstFormat format,
void void
gst_segment_set_seek (GstSegment * segment, gdouble rate, gst_segment_set_seek (GstSegment * segment, gdouble rate,
GstFormat format, GstSeekFlags flags, GstFormat format, GstSeekFlags flags,
GstSeekType cur_type, gint64 cur, GstSeekType start_type, gint64 start,
GstSeekType stop_type, gint64 stop, gboolean * update) GstSeekType stop_type, gint64 stop, gboolean * update)
{ {
gboolean update_stop, update_start; gboolean update_stop, update_start;
@ -263,35 +275,35 @@ gst_segment_set_seek (GstSegment * segment, gdouble rate,
update_stop = update_start = TRUE; update_stop = update_start = TRUE;
/* start is never invalid */ /* start is never invalid */
switch (cur_type) { switch (start_type) {
case GST_SEEK_TYPE_NONE: case GST_SEEK_TYPE_NONE:
/* no update to segment */ /* no update to segment */
cur = segment->start; start = segment->start;
update_start = FALSE; update_start = FALSE;
break; break;
case GST_SEEK_TYPE_SET: case GST_SEEK_TYPE_SET:
/* cur holds desired position */ /* start holds desired position */
break; break;
case GST_SEEK_TYPE_CUR: case GST_SEEK_TYPE_CUR:
/* add cur to currently configure segment */ /* add start to currently configure segment */
cur = segment->start + cur; start = segment->start + start;
break; break;
case GST_SEEK_TYPE_END: case GST_SEEK_TYPE_END:
if (segment->duration != -1) { if (segment->duration != -1) {
/* add cur to total length */ /* add start to total length */
cur = segment->duration + cur; start = segment->duration + start;
} else { } else {
/* no update if duration unknown */ /* no update if duration unknown */
cur = segment->start; start = segment->start;
update_start = FALSE; update_start = FALSE;
} }
break; break;
} }
/* bring in sane range */ /* bring in sane range */
if (segment->duration != -1) if (segment->duration != -1)
cur = CLAMP (cur, 0, segment->duration); start = CLAMP (start, 0, segment->duration);
else else
cur = MAX (cur, 0); start = MAX (start, 0);
/* stop can be -1 if we have not configured a stop. */ /* stop can be -1 if we have not configured a stop. */
switch (stop_type) { switch (stop_type) {
@ -328,15 +340,18 @@ gst_segment_set_seek (GstSegment * segment, gdouble rate,
/* we can't have stop before start */ /* we can't have stop before start */
if (stop != -1) if (stop != -1)
g_return_if_fail (cur <= stop); g_return_if_fail (start <= stop);
segment->rate = rate; segment->rate = rate;
segment->abs_rate = ABS (rate); segment->abs_rate = ABS (rate);
segment->applied_rate = 1.0; segment->applied_rate = 1.0;
segment->flags = flags; segment->flags = flags;
segment->start = cur; segment->start = start;
if (update_start) { if (update_start && rate > 0.0) {
segment->last_stop = cur; segment->last_stop = start;
}
if (update_stop && rate < 0.0) {
segment->last_stop = stop;
} }
segment->time = segment->last_stop; segment->time = segment->last_stop;
segment->stop = stop; segment->stop = stop;

View file

@ -83,7 +83,7 @@ void gst_segment_set_last_stop (GstSegment *segment, GstFormat for
void gst_segment_set_seek (GstSegment *segment, gdouble rate, void gst_segment_set_seek (GstSegment *segment, gdouble rate,
GstFormat format, GstSeekFlags flags, GstFormat format, GstSeekFlags flags,
GstSeekType cur_type, gint64 cur, GstSeekType start_type, gint64 start,
GstSeekType stop_type, gint64 stop, GstSeekType stop_type, gint64 stop,
gboolean *update); gboolean *update);

View file

@ -333,9 +333,21 @@ GST_START_TEST (test_push_linked)
fail_unless (GST_PAD_LINK_SUCCESSFUL (plr)); fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
ASSERT_CAPS_REFCOUNT (caps, "caps", 3); ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
buffer = gst_buffer_new ();
#if 0
/* FIXME, new pad should be flushing */
gst_buffer_ref (buffer);
fail_unless (gst_pad_push (src, buffer) == GST_FLOW_WRONG_STATE);
gst_buffer_ref (buffer);
fail_unless (gst_pad_chain (sink, buffer) == GST_FLOW_WRONG_STATE);
#endif
/* activate pads */
gst_pad_set_active (src, TRUE);
gst_pad_set_active (sink, TRUE);
/* test */ /* test */
/* pushing on a linked pad will drop the ref to the buffer */ /* pushing on a linked pad will drop the ref to the buffer */
buffer = gst_buffer_new ();
gst_buffer_ref (buffer); gst_buffer_ref (buffer);
fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK); fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 2); ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 2);

View file

@ -380,6 +380,43 @@ GST_START_TEST (segment_seek_size)
GST_END_TEST; GST_END_TEST;
GST_START_TEST (segment_seek_reverse)
{
GstSegment segment;
gboolean update;
gst_segment_init (&segment, GST_FORMAT_BYTES);
gst_segment_set_duration (&segment, GST_FORMAT_BYTES, 200);
/* configure segment to stop 100 */
gst_segment_set_seek (&segment, -1.0,
GST_FORMAT_BYTES,
GST_SEEK_FLAG_NONE,
GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 100, &update);
fail_unless (segment.start == 0);
fail_unless (segment.stop == 100);
fail_unless (segment.last_stop == 100);
/* update */
gst_segment_set_seek (&segment, -1.0,
GST_FORMAT_BYTES,
GST_SEEK_FLAG_NONE,
GST_SEEK_TYPE_SET, 10, GST_SEEK_TYPE_CUR, -20, &update);
fail_unless (segment.start == 10);
fail_unless (segment.stop == 80);
fail_unless (segment.last_stop == 80);
gst_segment_set_seek (&segment, -1.0,
GST_FORMAT_BYTES,
GST_SEEK_FLAG_NONE,
GST_SEEK_TYPE_SET, 20, GST_SEEK_TYPE_NONE, 0, &update);
fail_unless (segment.start == 20);
fail_unless (segment.stop == 80);
fail_unless (segment.last_stop == 80);
}
GST_END_TEST;
/* mess with the segment structure in the bytes format */ /* mess with the segment structure in the bytes format */
GST_START_TEST (segment_newsegment_open) GST_START_TEST (segment_newsegment_open)
{ {
@ -1289,6 +1326,7 @@ gst_segment_suite (void)
suite_add_tcase (s, tc_chain); suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, segment_seek_nosize); tcase_add_test (tc_chain, segment_seek_nosize);
tcase_add_test (tc_chain, segment_seek_size); tcase_add_test (tc_chain, segment_seek_size);
tcase_add_test (tc_chain, segment_seek_reverse);
tcase_add_test (tc_chain, segment_newsegment_open); tcase_add_test (tc_chain, segment_newsegment_open);
tcase_add_test (tc_chain, segment_newsegment_closed); tcase_add_test (tc_chain, segment_newsegment_closed);
tcase_add_test (tc_chain, segment_newsegment_streamtime); tcase_add_test (tc_chain, segment_newsegment_streamtime);