diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-10-26 11:47:25 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-10-26 11:47:25 +0100 |
commit | 4aac09e7088ded56950c8f281b327b904c41a184 (patch) | |
tree | a0b9eb4b35eb55db1902951d144b809ba7589a00 /gst | |
parent | b02d73a0edae1ff7bc4e81c237c492de70a83e9e (diff) |
aacparse: Always set profile/level on the caps
We have the information already, so why not use it?
Diffstat (limited to 'gst')
-rw-r--r-- | gst/audioparsers/gstaacparse.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/gst/audioparsers/gstaacparse.c b/gst/audioparsers/gstaacparse.c index 7c999e1af..aee124857 100644 --- a/gst/audioparsers/gstaacparse.c +++ b/gst/audioparsers/gstaacparse.c @@ -164,8 +164,9 @@ gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) GstCaps *src_caps = NULL, *allowed; gboolean res = FALSE; const gchar *stream_format; - GstBuffer *codec_data; + guint8 codec_data[2]; guint16 codec_data_data; + gint sample_rate_idx; GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps); if (sink_caps) @@ -194,6 +195,17 @@ gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) stream_format = NULL; } + /* Generate codec data to be able to set profile/level on the caps */ + sample_rate_idx = + gst_codec_utils_aac_get_index_from_sample_rate (aacparse->sample_rate); + if (sample_rate_idx < 0) + goto not_a_known_rate; + codec_data_data = + (aacparse->object_type << 11) | + (sample_rate_idx << 7) | (aacparse->channels << 3); + GST_WRITE_UINT16_BE (codec_data, codec_data_data); + gst_codec_utils_aac_caps_set_level_and_profile (src_caps, codec_data, 2); + s = gst_caps_get_structure (src_caps, 0); if (aacparse->sample_rate > 0) gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL); @@ -212,14 +224,7 @@ gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) gst_caps_set_simple (src_caps, "stream-format", G_TYPE_STRING, "raw", NULL); if (gst_caps_can_intersect (src_caps, allowed)) { - GstMapInfo map; - int idx; - - idx = - gst_codec_utils_aac_get_index_from_sample_rate - (aacparse->sample_rate); - if (idx < 0) - goto not_a_known_rate; + GstBuffer *codec_data_buffer; GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad, "Caps can intersect, we will drop the ADTS layer"); @@ -227,15 +232,10 @@ gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) /* The codec_data data is according to AudioSpecificConfig, ISO/IEC 14496-3, 1.6.2.1 */ - codec_data = gst_buffer_new_and_alloc (2); - gst_buffer_map (codec_data, &map, GST_MAP_WRITE); - codec_data_data = - (aacparse->object_type << 11) | - (idx << 7) | (aacparse->channels << 3); - GST_WRITE_UINT16_BE (map.data, codec_data_data); - gst_buffer_unmap (codec_data, &map); + codec_data_buffer = gst_buffer_new_and_alloc (2); + gst_buffer_fill (codec_data_buffer, 0, codec_data, 2); gst_caps_set_simple (src_caps, "codec_data", GST_TYPE_BUFFER, - codec_data, NULL); + codec_data_buffer, NULL); } } else if (aacparse->header_type == DSPAAC_HEADER_NONE) { GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad, @@ -258,7 +258,8 @@ gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps) return res; not_a_known_rate: - gst_caps_unref (allowed); + GST_ERROR_OBJECT (aacparse, "Not a known sample rate: %d", + aacparse->sample_rate); gst_caps_unref (src_caps); return FALSE; } |