tests: qtdemux: test correct pad names are created

Test correct pad names are created in accordance to their media type
in mss mode.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/628>
This commit is contained in:
Hosang Lee 2020-07-22 16:24:15 +09:00 committed by GStreamer Merge Bot
parent f8e686078d
commit d6f6e8410e

View file

@ -740,6 +740,152 @@ GST_START_TEST (test_qtdemux_stream_change)
GST_END_TEST;
static void
qtdemux_pad_added_cb_check_name (GstElement * element, GstPad * pad,
gchar * data)
{
gchar *pad_name = gst_pad_get_name (pad);
GST_DEBUG_OBJECT (pad, "New pad added");
fail_unless (!g_strcmp0 (pad_name, data));
g_free (pad_name);
}
GST_START_TEST (test_qtdemux_pad_names)
{
GstElement *qtdemux_v;
GstElement *qtdemux_a;
GstPad *sinkpad;
gchar *expected_video_pad_name;
gchar *expected_audio_pad_name;
GstBuffer *inbuf;
GstSegment segment;
GstEvent *event;
GstCaps *caps;
GstCaps *mediacaps;
/* The goal of this test is to check that qtdemux can create proper
* pad names with encrypted stream caps in mss mode.
*
* Input Caps:
* - media-caps with cenc
*
* Expected behaviour
* - Demux exposes src pad with names in accordance to their media types
*/
expected_video_pad_name = g_strdup ("video_0");
qtdemux_v = gst_element_factory_make ("qtdemux", NULL);
gst_element_set_state (qtdemux_v, GST_STATE_PLAYING);
sinkpad = gst_element_get_static_pad (qtdemux_v, "sink");
/* We'll want to know when the source pad is added */
g_signal_connect (qtdemux_v, "pad-added", (GCallback)
qtdemux_pad_added_cb_check_name, expected_video_pad_name);
/* Send the initial STREAM_START and segment (TIME) event */
event = gst_event_new_stream_start ("TEST");
GST_DEBUG ("Pushing stream-start event");
fail_unless (gst_pad_send_event (sinkpad, event) == TRUE);
/* Send CAPS event* */
mediacaps = gst_caps_new_simple ("application/x-cenc",
"stream-format", G_TYPE_STRING, "avc",
"format", G_TYPE_STRING, "H264",
"width", G_TYPE_INT, 512,
"height", G_TYPE_INT, 288,
"original-media-type", G_TYPE_STRING, "video/x-h264",
"protection-system", G_TYPE_STRING,
"9a04f079-9840-4286-ab92-e65be0885f95", NULL);
caps =
gst_caps_new_simple ("video/quicktime", "variant", G_TYPE_STRING,
"mss-fragmented", "timesacle", G_TYPE_UINT64, 10000000, "media-caps",
GST_TYPE_CAPS, mediacaps, NULL);
/* Send segment event* */
event = gst_event_new_caps (caps);
GST_DEBUG ("Pushing caps event");
fail_unless (gst_pad_send_event (sinkpad, event) == TRUE);
gst_caps_unref (mediacaps);
gst_caps_unref (caps);
gst_segment_init (&segment, GST_FORMAT_TIME);
event = gst_event_new_segment (&segment);
GST_DEBUG ("Pushing segment event");
fail_unless (gst_pad_send_event (sinkpad, event) == TRUE);
/* Send the first fragment */
/* NOTE: mss streams don't have moov */
inbuf = gst_buffer_new_and_alloc (seg_1_moof_size);
gst_buffer_fill (inbuf, 0, seg_1_m4f, seg_1_moof_size);
GST_BUFFER_PTS (inbuf) = 0;
GST_BUFFER_OFFSET (inbuf) = 0;
GST_BUFFER_FLAG_SET (inbuf, GST_BUFFER_FLAG_DISCONT);
GST_DEBUG ("Pushing video fragment");
fail_unless (gst_pad_chain (sinkpad, inbuf) == GST_FLOW_OK);
gst_object_unref (sinkpad);
gst_element_set_state (qtdemux_v, GST_STATE_NULL);
gst_object_unref (qtdemux_v);
g_free (expected_video_pad_name);
/* Repeat test for audio media type */
expected_audio_pad_name = g_strdup ("audio_0");
qtdemux_a = gst_element_factory_make ("qtdemux", NULL);
gst_element_set_state (qtdemux_a, GST_STATE_PLAYING);
sinkpad = gst_element_get_static_pad (qtdemux_a, "sink");
/* We'll want to know when the source pad is added */
g_signal_connect (qtdemux_a, "pad-added", (GCallback)
qtdemux_pad_added_cb_check_name, expected_audio_pad_name);
/* Send the initial STREAM_START and segment (TIME) event */
event = gst_event_new_stream_start ("TEST");
GST_DEBUG ("Pushing stream-start event");
fail_unless (gst_pad_send_event (sinkpad, event) == TRUE);
/* Send CAPS event* */
mediacaps = gst_caps_new_simple ("application/x-cenc",
"mpegversion", G_TYPE_INT, 4,
"channels", G_TYPE_INT, 2,
"rate", G_TYPE_INT, 48000,
"original-media-type", G_TYPE_STRING, "audio/mpeg",
"protection-system", G_TYPE_STRING,
"9a04f079-9840-4286-ab92-e65be0885f95", NULL);
caps =
gst_caps_new_simple ("video/quicktime", "variant", G_TYPE_STRING,
"mss-fragmented", "timesacle", G_TYPE_UINT64, 10000000, "media-caps",
GST_TYPE_CAPS, mediacaps, NULL);
/* Send segment event* */
event = gst_event_new_caps (caps);
GST_DEBUG ("Pushing caps event");
fail_unless (gst_pad_send_event (sinkpad, event) == TRUE);
gst_caps_unref (mediacaps);
gst_caps_unref (caps);
gst_segment_init (&segment, GST_FORMAT_TIME);
event = gst_event_new_segment (&segment);
GST_DEBUG ("Pushing segment event");
fail_unless (gst_pad_send_event (sinkpad, event) == TRUE);
/* Send the first fragment */
/* NOTE: mss streams don't have moov */
inbuf = gst_buffer_new_and_alloc (seg_1_moof_size);
gst_buffer_fill (inbuf, 0, seg_1_m4f, seg_1_moof_size);
GST_BUFFER_PTS (inbuf) = 0;
GST_BUFFER_OFFSET (inbuf) = 0;
GST_BUFFER_FLAG_SET (inbuf, GST_BUFFER_FLAG_DISCONT);
GST_DEBUG ("Pushing audio fragment");
fail_unless (gst_pad_chain (sinkpad, inbuf) == GST_FLOW_OK);
gst_object_unref (sinkpad);
gst_element_set_state (qtdemux_a, GST_STATE_NULL);
gst_object_unref (qtdemux_a);
g_free (expected_audio_pad_name);
}
GST_END_TEST;
static Suite *
qtdemux_suite (void)
{
@ -752,6 +898,7 @@ qtdemux_suite (void)
tcase_add_test (tc_chain, test_qtdemux_input_gap);
tcase_add_test (tc_chain, test_qtdemux_duplicated_moov);
tcase_add_test (tc_chain, test_qtdemux_stream_change);
tcase_add_test (tc_chain, test_qtdemux_pad_names);
return s;
}