summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRene Stadler <mail@renestadler.de>2008-03-24 12:32:59 +0000
committerRene Stadler <mail@renestadler.de>2008-03-24 12:32:59 +0000
commitfe1f183340452ee6d65e667ce1c8b3ee58aaec32 (patch)
tree372746cf6c2e92ae4f06f32a1a94ed8287f15be0
parentcc2d5bd32b8db721e15aa4fa62cdc4852d233351 (diff)
downloadgst-plugins-bad-fe1f183340452ee6d65e667ce1c8b3ee58aaec32.tar.gz
gst-plugins-bad-fe1f183340452ee6d65e667ce1c8b3ee58aaec32.tar.bz2
gst-plugins-bad-fe1f183340452ee6d65e667ce1c8b3ee58aaec32.zip
Make rganalysis and rglimiter elements GAP-flag aware.
Original commit message from CVS: * gst/replaygain/gstrganalysis.c (gst_rg_analysis_init), (gst_rg_analysis_transform_ip): * gst/replaygain/gstrglimiter.c (gst_rg_limiter_init), (gst_rg_limiter_transform_ip): Make rganalysis and rglimiter elements GAP-flag aware. * tests/check/elements/rganalysis.c: (test_gap_buffers), (rganalysis_suite): * tests/check/elements/rglimiter.c (test_gap), (rglimiter_suite): Add tests to verify gap-awareness.
-rw-r--r--ChangeLog13
m---------common0
-rw-r--r--gst/replaygain/gstrganalysis.c8
-rw-r--r--gst/replaygain/gstrglimiter.c9
-rw-r--r--tests/check/elements/rganalysis.c41
-rw-r--r--tests/check/elements/rglimiter.c31
6 files changed, 101 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index f61c468d..74a879d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2008-03-24 Rene Stadler <mail@renestadler.de>
+
+ * gst/replaygain/gstrganalysis.c (gst_rg_analysis_init),
+ (gst_rg_analysis_transform_ip):
+ * gst/replaygain/gstrglimiter.c (gst_rg_limiter_init),
+ (gst_rg_limiter_transform_ip):
+ Make rganalysis and rglimiter elements GAP-flag aware.
+
+ * tests/check/elements/rganalysis.c: (test_gap_buffers),
+ (rganalysis_suite):
+ * tests/check/elements/rglimiter.c (test_gap), (rglimiter_suite):
+ Add tests to verify gap-awareness.
+
2008-03-22 Sebastian Dröge <slomo@circular-chaos.org>
* ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_headers_cb),
diff --git a/common b/common
-Subproject 9a358e5cc3977fd6121f12dd25a358081fd7704
+Subproject 4221e9dcb05faa6f6f7ba19bba32fe90da4577d
diff --git a/gst/replaygain/gstrganalysis.c b/gst/replaygain/gstrganalysis.c
index 24367786..613c0876 100644
--- a/gst/replaygain/gstrganalysis.c
+++ b/gst/replaygain/gstrganalysis.c
@@ -288,6 +288,10 @@ gst_rg_analysis_class_init (GstRgAnalysisClass * klass)
static void
gst_rg_analysis_init (GstRgAnalysis * filter, GstRgAnalysisClass * gclass)
{
+ GstBaseTransform *base = GST_BASE_TRANSFORM (filter);
+
+ gst_base_transform_set_gap_aware (base, TRUE);
+
filter->num_tracks = 0;
filter->forced = FORCED_DEFAULT;
filter->reference_level = RG_REFERENCE_LEVEL;
@@ -452,6 +456,10 @@ gst_rg_analysis_transform_ip (GstBaseTransform * base, GstBuffer * buf)
if (filter->skip)
return GST_FLOW_OK;
+ /* Buffers made up of silence have no influence on the analysis: */
+ if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))
+ return GST_FLOW_OK;
+
GST_LOG_OBJECT (filter, "processing buffer of size %u",
GST_BUFFER_SIZE (buf));
diff --git a/gst/replaygain/gstrglimiter.c b/gst/replaygain/gstrglimiter.c
index 609db3d7..d474b26e 100644
--- a/gst/replaygain/gstrglimiter.c
+++ b/gst/replaygain/gstrglimiter.c
@@ -129,8 +129,12 @@ gst_rg_limiter_class_init (GstRgLimiterClass * klass)
static void
gst_rg_limiter_init (GstRgLimiter * filter, GstRgLimiterClass * gclass)
{
+ GstBaseTransform *base = GST_BASE_TRANSFORM (filter);
+
+ gst_base_transform_set_passthrough (base, FALSE);
+ gst_base_transform_set_gap_aware (base, TRUE);
+
filter->enabled = TRUE;
- gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), FALSE);
}
static void
@@ -182,6 +186,9 @@ gst_rg_limiter_transform_ip (GstBaseTransform * base, GstBuffer * buf)
if (!filter->enabled)
return GST_FLOW_OK;
+ if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))
+ return GST_FLOW_OK;
+
input = (gfloat *) GST_BUFFER_DATA (buf);
count = GST_BUFFER_SIZE (buf) / sizeof (gfloat);
diff --git a/tests/check/elements/rganalysis.c b/tests/check/elements/rganalysis.c
index 96ea6dad..1a44bd4e 100644
--- a/tests/check/elements/rganalysis.c
+++ b/tests/check/elements/rganalysis.c
@@ -741,6 +741,46 @@ GST_START_TEST (test_empty_buffers)
GST_END_TEST;
+GST_START_TEST (test_gap_buffers)
+{
+ GstElement *element = setup_rganalysis ();
+ GstTagList *tag_list;
+ GstBuffer *buf;
+ gint accumulator = 0;
+ gint i;
+
+ set_playing_state (element);
+
+ for (i = 0; i < 60; i++) {
+ if (i % 3 == 0) {
+ /* We are cheating here; the element cannot know that these GAP buffers
+ * actually contain non-silence so it must skip them. */
+ buf = test_buffer_square_float_mono (&accumulator, 44100, 512, 0.25);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_GAP);
+ push_buffer (buf);
+
+ /* Verify that the base class does not lift the GAP flag: */
+ fail_if (g_list_length (buffers) == 0);
+ if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))
+ fail_unless (GST_BUFFER_FLAG_IS_SET (buffers->data,
+ GST_BUFFER_FLAG_GAP));
+ } else {
+ push_buffer (test_buffer_const_float_mono (44100, 512, 0.0));
+ }
+ }
+
+ send_eos_event (element);
+ tag_list = poll_tags (element);
+ /* We pushed faked GAP buffers with non-silence and non-GAP buffers with
+ * silence, so the correct result is that the analysis only got silence: */
+ fail_unless_track_peak (tag_list, 0.0);
+ fail_unless_track_gain (tag_list, SILENCE_GAIN);
+
+ cleanup_rganalysis (element);
+}
+
+GST_END_TEST;
+
/* Tests for correctness of the peak values. */
/* Float peak test. For stereo, one channel has the constant value of -1.369,
@@ -1778,6 +1818,7 @@ rganalysis_suite (void)
tcase_add_test (tc_chain, test_no_buffer_album_1);
tcase_add_test (tc_chain, test_no_buffer_album_2);
tcase_add_test (tc_chain, test_empty_buffers);
+ tcase_add_test (tc_chain, test_gap_buffers);
tcase_add_test (tc_chain, test_peak_float);
tcase_add_test (tc_chain, test_peak_int16_16);
diff --git a/tests/check/elements/rglimiter.c b/tests/check/elements/rglimiter.c
index 33b478d0..9d838785 100644
--- a/tests/check/elements/rglimiter.c
+++ b/tests/check/elements/rglimiter.c
@@ -204,6 +204,36 @@ GST_START_TEST (test_limiting)
GST_END_TEST;
+GST_START_TEST (test_gap)
+{
+ GstElement *element = setup_rglimiter ();
+ GstBuffer *buf, *out_buf;
+
+ set_playing_state (element);
+
+ buf = create_test_buffer ();
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_GAP);
+ fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK);
+ fail_unless (g_list_length (buffers) == 1);
+ out_buf = buffers->data;
+ fail_if (out_buf == NULL);
+ ASSERT_BUFFER_REFCOUNT (out_buf, "out_buf", 1);
+
+ /* Verify that the baseclass does not lift the GAP flag: */
+ fail_unless (GST_BUFFER_FLAG_IS_SET (out_buf, GST_BUFFER_FLAG_GAP));
+
+ g_assert (GST_BUFFER_SIZE (out_buf) == GST_BUFFER_SIZE (buf));
+ /* We cheated by passing an input buffer with non-silence that has the GAP
+ * flag set. The element cannot know that however and must have skipped
+ * adjusting the buffer because of the flag, which we can easily verify: */
+ fail_if (memcmp (GST_BUFFER_DATA (out_buf),
+ GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (out_buf)) != 0);
+
+ cleanup_rglimiter (element);
+}
+
+GST_END_TEST;
+
Suite *
rglimiter_suite (void)
{
@@ -215,6 +245,7 @@ rglimiter_suite (void)
tcase_add_test (tc_chain, test_no_buffer);
tcase_add_test (tc_chain, test_disabled);
tcase_add_test (tc_chain, test_limiting);
+ tcase_add_test (tc_chain, test_gap);
return s;
}