Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/gst-plugins-good.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2020-04-03 07:45:56 +0300
committerSeungha Yang <seungha@centricular.com>2020-04-03 09:00:37 +0300
commit599066726f00e84181046725d5c4ddc784394167 (patch)
treee83c00487a781424559a979e0e955f2c9352ffa3 /tests
parent78eaa7c6ede03811c6f0cf724ac7b9888aabfd87 (diff)
splitmuxsink: Don't send too many force key unit event
splitmuxsink should requst keyframe depending on configured threshold and previously requested time in order to avoid too many keyframe request.
Diffstat (limited to 'tests')
-rw-r--r--tests/check/elements/splitmux.c86
1 files changed, 84 insertions, 2 deletions
diff --git a/tests/check/elements/splitmux.c b/tests/check/elements/splitmux.c
index 04c352c99..be8c5c93a 100644
--- a/tests/check/elements/splitmux.c
+++ b/tests/check/elements/splitmux.c
@@ -27,6 +27,7 @@
#include <gst/check/gstcheck.h>
#include <gst/app/app.h>
+#include <gst/video/video.h>
#include <stdlib.h>
gchar *tmpdir = NULL;
@@ -930,6 +931,24 @@ GST_START_TEST (test_splitmuxsink_muxer_pad_map)
GST_END_TEST;
+static GstPadProbeReturn
+count_upstrea_fku (GstPad * pad, GstPadProbeInfo * info,
+ guint * upstream_fku_count)
+{
+ GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CUSTOM_UPSTREAM:
+ if (gst_video_event_is_force_key_unit (event))
+ *upstream_fku_count += 1;
+ break;
+ default:
+ break;
+ }
+
+ return GST_PAD_PROBE_OK;
+}
+
static void
splitmuxsink_split_by_keyframe (gboolean send_keyframe_request,
guint max_size_time_sec, guint encoder_key_interval_sec)
@@ -937,17 +956,21 @@ splitmuxsink_split_by_keyframe (gboolean send_keyframe_request,
GstMessage *msg;
GstElement *pipeline;
GstElement *sink;
+ GstElement *enc;
+ GstPad *srcpad;
gchar *pipeline_str;
gchar *dest_pattern;
guint count;
guint expected_count;
gchar *in_pattern;
+ guint upstream_fku_count = 0;
+ guint expected_fku_count;
pipeline_str = g_strdup_printf ("splitmuxsink name=splitsink "
"max-size-time=%" G_GUINT64_FORMAT
" send-keyframe-requests=%s muxer=qtmux "
"videotestsrc num-buffers=30 ! video/x-raw,width=80,height=64,framerate=5/1 "
- "! videoconvert ! queue ! vp8enc keyframe-max-dist=%d ! splitsink.video ",
+ "! videoconvert ! queue ! vp8enc name=enc keyframe-max-dist=%d ! splitsink.video ",
max_size_time_sec * GST_SECOND, send_keyframe_request ? "true" : "false",
encoder_key_interval_sec * 5);
@@ -964,6 +987,16 @@ splitmuxsink_split_by_keyframe (gboolean send_keyframe_request,
g_free (dest_pattern);
g_object_unref (sink);
+ enc = gst_bin_get_by_name (GST_BIN (pipeline), "enc");
+ fail_if (enc == NULL);
+ srcpad = gst_element_get_static_pad (enc, "src");
+ fail_if (srcpad == NULL);
+
+ gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_UPSTREAM,
+ (GstPadProbeCallback) count_upstrea_fku, &upstream_fku_count, NULL);
+ gst_object_unref (srcpad);
+ gst_object_unref (enc);
+
msg = run_pipeline (pipeline);
if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR)
@@ -978,6 +1011,18 @@ splitmuxsink_split_by_keyframe (gboolean send_keyframe_request,
fail_unless (count == expected_count,
"Expected %d output files, got %d", expected_count, count);
+ if (!send_keyframe_request) {
+ expected_fku_count = 0;
+ } else {
+ expected_fku_count = count;
+ }
+
+ GST_INFO ("Upstream force keyunit event count %d", upstream_fku_count);
+
+ fail_unless (upstream_fku_count == expected_fku_count,
+ "Expected upstream force keyunit event count %d, got %d",
+ expected_fku_count, upstream_fku_count);
+
in_pattern = g_build_filename (tmpdir, "out*.m4v", NULL);
/* FIXME: Reverse playback works poorly with multiple video streams
* in qtdemux (at least, maybe other demuxers) at the time this was
@@ -1035,17 +1080,21 @@ splitmuxsink_split_by_keyframe_timecode (gboolean send_keyframe_request,
GstMessage *msg;
GstElement *pipeline;
GstElement *sink;
+ GstElement *enc;
+ GstPad *srcpad;
gchar *pipeline_str;
gchar *dest_pattern;
guint count;
guint expected_count;
gchar *in_pattern;
+ guint upstream_fku_count = 0;
+ guint expected_fku_count;
pipeline_str = g_strdup_printf ("splitmuxsink name=splitsink "
"max-size-timecode=%s"
" send-keyframe-requests=%s muxer=qtmux "
"videotestsrc num-buffers=30 ! video/x-raw,width=80,height=64,framerate=5/1 "
- "! videoconvert ! timecodestamper ! queue ! vp8enc keyframe-max-dist=%d ! splitsink.video ",
+ "! videoconvert ! timecodestamper ! queue ! vp8enc name=enc keyframe-max-dist=%d ! splitsink.video ",
maxsize_timecode_string, send_keyframe_request ? "true" : "false",
encoder_key_interval_sec ? encoder_key_interval_sec * 5 : 1);
@@ -1062,6 +1111,16 @@ splitmuxsink_split_by_keyframe_timecode (gboolean send_keyframe_request,
g_free (dest_pattern);
g_object_unref (sink);
+ enc = gst_bin_get_by_name (GST_BIN (pipeline), "enc");
+ fail_if (enc == NULL);
+ srcpad = gst_element_get_static_pad (enc, "src");
+ fail_if (srcpad == NULL);
+
+ gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_UPSTREAM,
+ (GstPadProbeCallback) count_upstrea_fku, &upstream_fku_count, NULL);
+ gst_object_unref (srcpad);
+ gst_object_unref (enc);
+
msg = run_pipeline (pipeline);
if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR)
@@ -1077,6 +1136,18 @@ splitmuxsink_split_by_keyframe_timecode (gboolean send_keyframe_request,
fail_unless (count == expected_count,
"Expected %d output files, got %d", expected_count, count);
+ if (!send_keyframe_request) {
+ expected_fku_count = 0;
+ } else {
+ expected_fku_count = count;
+ }
+
+ GST_INFO ("Upstream force keyunit event count %d", upstream_fku_count);
+
+ fail_unless (upstream_fku_count == expected_fku_count,
+ "Expected upstream force keyunit event count %d, got %d",
+ expected_fku_count, upstream_fku_count);
+
in_pattern = g_build_filename (tmpdir, "out*.m4v", NULL);
/* FIXME: Reverse playback works poorly with multiple video streams
* in qtdemux (at least, maybe other demuxers) at the time this was
@@ -1087,6 +1158,15 @@ splitmuxsink_split_by_keyframe_timecode (gboolean send_keyframe_request,
g_free (in_pattern);
}
+GST_START_TEST (test_splitmuxsink_without_keyframe_request_timecode)
+{
+ /* This encoding option is intended to produce keyframe per 1 second
+ * but splitmuxsink will split file per 2 second without keyframe request */
+ splitmuxsink_split_by_keyframe_timecode (FALSE, "00:00:02:00", 2, 1);
+}
+
+GST_END_TEST;
+
GST_START_TEST (test_splitmuxsink_keyframe_request_timecode)
{
/* This encoding option is intended to produce keyframe per 1 second
@@ -1195,6 +1275,8 @@ splitmux_suite (void)
}
if (have_qtmux && have_vp8 && have_timecodestamper) {
+ tcase_add_test (tc_chain,
+ test_splitmuxsink_without_keyframe_request_timecode);
tcase_add_test (tc_chain, test_splitmuxsink_keyframe_request_timecode);
tcase_add_test (tc_chain,
test_splitmuxsink_keyframe_request_timecode_trailing_small_segment);