summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorOgnyan Tonchev <ognyan.tonchev at axis.com>2009-06-19 18:12:27 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2009-06-19 18:12:27 +0200
commit11b7016f7dca29a7c108cf2898b72cf23407874d (patch)
treeaeb55519dec29b92b9ae9d45b9e295bafb71612d /tests
parent83a0e7d2a36a58974883a26df05aca972e7ac110 (diff)
tests: add unit tests for buffer-list payloaders
See #585559
Diffstat (limited to 'tests')
-rw-r--r--tests/check/elements/rtp-payloading.c228
1 files changed, 212 insertions, 16 deletions
diff --git a/tests/check/elements/rtp-payloading.c b/tests/check/elements/rtp-payloading.c
index 92fa875f..6517f4a5 100644
--- a/tests/check/elements/rtp-payloading.c
+++ b/tests/check/elements/rtp-payloading.c
@@ -43,6 +43,45 @@ typedef struct
} rtp_pipeline;
/*
+ * Number of bytes received in the chain list function when using buffer lists
+ */
+static guint chain_list_bytes_received;
+
+/*
+ * Chain list function for testing buffer lists
+ */
+static GstFlowReturn
+rtp_pipeline_chain_list (GstPad * pad, GstBufferList * list)
+{
+ GstBufferListIterator *it;
+
+ fail_if (!list);
+ it = gst_buffer_list_iterate (list);
+
+ /*
+ * Count the size of the payload in the buffer list.
+ */
+
+ /* Loop through all groups */
+ while (gst_buffer_list_iterator_next_group (it)) {
+ GstBuffer *paybuf;
+
+ /* Skip the first buffer in the group, its the RTP header */
+ fail_if (!gst_buffer_list_iterator_next (it));
+
+ /* Loop through all payload buffers in the current group */
+ while ((paybuf = gst_buffer_list_iterator_next (it))) {
+ chain_list_bytes_received += GST_BUFFER_SIZE (paybuf);
+ }
+ }
+
+ gst_buffer_list_iterator_free (it);
+ gst_buffer_list_unref (list);
+
+ return GST_FLOW_OK;
+}
+
+/*
* RTP bus callback.
*/
static gboolean
@@ -275,6 +314,27 @@ rtp_pipeline_run (rtp_pipeline * p)
}
/*
+ * Enables buffer lists. Sets the buffer-list property of the payloader
+ * and adds a chain_list_function to the depayloader.
+ * @param p Pointer to the RTP pipeline.
+ */
+static void
+rtp_pipeline_enable_lists (rtp_pipeline * p, guint mtu_size)
+{
+ /* use buffer lists */
+ g_object_set (p->rtppay, "buffer-list", TRUE, NULL);
+
+ /* set mtu size if needed */
+ if (mtu_size) {
+ g_object_set (p->rtppay, "mtu", mtu_size, NULL);
+ }
+
+ /* Add chain list function for the buffer list tests */
+ gst_pad_set_chain_list_function (gst_element_get_static_pad (p->rtpdepay,
+ "sink"), GST_DEBUG_FUNCPTR (rtp_pipeline_chain_list));
+}
+
+/*
* Creates the RTP pipeline and runs the test using the pipeline.
* @param frame_data Pointer to the frame data which is used to pass thru pay/depayloaders.
* @param frame_data_size Frame data size in bytes.
@@ -282,10 +342,14 @@ rtp_pipeline_run (rtp_pipeline * p)
* @param filtercaps Caps filters.
* @param pay Payloader name.
* @param depay Depayloader name.
+ * @bytes_sent bytes that will be sent, used when testing buffer lists
+ * @mtu_size set mtu size when testing lists
+ * @use_lists enable buffer lists
*/
static void
rtp_pipeline_test (const char *frame_data, int frame_data_size, int frame_count,
- const char *filtercaps, const char *pay, const char *depay)
+ const char *filtercaps, const char *pay, const char *depay,
+ guint bytes_sent, guint mtu_size, gboolean use_lists)
{
/* Create RTP pipeline. */
rtp_pipeline *p =
@@ -296,11 +360,21 @@ rtp_pipeline_test (const char *frame_data, int frame_data_size, int frame_count,
return;
}
+ if (use_lists) {
+ rtp_pipeline_enable_lists (p, mtu_size);
+ chain_list_bytes_received = 0;
+ }
+
/* Run RTP pipeline. */
rtp_pipeline_run (p);
/* Destroy RTP pipeline. */
rtp_pipeline_destroy (p);
+
+ if (use_lists) {
+ /* 'next NAL' indicator is 4 bytes */
+ fail_if (chain_list_bytes_received != bytes_sent * LOOP_COUNT);
+ }
}
static char rtp_ilbc_frame_data[] =
@@ -316,7 +390,7 @@ GST_START_TEST (rtp_ilbc)
{
rtp_pipeline_test (rtp_ilbc_frame_data, rtp_ilbc_frame_data_size,
rtp_ilbc_frame_count, "audio/x-iLBC,mode=20", "rtpilbcpay",
- "rtpilbcdepay");
+ "rtpilbcdepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -333,7 +407,7 @@ GST_START_TEST (rtp_gsm)
{
rtp_pipeline_test (rtp_gsm_frame_data, rtp_gsm_frame_data_size,
rtp_gsm_frame_count, "audio/x-gsm,rate=8000,channels=1", "rtpgsmpay",
- "rtpgsmdepay");
+ "rtpgsmdepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -351,7 +425,7 @@ GST_START_TEST (rtp_amr)
{
rtp_pipeline_test (rtp_amr_frame_data, rtp_amr_frame_data_size,
rtp_amr_frame_count, "audio/AMR,channels=1,rate=8000", "rtpamrpay",
- "rtpamrdepay");
+ "rtpamrdepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -368,7 +442,7 @@ GST_START_TEST (rtp_pcma)
{
rtp_pipeline_test (rtp_pcma_frame_data, rtp_pcma_frame_data_size,
rtp_pcma_frame_count, "audio/x-alaw,channels=1,rate=8000", "rtppcmapay",
- "rtppcmadepay");
+ "rtppcmadepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -385,7 +459,7 @@ GST_START_TEST (rtp_pcmu)
{
rtp_pipeline_test (rtp_pcmu_frame_data, rtp_pcmu_frame_data_size,
rtp_pcmu_frame_count, "audio/x-mulaw,channels=1,rate=8000", "rtppcmupay",
- "rtppcmudepay");
+ "rtppcmudepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -401,7 +475,8 @@ static int rtp_mpa_frame_count = 1;
GST_START_TEST (rtp_mpa)
{
rtp_pipeline_test (rtp_mpa_frame_data, rtp_mpa_frame_data_size,
- rtp_mpa_frame_count, "audio/mpeg", "rtpmpapay", "rtpmpadepay");
+ rtp_mpa_frame_count, "audio/mpeg", "rtpmpapay", "rtpmpadepay", 0, 0,
+ FALSE);
}
GST_END_TEST;
@@ -418,7 +493,7 @@ GST_START_TEST (rtp_h263)
{
rtp_pipeline_test (rtp_h263_frame_data, rtp_h263_frame_data_size,
rtp_h263_frame_count, "video/x-h263,variant=itu,h263version=h263",
- "rtph263pay", "rtph263depay");
+ "rtph263pay", "rtph263depay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -435,7 +510,7 @@ GST_START_TEST (rtp_h263p)
{
rtp_pipeline_test (rtp_h263p_frame_data, rtp_h263p_frame_data_size,
rtp_h263p_frame_count, "video/x-h263,variant=itu", "rtph263ppay",
- "rtph263pdepay");
+ "rtph263pdepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -451,7 +526,61 @@ static int rtp_h264_frame_count = 1;
GST_START_TEST (rtp_h264)
{
rtp_pipeline_test (rtp_h264_frame_data, rtp_h264_frame_data_size,
- rtp_h264_frame_count, "video/x-h264", "rtph264pay", "rtph264depay");
+ rtp_h264_frame_count, "video/x-h264", "rtph264pay", "rtph264depay",
+ 0, 0, FALSE);
+}
+
+GST_END_TEST;
+static char rtp_h264_list_lt_mtu_frame_data[] =
+ /* not packetized, next NAL starts with 0001 */
+{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0xad, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00
+};
+
+static int rtp_h264_list_lt_mtu_frame_data_size = 16;
+
+static int rtp_h264_list_lt_mtu_frame_count = 2;
+
+/* NAL = 4 bytes */
+static int rtp_h264_list_lt_mtu_bytes_sent = 2 * (16 - 4);
+
+static int rtp_h264_list_lt_mtu_mtu_size = 1024;
+
+GST_START_TEST (rtp_h264_list_lt_mtu)
+{
+ rtp_pipeline_test (rtp_h264_list_lt_mtu_frame_data,
+ rtp_h264_list_lt_mtu_frame_data_size, rtp_h264_list_lt_mtu_frame_count,
+ "video/x-h264", "rtph264pay", "rtph264depay",
+ rtp_h264_list_lt_mtu_bytes_sent, rtp_h264_list_lt_mtu_mtu_size, TRUE);
+}
+
+GST_END_TEST;
+static char rtp_h264_list_gt_mtu_frame_data[] =
+ /* not packetized, next NAL starts with 0001 */
+{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static int rtp_h264_list_gt_mtu_frame_data_size = 64;
+
+static int rtp_h264_list_gt_mtu_frame_count = 1;
+
+/* NAL = 4 bytes. When data does not fit into 1 mtu, 1 byte will be skipped */
+static int rtp_h264_list_gt_mtu_bytes_sent = 1 * (64 - 4) - 1;
+
+static int rtp_h264_list_gt_mtu_mty_size = 28;
+
+GST_START_TEST (rtp_h264_list_gt_mtu)
+{
+ rtp_pipeline_test (rtp_h264_list_gt_mtu_frame_data,
+ rtp_h264_list_gt_mtu_frame_data_size, rtp_h264_list_gt_mtu_frame_count,
+ "video/x-h264", "rtph264pay", "rtph264depay",
+ rtp_h264_list_gt_mtu_bytes_sent, rtp_h264_list_gt_mtu_mty_size, TRUE);
}
GST_END_TEST;
@@ -469,7 +598,7 @@ GST_START_TEST (rtp_L16)
rtp_pipeline_test (rtp_L16_frame_data, rtp_L16_frame_data_size,
rtp_L16_frame_count,
"audio/x-raw-int,endianess=4321,signed=true,width=16,depth=16,rate=1,channels=1",
- "rtpL16pay", "rtpL16depay");
+ "rtpL16pay", "rtpL16depay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -486,7 +615,7 @@ GST_START_TEST (rtp_mp2t)
{
rtp_pipeline_test (rtp_mp2t_frame_data, rtp_mp2t_frame_data_size,
rtp_mp2t_frame_count, "video/mpegts,packetsize=188,systemstream=true",
- "rtpmp2tpay", "rtpmp2tdepay");
+ "rtpmp2tpay", "rtpmp2tdepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -503,7 +632,27 @@ GST_START_TEST (rtp_mp4v)
{
rtp_pipeline_test (rtp_mp4v_frame_data, rtp_mp4v_frame_data_size,
rtp_mp4v_frame_count, "video/mpeg,mpegversion=4,systemstream=false",
- "rtpmp4vpay", "rtpmp4vdepay");
+ "rtpmp4vpay", "rtpmp4vdepay", 0, 0, FALSE);
+}
+
+GST_END_TEST;
+static char rtp_mp4v_list_frame_data[] =
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static int rtp_mp4v_list_frame_data_size = 20;
+
+static int rtp_mp4v_list_frame_count = 1;
+
+static int rtp_mp4v_list_bytes_sent = 1 * 20;
+
+GST_START_TEST (rtp_mp4v_list)
+{
+ rtp_pipeline_test (rtp_mp4v_list_frame_data, rtp_mp4v_list_frame_data_size,
+ rtp_mp4v_list_frame_count,
+ "video/mpeg,mpegversion=4,codec_data=(buffer)000001b001",
+ "rtpmp4vpay", "rtpmp4vdepay", rtp_mp4v_list_bytes_sent, 0, TRUE);
}
GST_END_TEST;
@@ -521,7 +670,7 @@ GST_START_TEST (rtp_mp4g)
rtp_pipeline_test (rtp_mp4g_frame_data, rtp_mp4g_frame_data_size,
rtp_mp4g_frame_count,
"video/mpeg,mpegversion=4,codec_data=(buffer)000001b001", "rtpmp4gpay",
- "rtpmp4gdepay");
+ "rtpmp4gdepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -538,7 +687,7 @@ GST_START_TEST (rtp_theora)
{
rtp_pipeline_test (rtp_theora_frame_data, rtp_theora_frame_data_size,
rtp_theora_frame_count, "video/x-theora", "rtptheorapay",
- "rtptheoradepay");
+ "rtptheoradepay", 0, 0, FALSE);
}
GST_END_TEST;
@@ -555,7 +704,49 @@ GST_START_TEST (rtp_vorbis)
{
rtp_pipeline_test (rtp_vorbis_frame_data, rtp_vorbis_frame_data_size,
rtp_vorbis_frame_count, "audio/x-vorbis", "rtpvorbispay",
- "rtpvorbisdepay");
+ "rtpvorbisdepay", 0, 0, FALSE);
+}
+
+GST_END_TEST;
+static char rtp_jpeg_frame_data[] =
+ { /* SOF */ 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x03, 0x00, 0x21, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08,
+ /* DQT */ 0xFF, 0xDB, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x03, 0x00, 0x21, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08,
+ /* DATA */ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static int rtp_jpeg_frame_data_size = 42;
+
+static int rtp_jpeg_frame_count = 1;
+
+GST_START_TEST (rtp_jpeg)
+{
+ rtp_pipeline_test (rtp_jpeg_frame_data, rtp_jpeg_frame_data_size,
+ rtp_jpeg_frame_count, "video/x-jpeg,height=640,width=480", "rtpjpegpay",
+ "rtpjpegdepay", 0, 0, FALSE);
+}
+
+GST_END_TEST;
+static char rtp_jpeg_list_frame_data[] =
+ { /* SOF */ 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x03, 0x00, 0x21, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08,
+ /* DQT */ 0xFF, 0xDB, 0x00, 0x11, 0x08, 0x00, 0x08, 0x00, 0x08,
+ 0x03, 0x00, 0x21, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08,
+ /* DATA */ 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static int rtp_jpeg_list_frame_data_size = 42;
+
+static int rtp_jpeg_list_frame_count = 1;
+
+static int rtp_jpeg_list_bytes_sent = 1 * 42;
+
+GST_START_TEST (rtp_jpeg_list)
+{
+ rtp_pipeline_test (rtp_jpeg_list_frame_data, rtp_jpeg_list_frame_data_size,
+ rtp_jpeg_list_frame_count, "video/x-jpeg,height=640,width=480",
+ "rtpjpegpay", "rtpjpegdepay", rtp_jpeg_list_bytes_sent, 0, TRUE);
}
GST_END_TEST;
@@ -584,12 +775,17 @@ rtp_payloading_suite ()
tcase_add_test (tc_chain, rtp_h263);
tcase_add_test (tc_chain, rtp_h263p);
tcase_add_test (tc_chain, rtp_h264);
+ tcase_add_test (tc_chain, rtp_h264_list_lt_mtu);
+ tcase_add_test (tc_chain, rtp_h264_list_gt_mtu);
tcase_add_test (tc_chain, rtp_L16);
tcase_add_test (tc_chain, rtp_mp2t);
tcase_add_test (tc_chain, rtp_mp4v);
+ tcase_add_test (tc_chain, rtp_mp4v_list);
tcase_add_test (tc_chain, rtp_mp4g);
tcase_add_test (tc_chain, rtp_theora);
tcase_add_test (tc_chain, rtp_vorbis);
+ tcase_add_test (tc_chain, rtp_jpeg);
+ tcase_add_test (tc_chain, rtp_jpeg_list);
return s;
}