You can subscribe to this list here.
2000 |
Jan
(16) |
Feb
(60) |
Mar
(22) |
Apr
(14) |
May
(24) |
Jun
(20) |
Jul
(15) |
Aug
(55) |
Sep
(39) |
Oct
(27) |
Nov
(33) |
Dec
(53) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
(186) |
Feb
(87) |
Mar
(153) |
Apr
(186) |
May
(316) |
Jun
(376) |
Jul
(84) |
Aug
(135) |
Sep
(251) |
Oct
(327) |
Nov
(78) |
Dec
(1619) |
2002 |
Jan
(828) |
Feb
(500) |
Mar
(314) |
Apr
(310) |
May
(306) |
Jun
(361) |
Jul
(320) |
Aug
(136) |
Sep
(427) |
Oct
(285) |
Nov
(248) |
Dec
(344) |
2003 |
Jan
(469) |
Feb
(215) |
Mar
(148) |
Apr
(310) |
May
(303) |
Jun
(227) |
Jul
(315) |
Aug
(158) |
Sep
(191) |
Oct
(325) |
Nov
(479) |
Dec
(417) |
2004 |
Jan
(529) |
Feb
(445) |
Mar
(550) |
Apr
(380) |
May
(385) |
Jun
(263) |
Jul
(393) |
Aug
(186) |
Sep
(138) |
Oct
(272) |
Nov
(254) |
Dec
(259) |
2005 |
Jan
(310) |
Feb
(234) |
Mar
(171) |
Apr
(316) |
May
(364) |
Jun
(381) |
Jul
(420) |
Aug
(489) |
Sep
(663) |
Oct
(735) |
Nov
(839) |
Dec
(403) |
2006 |
Jan
(340) |
Feb
(445) |
Mar
(433) |
Apr
(451) |
May
(438) |
Jun
(312) |
Jul
(315) |
Aug
(283) |
Sep
(290) |
Oct
(243) |
Nov
(195) |
Dec
(182) |
2007 |
Jan
(278) |
Feb
(256) |
Mar
(318) |
Apr
(250) |
May
(286) |
Jun
(249) |
Jul
(226) |
Aug
(179) |
Sep
(265) |
Oct
(234) |
Nov
(244) |
Dec
(272) |
2008 |
Jan
(414) |
Feb
(379) |
Mar
(206) |
Apr
(308) |
May
(422) |
Jun
(350) |
Jul
(205) |
Aug
(349) |
Sep
(127) |
Oct
(306) |
Nov
(359) |
Dec
(236) |
2009 |
Jan
(326) |
Feb
(453) |
Mar
(684) |
Apr
(702) |
May
(1106) |
Jun
(774) |
Jul
(441) |
Aug
(561) |
Sep
(603) |
Oct
(824) |
Nov
(539) |
Dec
(347) |
2010 |
Jan
(470) |
Feb
(448) |
Mar
(845) |
Apr
(512) |
May
(428) |
Jun
(893) |
Jul
(347) |
Aug
(350) |
Sep
(689) |
Oct
(456) |
Nov
(254) |
Dec
(860) |
2011 |
Jan
(763) |
Feb
(106) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Tim-Philipp M. <t....@ze...> - 2011-02-11 00:00:13
|
This mailing list has moved to: gst...@li... Your subscription should have been transferred automatically (unless you had the "hidden" flag set) and you should already have received a welcome e-mail from the new list. If you haven't, please check your SPAM filters and other mail filters and sign up again on http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits if needed. The old mailing list will be disabled for posting. Thanks for reading, see you on the other side! Cheers -Tim |
From: <bi...@ke...> - 2011-02-10 18:12:56
|
Module: gnonlin Branch: master Commit: c3bdc5b138b97c9365098a091db2b74418482219 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=c3bdc5b138b97c9365098a091db2b74418482219 Author: Edward Hervey <bi...@bi...> Date: Thu Feb 10 19:11:57 2011 +0100 tests: Make gnlcomposition check stop faster --- tests/check/gnl/gnlcomposition.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/tests/check/gnl/gnlcomposition.c b/tests/check/gnl/gnlcomposition.c index cb91a0f..a517569 100644 --- a/tests/check/gnl/gnlcomposition.c +++ b/tests/check/gnl/gnlcomposition.c @@ -391,7 +391,8 @@ GST_START_TEST (test_no_more_pads_race) /* FIXME: maybe slow down the videotestsrc steaming thread */ gst_bin_add (GST_BIN (composition), source2); - message = gst_bus_timed_pop_filtered (bus, 1 * GST_SECOND, GST_MESSAGE_ERROR); + message = + gst_bus_timed_pop_filtered (bus, GST_SECOND / 10, GST_MESSAGE_ERROR); if (message) { if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR) { GError *error; |
From: <bi...@ke...> - 2011-02-10 18:03:15
|
Module: gnonlin Branch: master Commit: 1cdf7d533215f831c6cca6ec3102797ef38be8bc URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=1cdf7d533215f831c6cca6ec3102797ef38be8bc Author: Edward Hervey <bi...@bi...> Date: Thu Feb 10 18:51:41 2011 +0100 tests: Add doc and refine seek check --- tests/check/gnl/gnloperation.c | 9 +++++++++ tests/check/gnl/seek.c | 7 +++++++ tests/check/gnl/simple.c | 8 ++++++++ 3 files changed, 24 insertions(+), 0 deletions(-) diff --git a/tests/check/gnl/gnloperation.c b/tests/check/gnl/gnloperation.c index 74a2dd7..509f5b4 100644 --- a/tests/check/gnl/gnloperation.c +++ b/tests/check/gnl/gnloperation.c @@ -503,6 +503,15 @@ GST_START_TEST (test_complex_operations) comp = gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); + /* TOPOLOGY + * + * 0 1 2 3 4 5 6 | Priority + * ---------------------------------------------------------------------------- + * [ -oper- ] | 1 + * [ -source2- -] | 2 + * [ -source1- -] | 3 + * */ + /* source1 Start : 0s diff --git a/tests/check/gnl/seek.c b/tests/check/gnl/seek.c index cbb0206..1801f25 100644 --- a/tests/check/gnl/seek.c +++ b/tests/check/gnl/seek.c @@ -90,6 +90,10 @@ fill_pipeline_and_check (GstElement * comp, GList * segments, GList * seeks) carry_on = FALSE; break; } + + /* We should have received the segment by then and there should be none left */ + fail_if (collect->expected_segments != NULL); + while (seeks) { SeekInfo *sinfo = (SeekInfo *) seeks->data; @@ -106,13 +110,16 @@ fill_pipeline_and_check (GstElement * comp, GList * segments, GList * seeks) GST_TIME_FORMAT " %" GST_TIME_FORMAT ")", GST_TIME_ARGS (sinfo->position), GST_TIME_ARGS (sinfo->start), GST_TIME_ARGS (sinfo->stop)); + fail_unless_equals_int (gst_element_seek_simple (pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, sinfo->position), !sinfo->expect_failure); + if (!sinfo->expect_failure) { g_free (sinfo); break; } + GST_DEBUG ("Seek failed as expected"); if (seeks == NULL) carry_on = FALSE; diff --git a/tests/check/gnl/simple.c b/tests/check/gnl/simple.c index c584863..963a924 100644 --- a/tests/check/gnl/simple.c +++ b/tests/check/gnl/simple.c @@ -473,6 +473,14 @@ test_one_under_another_full (gboolean async) gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); fail_if (comp == NULL); + /* TOPOLOGY + * + * 0 1 2 3 4 5 | Priority + * ---------------------------------------------------------------------------- + * [- source1 -] | 1 + * [- source2 -] | 2 + * */ + /* Source 1 Start : 0s |
From: <bi...@ke...> - 2011-02-10 18:03:11
|
Module: gnonlin Branch: master Commit: 158a35a9e0e9b79b8d4399b42f501676f5d1a1e4 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=158a35a9e0e9b79b8d4399b42f501676f5d1a1e4 Author: Edward Hervey <bi...@bi...> Date: Tue Feb 8 09:12:35 2011 +0100 tests: refactor 'complex' test --- tests/check/gnl/common.h | 15 ++ tests/check/gnl/complex.c | 615 +++++++++------------------------------------ 2 files changed, 133 insertions(+), 497 deletions(-) Diff: http://cgit.freedesktop.org/gstreamer/gnonlin/diff/?id=158a35a9e0e9b79b8d4399b42f501676f5d1a1e4 |
From: <bi...@ke...> - 2011-02-10 18:03:11
|
Module: gnonlin Branch: master Commit: 2eaa525c9ef9664ecff9bad46125e4dbeccf1919 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=2eaa525c9ef9664ecff9bad46125e4dbeccf1919 Author: Edward Hervey <bi...@bi...> Date: Thu Feb 10 18:51:08 2011 +0100 tests: Small cleanup --- tests/check/gnl/common.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/check/gnl/common.h b/tests/check/gnl/common.h index 6ee967d..f13b315 100644 --- a/tests/check/gnl/common.h +++ b/tests/check/gnl/common.h @@ -93,9 +93,9 @@ compare_segments (Segment * segment, GstEvent * event) } fail_if (rate != segment->rate); fail_if (format != segment->format); - fail_if (start != segment->start); - fail_if (stop != segment->stop); - fail_if (position != segment->position); + fail_unless_equals_int64 (start, segment->start); + fail_unless_equals_int64 (stop, segment->stop); + fail_unless_equals_int64 (position, segment->position); GST_DEBUG ("Segment was valid, discarding expected Segment"); @@ -108,7 +108,7 @@ sinkpad_event_probe (GstPad * sinkpad, GstEvent * event, CollectStructure * coll Segment * segment; if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { - fail_if (collect->expected_segments == NULL); + fail_if (collect->expected_segments == NULL, "Received unexpected segment"); segment = (Segment *) collect->expected_segments->data; if (compare_segments (segment, event)) { @@ -271,7 +271,7 @@ new_operation (const gchar * name, const gchar * factory, guint64 start, gint64 GstElement * operation = NULL; operation = gst_element_factory_make_or_warn (factory, NULL); - gnloperation = gst_element_factory_make_or_warn ("gnloperation", NULL); + gnloperation = gst_element_factory_make_or_warn ("gnloperation", name); g_object_set (G_OBJECT (gnloperation), "start", start, |
From: <bi...@ke...> - 2011-02-10 18:03:11
|
Module: gnonlin Branch: master Commit: 40faf593f6ecfaf58a302c48070369c048453220 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=40faf593f6ecfaf58a302c48070369c048453220 Author: Edward Hervey <bi...@bi...> Date: Tue Feb 8 13:45:03 2011 +0100 tests: Added more seeking tests involving operations --- tests/check/gnl/seek.c | 237 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 237 insertions(+), 0 deletions(-) diff --git a/tests/check/gnl/seek.c b/tests/check/gnl/seek.c index 921c08b..cbb0206 100644 --- a/tests/check/gnl/seek.c +++ b/tests/check/gnl/seek.c @@ -454,6 +454,241 @@ test_one_bin_after_other_full () fill_pipeline_and_check (comp, segments, seeks); } + +GST_START_TEST (test_complex_operations) +{ + guint64 start, stop; + gint64 duration; + GstElement *comp, *oper, *source1, *source2; + GList *segments = NULL, *seeks = NULL; + + comp = + gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); + + /* TOPOLOGY + * + * 0 1 2 3 4 .. 6 | Priority + * ---------------------------------------------------------------------------- + * [------ oper ----------] | 1 + * [--------------------- source1 ----------------] | 2 + * [------------ source2 ------] | 3 + * */ + + /* + source1 + Start : 0s + Duration : 4s + Priority : 3 + */ + + source1 = videotest_in_bin_gnl_src ("source1", 0, 4 * GST_SECOND, 2, 3); + fail_if (source1 == NULL); + check_start_stop_duration (source1, 0, 4 * GST_SECOND, 4 * GST_SECOND); + + /* + source2 + Start : 2s + Duration : 4s + Priority : 2 + */ + + source2 = + videotest_in_bin_gnl_src ("source2", 2 * GST_SECOND, 4 * GST_SECOND, 2, + 2); + fail_if (source2 == NULL); + check_start_stop_duration (source2, 2 * GST_SECOND, 6 * GST_SECOND, + 4 * GST_SECOND); + + /* + operation + Start : 2s + Duration : 2s + Priority : 1 + */ + + oper = + new_operation ("oper", "videomixer", 2 * GST_SECOND, 2 * GST_SECOND, 1); + fail_if (oper == NULL); + check_start_stop_duration (oper, 2 * GST_SECOND, 4 * GST_SECOND, + 2 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (source1, "source1", 1); + ASSERT_OBJECT_REFCOUNT (source2, "source2", 1); + ASSERT_OBJECT_REFCOUNT (oper, "oper", 1); + + /* Add source1 */ + gst_bin_add (GST_BIN (comp), source1); + check_start_stop_duration (comp, 0, 4 * GST_SECOND, 4 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (source1, "source1", 1); + + /* Add source2 */ + gst_bin_add (GST_BIN (comp), source2); + check_start_stop_duration (comp, 0, 6 * GST_SECOND, 6 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (source2, "source2", 1); + + /* Add operaton */ + + gst_bin_add (GST_BIN (comp), oper); + check_start_stop_duration (comp, 0, 6 * GST_SECOND, 6 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (oper, "oper", 1); + + /* Expected segments */ + segments = g_list_append (segments, + segment_new (1.0, GST_FORMAT_TIME, 0, 2 * GST_SECOND, 0)); + + /* Seeks */ + seeks = + g_list_append (seeks, new_seek_info (0.5 * GST_SECOND, 0.5 * GST_SECOND, + 2 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (2.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (4.5 * GST_SECOND, 4.5 * GST_SECOND, + 6 * GST_SECOND, FALSE)); + /* and backwards */ + seeks = + g_list_append (seeks, new_seek_info (2.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (0.5 * GST_SECOND, 0.5 * GST_SECOND, + 2 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (2.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (4.5 * GST_SECOND, 4.5 * GST_SECOND, + 6 * GST_SECOND, FALSE)); + + fill_pipeline_and_check (comp, segments, seeks); +} + +GST_END_TEST; + + +GST_START_TEST (test_complex_operations_bis) +{ + guint64 start, stop; + gint64 duration; + GstElement *comp, *oper, *source1, *source2; + GList *segments = NULL, *seeks = NULL; + + comp = + gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); + + /* TOPOLOGY + * + * 0 1 2 3 4 .. 6 | Priority + * ---------------------------------------------------------------------------- + * [ ......................[------ oper ----------]..........] | 1 EXPANDABLE + * [--------------------- source1 ----------------] | 2 + * [------------ source2 ------] | 3 + * */ + + + /* + source1 + Start : 0s + Duration : 4s + Priority : 2 + */ + + source1 = videotest_in_bin_gnl_src ("source1", 0, 4 * GST_SECOND, 3, 2); + fail_if (source1 == NULL); + check_start_stop_duration (source1, 0, 4 * GST_SECOND, 4 * GST_SECOND); + + /* + source2 + Start : 2s + Duration : 4s + Priority : 3 + */ + + source2 = + videotest_in_bin_gnl_src ("source2", 2 * GST_SECOND, 4 * GST_SECOND, 2, + 3); + fail_if (source2 == NULL); + check_start_stop_duration (source2, 2 * GST_SECOND, 6 * GST_SECOND, + 4 * GST_SECOND); + + /* + operation + Start : 2s + Duration : 2s + Priority : 1 + EXPANDABLE + */ + + oper = + new_operation ("oper", "videomixer", 2 * GST_SECOND, 2 * GST_SECOND, 1); + fail_if (oper == NULL); + check_start_stop_duration (oper, 2 * GST_SECOND, 4 * GST_SECOND, + 2 * GST_SECOND); + g_object_set (oper, "expandable", TRUE, NULL); + + ASSERT_OBJECT_REFCOUNT (source1, "source1", 1); + ASSERT_OBJECT_REFCOUNT (source2, "source2", 1); + ASSERT_OBJECT_REFCOUNT (oper, "oper", 1); + + /* Add source1 */ + gst_bin_add (GST_BIN (comp), source1); + check_start_stop_duration (comp, 0, 4 * GST_SECOND, 4 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (source1, "source1", 1); + + /* Add source2 */ + gst_bin_add (GST_BIN (comp), source2); + check_start_stop_duration (comp, 0, 6 * GST_SECOND, 6 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (source2, "source2", 1); + + /* Add operaton */ + + gst_bin_add (GST_BIN (comp), oper); + check_start_stop_duration (comp, 0, 6 * GST_SECOND, 6 * GST_SECOND); + check_start_stop_duration (oper, 0 * GST_SECOND, 6 * GST_SECOND, + 6 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (oper, "oper", 1); + + /* Expected segments */ + segments = g_list_append (segments, + segment_new (1.0, GST_FORMAT_TIME, 0, 2 * GST_SECOND, 0)); + + /* Seeks */ + seeks = + g_list_append (seeks, new_seek_info (0.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (2.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (4.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + /* and backwards */ + seeks = + g_list_append (seeks, new_seek_info (2.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (0.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + + seeks = + g_list_append (seeks, new_seek_info (2.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + seeks = + g_list_append (seeks, new_seek_info (4.5 * GST_SECOND, 0 * GST_SECOND, + 1.5 * GST_SECOND, FALSE)); + + fill_pipeline_and_check (comp, segments, seeks); +} + +GST_END_TEST; + + GST_START_TEST (test_simplest) { test_simplest_full (); @@ -498,6 +733,8 @@ gnonlin_suite (void) tcase_add_test (tc_chain, test_one_after_other); tcase_add_test (tc_chain, test_one_under_another); tcase_add_test (tc_chain, test_one_bin_after_other); + tcase_add_test (tc_chain, test_complex_operations); + tcase_add_test (tc_chain, test_complex_operations_bis); return s; } |
From: <bi...@ke...> - 2011-02-10 18:03:11
|
Module: gnonlin Branch: master Commit: 83d10f27bce7f9d68126032711aaddd85f3eb196 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=83d10f27bce7f9d68126032711aaddd85f3eb196 Author: Edward Hervey <bi...@bi...> Date: Tue Feb 8 12:59:10 2011 +0100 check: refactor 'gnloperation' tests --- tests/check/gnl/gnloperation.c | 926 ++++++---------------------------------- 1 files changed, 131 insertions(+), 795 deletions(-) Diff: http://cgit.freedesktop.org/gstreamer/gnonlin/diff/?id=83d10f27bce7f9d68126032711aaddd85f3eb196 |
From: <bi...@ke...> - 2011-02-10 18:03:05
|
Module: gnonlin Branch: master Commit: d37d1c163e7ab02bbf069eba8656d7ab43ab9690 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=d37d1c163e7ab02bbf069eba8656d7ab43ab9690 Author: Edward Hervey <edw...@co...> Date: Sat Jan 29 12:52:30 2011 +0100 check: Add some comments --- tests/check/gnl/complex.c | 9 +++++++++ tests/check/gnl/gnloperation.c | 10 ++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-) diff --git a/tests/check/gnl/complex.c b/tests/check/gnl/complex.c index 4e4ffb1..c9c4ef4 100644 --- a/tests/check/gnl/complex.c +++ b/tests/check/gnl/complex.c @@ -215,6 +215,15 @@ GST_START_TEST (test_one_default_another) gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); fail_if (comp == NULL); + /* TOPOLOGY + * + * 0 1 2 3 4 5 | Priority + * ---------------------------------------------------------------------------- + * [-source1--] [-source2--][-source3-] | 1 + * [--------------------------defaultsource------------------] | MAXUINT32 + * */ + + /* defaultsrc source Start : 0s diff --git a/tests/check/gnl/gnloperation.c b/tests/check/gnl/gnloperation.c index bc8154d..ec6ce89 100644 --- a/tests/check/gnl/gnloperation.c +++ b/tests/check/gnl/gnloperation.c @@ -1111,6 +1111,16 @@ GST_START_TEST (test_complex_operations_bis) comp = gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); + /* TOPOLOGY + * + * 0 1 2 3 4 .. 6 | Priority + * ---------------------------------------------------------------------------- + * [ ......................[------ oper ----------]..........] | 1 EXPANDABLE + * [--------------------- source1 ----------------] | 2 + * [------------ source2 ------] | 3 + * */ + + /* source1 Start : 0s |
From: <bi...@ke...> - 2011-02-10 18:03:05
|
Module: gnonlin Branch: master Commit: 1c91a255a57653b5964469c786ff4094818292fd URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=1c91a255a57653b5964469c786ff4094818292fd Author: Edward Hervey <edw...@co...> Date: Mon Jan 31 16:05:34 2011 +0100 check: More debugging and state checking --- tests/check/gnl/gnlcomposition.c | 6 ++++++ tests/check/gnl/gnloperation.c | 24 +++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/tests/check/gnl/gnlcomposition.c b/tests/check/gnl/gnlcomposition.c index 7115a8d..cb91a0f 100644 --- a/tests/check/gnl/gnlcomposition.c +++ b/tests/check/gnl/gnlcomposition.c @@ -366,8 +366,12 @@ GST_START_TEST (test_no_more_pads_race) g_object_connect (composition, "signal::pad-removed", on_composition_pad_removed_cb, NULL, NULL); + GST_DEBUG ("Adding composition to pipeline"); + gst_bin_add_many (GST_BIN (pipeline), composition, fakesink, NULL); + GST_DEBUG ("Setting pipeline to PAUSED"); + fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE); @@ -382,6 +386,8 @@ GST_START_TEST (test_no_more_pads_race) } gst_message_unref (message); + GST_DEBUG ("Adding second source"); + /* FIXME: maybe slow down the videotestsrc steaming thread */ gst_bin_add (GST_BIN (composition), source2); diff --git a/tests/check/gnl/gnloperation.c b/tests/check/gnl/gnloperation.c index ec6ce89..25d25cd 100644 --- a/tests/check/gnl/gnloperation.c +++ b/tests/check/gnl/gnloperation.c @@ -16,6 +16,14 @@ GST_START_TEST (test_simple_operation) comp = gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); + /* TOPOLOGY + * + * 0 1 2 3 4 5 | Priority + * ---------------------------------------------------------------------------- + * [-- oper --] | 0 + * [------------- source -------------] | 1 + * */ + /* source Start : 0s @@ -1022,7 +1030,7 @@ GST_START_TEST (test_complex_operations) } } - GST_DEBUG ("Setting pipeline to NULL"); + GST_DEBUG ("Setting pipeline to READY"); fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); @@ -1031,6 +1039,11 @@ GST_START_TEST (test_complex_operations) GST_DEBUG ("Resetted pipeline to READY"); + /* Elements should all be in the READY state */ + check_state_simple (source1, GST_STATE_READY); + check_state_simple (source2, GST_STATE_READY); + check_state_simple (oper, GST_STATE_READY); + /* Expected segments */ collect->expected_segments = g_list_append (collect->expected_segments, segment_new (1.0, GST_FORMAT_TIME, 0, 2 * GST_SECOND, 0)); @@ -1255,14 +1268,19 @@ GST_START_TEST (test_complex_operations_bis) } } - GST_DEBUG ("Setting pipeline to NULL"); + GST_DEBUG ("Setting pipeline to READY"); fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); fail_if (collect->expected_segments != NULL); - GST_DEBUG ("Resetted pipeline to READY"); + GST_DEBUG ("Resetted pipeline to READY, checking state of elements"); + + /* Elements should all be in the READY state */ + check_state_simple (source1, GST_STATE_READY); + check_state_simple (source2, GST_STATE_READY); + check_state_simple (oper, GST_STATE_READY); /* Expected segments */ collect->expected_segments = g_list_append (collect->expected_segments, |
From: <bi...@ke...> - 2011-02-10 18:03:05
|
Module: gnonlin Branch: master Commit: f78dd57941980066d0f7d26501f8f04f284303b2 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=f78dd57941980066d0f7d26501f8f04f284303b2 Author: Edward Hervey <edw...@co...> Date: Sat Jan 29 12:52:09 2011 +0100 check: Add a simple variant --- tests/check/gnl/simple.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 177 insertions(+), 0 deletions(-) diff --git a/tests/check/gnl/simple.c b/tests/check/gnl/simple.c index 0b8ccd9..c584863 100644 --- a/tests/check/gnl/simple.c +++ b/tests/check/gnl/simple.c @@ -6,6 +6,168 @@ #define ENABLE_ASYNC_UPDATE { if (async) g_object_set(comp, "update", TRUE, NULL); } static void +test_simplest_full (gboolean async) +{ + GstElement *pipeline; + GstElement *comp, *sink, *source1; + CollectStructure *collect; + GstBus *bus; + GstMessage *message; + gboolean carry_on = TRUE; + guint64 start, stop; + gint64 duration; + GstPad *sinkpad; + + pipeline = gst_pipeline_new ("test_pipeline"); + comp = + gst_element_factory_make_or_warn ("gnlcomposition", "test_composition"); + fail_if (comp == NULL); + + /* + Source 1 + Start : 0s + Duration : 1s + Media start : 5s + Media Duartion : 1s + Priority : 1 + */ + source1 = + videotest_gnl_src_full ("source1", 0, 1 * GST_SECOND, 5 * GST_SECOND, + 1 * GST_SECOND, 3, 1); + fail_if (source1 == NULL); + check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND); + + /* Add one source */ + + DISABLE_ASYNC_UPDATE; + gst_bin_add (GST_BIN (comp), source1); + ENABLE_ASYNC_UPDATE; + check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND); + + ASSERT_OBJECT_REFCOUNT (source1, "source1", 1); + + sink = gst_element_factory_make_or_warn ("fakesink", "sink"); + fail_if (sink == NULL); + + gst_bin_add_many (GST_BIN (pipeline), comp, sink, NULL); + + /* Shared data */ + collect = g_new0 (CollectStructure, 1); + collect->comp = comp; + collect->sink = sink; + + /* Expected segments */ + collect->expected_segments = g_list_append (collect->expected_segments, + segment_new (1.0, GST_FORMAT_TIME, 5 * GST_SECOND, 6 * GST_SECOND, 0)); + + g_signal_connect (G_OBJECT (comp), "pad-added", + G_CALLBACK (composition_pad_added_cb), collect); + + sinkpad = gst_element_get_pad (sink, "sink"); + gst_pad_add_event_probe (sinkpad, G_CALLBACK (sinkpad_event_probe), collect); + gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (sinkpad_buffer_probe), + collect); + + bus = gst_element_get_bus (GST_ELEMENT (pipeline)); + + GST_DEBUG ("Setting pipeline to PLAYING"); + ASSERT_OBJECT_REFCOUNT (source1, "source1", 1); + + fail_if (gst_element_set_state (GST_ELEMENT (pipeline), + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + GST_DEBUG ("Let's poll the bus"); + + while (carry_on) { + message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10); + if (message) { + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_EOS: + /* we should check if we really finished here */ + GST_WARNING ("Got an EOS"); + carry_on = FALSE; + break; + case GST_MESSAGE_SEGMENT_START: + case GST_MESSAGE_SEGMENT_DONE: + /* We shouldn't see any segement messages, since we didn't do a segment seek */ + GST_WARNING ("Saw a Segment start/stop"); + fail_if (TRUE); + break; + case GST_MESSAGE_ERROR: + GST_WARNING ("Saw an ERROR"); + fail_if (TRUE); + default: + break; + } + gst_mini_object_unref (GST_MINI_OBJECT (message)); + } + } + + GST_DEBUG ("Setting pipeline to NULL"); + + fail_if (gst_element_set_state (GST_ELEMENT (pipeline), + GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); + + fail_if (collect->expected_segments != NULL); + + GST_DEBUG ("Resetted pipeline to READY"); + + /* Expected segments */ + collect->expected_segments = g_list_append (collect->expected_segments, + segment_new (1.0, GST_FORMAT_TIME, 5 * GST_SECOND, 6 * GST_SECOND, 0)); + + + GST_DEBUG ("Setting pipeline to PLAYING again"); + + fail_if (gst_element_set_state (GST_ELEMENT (pipeline), + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + carry_on = TRUE; + + GST_DEBUG ("Let's poll the bus AGAIN"); + + while (carry_on) { + message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10); + if (message) { + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_EOS: + /* we should check if we really finished here */ + carry_on = FALSE; + break; + case GST_MESSAGE_SEGMENT_START: + case GST_MESSAGE_SEGMENT_DONE: + /* We shouldn't see any segement messages, since we didn't do a segment seek */ + GST_WARNING ("Saw a Segment start/stop"); + fail_if (TRUE); + break; + case GST_MESSAGE_ERROR: + GST_ERROR ("Saw an ERROR"); + fail_if (TRUE); + default: + break; + } + gst_mini_object_unref (GST_MINI_OBJECT (message)); + } else { + GST_DEBUG ("bus_poll responded, but there wasn't any message..."); + } + } + + fail_if (collect->expected_segments != NULL); + + gst_object_unref (GST_OBJECT (sinkpad)); + + fail_if (gst_element_set_state (GST_ELEMENT (pipeline), + GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE); + + ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "main pipeline", 1, 2); + gst_object_unref (pipeline); + ASSERT_OBJECT_REFCOUNT_BETWEEN (bus, "main bus", 1, 2); + gst_object_unref (bus); + + g_free (collect); +} + +static void test_time_duration_full (gboolean async) { guint64 start, stop; @@ -633,6 +795,19 @@ test_one_bin_after_other_full (gboolean async) g_free (collect); } +GST_START_TEST (test_simplest) +{ + test_simplest_full (FALSE); +} + +GST_END_TEST; + +GST_START_TEST (test_simplest_async) +{ + test_simplest_full (TRUE); +} + +GST_END_TEST; GST_START_TEST (test_time_duration) { @@ -702,6 +877,8 @@ gnonlin_suite (void) tcase_add_test (tc_chain, test_time_duration); tcase_add_test (tc_chain, test_time_duration_async); + tcase_add_test (tc_chain, test_simplest); + tcase_add_test (tc_chain, test_simplest_async); tcase_add_test (tc_chain, test_one_after_other); tcase_add_test (tc_chain, test_one_after_other_async); tcase_add_test (tc_chain, test_one_under_another); |
From: <bi...@ke...> - 2011-02-10 18:03:05
|
Module: gnonlin Branch: master Commit: 07767da07a7f26b77bae2d73d59875e23f4b8037 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=07767da07a7f26b77bae2d73d59875e23f4b8037 Author: Edward Hervey <edw...@co...> Date: Mon Jan 31 16:05:15 2011 +0100 tests: Add a method for checking element states --- tests/check/gnl/common.h | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/tests/check/gnl/common.h b/tests/check/gnl/common.h index f0c9fb2..987c9eb 100644 --- a/tests/check/gnl/common.h +++ b/tests/check/gnl/common.h @@ -22,6 +22,16 @@ G_STMT_START { \ GST_DEBUG_OBJECT (object, "start/stop/duration values valid"); \ } G_STMT_END; +#define check_state_simple(object, expected_state) \ + G_STMT_START { \ + GstStateChangeReturn ret; \ + GstState state, pending; \ + ret = gst_element_get_state(GST_ELEMENT_CAST(object), &state, &pending, 5 * GST_SECOND); \ + fail_if (ret == GST_STATE_CHANGE_FAILURE); \ + fail_unless (state == expected_state, "Element state (%s) is not the expected one (%s)", \ + gst_element_state_get_name(state), gst_element_state_get_name(expected_state)); \ + } G_STMT_END; + typedef struct _Segment { gdouble rate; GstFormat format; |
From: <bi...@ke...> - 2011-02-10 18:03:05
|
Module: gnonlin Branch: master Commit: 2422274c652ff2947af895872fe6f7cfad8fc424 URL: http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=2422274c652ff2947af895872fe6f7cfad8fc424 Author: Edward Hervey <edw...@co...> Date: Wed Feb 2 18:10:52 2011 +0100 tests: First go at testing seeking Still needs more checks though --- tests/check/Makefile.am | 3 +- tests/check/gnl/seek.c | 504 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 506 insertions(+), 1 deletions(-) Diff: http://cgit.freedesktop.org/gstreamer/gnonlin/diff/?id=2422274c652ff2947af895872fe6f7cfad8fc424 |
From: <mn...@ke...> - 2011-02-10 17:21:17
|
Module: gst-plugins-good Branch: master Commit: 686189f3f0cb7c26836ea2a5b6f294faddcf9971 URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=686189f3f0cb7c26836ea2a5b6f294faddcf9971 Author: Mark Nauwelaerts <mar...@co...> Date: Thu Feb 10 18:11:46 2011 +0100 qtdemux: propagate error during expose_streams ... as it may occur during initial parsing of fragmented file. --- gst/qtdemux/qtdemux.c | 31 +++++++++++++++++++------------ 1 files changed, 19 insertions(+), 12 deletions(-) diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 7be9986..96e320d 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -425,7 +425,7 @@ static GstCaps *qtdemux_sub_caps (GstQTDemux * qtdemux, gchar ** codec_name); static gboolean qtdemux_parse_samples (GstQTDemux * qtdemux, QtDemuxStream * stream, guint32 n); -static void qtdemux_expose_streams (GstQTDemux * qtdemux); +static GstFlowReturn qtdemux_expose_streams (GstQTDemux * qtdemux); static void @@ -2765,7 +2765,7 @@ gst_qtdemux_loop_state_header (GstQTDemux * qtdemux) beach: if (ret == GST_FLOW_UNEXPECTED && qtdemux->got_moov) { /* digested all data, show what we have */ - qtdemux_expose_streams (qtdemux); + ret = qtdemux_expose_streams (qtdemux); /* Only post, event on pads is done after newsegment */ qtdemux_post_global_tags (qtdemux); @@ -2773,7 +2773,7 @@ beach: qtdemux->state = QTDEMUX_STATE_MOVIE; GST_DEBUG_OBJECT (qtdemux, "switching state to STATE_MOVIE (%d)", qtdemux->state); - return GST_FLOW_OK; + return ret; } return ret; } @@ -5116,20 +5116,20 @@ locate_failed: /* should only do something in pull mode */ /* call with OBJECT lock */ -static gboolean +static GstFlowReturn qtdemux_add_fragmented_samples (GstQTDemux * qtdemux) { guint64 length, offset; GstBuffer *buf = NULL; GstFlowReturn ret = GST_FLOW_OK; - gboolean res = TRUE; + GstFlowReturn res = TRUE; offset = qtdemux->moof_offset; GST_DEBUG_OBJECT (qtdemux, "next moof at offset %" G_GUINT64_FORMAT, offset); if (!offset) { GST_DEBUG_OBJECT (qtdemux, "no next moof"); - return FALSE; + return GST_FLOW_UNEXPECTED; } /* best not do pull etc with lock held */ @@ -5169,7 +5169,7 @@ parse_failed: { GST_DEBUG_OBJECT (qtdemux, "failed to parse moof"); offset = 0; - res = FALSE; + res = GST_FLOW_ERROR; goto exit; } flow_failed: @@ -5182,7 +5182,7 @@ flow_failed: GST_DEBUG_OBJECT (qtdemux, "upstream WRONG_STATE"); /* resume at current position next time */ } - res = FALSE; + res = ret; goto exit; } } @@ -5772,7 +5772,7 @@ done: GST_DEBUG_OBJECT (qtdemux, "parsed all available samples; checking for more"); while (n + 1 == stream->n_samples) - if (!qtdemux_add_fragmented_samples (qtdemux)) + if (qtdemux_add_fragmented_samples (qtdemux) != GST_FLOW_OK) break; } GST_OBJECT_UNLOCK (qtdemux); @@ -7323,14 +7323,15 @@ too_many_streams: } } -static void +static GstFlowReturn qtdemux_expose_streams (GstQTDemux * qtdemux) { gint i; + GstFlowReturn ret = GST_FLOW_OK; GST_DEBUG_OBJECT (qtdemux, "exposing streams"); - for (i = 0; i < qtdemux->n_streams; i++) { + for (i = 0; ret == GST_FLOW_OK && i < qtdemux->n_streams; i++) { QtDemuxStream *stream = qtdemux->streams[i]; guint32 sample_num = 0; guint samples = 20; @@ -7344,7 +7345,7 @@ qtdemux_expose_streams (GstQTDemux * qtdemux) /* need all moov samples first */ GST_OBJECT_LOCK (qtdemux); while (stream->n_samples == 0) - if (!qtdemux_add_fragmented_samples (qtdemux)) + if ((ret = qtdemux_add_fragmented_samples (qtdemux)) != GST_FLOW_OK) break; GST_OBJECT_UNLOCK (qtdemux); } else { @@ -7352,6 +7353,10 @@ qtdemux_expose_streams (GstQTDemux * qtdemux) qtdemux->moof_offset = 0; } + /* prepare braking */ + if (ret != GST_FLOW_ERROR) + ret = GST_FLOW_OK; + /* in pull mode, we should have parsed some sample info by now; * and quite some code will not handle no samples. * in push mode, we'll just have to deal with it */ @@ -7411,6 +7416,8 @@ qtdemux_expose_streams (GstQTDemux * qtdemux) gst_element_post_message (GST_ELEMENT_CAST (qtdemux), m); qtdemux->posted_redirect = TRUE; } + + return ret; } /* check if major or compatible brand is 3GP */ |
From: <mn...@ke...> - 2011-02-10 17:21:17
|
Module: gst-plugins-good Branch: master Commit: b70f4b6ffad984f76efc6f5916f7d8db42c9e496 URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=b70f4b6ffad984f76efc6f5916f7d8db42c9e496 Author: Mark Nauwelaerts <mar...@co...> Date: Thu Feb 10 11:56:33 2011 +0100 matroskademux: store cluster positions provided by SeekHead ... and use those, if available, to locate a cluster rather than scanning. --- gst/matroska/matroska-demux.c | 55 +++++++++++++++++++++++++++++++++++++++++ gst/matroska/matroska-demux.h | 2 + 2 files changed, 57 insertions(+), 0 deletions(-) diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index f1b2b78..7643119 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -399,6 +399,11 @@ gst_matroska_demux_reset (GstElement * element) demux->index = NULL; } + if (demux->clusters) { + g_array_free (demux->clusters, TRUE); + demux->clusters = NULL; + } + /* reset timers */ demux->clock = NULL; demux->time_scale = 1000000; @@ -2326,6 +2331,17 @@ gst_matroska_demux_move_to_entry (GstMatroskaDemux * demux, return TRUE; } +static gint +gst_matroska_cluster_compare (gint64 * i1, gint64 * i2) +{ + if (*i1 < *i2) + return -1; + else if (*i1 > *i2) + return 1; + else + return 0; +} + /* searches for a cluster start from @pos, * return GST_FLOW_OK and cluster position in @pos if found */ static GstFlowReturn @@ -2342,6 +2358,30 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) orig_offset = demux->offset; + GST_LOG_OBJECT (demux, "searching cluster following offset %" G_GINT64_FORMAT, + *pos); + + if (demux->clusters) { + gint64 *cpos; + + cpos = gst_util_array_binary_search (demux->clusters->data, + demux->clusters->len, sizeof (gint64), + (GCompareDataFunc) gst_matroska_cluster_compare, + GST_SEARCH_MODE_AFTER, pos, NULL); + /* sanity check */ + if (cpos) { + GST_DEBUG_OBJECT (demux, + "cluster reported at offset %" G_GINT64_FORMAT, *cpos); + demux->offset = *cpos; + ret = + gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed); + if (ret == GST_FLOW_OK && id == GST_MATROSKA_ID_CLUSTER) { + newpos = *cpos; + goto exit; + } + } + } + /* read in at newpos and scan for ebml cluster id */ while (1) { GstByteReader reader; @@ -2410,6 +2450,7 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) buf = NULL; } +exit: demux->offset = orig_offset; *pos = newpos; return ret; @@ -5383,6 +5424,17 @@ gst_matroska_demux_parse_contents_seekentry (GstMatroskaDemux * demux, break; } + case GST_MATROSKA_ID_CLUSTER: + { + guint64 pos = seek_pos + demux->ebml_segment_start; + + GST_LOG_OBJECT (demux, "Cluster position"); + if (G_UNLIKELY (!demux->clusters)) + demux->clusters = g_array_sized_new (TRUE, TRUE, sizeof (guint64), 100); + g_array_append_val (demux->clusters, pos); + break; + } + default: GST_DEBUG_OBJECT (demux, "Ignoring Seek entry for ID=0x%x", seek_id); break; @@ -5429,6 +5481,9 @@ gst_matroska_demux_parse_contents (GstMatroskaDemux * demux, GstEbmlRead * ebml) DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret); + /* Sort clusters by position for easier searching */ + g_array_sort (demux->clusters, (GCompareFunc) gst_matroska_cluster_compare); + return ret; } diff --git a/gst/matroska/matroska-demux.h b/gst/matroska/matroska-demux.h index b31f79c..a35a593 100644 --- a/gst/matroska/matroska-demux.h +++ b/gst/matroska/matroska-demux.h @@ -92,6 +92,8 @@ typedef struct _GstMatroskaDemux { /* a cue (index) table */ GArray *index; + /* cluster positions (optional) */ + GArray *clusters; /* timescale in the file */ guint64 time_scale; |
From: <mn...@ke...> - 2011-02-10 17:21:16
|
Module: gst-plugins-good Branch: master Commit: 3dc42d370437e4fc1362e861f9c44d685b262aa3 URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=3dc42d370437e4fc1362e861f9c44d685b262aa3 Author: Mark Nauwelaerts <mar...@co...> Date: Thu Feb 10 18:00:11 2011 +0100 qtdemux: avoid skipping exposing a stream following a removed stream --- gst/qtdemux/qtdemux.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index b6457ce..7be9986 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -7362,6 +7362,7 @@ qtdemux_expose_streams (GstQTDemux * qtdemux) sizeof (QtDemuxStream *) * (GST_QTDEMUX_MAX_STREAMS - i - 1)); qtdemux->streams[GST_QTDEMUX_MAX_STREAMS - 1] = NULL; qtdemux->n_streams--; + i--; continue; } |
From: <wt...@ke...> - 2011-02-10 14:45:42
|
Module: gstreamer Branch: master Commit: d19f40c7169db209fd71b06d3d2f9c209aacfe5e URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=d19f40c7169db209fd71b06d3d2f9c209aacfe5e Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 14:50:04 2011 +0100 basesink: keep track of earliest QoS timestamp Keep track of the earliest allowed timestamp according to the latest QoS report and drop buffers before that time. Activate this filter when throttling is enabled. We could later also activate this in the other QoS cases. See #638891 --- libs/gst/base/gstbasesink.c | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 498b0e9..046fd11 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -260,7 +260,8 @@ struct _GstBaseSinkPrivate /* Cached GstClockID */ GstClockID cached_clock_id; - /* for throttling */ + /* for throttling and QoS */ + GstClockTime earliest_in_time; GstClockTime throttle_time; }; @@ -2490,6 +2491,10 @@ do_step: /* save sync time for eos when the previous object needed sync */ priv->eos_rtime = (do_sync ? priv->current_rstop : GST_CLOCK_TIME_NONE); + if (G_UNLIKELY (priv->earliest_in_time != -1 + && rstart < priv->earliest_in_time)) + goto qos_dropped; + again: /* first do preroll, this makes sure we commit our state * to PAUSED and can continue to PLAYING. We cannot perform @@ -2576,6 +2581,12 @@ not_syncable: GST_DEBUG_OBJECT (basesink, "non syncable object %p", obj); return GST_FLOW_OK; } +qos_dropped: + { + GST_DEBUG_OBJECT (basesink, "dropped because of QoS %p", obj); + *late = TRUE; + return GST_FLOW_OK; + } flushing: { GST_DEBUG_OBJECT (basesink, "we are flushing"); @@ -2754,6 +2765,7 @@ gst_base_sink_reset_qos (GstBaseSink * sink) priv = sink->priv; priv->last_in_time = GST_CLOCK_TIME_NONE; + priv->earliest_in_time = GST_CLOCK_TIME_NONE; priv->last_left = GST_CLOCK_TIME_NONE; priv->avg_duration = GST_CLOCK_TIME_NONE; priv->avg_pt = GST_CLOCK_TIME_NONE; @@ -2833,6 +2845,9 @@ gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj, done: if (!late || !GST_CLOCK_TIME_IS_VALID (priv->last_in_time)) { priv->last_in_time = start; + /* the next allowed input timestamp */ + if (priv->throttle_time > 0) + priv->earliest_in_time = start + priv->throttle_time; } return late; |
From: <wt...@ke...> - 2011-02-10 14:45:42
|
Module: gstreamer Branch: master Commit: c8d1abdd001ec62cf99fef5e3f46bdb46325476e URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=c8d1abdd001ec62cf99fef5e3f46bdb46325476e Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 14:53:34 2011 +0100 basesink: fix some comments --- libs/gst/base/gstbasesink.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 046fd11..3556e02 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -402,7 +402,7 @@ static GstFlowReturn gst_base_sink_pad_buffer_alloc (GstPad * pad, /* check if an object was too late */ static gboolean gst_base_sink_is_too_late (GstBaseSink * basesink, - GstMiniObject * obj, GstClockTime start, GstClockTime stop, + GstMiniObject * obj, GstClockTime rstart, GstClockTime rstop, GstClockReturn status, GstClockTimeDiff jitter); static GstFlowReturn gst_base_sink_preroll_object (GstBaseSink * basesink, guint8 obj_type, GstMiniObject * obj); @@ -2778,7 +2778,7 @@ gst_base_sink_reset_qos (GstBaseSink * sink) /* Checks if the object was scheduled too late. * - * start/stop contain the raw timestamp start and stop values + * rstart/rstop contain the running_time start and stop values * of the object. * * status and jitter contain the return values from the clock wait. @@ -2787,7 +2787,7 @@ gst_base_sink_reset_qos (GstBaseSink * sink) */ static gboolean gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj, - GstClockTime start, GstClockTime stop, + GstClockTime rstart, GstClockTime rstop, GstClockReturn status, GstClockTimeDiff jitter) { gboolean late; @@ -2813,25 +2813,25 @@ gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj, goto not_buffer; /* can't do check if we don't have a timestamp */ - if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (start))) + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (rstart))) goto no_timestamp; /* we can add a valid stop time */ - if (GST_CLOCK_TIME_IS_VALID (stop)) - max_lateness += stop; + if (GST_CLOCK_TIME_IS_VALID (rstop)) + max_lateness += rstop; else - max_lateness += start; + max_lateness += rstart; /* if the jitter bigger than duration and lateness we are too late */ - if ((late = start + jitter > max_lateness)) { + if ((late = rstart + jitter > max_lateness)) { GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, basesink, "buffer is too late %" GST_TIME_FORMAT - " > %" GST_TIME_FORMAT, GST_TIME_ARGS (start + jitter), + " > %" GST_TIME_FORMAT, GST_TIME_ARGS (rstart + jitter), GST_TIME_ARGS (max_lateness)); /* !!emergency!!, if we did not receive anything valid for more than a * second, render it anyway so the user sees something */ if (GST_CLOCK_TIME_IS_VALID (priv->last_in_time) && - start - priv->last_in_time > GST_SECOND) { + rstart - priv->last_in_time > GST_SECOND) { late = FALSE; GST_ELEMENT_WARNING (basesink, CORE, CLOCK, (_("A lot of buffers are being dropped.")), @@ -2844,10 +2844,10 @@ gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj, done: if (!late || !GST_CLOCK_TIME_IS_VALID (priv->last_in_time)) { - priv->last_in_time = start; + priv->last_in_time = rstart; /* the next allowed input timestamp */ if (priv->throttle_time > 0) - priv->earliest_in_time = start + priv->throttle_time; + priv->earliest_in_time = rstart + priv->throttle_time; } return late; |
From: <wt...@ke...> - 2011-02-10 14:45:42
|
Module: gstreamer Branch: master Commit: dad43fa0042bbdbb0e91e17a7735e9527c898fe5 URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=dad43fa0042bbdbb0e91e17a7735e9527c898fe5 Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 14:17:12 2011 +0100 basesink: use new QoS type Use the new QoS type and send throttling QoS messages. --- libs/gst/base/gstbasesink.c | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index b4c5e73..498b0e9 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -2590,7 +2590,7 @@ preroll_failed: } static gboolean -gst_base_sink_send_qos (GstBaseSink * basesink, +gst_base_sink_send_qos (GstBaseSink * basesink, GstQOSType type, gdouble proportion, GstClockTime time, GstClockTimeDiff diff) { GstEvent *event; @@ -2598,10 +2598,10 @@ gst_base_sink_send_qos (GstBaseSink * basesink, /* generate Quality-of-Service event */ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, basesink, - "qos: proportion: %lf, diff %" G_GINT64_FORMAT ", timestamp %" - GST_TIME_FORMAT, proportion, diff, GST_TIME_ARGS (time)); + "qos: type %d, proportion: %lf, diff %" G_GINT64_FORMAT ", timestamp %" + GST_TIME_FORMAT, type, proportion, diff, GST_TIME_ARGS (time)); - event = gst_event_new_qos (proportion, diff, time); + event = gst_event_new_qos_full (type, proportion, diff, time); /* send upstream */ res = gst_pad_push_event (basesink->sinkpad, event); @@ -2715,6 +2715,9 @@ gst_base_sink_perform_qos (GstBaseSink * sink, gboolean dropped) if (priv->avg_rate >= 0.0) { + GstQOSType type; + GstClockTimeDiff diff; + /* if we have a valid rate, start sending QoS messages */ if (priv->current_jitter < 0) { /* make sure we never go below 0 when adding the jitter to the @@ -2722,8 +2725,20 @@ gst_base_sink_perform_qos (GstBaseSink * sink, gboolean dropped) if (priv->current_rstart < -priv->current_jitter) priv->current_jitter = -priv->current_rstart; } - gst_base_sink_send_qos (sink, priv->avg_rate, priv->current_rstart, - priv->current_jitter); + + if (priv->throttle_time > 0) { + diff = priv->throttle_time; + type = GST_QOS_TYPE_THROTTLE; + } else { + diff = priv->current_jitter; + if (diff <= 0) + type = GST_QOS_TYPE_OVERFLOW; + else + type = GST_QOS_TYPE_UNDERFLOW; + } + + gst_base_sink_send_qos (sink, type, priv->avg_rate, priv->current_rstart, + diff); } /* record when this buffer will leave us */ |
From: <wt...@ke...> - 2011-02-10 14:45:36
|
Module: gstreamer Branch: master Commit: 56826a5ee6c45679fd4c3cc38fba6c5acc609d01 URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=56826a5ee6c45679fd4c3cc38fba6c5acc609d01 Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 12:02:03 2011 +0100 event: add QoS event type Add a parameter to the QoS event to specify the QoS event type. Update docs and add unit test. See #638891 --- docs/gst/gstreamer-sections.txt | 5 ++ gst/gst.c | 2 + gst/gstevent.c | 78 +++++++++++++++++++++++++++++++++++--- gst/gstevent.h | 32 +++++++++++++++- tests/check/gst/gstevent.c | 20 ++++++++++ win32/common/libgstreamer.def | 3 + 6 files changed, 131 insertions(+), 9 deletions(-) Diff: http://cgit.freedesktop.org/gstreamer/gstreamer/diff/?id=56826a5ee6c45679fd4c3cc38fba6c5acc609d01 |
From: <wt...@ke...> - 2011-02-10 14:45:36
|
Module: gstreamer Branch: master Commit: aa32e1fab16ab2808935bc2d755df2eeb0a1020f URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=aa32e1fab16ab2808935bc2d755df2eeb0a1020f Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 12:00:47 2011 +0100 clock: fix parameter docs --- gst/gstclock.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/gst/gstclock.c b/gst/gstclock.c index dd71e19..45f503e 100644 --- a/gst/gstclock.c +++ b/gst/gstclock.c @@ -440,7 +440,7 @@ gst_clock_id_get_time (GstClockID id) /** * gst_clock_id_wait * @id: The #GstClockID to wait on - * @jitter (out) (allow-none): a pointer that will contain the jitter, + * @jitter: (out) (allow-none): a pointer that will contain the jitter, * can be %NULL. * * Perform a blocking wait on @id. |
From: <wt...@ke...> - 2011-02-10 14:45:36
|
Module: gstreamer Branch: master Commit: 2371cbbec27b6a77be07a931fbf1760e9737e43c URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=2371cbbec27b6a77be07a931fbf1760e9737e43c Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 10:34:57 2011 +0100 design: update QoS document Add new QoS types and talk about the new throttle QoS message. --- docs/design/part-qos.txt | 53 +++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 48 insertions(+), 5 deletions(-) diff --git a/docs/design/part-qos.txt b/docs/design/part-qos.txt index 5cb7a87..31eabc9 100644 --- a/docs/design/part-qos.txt +++ b/docs/design/part-qos.txt @@ -16,6 +16,10 @@ made: in the sinks. - long term rate corrections based on trends observed in the sinks. +It is also possible for the application to artificially introduce delay +between synchronized buffers, this is called throttling. It can be used +to reduce the framerate, for example. + Sources of quality problems ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -23,6 +27,7 @@ Sources of quality problems - High CPU load - Network problems - Other resource problems such as disk load, memory bottlenecks etc. + - application level throttling QoS event @@ -31,6 +36,19 @@ QoS event The QoS event is generated by an element that synchronizes against the clock. It travels upstream and contains the following fields: + - type, GST_TYPE_QOS_TYPE: + The type of the QoS event, we have the following types and the default type + is GST_QOS_TYPE_UNDERFLOW: + + GST_QOS_TYPE_OVERFLOW: an element is receiving buffers too fast and can't + keep up processing them. Upstream should reduce the + rate. + GST_QOS_TYPE_UNDERFLOW: an element is receiving buffers too slowly and has + to drop them because they are too late. Upstream should + increase the processing rate. + GST_QOS_TYPE_THROTTLE: the application is asking to add extra delay between + buffers, upstream is allowed to drop buffers + - timestamp, G_TYPE_UINT64: The timestamp on the buffer that generated the QoS event. These timestamps are expressed in total running_time in the sink so that the value is ever @@ -39,7 +57,9 @@ travels upstream and contains the following fields: - jitter, G_TYPE_INT64: The difference of that timestamp against the current clock time. Negative values mean the timestamp was on time. Positive values indicate the - timestamp was late by that amount. + timestamp was late by that amount. + When throttling, the jitter contains the throttling delay added by the + application. - proportion, G_TYPE_DOUBLE: Long term prediction of the ideal rate relative to normal rate to get @@ -175,7 +195,7 @@ Values DR1 > 1.0 mean that the upstream element cannot produce buffers of duration D1 in real-time. It is exactly DR1 that tells the amount of speedup we require from upstream to regain real-time performance. -An element that is not receiving enough data is said to be starved. +An element that is not receiving enough data is said to be underflowed. Element measurements @@ -185,7 +205,7 @@ In addition to the measurements of the datarate of the upstream element, a typical element must also measure its own performance. Global pipeline performance problems can indeed also be caused by the element itself when it receives too much data it cannot process in time. The element is then said to -be flooded. +be overflowed. Short term correction @@ -259,6 +279,24 @@ as given by the proportion member. Failure to do so will certainly lead to more dropped frames and a generally worse QoS. +Throttling +---------- + +In throttle mode, the time distance between buffers is kept to a configurable +throttle interval. This means that effectively the buffer rate is limited +to 1 buffer per throttle interval. This can be used to limit the framerate, +for example. + +When an element is configured in throttling mode (this is usually only +implemented on sinks) it should produce QoS events upstream with the jitter +field set to the throttle interval. This should instruct upstream elements to +skip or drop the remaining buffers in the configured throttle interval. + +The proportion field is set to the desired slowdown needed to get the +desired throttle interval. Implementations can use the QoS Throttle type, +the proportion and the jitter member to tune their implementations. + + QoS strategies -------------- @@ -299,7 +337,7 @@ calculate a proportion. The processing time in system time is compared to render time to decide if the majority of the time is spend upstream or in the sink itself. This value -is used to decide flood or starvation. +is used to decide overflow or underflow. The number of rendered and dropped buffers is used to query stats on the sink. @@ -316,6 +354,11 @@ the human eye. A QoS message is posted whenever a (part of a) buffer is dropped. +In throttle mode, the sink sends QoS event upstream with the timestamp set to +the running_time of the latest buffer and the jitter set to the throttle interval. +If the throttled buffer is late, the lateness is subtracted from the throttle +interval in order to keep the desired throttle interval. + GstBaseTransform ---------------- @@ -380,7 +423,7 @@ Sources The QoS events only apply to push based sources since pull based sources are entirely controlled by another downstream element. -Sources can receive a flood or starvation event that can be used to switch to +Sources can receive a overflow or underflow event that can be used to switch to less demanding source material. In case of a network stream, a switch could be done to a lower or higher quality stream or additional enhancement layers could be used or ignored. |
From: <wt...@ke...> - 2011-02-10 14:45:36
|
Module: gstreamer Branch: master Commit: 4ee5c61a2da379c6a4d5003b91989754c373322f URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=4ee5c61a2da379c6a4d5003b91989754c373322f Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 13:42:05 2011 +0100 basesink: add property to configure a throttle-time Add a property to configure the throttle time on a sink. The property is not yet used. See #638891 --- docs/libs/gstreamer-libs-sections.txt | 2 + libs/gst/base/gstbasesink.c | 72 +++++++++++++++++++++++++++++++++ libs/gst/base/gstbasesink.h | 4 ++ win32/common/libgstbase.def | 2 + 4 files changed, 80 insertions(+), 0 deletions(-) diff --git a/docs/libs/gstreamer-libs-sections.txt b/docs/libs/gstreamer-libs-sections.txt index 25cbcd3..3678413 100644 --- a/docs/libs/gstreamer-libs-sections.txt +++ b/docs/libs/gstreamer-libs-sections.txt @@ -285,6 +285,8 @@ gst_base_sink_is_last_buffer_enabled gst_base_sink_get_last_buffer gst_base_sink_set_blocksize gst_base_sink_get_blocksize +gst_base_sink_get_throttle_time +gst_base_sink_set_throttle_time GST_BASE_SINK_PAD diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index cffd33b..b4c5e73 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -259,6 +259,9 @@ struct _GstBaseSinkPrivate /* Cached GstClockID */ GstClockID cached_clock_id; + + /* for throttling */ + GstClockTime throttle_time; }; #define DO_RUNNING_AVG(avg,val,size) (((val) + ((size)-1) * (avg)) / (size)) @@ -299,6 +302,7 @@ enum #define DEFAULT_BLOCKSIZE 4096 #define DEFAULT_RENDER_DELAY 0 #define DEFAULT_ENABLE_LAST_BUFFER TRUE +#define DEFAULT_THROTTLE_TIME 0 enum { @@ -313,6 +317,7 @@ enum PROP_LAST_BUFFER, PROP_BLOCKSIZE, PROP_RENDER_DELAY, + PROP_THROTTLE_TIME, PROP_LAST }; @@ -524,6 +529,19 @@ gst_base_sink_class_init (GstBaseSinkClass * klass) g_param_spec_uint64 ("render-delay", "Render Delay", "Additional render delay of the sink in nanoseconds", 0, G_MAXUINT64, DEFAULT_RENDER_DELAY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstBaseSink:throttle-time + * + * The time to insert between buffers. This property can be used to control + * the maximum amount of buffers per second to render. Setting this property + * to a value bigger than 0 will make the sink create THROTTLE QoS events. + * + * Since: 0.10.33 + */ + g_object_class_install_property (gobject_class, PROP_THROTTLE_TIME, + g_param_spec_uint64 ("throttle-time", "Throttle time", + "The time to keep between rendered buffers (unused)", 0, G_MAXUINT64, + DEFAULT_THROTTLE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_base_sink_change_state); @@ -689,6 +707,7 @@ gst_base_sink_init (GstBaseSink * basesink, gpointer g_class) priv->blocksize = DEFAULT_BLOCKSIZE; priv->cached_clock_id = NULL; g_atomic_int_set (&priv->enable_last_buffer, DEFAULT_ENABLE_LAST_BUFFER); + priv->throttle_time = DEFAULT_THROTTLE_TIME; GST_OBJECT_FLAG_SET (basesink, GST_ELEMENT_IS_SINK); } @@ -1283,6 +1302,53 @@ gst_base_sink_get_blocksize (GstBaseSink * sink) return res; } +/** + * gst_base_sink_set_throttle_time: + * @sink: a #GstBaseSink + * @throttle: the throttle time in nanoseconds + * + * Set the time that will be inserted between rendered buffers. This + * can be used to control the maximum buffers per second that the sink + * will render. + * + * Since: 0.10.33 + */ +void +gst_base_sink_set_throttle_time (GstBaseSink * sink, guint64 throttle) +{ + g_return_if_fail (GST_IS_BASE_SINK (sink)); + + GST_OBJECT_LOCK (sink); + sink->priv->throttle_time = throttle; + GST_LOG_OBJECT (sink, "set throttle_time to %" G_GUINT64_FORMAT, throttle); + GST_OBJECT_UNLOCK (sink); +} + +/** + * gst_base_sink_get_throttle_time: + * @sink: a #GstBaseSink + * + * Get the time that will be inserted between frames to control the + * maximum buffers per second. + * + * Returns: the number of nanoseconds @sink will put between frames. + * + * Since: 0.10.33 + */ +guint64 +gst_base_sink_get_throttle_time (GstBaseSink * sink) +{ + guint64 res; + + g_return_val_if_fail (GST_IS_BASE_SINK (sink), 0); + + GST_OBJECT_LOCK (sink); + res = sink->priv->throttle_time; + GST_OBJECT_UNLOCK (sink); + + return res; +} + static void gst_base_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -1320,6 +1386,9 @@ gst_base_sink_set_property (GObject * object, guint prop_id, case PROP_ENABLE_LAST_BUFFER: gst_base_sink_set_last_buffer_enabled (sink, g_value_get_boolean (value)); break; + case PROP_THROTTLE_TIME: + gst_base_sink_set_throttle_time (sink, g_value_get_uint64 (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1363,6 +1432,9 @@ gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value, case PROP_RENDER_DELAY: g_value_set_uint64 (value, gst_base_sink_get_render_delay (sink)); break; + case PROP_THROTTLE_TIME: + g_value_set_uint64 (value, gst_base_sink_get_throttle_time (sink)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/libs/gst/base/gstbasesink.h b/libs/gst/base/gstbasesink.h index e91cb2c..a4215b8 100644 --- a/libs/gst/base/gstbasesink.h +++ b/libs/gst/base/gstbasesink.h @@ -233,6 +233,10 @@ GstClockTime gst_base_sink_get_render_delay (GstBaseSink *sink); void gst_base_sink_set_blocksize (GstBaseSink *sink, guint blocksize); guint gst_base_sink_get_blocksize (GstBaseSink *sink); +/* throttle-time */ +void gst_base_sink_set_throttle_time (GstBaseSink *sink, guint64 throttle); +guint64 gst_base_sink_get_throttle_time (GstBaseSink *sink); + GstClockReturn gst_base_sink_wait_clock (GstBaseSink *sink, GstClockTime time, GstClockTimeDiff * jitter); GstFlowReturn gst_base_sink_wait_eos (GstBaseSink *sink, GstClockTime time, diff --git a/win32/common/libgstbase.def b/win32/common/libgstbase.def index 6676afe..cccb58b 100644 --- a/win32/common/libgstbase.def +++ b/win32/common/libgstbase.def @@ -21,6 +21,7 @@ EXPORTS gst_base_sink_get_max_lateness gst_base_sink_get_render_delay gst_base_sink_get_sync + gst_base_sink_get_throttle_time gst_base_sink_get_ts_offset gst_base_sink_get_type gst_base_sink_is_async_enabled @@ -34,6 +35,7 @@ EXPORTS gst_base_sink_set_qos_enabled gst_base_sink_set_render_delay gst_base_sink_set_sync + gst_base_sink_set_throttle_time gst_base_sink_set_ts_offset gst_base_sink_wait_clock gst_base_sink_wait_eos |
From: <wt...@ke...> - 2011-02-10 14:45:36
|
Module: gstreamer Branch: master Commit: 80311b758c470b723ce4841937299d8918bb3e30 URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=80311b758c470b723ce4841937299d8918bb3e30 Author: Wim Taymans <wim...@co...> Date: Thu Feb 10 10:49:22 2011 +0100 design: tweak docs a little --- docs/design/part-qos.txt | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/design/part-qos.txt b/docs/design/part-qos.txt index 31eabc9..a1a07f5 100644 --- a/docs/design/part-qos.txt +++ b/docs/design/part-qos.txt @@ -57,9 +57,10 @@ travels upstream and contains the following fields: - jitter, G_TYPE_INT64: The difference of that timestamp against the current clock time. Negative values mean the timestamp was on time. Positive values indicate the - timestamp was late by that amount. + timestamp was late by that amount. When buffers are received in time and + throttling is not enabled, the QoS type field is set to OVERFLOW. When throttling, the jitter contains the throttling delay added by the - application. + application and the type is set to THROTTLE. - proportion, G_TYPE_DOUBLE: Long term prediction of the ideal rate relative to normal rate to get |
From: <gk...@ke...> - 2011-02-10 14:44:41
|
Module: qt-gstreamer Branch: master Commit: 771aea1176625987b6e3038c222899a83ecbcbd5 URL: http://cgit.freedesktop.org/gstreamer/qt-gstreamer/commit/?id=771aea1176625987b6e3038c222899a83ecbcbd5 Author: George Kiagiadakis <geo...@co...> Date: Thu Feb 10 16:42:41 2011 +0200 Install Utils/global.h --- src/QGst/CMakeLists.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/src/QGst/CMakeLists.txt b/src/QGst/CMakeLists.txt index 83f6fb5..5f40215 100644 --- a/src/QGst/CMakeLists.txt +++ b/src/QGst/CMakeLists.txt @@ -84,6 +84,7 @@ set(QtGStreamer_INSTALLED_HEADERS Ui/global.h Ui/videowidget.h Ui/VideoWidget + Utils/global.h Utils/applicationsink.h Utils/ApplicationSink Utils/applicationsource.h Utils/ApplicationSource ) |
From: <gk...@ke...> - 2011-02-10 14:44:40
|
Module: qt-gstreamer Branch: master Commit: 6fa089c8596116abb5703b422381dbf7c63a16ad URL: http://cgit.freedesktop.org/gstreamer/qt-gstreamer/commit/?id=6fa089c8596116abb5703b422381dbf7c63a16ad Author: George Kiagiadakis <geo...@co...> Date: Sun Feb 6 14:50:11 2011 +0200 Add Element::removePad(). This is useful for manipulating ghost pads on custom bins. --- src/QGst/element.cpp | 5 +++++ src/QGst/element.h | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-) diff --git a/src/QGst/element.cpp b/src/QGst/element.cpp index 0679cb6..0a43b77 100644 --- a/src/QGst/element.cpp +++ b/src/QGst/element.cpp @@ -78,6 +78,11 @@ bool Element::addPad(const PadPtr & pad) return gst_element_add_pad(object<GstElement>(), pad); } +bool Element::removePad(const PadPtr & pad) +{ + return gst_element_remove_pad(object<GstElement>(), pad); +} + PadPtr Element::getStaticPad(const char *name) { GstPad *pad = gst_element_get_static_pad(object<GstElement>(), name); diff --git a/src/QGst/element.h b/src/QGst/element.h index 2783241..b3637dd 100644 --- a/src/QGst/element.h +++ b/src/QGst/element.h @@ -44,6 +44,8 @@ public: bool setStateLocked(bool locked); bool addPad(const PadPtr & pad); + bool removePad(const PadPtr & pad); + PadPtr getStaticPad(const char *name); PadPtr getRequestPad(const char *name); void releaseRequestPad(const PadPtr & pad); |