1 /* GStreamer AAC parser plugin
2 * Copyright (C) 2008 Nokia Corporation. All rights reserved.
4 * Contact: Stefan Kost <stefan.kost@nokia.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
23 * SECTION:element-aacparse
24 * @short_description: AAC parser
25 * @see_also: #GstAmrParse
27 * This is an AAC parser which handles both ADIF and ADTS stream formats.
29 * As ADIF format is not framed, it is not seekable and stream duration cannot
30 * be determined either. However, ADTS format AAC clips can be seeked, and parser
31 * can also estimate playback position and clip duration.
34 * <title>Example launch line</title>
36 * gst-launch-1.0 filesrc location=abc.aac ! aacparse ! faad ! audioresample ! audioconvert ! alsasink
47 #include <gst/base/gstbitreader.h>
48 #include <gst/pbutils/pbutils.h>
49 #include "gstaacparse.h"
52 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
55 GST_STATIC_CAPS ("audio/mpeg, "
56 "framed = (boolean) true, " "mpegversion = (int) { 2, 4 }, "
57 "stream-format = (string) { raw, adts, adif, loas };"));
59 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
62 GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) { 2, 4 };"));
64 GST_DEBUG_CATEGORY_STATIC (aacparse_debug);
65 #define GST_CAT_DEFAULT aacparse_debug
68 #define ADIF_MAX_SIZE 40 /* Should be enough */
69 #define ADTS_MAX_SIZE 10 /* Should be enough */
70 #define LOAS_MAX_SIZE 3 /* Should be enough */
72 #define ADTS_HEADERS_LENGTH 7UL /* Total byte-length of fixed and variable
73 headers prepended during raw to ADTS
76 #define AAC_FRAME_DURATION(parse) (GST_SECOND/parse->frames_per_sec)
78 static const gint loas_sample_rate_table[32] = {
79 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
80 16000, 12000, 11025, 8000, 7350, 0, 0, 0
83 static const gint loas_channels_table[32] = {
84 0, 1, 2, 3, 4, 5, 6, 8,
85 0, 0, 0, 7, 8, 0, 8, 0
88 static gboolean gst_aac_parse_start (GstBaseParse * parse);
89 static gboolean gst_aac_parse_stop (GstBaseParse * parse);
91 static gboolean gst_aac_parse_sink_setcaps (GstBaseParse * parse,
93 static GstCaps *gst_aac_parse_sink_getcaps (GstBaseParse * parse,
96 static GstFlowReturn gst_aac_parse_handle_frame (GstBaseParse * parse,
97 GstBaseParseFrame * frame, gint * skipsize);
98 static GstFlowReturn gst_aac_parse_pre_push_frame (GstBaseParse * parse,
99 GstBaseParseFrame * frame);
101 G_DEFINE_TYPE (GstAacParse, gst_aac_parse, GST_TYPE_BASE_PARSE);
104 * gst_aac_parse_class_init:
105 * @klass: #GstAacParseClass.
109 gst_aac_parse_class_init (GstAacParseClass * klass)
111 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
112 GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
114 GST_DEBUG_CATEGORY_INIT (aacparse_debug, "aacparse", 0,
115 "AAC audio stream parser");
117 gst_element_class_add_pad_template (element_class,
118 gst_static_pad_template_get (&sink_template));
119 gst_element_class_add_pad_template (element_class,
120 gst_static_pad_template_get (&src_template));
122 gst_element_class_set_static_metadata (element_class,
123 "AAC audio stream parser", "Codec/Parser/Audio",
124 "Advanced Audio Coding parser", "Stefan Kost <stefan.kost@nokia.com>");
126 parse_class->start = GST_DEBUG_FUNCPTR (gst_aac_parse_start);
127 parse_class->stop = GST_DEBUG_FUNCPTR (gst_aac_parse_stop);
128 parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_setcaps);
129 parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_getcaps);
130 parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_handle_frame);
131 parse_class->pre_push_frame =
132 GST_DEBUG_FUNCPTR (gst_aac_parse_pre_push_frame);
137 * gst_aac_parse_init:
138 * @aacparse: #GstAacParse.
139 * @klass: #GstAacParseClass.
143 gst_aac_parse_init (GstAacParse * aacparse)
145 GST_DEBUG ("initialized");
146 GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (aacparse));
151 * gst_aac_parse_set_src_caps:
152 * @aacparse: #GstAacParse.
153 * @sink_caps: (proposed) caps of sink pad
155 * Set source pad caps according to current knowledge about the
158 * Returns: TRUE if caps were successfully set.
161 gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps)
164 GstCaps *src_caps = NULL, *allowed;
165 gboolean res = FALSE;
166 const gchar *stream_format;
167 guint8 codec_data[2];
168 guint16 codec_data_data;
169 gint sample_rate_idx;
171 GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps);
173 src_caps = gst_caps_copy (sink_caps);
175 src_caps = gst_caps_new_empty_simple ("audio/mpeg");
177 gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE,
178 "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL);
180 aacparse->output_header_type = aacparse->header_type;
181 switch (aacparse->header_type) {
182 case DSPAAC_HEADER_NONE:
183 stream_format = "raw";
185 case DSPAAC_HEADER_ADTS:
186 stream_format = "adts";
188 case DSPAAC_HEADER_ADIF:
189 stream_format = "adif";
191 case DSPAAC_HEADER_LOAS:
192 stream_format = "loas";
195 stream_format = NULL;
198 /* Generate codec data to be able to set profile/level on the caps */
200 gst_codec_utils_aac_get_index_from_sample_rate (aacparse->sample_rate);
201 if (sample_rate_idx < 0)
202 goto not_a_known_rate;
204 (aacparse->object_type << 11) |
205 (sample_rate_idx << 7) | (aacparse->channels << 3);
206 GST_WRITE_UINT16_BE (codec_data, codec_data_data);
207 gst_codec_utils_aac_caps_set_level_and_profile (src_caps, codec_data, 2);
209 s = gst_caps_get_structure (src_caps, 0);
210 if (aacparse->sample_rate > 0)
211 gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL);
212 if (aacparse->channels > 0)
213 gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL);
215 gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL);
217 allowed = gst_pad_get_allowed_caps (GST_BASE_PARSE (aacparse)->srcpad);
218 if (allowed && !gst_caps_can_intersect (src_caps, allowed)) {
219 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
220 "Caps can not intersect");
221 if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
222 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
223 "Input is ADTS, trying raw");
224 gst_caps_set_simple (src_caps, "stream-format", G_TYPE_STRING, "raw",
226 if (gst_caps_can_intersect (src_caps, allowed)) {
227 GstBuffer *codec_data_buffer;
229 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
230 "Caps can intersect, we will drop the ADTS layer");
231 aacparse->output_header_type = DSPAAC_HEADER_NONE;
233 /* The codec_data data is according to AudioSpecificConfig,
234 ISO/IEC 14496-3, 1.6.2.1 */
235 codec_data_buffer = gst_buffer_new_and_alloc (2);
236 gst_buffer_fill (codec_data_buffer, 0, codec_data, 2);
237 gst_caps_set_simple (src_caps, "codec_data", GST_TYPE_BUFFER,
238 codec_data_buffer, NULL);
240 } else if (aacparse->header_type == DSPAAC_HEADER_NONE) {
241 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
242 "Input is raw, trying ADTS");
243 gst_caps_set_simple (src_caps, "stream-format", G_TYPE_STRING, "adts",
245 if (gst_caps_can_intersect (src_caps, allowed)) {
246 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
247 "Caps can intersect, we will prepend ADTS headers");
248 aacparse->output_header_type = DSPAAC_HEADER_ADTS;
253 gst_caps_unref (allowed);
255 GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
257 res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
258 gst_caps_unref (src_caps);
262 GST_ERROR_OBJECT (aacparse, "Not a known sample rate: %d",
263 aacparse->sample_rate);
264 gst_caps_unref (src_caps);
270 * gst_aac_parse_sink_setcaps:
274 * Implementation of "set_sink_caps" vmethod in #GstBaseParse class.
276 * Returns: TRUE on success.
279 gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
281 GstAacParse *aacparse;
282 GstStructure *structure;
286 aacparse = GST_AAC_PARSE (parse);
287 structure = gst_caps_get_structure (caps, 0);
288 caps_str = gst_caps_to_string (caps);
290 GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str);
293 /* This is needed at least in case of RTP
294 * Parses the codec_data information to get ObjectType,
295 * number of channels and samplerate */
296 value = gst_structure_get_value (structure, "codec_data");
298 GstBuffer *buf = gst_value_get_buffer (value);
304 gst_buffer_map (buf, &map, GST_MAP_READ);
306 sr_idx = ((map.data[0] & 0x07) << 1) | ((map.data[1] & 0x80) >> 7);
307 aacparse->object_type = (map.data[0] & 0xf8) >> 3;
308 aacparse->sample_rate =
309 gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
310 aacparse->channels = (map.data[1] & 0x78) >> 3;
311 if (aacparse->channels == 7)
312 aacparse->channels = 8;
313 else if (aacparse->channels == 11)
314 aacparse->channels = 7;
315 else if (aacparse->channels == 12 || aacparse->channels == 14)
316 aacparse->channels = 8;
317 aacparse->header_type = DSPAAC_HEADER_NONE;
318 aacparse->mpegversion = 4;
319 aacparse->frame_samples = (map.data[1] & 4) ? 960 : 1024;
320 gst_buffer_unmap (buf, &map);
322 GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, "
323 "samples=%d", aacparse->object_type, aacparse->sample_rate,
324 aacparse->channels, aacparse->frame_samples);
326 /* arrange for metadata and get out of the way */
327 gst_aac_parse_set_src_caps (aacparse, caps);
328 if (aacparse->header_type == aacparse->output_header_type)
329 gst_base_parse_set_passthrough (parse, TRUE);
333 /* caps info overrides */
334 gst_structure_get_int (structure, "rate", &aacparse->sample_rate);
335 gst_structure_get_int (structure, "channels", &aacparse->channels);
337 aacparse->sample_rate = 0;
338 aacparse->channels = 0;
339 aacparse->header_type = DSPAAC_HEADER_NOT_PARSED;
340 gst_base_parse_set_passthrough (parse, FALSE);
348 * gst_aac_parse_adts_get_frame_len:
349 * @data: block of data containing an ADTS header.
351 * This function calculates ADTS frame length from the given header.
353 * Returns: size of the ADTS frame.
356 gst_aac_parse_adts_get_frame_len (const guint8 * data)
358 return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5);
363 * gst_aac_parse_check_adts_frame:
364 * @aacparse: #GstAacParse.
365 * @data: Data to be checked.
366 * @avail: Amount of data passed.
367 * @framesize: If valid ADTS frame was found, this will be set to tell the
368 * found frame size in bytes.
369 * @needed_data: If frame was not found, this may be set to tell how much
370 * more data is needed in the next round to detect the frame
371 * reliably. This may happen when a frame header candidate
372 * is found but it cannot be guaranteed to be the header without
373 * peeking the following data.
375 * Check if the given data contains contains ADTS frame. The algorithm
376 * will examine ADTS frame header and calculate the frame size. Also, another
377 * consecutive ADTS frame header need to be present after the found frame.
378 * Otherwise the data is not considered as a valid ADTS frame. However, this
379 * "extra check" is omitted when EOS has been received. In this case it is
380 * enough when data[0] contains a valid ADTS header.
382 * This function may set the #needed_data to indicate that a possible frame
383 * candidate has been found, but more data (#needed_data bytes) is needed to
384 * be absolutely sure. When this situation occurs, FALSE will be returned.
386 * When a valid frame is detected, this function will use
387 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
388 * to set the needed bytes for next frame.This way next data chunk is already
391 * Returns: TRUE if the given data contains a valid ADTS header.
394 gst_aac_parse_check_adts_frame (GstAacParse * aacparse,
395 const guint8 * data, const guint avail, gboolean drain,
396 guint * framesize, guint * needed_data)
402 /* Absolute minimum to perform the ADTS syncword,
403 layer and sampling frequency tests */
404 if (G_UNLIKELY (avail < 3)) {
409 /* Syncword and layer tests */
410 if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) {
412 /* Sampling frequency test */
413 if (G_UNLIKELY ((data[2] & 0x3C) >> 2 == 15))
416 /* This looks like an ADTS frame header but
417 we need at least 6 bytes to proceed */
418 if (G_UNLIKELY (avail < 6)) {
423 *framesize = gst_aac_parse_adts_get_frame_len (data);
425 /* If frame has CRC, it needs 2 bytes
426 for it at the end of the header */
427 crc_size = (data[1] & 0x01) ? 0 : 2;
430 if (*framesize < 7 + crc_size) {
431 *needed_data = 7 + crc_size;
435 /* In EOS mode this is enough. No need to examine the data further.
436 We also relax the check when we have sync, on the assumption that
437 if we're not looking at random data, we have a much higher chance
438 to get the correct sync, and this avoids losing two frames when
439 a single bit corruption happens. */
440 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
444 if (*framesize + ADTS_MAX_SIZE > avail) {
445 /* We have found a possible frame header candidate, but can't be
446 sure since we don't have enough data to check the next frame */
447 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
448 *framesize + ADTS_MAX_SIZE, avail);
449 *needed_data = *framesize + ADTS_MAX_SIZE;
450 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
451 *framesize + ADTS_MAX_SIZE);
455 if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) {
456 guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize));
458 GST_LOG ("ADTS frame found, len: %d bytes", *framesize);
459 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
460 nextlen + ADTS_MAX_SIZE);
468 gst_aac_parse_latm_get_value (GstAacParse * aacparse, GstBitReader * br,
471 guint8 bytes, i, byte;
474 if (!gst_bit_reader_get_bits_uint8 (br, &bytes, 2))
476 for (i = 0; i < bytes; ++i) {
478 if (!gst_bit_reader_get_bits_uint8 (br, &byte, 8))
486 gst_aac_parse_get_audio_object_type (GstAacParse * aacparse, GstBitReader * br,
487 guint8 * audio_object_type)
489 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 5))
491 if (*audio_object_type == 31) {
492 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 6))
494 *audio_object_type += 32;
496 GST_LOG_OBJECT (aacparse, "audio object type %u", *audio_object_type);
501 gst_aac_parse_get_audio_sample_rate (GstAacParse * aacparse, GstBitReader * br,
504 guint8 sampling_frequency_index;
505 if (!gst_bit_reader_get_bits_uint8 (br, &sampling_frequency_index, 4))
507 GST_LOG_OBJECT (aacparse, "sampling_frequency_index: %u",
508 sampling_frequency_index);
509 if (sampling_frequency_index == 0xf) {
510 guint32 sampling_rate;
511 if (!gst_bit_reader_get_bits_uint32 (br, &sampling_rate, 24))
513 *sample_rate = sampling_rate;
515 *sample_rate = loas_sample_rate_table[sampling_frequency_index];
522 /* See table 1.13 in ISO/IEC 14496-3 */
524 gst_aac_parse_read_loas_audio_specific_config (GstAacParse * aacparse,
525 GstBitReader * br, gint * sample_rate, gint * channels, guint32 * bits)
527 guint8 audio_object_type, channel_configuration;
529 if (!gst_aac_parse_get_audio_object_type (aacparse, br, &audio_object_type))
532 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
535 if (!gst_bit_reader_get_bits_uint8 (br, &channel_configuration, 4))
537 GST_LOG_OBJECT (aacparse, "channel_configuration: %d", channel_configuration);
538 *channels = loas_channels_table[channel_configuration];
542 if (audio_object_type == 5) {
543 GST_LOG_OBJECT (aacparse,
544 "Audio object type 5, so rereading sampling rate...");
545 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
549 GST_INFO_OBJECT (aacparse, "Found LOAS config: %d Hz, %d channels",
550 *sample_rate, *channels);
552 /* There's LOTS of stuff next, but we ignore it for now as we have
553 what we want (sample rate and number of channels */
554 GST_DEBUG_OBJECT (aacparse,
555 "Need more code to parse humongous LOAS data, currently ignored");
563 gst_aac_parse_read_loas_config (GstAacParse * aacparse, const guint8 * data,
564 guint avail, gint * sample_rate, gint * channels, gint * version)
569 /* No version in the bitstream, but the spec has LOAS in the MPEG-4 section */
573 gst_bit_reader_init (&br, data, avail);
575 /* skip sync word (11 bits) and size (13 bits) */
576 if (!gst_bit_reader_skip (&br, 11 + 13))
579 /* First bit is "use last config" */
580 if (!gst_bit_reader_get_bits_uint8 (&br, &u8, 1))
583 GST_DEBUG_OBJECT (aacparse, "Frame uses previous config");
584 if (!aacparse->sample_rate || !aacparse->channels) {
585 GST_WARNING_OBJECT (aacparse, "No previous config to use");
587 *sample_rate = aacparse->sample_rate;
588 *channels = aacparse->channels;
592 GST_DEBUG_OBJECT (aacparse, "Frame contains new config");
594 if (!gst_bit_reader_get_bits_uint8 (&br, &v, 1))
597 if (!gst_bit_reader_get_bits_uint8 (&br, &vA, 1))
602 GST_LOG_OBJECT (aacparse, "v %d, vA %d", v, vA);
604 guint8 same_time, subframes, num_program, prog;
607 if (!gst_aac_parse_latm_get_value (aacparse, &br, &value))
610 if (!gst_bit_reader_get_bits_uint8 (&br, &same_time, 1))
612 if (!gst_bit_reader_get_bits_uint8 (&br, &subframes, 6))
614 if (!gst_bit_reader_get_bits_uint8 (&br, &num_program, 4))
616 GST_LOG_OBJECT (aacparse, "same_time %d, subframes %d, num_program %d",
617 same_time, subframes, num_program);
619 for (prog = 0; prog <= num_program; ++prog) {
620 guint8 num_layer, layer;
621 if (!gst_bit_reader_get_bits_uint8 (&br, &num_layer, 3))
623 GST_LOG_OBJECT (aacparse, "Program %d: %d layers", prog, num_layer);
625 for (layer = 0; layer <= num_layer; ++layer) {
626 guint8 use_same_config;
627 if (prog == 0 && layer == 0) {
630 if (!gst_bit_reader_get_bits_uint8 (&br, &use_same_config, 1))
633 if (!use_same_config) {
635 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
636 sample_rate, channels, NULL))
639 guint32 bits, asc_len;
640 if (!gst_aac_parse_latm_get_value (aacparse, &br, &asc_len))
642 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
643 sample_rate, channels, &bits))
646 if (!gst_bit_reader_skip (&br, asc_len))
652 GST_LOG_OBJECT (aacparse, "More data ignored");
654 GST_WARNING_OBJECT (aacparse, "Spec says \"TBD\"...");
660 * gst_aac_parse_loas_get_frame_len:
661 * @data: block of data containing a LOAS header.
663 * This function calculates LOAS frame length from the given header.
665 * Returns: size of the LOAS frame.
668 gst_aac_parse_loas_get_frame_len (const guint8 * data)
670 return (((data[1] & 0x1f) << 8) | data[2]) + 3;
675 * gst_aac_parse_check_loas_frame:
676 * @aacparse: #GstAacParse.
677 * @data: Data to be checked.
678 * @avail: Amount of data passed.
679 * @framesize: If valid LOAS frame was found, this will be set to tell the
680 * found frame size in bytes.
681 * @needed_data: If frame was not found, this may be set to tell how much
682 * more data is needed in the next round to detect the frame
683 * reliably. This may happen when a frame header candidate
684 * is found but it cannot be guaranteed to be the header without
685 * peeking the following data.
687 * Check if the given data contains contains LOAS frame. The algorithm
688 * will examine LOAS frame header and calculate the frame size. Also, another
689 * consecutive LOAS frame header need to be present after the found frame.
690 * Otherwise the data is not considered as a valid LOAS frame. However, this
691 * "extra check" is omitted when EOS has been received. In this case it is
692 * enough when data[0] contains a valid LOAS header.
694 * This function may set the #needed_data to indicate that a possible frame
695 * candidate has been found, but more data (#needed_data bytes) is needed to
696 * be absolutely sure. When this situation occurs, FALSE will be returned.
698 * When a valid frame is detected, this function will use
699 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
700 * to set the needed bytes for next frame.This way next data chunk is already
703 * LOAS can have three different formats, if I read the spec correctly. Only
704 * one of them is supported here, as the two samples I have use this one.
706 * Returns: TRUE if the given data contains a valid LOAS header.
709 gst_aac_parse_check_loas_frame (GstAacParse * aacparse,
710 const guint8 * data, const guint avail, gboolean drain,
711 guint * framesize, guint * needed_data)
716 if (G_UNLIKELY (avail < 3)) {
721 if ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) {
722 *framesize = gst_aac_parse_loas_get_frame_len (data);
723 GST_DEBUG_OBJECT (aacparse, "Found %u byte LOAS frame", *framesize);
725 /* In EOS mode this is enough. No need to examine the data further.
726 We also relax the check when we have sync, on the assumption that
727 if we're not looking at random data, we have a much higher chance
728 to get the correct sync, and this avoids losing two frames when
729 a single bit corruption happens. */
730 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
734 if (*framesize + LOAS_MAX_SIZE > avail) {
735 /* We have found a possible frame header candidate, but can't be
736 sure since we don't have enough data to check the next frame */
737 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
738 *framesize + LOAS_MAX_SIZE, avail);
739 *needed_data = *framesize + LOAS_MAX_SIZE;
740 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
741 *framesize + LOAS_MAX_SIZE);
745 if ((data[*framesize] == 0x56) && ((data[*framesize + 1] & 0xe0) == 0xe0)) {
746 guint nextlen = gst_aac_parse_loas_get_frame_len (data + (*framesize));
748 GST_LOG ("LOAS frame found, len: %d bytes", *framesize);
749 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
750 nextlen + LOAS_MAX_SIZE);
757 /* caller ensure sufficient data */
759 gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data,
760 gint * rate, gint * channels, gint * object, gint * version)
764 gint sr_idx = (data[2] & 0x3c) >> 2;
766 *rate = gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
769 *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6);
775 *version = (data[1] & 0x08) ? 2 : 4;
777 *object = ((data[2] & 0xc0) >> 6) + 1;
781 * gst_aac_parse_detect_stream:
782 * @aacparse: #GstAacParse.
783 * @data: A block of data that needs to be examined for stream characteristics.
784 * @avail: Size of the given datablock.
785 * @framesize: If valid stream was found, this will be set to tell the
786 * first frame size in bytes.
787 * @skipsize: If valid stream was found, this will be set to tell the first
788 * audio frame position within the given data.
790 * Examines the given piece of data and try to detect the format of it. It
791 * checks for "ADIF" header (in the beginning of the clip) and ADTS frame
792 * header. If the stream is detected, TRUE will be returned and #framesize
793 * is set to indicate the found frame size. Additionally, #skipsize might
794 * be set to indicate the number of bytes that need to be skipped, a.k.a. the
795 * position of the frame inside given data chunk.
797 * Returns: TRUE on success.
800 gst_aac_parse_detect_stream (GstAacParse * aacparse,
801 const guint8 * data, const guint avail, gboolean drain,
802 guint * framesize, gint * skipsize)
804 gboolean found = FALSE;
805 guint need_data_adts = 0, need_data_loas;
808 GST_DEBUG_OBJECT (aacparse, "Parsing header data");
810 /* FIXME: No need to check for ADIF if we are not in the beginning of the
813 /* Can we even parse the header? */
814 if (avail < MAX (ADTS_MAX_SIZE, LOAS_MAX_SIZE)) {
815 GST_DEBUG_OBJECT (aacparse, "Not enough data to check");
819 for (i = 0; i < avail - 4; i++) {
820 if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) ||
821 ((data[i] == 0x56) && ((data[i + 1] & 0xe0) == 0xe0)) ||
822 strncmp ((char *) data + i, "ADIF", 4) == 0) {
823 GST_DEBUG_OBJECT (aacparse, "Found signature at offset %u", i);
827 /* Trick: tell the parent class that we didn't find the frame yet,
828 but make it skip 'i' amount of bytes. Next time we arrive
829 here we have full frame in the beginning of the data. */
842 if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain,
843 framesize, &need_data_adts)) {
846 GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize);
848 gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels,
849 &aacparse->object_type, &aacparse->mpegversion);
851 if (!channels || !framesize) {
852 GST_DEBUG_OBJECT (aacparse, "impossible ADTS configuration");
856 aacparse->header_type = DSPAAC_HEADER_ADTS;
857 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
858 aacparse->frame_samples, 2, 2);
860 GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d",
861 rate, channels, aacparse->object_type, aacparse->mpegversion);
863 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
868 if (gst_aac_parse_check_loas_frame (aacparse, data, avail, drain,
869 framesize, &need_data_loas)) {
872 GST_INFO ("LOAS, framesize: %d", *framesize);
874 aacparse->header_type = DSPAAC_HEADER_LOAS;
876 if (!gst_aac_parse_read_loas_config (aacparse, data, avail, &rate,
877 &channels, &aacparse->mpegversion)) {
878 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
882 if (rate && channels) {
883 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
884 aacparse->frame_samples, 2, 2);
886 GST_DEBUG ("LOAS: samplerate %d, channels %d, objtype %d, version %d",
887 rate, channels, aacparse->object_type, aacparse->mpegversion);
888 aacparse->sample_rate = rate;
889 aacparse->channels = channels;
892 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
897 if (need_data_adts || need_data_loas) {
898 /* This tells the parent class not to skip any data */
903 if (avail < ADIF_MAX_SIZE)
906 if (memcmp (data + i, "ADIF", 4) == 0) {
913 aacparse->header_type = DSPAAC_HEADER_ADIF;
914 aacparse->mpegversion = 4;
916 /* Skip the "ADIF" bytes */
919 /* copyright string */
921 skip_size += 9; /* skip 9 bytes */
923 bitstream_type = adif[0 + skip_size] & 0x10;
925 ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) |
926 ((unsigned int) adif[1 + skip_size] << 11) |
927 ((unsigned int) adif[2 + skip_size] << 3) |
928 ((unsigned int) adif[3 + skip_size] & 0xe0);
931 if (bitstream_type == 0) {
933 /* Buffer fullness parsing. Currently not needed... */
937 num_elems = (adif[3 + skip_size] & 0x1e);
938 GST_INFO ("ADIF num_config_elems: %d", num_elems);
940 fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) |
941 ((unsigned int) adif[4 + skip_size] << 11) |
942 ((unsigned int) adif[5 + skip_size] << 3) |
943 ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5);
945 GST_INFO ("ADIF buffer fullness: %d", fullness);
947 aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) |
948 ((adif[7 + skip_size] & 0x80) >> 7);
949 sr_idx = (adif[7 + skip_size] & 0x78) >> 3;
953 aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3;
954 sr_idx = ((adif[4 + skip_size] & 0x07) << 1) |
955 ((adif[5 + skip_size] & 0x80) >> 7);
958 /* FIXME: This gives totally wrong results. Duration calculation cannot
960 aacparse->sample_rate =
961 gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
963 /* baseparse is not given any fps,
964 * so it will give up on timestamps, seeking, etc */
966 /* FIXME: Can we assume this? */
967 aacparse->channels = 2;
969 GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d",
970 aacparse->bitrate, aacparse->sample_rate, aacparse->object_type);
972 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512);
974 /* arrange for metadata and get out of the way */
975 sinkcaps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (aacparse));
976 gst_aac_parse_set_src_caps (aacparse, sinkcaps);
978 gst_caps_unref (sinkcaps);
980 /* not syncable, not easily seekable (unless we push data from start */
981 gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE);
982 gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE);
983 gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0);
989 /* This should never happen */
994 * gst_aac_parse_get_audio_profile_object_type
995 * @aacparse: #GstAacParse.
997 * Gets the MPEG-2 profile or the MPEG-4 object type value corresponding to the
998 * mpegversion and profile of @aacparse's src pad caps, according to the
999 * values defined by table 1.A.11 in ISO/IEC 14496-3.
1001 * Returns: the profile or object type value corresponding to @aacparse's src
1002 * pad caps, if such a value exists; otherwise G_MAXUINT8.
1005 gst_aac_parse_get_audio_profile_object_type (GstAacParse * aacparse)
1008 GstStructure *srcstruct;
1009 const gchar *profile;
1012 srccaps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (aacparse));
1013 srcstruct = gst_caps_get_structure (srccaps, 0);
1014 profile = gst_structure_get_string (srcstruct, "profile");
1015 if (G_UNLIKELY (profile == NULL)) {
1016 gst_caps_unref (srccaps);
1020 if (g_strcmp0 (profile, "main") == 0) {
1022 } else if (g_strcmp0 (profile, "lc") == 0) {
1024 } else if (g_strcmp0 (profile, "ssr") == 0) {
1026 } else if (g_strcmp0 (profile, "ltp") == 0) {
1027 if (G_LIKELY (aacparse->mpegversion == 4))
1030 ret = G_MAXUINT8; /* LTP Object Type allowed only for MPEG-4 */
1035 gst_caps_unref (srccaps);
1040 * gst_aac_parse_get_audio_channel_configuration
1041 * @num_channels: number of audio channels.
1043 * Gets the Channel Configuration value, as defined by table 1.19 in ISO/IEC
1044 * 14496-3, for a given number of audio channels.
1046 * Returns: the Channel Configuration value corresponding to @num_channels, if
1047 * such a value exists; otherwise G_MAXUINT8.
1050 gst_aac_parse_get_audio_channel_configuration (gint num_channels)
1052 if (num_channels >= 1 && num_channels <= 6) /* Mono up to & including 5.1 */
1053 return (guint8) num_channels;
1054 else if (num_channels == 8) /* 7.1 */
1059 /* FIXME: Add support for configurations 11, 12 and 14 from
1060 * ISO/IEC 14496-3:2009/PDAM 4 based on the actual channel layout
1065 * gst_aac_parse_get_audio_sampling_frequency_index:
1066 * @sample_rate: audio sampling rate.
1068 * Gets the Sampling Frequency Index value, as defined by table 1.18 in ISO/IEC
1069 * 14496-3, for a given sampling rate.
1071 * Returns: the Sampling Frequency Index value corresponding to @sample_rate,
1072 * if such a value exists; otherwise G_MAXUINT8.
1075 gst_aac_parse_get_audio_sampling_frequency_index (gint sample_rate)
1077 switch (sample_rate) {
1110 * gst_aac_parse_prepend_adts_headers:
1111 * @aacparse: #GstAacParse.
1112 * @frame: raw AAC frame to which ADTS headers shall be prepended.
1114 * Prepends ADTS headers to a raw AAC audio frame.
1116 * Returns: TRUE if ADTS headers were successfully prepended; FALSE otherwise.
1119 gst_aac_parse_prepend_adts_headers (GstAacParse * aacparse,
1120 GstBaseParseFrame * frame)
1123 guint8 *adts_headers;
1126 guint8 id, profile, channel_configuration, sampling_frequency_index;
1128 id = (aacparse->mpegversion == 4) ? 0x0U : 0x1U;
1129 profile = gst_aac_parse_get_audio_profile_object_type (aacparse);
1130 if (profile == G_MAXUINT8) {
1131 GST_ERROR_OBJECT (aacparse, "Unsupported audio profile or object type");
1134 channel_configuration =
1135 gst_aac_parse_get_audio_channel_configuration (aacparse->channels);
1136 if (channel_configuration == G_MAXUINT8) {
1137 GST_ERROR_OBJECT (aacparse, "Unsupported number of channels");
1140 sampling_frequency_index =
1141 gst_aac_parse_get_audio_sampling_frequency_index (aacparse->sample_rate);
1142 if (sampling_frequency_index == G_MAXUINT8) {
1143 GST_ERROR_OBJECT (aacparse, "Unsupported sampling frequency");
1147 frame->out_buffer = gst_buffer_copy (frame->buffer);
1148 buf_size = gst_buffer_get_size (frame->out_buffer);
1149 frame_size = buf_size + ADTS_HEADERS_LENGTH;
1151 if (G_UNLIKELY (frame_size >= 0x4000)) {
1152 GST_ERROR_OBJECT (aacparse, "Frame size is too big for ADTS");
1156 adts_headers = (guint8 *) g_malloc0 (ADTS_HEADERS_LENGTH);
1158 /* Note: no error correction bits are added to the resulting ADTS frames */
1159 adts_headers[0] = 0xFFU;
1160 adts_headers[1] = 0xF0U | (id << 3) | 0x1U;
1161 adts_headers[2] = (profile << 6) | (sampling_frequency_index << 2) | 0x2U |
1162 (channel_configuration & 0x4U);
1163 adts_headers[3] = ((channel_configuration & 0x3U) << 6) | 0x30U |
1164 (guint8) (frame_size >> 11);
1165 adts_headers[4] = (guint8) ((frame_size >> 3) & 0x00FF);
1166 adts_headers[5] = (guint8) (((frame_size & 0x0007) << 5) + 0x1FU);
1167 adts_headers[6] = 0xFCU;
1169 mem = gst_memory_new_wrapped (0, adts_headers, ADTS_HEADERS_LENGTH, 0,
1170 ADTS_HEADERS_LENGTH, adts_headers, g_free);
1171 gst_buffer_prepend_memory (frame->out_buffer, mem);
1177 * gst_aac_parse_check_valid_frame:
1178 * @parse: #GstBaseParse.
1179 * @frame: #GstBaseParseFrame.
1180 * @skipsize: How much data parent class should skip in order to find the
1183 * Implementation of "handle_frame" vmethod in #GstBaseParse class.
1185 * Also determines frame overhead.
1186 * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have
1187 * a per-frame header. LOAS has 3 bytes.
1189 * We're making a couple of simplifying assumptions:
1191 * 1. We count Program Configuration Elements rather than searching for them
1192 * in the streams to discount them - the overhead is negligible.
1194 * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16
1195 * bits, which should still not be significant enough to warrant the
1196 * additional parsing through the headers
1198 * Returns: a #GstFlowReturn.
1200 static GstFlowReturn
1201 gst_aac_parse_handle_frame (GstBaseParse * parse,
1202 GstBaseParseFrame * frame, gint * skipsize)
1205 GstAacParse *aacparse;
1206 gboolean ret = FALSE;
1210 gint rate, channels;
1212 aacparse = GST_AAC_PARSE (parse);
1213 buffer = frame->buffer;
1215 gst_buffer_map (buffer, &map, GST_MAP_READ);
1218 lost_sync = GST_BASE_PARSE_LOST_SYNC (parse);
1220 if (aacparse->header_type == DSPAAC_HEADER_ADIF ||
1221 aacparse->header_type == DSPAAC_HEADER_NONE) {
1222 /* There is nothing to parse */
1223 framesize = map.size;
1226 } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) {
1228 ret = gst_aac_parse_detect_stream (aacparse, map.data, map.size,
1229 GST_BASE_PARSE_DRAINING (parse), &framesize, skipsize);
1231 } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
1232 guint needed_data = 1024;
1234 ret = gst_aac_parse_check_adts_frame (aacparse, map.data, map.size,
1235 GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
1237 if (!ret && needed_data) {
1238 GST_DEBUG ("buffer didn't contain valid frame");
1240 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
1244 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
1245 guint needed_data = 1024;
1247 ret = gst_aac_parse_check_loas_frame (aacparse, map.data,
1248 map.size, GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
1250 if (!ret && needed_data) {
1251 GST_DEBUG ("buffer didn't contain valid frame");
1253 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
1258 GST_DEBUG ("buffer didn't contain valid frame");
1259 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
1263 if (G_UNLIKELY (!ret))
1266 if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
1268 frame->overhead = 7;
1270 gst_aac_parse_parse_adts_header (aacparse, map.data,
1271 &rate, &channels, NULL, NULL);
1273 GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels);
1275 if (G_UNLIKELY (rate != aacparse->sample_rate
1276 || channels != aacparse->channels)) {
1277 aacparse->sample_rate = rate;
1278 aacparse->channels = channels;
1280 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1281 /* If linking fails, we need to return appropriate error */
1282 ret = GST_FLOW_NOT_LINKED;
1285 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1286 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1288 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
1289 gboolean setcaps = FALSE;
1292 frame->overhead = 3;
1294 if (!gst_aac_parse_read_loas_config (aacparse, map.data, map.size, &rate,
1296 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
1297 } else if (G_UNLIKELY (rate != aacparse->sample_rate
1298 || channels != aacparse->channels)) {
1299 aacparse->sample_rate = rate;
1300 aacparse->channels = channels;
1302 GST_INFO_OBJECT (aacparse, "New LOAS config: %d Hz, %d channels", rate,
1306 /* We want to set caps both at start, and when rate/channels change.
1307 Since only some LOAS frames have that info, we may receive frames
1308 before knowing about rate/channels. */
1310 || !gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (aacparse))) {
1311 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1312 /* If linking fails, we need to return appropriate error */
1313 ret = GST_FLOW_NOT_LINKED;
1316 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1317 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1321 if (aacparse->header_type == DSPAAC_HEADER_NONE
1322 && aacparse->output_header_type == DSPAAC_HEADER_ADTS) {
1323 if (!gst_aac_parse_prepend_adts_headers (aacparse, frame)) {
1324 GST_ERROR_OBJECT (aacparse, "Failed to prepend ADTS headers to frame");
1325 ret = GST_FLOW_ERROR;
1330 gst_buffer_unmap (buffer, &map);
1333 /* found, skip if needed */
1342 if (ret && framesize <= map.size) {
1343 return gst_base_parse_finish_frame (parse, frame, framesize);
1349 static GstFlowReturn
1350 gst_aac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
1352 GstAacParse *aacparse = GST_AAC_PARSE (parse);
1354 if (!aacparse->sent_codec_tag) {
1355 GstTagList *taglist;
1358 taglist = gst_tag_list_new_empty ();
1361 caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
1362 gst_pb_utils_add_codec_description_to_tag_list (taglist,
1363 GST_TAG_AUDIO_CODEC, caps);
1364 gst_caps_unref (caps);
1366 gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (aacparse),
1367 gst_event_new_tag (taglist));
1369 /* also signals the end of first-frame processing */
1370 aacparse->sent_codec_tag = TRUE;
1373 /* As a special case, we can remove the ADTS framing and output raw AAC. */
1374 if (aacparse->header_type == DSPAAC_HEADER_ADTS
1375 && aacparse->output_header_type == DSPAAC_HEADER_NONE) {
1378 gst_buffer_map (frame->buffer, &map, GST_MAP_READ);
1379 header_size = (map.data[1] & 1) ? 7 : 9; /* optional CRC */
1380 gst_buffer_unmap (frame->buffer, &map);
1381 gst_buffer_resize (frame->buffer, header_size,
1382 gst_buffer_get_size (frame->buffer) - header_size);
1390 * gst_aac_parse_start:
1391 * @parse: #GstBaseParse.
1393 * Implementation of "start" vmethod in #GstBaseParse class.
1395 * Returns: TRUE if startup succeeded.
1398 gst_aac_parse_start (GstBaseParse * parse)
1400 GstAacParse *aacparse;
1402 aacparse = GST_AAC_PARSE (parse);
1403 GST_DEBUG ("start");
1404 aacparse->frame_samples = 1024;
1405 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
1406 aacparse->sent_codec_tag = FALSE;
1412 * gst_aac_parse_stop:
1413 * @parse: #GstBaseParse.
1415 * Implementation of "stop" vmethod in #GstBaseParse class.
1417 * Returns: TRUE is stopping succeeded.
1420 gst_aac_parse_stop (GstBaseParse * parse)
1427 remove_fields (GstCaps * caps)
1431 n = gst_caps_get_size (caps);
1432 for (i = 0; i < n; i++) {
1433 GstStructure *s = gst_caps_get_structure (caps, i);
1435 gst_structure_remove_field (s, "framed");
1440 add_conversion_fields (GstCaps * caps)
1444 n = gst_caps_get_size (caps);
1445 for (i = 0; i < n; i++) {
1446 GstStructure *s = gst_caps_get_structure (caps, i);
1448 if (gst_structure_has_field (s, "stream-format")) {
1449 const GValue *v = gst_structure_get_value (s, "stream-format");
1451 if (G_VALUE_HOLDS_STRING (v)) {
1452 const gchar *str = g_value_get_string (v);
1454 if (strcmp (str, "adts") == 0 || strcmp (str, "raw") == 0) {
1455 GValue va = G_VALUE_INIT;
1456 GValue vs = G_VALUE_INIT;
1458 g_value_init (&va, GST_TYPE_LIST);
1459 g_value_init (&vs, G_TYPE_STRING);
1460 g_value_set_string (&vs, "adts");
1461 gst_value_list_append_value (&va, &vs);
1462 g_value_set_string (&vs, "raw");
1463 gst_value_list_append_value (&va, &vs);
1464 gst_structure_set_value (s, "stream-format", &va);
1465 g_value_unset (&va);
1466 g_value_unset (&vs);
1468 } else if (GST_VALUE_HOLDS_LIST (v)) {
1469 gboolean contains_raw = FALSE;
1470 gboolean contains_adts = FALSE;
1471 guint m = gst_value_list_get_size (v), j;
1473 for (j = 0; j < m; j++) {
1474 const GValue *ve = gst_value_list_get_value (v, j);
1477 if (G_VALUE_HOLDS_STRING (ve) && (str = g_value_get_string (ve))) {
1478 if (strcmp (str, "adts") == 0)
1479 contains_adts = TRUE;
1480 else if (strcmp (str, "raw") == 0)
1481 contains_raw = TRUE;
1485 if (contains_adts || contains_raw) {
1486 GValue va = G_VALUE_INIT;
1487 GValue vs = G_VALUE_INIT;
1489 g_value_init (&va, GST_TYPE_LIST);
1490 g_value_init (&vs, G_TYPE_STRING);
1491 g_value_copy (v, &va);
1493 if (!contains_raw) {
1494 g_value_set_string (&vs, "raw");
1495 gst_value_list_append_value (&va, &vs);
1497 if (!contains_adts) {
1498 g_value_set_string (&vs, "adts");
1499 gst_value_list_append_value (&va, &vs);
1502 gst_structure_set_value (s, "stream-format", &va);
1504 g_value_unset (&vs);
1505 g_value_unset (&va);
1513 gst_aac_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter)
1515 GstCaps *peercaps, *templ;
1518 templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
1521 GstCaps *fcopy = gst_caps_copy (filter);
1522 /* Remove the fields we convert */
1523 remove_fields (fcopy);
1524 add_conversion_fields (fcopy);
1525 peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), fcopy);
1526 gst_caps_unref (fcopy);
1528 peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), NULL);
1531 peercaps = gst_caps_make_writable (peercaps);
1532 /* Remove the fields we convert */
1533 remove_fields (peercaps);
1534 add_conversion_fields (peercaps);
1536 res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
1537 gst_caps_unref (peercaps);
1538 gst_caps_unref (templ);
1544 GstCaps *intersection;
1547 gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
1548 gst_caps_unref (res);