mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 04:56:24 +00:00
videotestsrc: implement duration query
Add duration query to videotestsrc, it can answer this query when the num-buffers property is set. https://bugzilla.gnome.org/show_bug.cgi?id=709646
This commit is contained in:
parent
8bcd1a2f8d
commit
c2eb3d4e71
2 changed files with 60 additions and 0 deletions
|
@ -773,6 +773,16 @@ gst_video_test_src_query (GstBaseSrc * bsrc, GstQuery * query)
|
||||||
gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
|
gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_QUERY_DURATION:{
|
||||||
|
if (bsrc->num_buffers != -1) {
|
||||||
|
gint64 dur = gst_util_uint64_scale_int_round (bsrc->num_buffers
|
||||||
|
* GST_SECOND, src->info.fps_d, src->info.fps_n);
|
||||||
|
res = TRUE;
|
||||||
|
gst_query_set_duration (query, GST_FORMAT_TIME, dur);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
|
res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -427,6 +427,55 @@ GST_START_TEST (test_backward_playback)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
GST_START_TEST (test_duration_query)
|
||||||
|
{
|
||||||
|
GstElement *bin;
|
||||||
|
GError *error = NULL;
|
||||||
|
GstStateChangeReturn ret;
|
||||||
|
gboolean queryret;
|
||||||
|
gint64 duration = -1;
|
||||||
|
|
||||||
|
bin =
|
||||||
|
gst_parse_launch ("videotestsrc ! fakesink name=sink sync=true", &error);
|
||||||
|
ret = gst_element_set_state (bin, GST_STATE_PAUSED);
|
||||||
|
if (ret == GST_STATE_CHANGE_ASYNC) {
|
||||||
|
ret = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE);
|
||||||
|
fail_if (ret != GST_STATE_CHANGE_SUCCESS, "Could not start test pipeline");
|
||||||
|
}
|
||||||
|
queryret = gst_element_query_duration (bin, GST_FORMAT_TIME, &duration);
|
||||||
|
/* should have unknown duration */
|
||||||
|
if (queryret && duration != -1) {
|
||||||
|
fail ("Should return false on duration query");
|
||||||
|
}
|
||||||
|
gst_element_set_state (bin, GST_STATE_NULL);
|
||||||
|
gst_object_unref (bin);
|
||||||
|
|
||||||
|
bin = gst_parse_launch ("videotestsrc num-buffers=100 ! capsfilter "
|
||||||
|
"caps=\"video/x-raw,framerate=(fraction)10/1\" ! "
|
||||||
|
"fakesink name=sink sync=true", &error);
|
||||||
|
ret = gst_element_set_state (bin, GST_STATE_PAUSED);
|
||||||
|
if (ret == GST_STATE_CHANGE_ASYNC) {
|
||||||
|
ret = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE);
|
||||||
|
fail_if (ret != GST_STATE_CHANGE_SUCCESS, "Could not start test pipeline");
|
||||||
|
}
|
||||||
|
queryret = gst_element_query_duration (bin, GST_FORMAT_TIME, &duration);
|
||||||
|
fail_unless (queryret, "Duration should be returned");
|
||||||
|
fail_unless (duration == GST_SECOND * 10, "Expected duration didn't match");
|
||||||
|
|
||||||
|
/* reverse playback should have no impact on duration */
|
||||||
|
gst_element_seek (bin, -1.0, GST_FORMAT_TIME,
|
||||||
|
GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
|
||||||
|
0, GST_SEEK_TYPE_SET, 1 * GST_SECOND);
|
||||||
|
queryret = gst_element_query_duration (bin, GST_FORMAT_TIME, &duration);
|
||||||
|
fail_unless (queryret, "Duration should be returned");
|
||||||
|
fail_unless (duration == GST_SECOND * 10, "Expected duration didn't match");
|
||||||
|
|
||||||
|
gst_element_set_state (bin, GST_STATE_NULL);
|
||||||
|
gst_object_unref (bin);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: add tests for YUV formats */
|
/* FIXME: add tests for YUV formats */
|
||||||
|
|
||||||
|
@ -448,6 +497,7 @@ videotestsrc_suite (void)
|
||||||
tcase_add_test (tc_chain, test_all_patterns);
|
tcase_add_test (tc_chain, test_all_patterns);
|
||||||
tcase_add_test (tc_chain, test_rgb_formats);
|
tcase_add_test (tc_chain, test_rgb_formats);
|
||||||
tcase_add_test (tc_chain, test_backward_playback);
|
tcase_add_test (tc_chain, test_backward_playback);
|
||||||
|
tcase_add_test (tc_chain, test_duration_query);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue