summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gst/aacparse/gstaacparse.c24
-rw-r--r--tests/check/elements/aacparse.c32
2 files changed, 41 insertions, 15 deletions
diff --git a/gst/aacparse/gstaacparse.c b/gst/aacparse/gstaacparse.c
index c9ad0b5f..07567bc7 100644
--- a/gst/aacparse/gstaacparse.c
+++ b/gst/aacparse/gstaacparse.c
@@ -213,17 +213,27 @@ gst_aacparse_finalize (GObject * object)
static gboolean
gst_aacparse_set_src_caps (GstAacParse * aacparse)
{
- GstCaps *src_caps = NULL;
- gchar *caps_str = NULL;
+ GstStructure *s;
+ GstCaps *sink_caps, *src_caps = NULL;
gboolean res = FALSE;
- src_caps = gst_caps_new_simple ("audio/mpeg",
- "framed", G_TYPE_BOOLEAN, TRUE,
+ sink_caps = GST_PAD_CAPS (GST_BASE_PARSE (aacparse)->sinkpad);
+ GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps);
+ if (sink_caps)
+ src_caps = gst_caps_copy (sink_caps);
+ else
+ src_caps = gst_caps_new_simple ("audio/mpeg", NULL);
+
+ gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE,
"mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL);
- caps_str = gst_caps_to_string (src_caps);
- GST_DEBUG_OBJECT (aacparse, "setting srcpad caps: %s", caps_str);
- g_free (caps_str);
+ s = gst_caps_get_structure (src_caps, 0);
+ if (!gst_structure_has_field (s, "rate") && aacparse->sample_rate > 0)
+ gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL);
+ if (!gst_structure_has_field (s, "channels") && aacparse->channels > 0)
+ gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL);
+
+ GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
gst_pad_use_fixed_caps (GST_BASE_PARSE (aacparse)->srcpad);
res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
diff --git a/tests/check/elements/aacparse.c b/tests/check/elements/aacparse.c
index f7de288b..bc561c7e 100644
--- a/tests/check/elements/aacparse.c
+++ b/tests/check/elements/aacparse.c
@@ -29,9 +29,12 @@
#define SRC_CAPS_CDATA "audio/mpeg, framed=(boolean)false, codec_data=(buffer)1190"
#define SRC_CAPS_TMPL "audio/mpeg, framed=(boolean)false, mpegversion=(int){2,4}"
-#define SINK_CAPS "audio/mpeg, framed=(boolean)true"
-#define SINK_CAPS_MPEG2 "audio/mpeg, framed=(boolean)true, mpegversion=2"
-#define SINK_CAPS_MPEG4 "audio/mpeg, framed=(boolean)true, mpegversion=4"
+#define SINK_CAPS \
+ "audio/mpeg, framed=(boolean)true"
+#define SINK_CAPS_MPEG2 \
+ "audio/mpeg, framed=(boolean)true, mpegversion=2, rate=48000, channels=2"
+#define SINK_CAPS_MPEG4 \
+ "audio/mpeg, framed=(boolean)true, mpegversion=4, rate=96000, channels=2"
#define SINK_CAPS_TMPL "audio/mpeg, framed=(boolean)true, mpegversion=(int){2,4}"
GList *buffers;
@@ -130,6 +133,8 @@ buffer_verify_adts (void *buffer, void *user_data)
gchar *bcaps = gst_caps_to_string (GST_BUFFER_CAPS (buffer));
g_free (bcaps);
+ GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?",
+ GST_BUFFER_CAPS (buffer), vdata->caps);
fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), vdata->caps));
}
@@ -226,6 +231,7 @@ GST_START_TEST (test_parse_adif_normal)
/* For ADIF parser assumes that data is always version 4 */
scaps = gst_caps_from_string (SINK_CAPS_MPEG4);
sinkcaps = gst_pad_get_negotiated_caps (sinkpad);
+ GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT " ?", sinkcaps, scaps);
fail_unless (gst_caps_is_equal (sinkcaps, scaps));
gst_caps_unref (sinkcaps);
gst_caps_unref (scaps);
@@ -413,6 +419,7 @@ GST_START_TEST (test_parse_adts_detect_mpeg_version)
/* Check that the negotiated caps are as expected */
sinkcaps = gst_pad_get_negotiated_caps (sinkpad);
+ GST_LOG ("%" GST_PTR_FORMAT " = %" GST_PTR_FORMAT "?", sinkcaps, vdata.caps);
fail_unless (gst_caps_is_equal (sinkcaps, vdata.caps));
gst_caps_unref (sinkcaps);
@@ -425,7 +432,10 @@ GST_START_TEST (test_parse_adts_detect_mpeg_version)
GST_END_TEST;
-
+#define structure_get_int(s,f) \
+ (g_value_get_int(gst_structure_get_value(s,f)))
+#define fail_unless_structure_field_int_equals(s,field,num) \
+ fail_unless_equals_int (structure_get_int(s,field), num)
/*
* Test if the parser handles raw stream and codec_data info properly.
*/
@@ -433,7 +443,8 @@ GST_START_TEST (test_parse_handle_codec_data)
{
GstElement *aacparse;
GstBuffer *buffer;
- GstCaps *scaps, *sinkcaps;
+ GstCaps *sinkcaps;
+ GstStructure *s;
guint datasum = 0;
guint i;
@@ -449,11 +460,16 @@ GST_START_TEST (test_parse_handle_codec_data)
/* Check that the negotiated caps are as expected */
/* When codec_data is present, parser assumes that data is version 4 */
- scaps = gst_caps_from_string (SINK_CAPS_MPEG4);
sinkcaps = gst_pad_get_negotiated_caps (sinkpad);
- fail_unless (gst_caps_is_equal (sinkcaps, scaps));
+ GST_LOG ("aac output caps: %" GST_PTR_FORMAT, sinkcaps);
+ s = gst_caps_get_structure (sinkcaps, 0);
+ fail_unless (gst_structure_has_name (s, "audio/mpeg"));
+ fail_unless_structure_field_int_equals (s, "mpegversion", 4);
+ fail_unless_structure_field_int_equals (s, "channels", 2);
+ fail_unless_structure_field_int_equals (s, "rate", 48000);
+ fail_unless (gst_structure_has_field (s, "codec_data"));
+
gst_caps_unref (sinkcaps);
- gst_caps_unref (scaps);
g_list_foreach (buffers, buffer_count_size, &datasum);
fail_unless_equals_int (datasum, 10 * 100);