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:
Thiago Santos 2013-10-08 16:10:54 -03:00
parent 8bcd1a2f8d
commit c2eb3d4e71
2 changed files with 60 additions and 0 deletions

View file

@ -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);
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:
res = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query);
break;

View file

@ -427,6 +427,55 @@ GST_START_TEST (test_backward_playback)
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 */
@ -448,6 +497,7 @@ videotestsrc_suite (void)
tcase_add_test (tc_chain, test_all_patterns);
tcase_add_test (tc_chain, test_rgb_formats);
tcase_add_test (tc_chain, test_backward_playback);
tcase_add_test (tc_chain, test_duration_query);
return s;
}