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, 0, 0, 0, 0, 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 GstBuffer *codec_data;
168 guint16 codec_data_data;
170 GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps);
172 src_caps = gst_caps_copy (sink_caps);
174 src_caps = gst_caps_new_empty_simple ("audio/mpeg");
176 gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE,
177 "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL);
179 aacparse->output_header_type = aacparse->header_type;
180 switch (aacparse->header_type) {
181 case DSPAAC_HEADER_NONE:
182 stream_format = "raw";
184 case DSPAAC_HEADER_ADTS:
185 stream_format = "adts";
187 case DSPAAC_HEADER_ADIF:
188 stream_format = "adif";
190 case DSPAAC_HEADER_LOAS:
191 stream_format = "loas";
194 stream_format = NULL;
197 s = gst_caps_get_structure (src_caps, 0);
198 if (aacparse->sample_rate > 0)
199 gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL);
200 if (aacparse->channels > 0)
201 gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL);
203 gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL);
205 allowed = gst_pad_get_allowed_caps (GST_BASE_PARSE (aacparse)->srcpad);
206 if (!gst_caps_can_intersect (src_caps, allowed)) {
207 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
208 "Caps can not intersect");
209 if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
210 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
211 "Input is ADTS, trying raw");
212 gst_caps_set_simple (src_caps, "stream-format", G_TYPE_STRING, "raw",
214 if (gst_caps_can_intersect (src_caps, allowed)) {
219 gst_codec_utils_aac_get_index_from_sample_rate
220 (aacparse->sample_rate);
222 goto not_a_known_rate;
224 GST_DEBUG_OBJECT (GST_BASE_PARSE (aacparse)->srcpad,
225 "Caps can intersect, we will drop the ADTS layer");
226 aacparse->output_header_type = DSPAAC_HEADER_NONE;
228 /* The codec_data data is according to AudioSpecificConfig,
229 ISO/IEC 14496-3, 1.6.2.1 */
230 codec_data = gst_buffer_new_and_alloc (2);
231 gst_buffer_map (codec_data, &map, GST_MAP_WRITE);
233 (aacparse->object_type << 11) |
234 (idx << 7) | (aacparse->channels << 3);
235 GST_WRITE_UINT16_BE (map.data, codec_data_data);
236 gst_buffer_unmap (codec_data, &map);
237 gst_caps_set_simple (src_caps, "codec_data", GST_TYPE_BUFFER,
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;
252 gst_caps_unref (allowed);
254 GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
256 res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
257 gst_caps_unref (src_caps);
261 gst_caps_unref (allowed);
262 gst_caps_unref (src_caps);
268 * gst_aac_parse_sink_setcaps:
272 * Implementation of "set_sink_caps" vmethod in #GstBaseParse class.
274 * Returns: TRUE on success.
277 gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
279 GstAacParse *aacparse;
280 GstStructure *structure;
284 aacparse = GST_AAC_PARSE (parse);
285 structure = gst_caps_get_structure (caps, 0);
286 caps_str = gst_caps_to_string (caps);
288 GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str);
291 /* This is needed at least in case of RTP
292 * Parses the codec_data information to get ObjectType,
293 * number of channels and samplerate */
294 value = gst_structure_get_value (structure, "codec_data");
296 GstBuffer *buf = gst_value_get_buffer (value);
302 gst_buffer_map (buf, &map, GST_MAP_READ);
304 sr_idx = ((map.data[0] & 0x07) << 1) | ((map.data[1] & 0x80) >> 7);
305 aacparse->object_type = (map.data[0] & 0xf8) >> 3;
306 aacparse->sample_rate =
307 gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
308 aacparse->channels = (map.data[1] & 0x78) >> 3;
309 aacparse->header_type = DSPAAC_HEADER_NONE;
310 aacparse->mpegversion = 4;
311 aacparse->frame_samples = (map.data[1] & 4) ? 960 : 1024;
312 gst_buffer_unmap (buf, &map);
314 GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, "
315 "samples=%d", aacparse->object_type, aacparse->sample_rate,
316 aacparse->channels, aacparse->frame_samples);
318 /* arrange for metadata and get out of the way */
319 gst_aac_parse_set_src_caps (aacparse, caps);
320 if (aacparse->header_type == aacparse->output_header_type)
321 gst_base_parse_set_passthrough (parse, TRUE);
325 /* caps info overrides */
326 gst_structure_get_int (structure, "rate", &aacparse->sample_rate);
327 gst_structure_get_int (structure, "channels", &aacparse->channels);
329 aacparse->sample_rate = 0;
330 aacparse->channels = 0;
331 aacparse->header_type = DSPAAC_HEADER_NOT_PARSED;
332 gst_base_parse_set_passthrough (parse, FALSE);
340 * gst_aac_parse_adts_get_frame_len:
341 * @data: block of data containing an ADTS header.
343 * This function calculates ADTS frame length from the given header.
345 * Returns: size of the ADTS frame.
348 gst_aac_parse_adts_get_frame_len (const guint8 * data)
350 return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5);
355 * gst_aac_parse_check_adts_frame:
356 * @aacparse: #GstAacParse.
357 * @data: Data to be checked.
358 * @avail: Amount of data passed.
359 * @framesize: If valid ADTS frame was found, this will be set to tell the
360 * found frame size in bytes.
361 * @needed_data: If frame was not found, this may be set to tell how much
362 * more data is needed in the next round to detect the frame
363 * reliably. This may happen when a frame header candidate
364 * is found but it cannot be guaranteed to be the header without
365 * peeking the following data.
367 * Check if the given data contains contains ADTS frame. The algorithm
368 * will examine ADTS frame header and calculate the frame size. Also, another
369 * consecutive ADTS frame header need to be present after the found frame.
370 * Otherwise the data is not considered as a valid ADTS frame. However, this
371 * "extra check" is omitted when EOS has been received. In this case it is
372 * enough when data[0] contains a valid ADTS header.
374 * This function may set the #needed_data to indicate that a possible frame
375 * candidate has been found, but more data (#needed_data bytes) is needed to
376 * be absolutely sure. When this situation occurs, FALSE will be returned.
378 * When a valid frame is detected, this function will use
379 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
380 * to set the needed bytes for next frame.This way next data chunk is already
383 * Returns: TRUE if the given data contains a valid ADTS header.
386 gst_aac_parse_check_adts_frame (GstAacParse * aacparse,
387 const guint8 * data, const guint avail, gboolean drain,
388 guint * framesize, guint * needed_data)
394 /* Absolute minimum to perform the ADTS syncword,
395 layer and sampling frequency tests */
396 if (G_UNLIKELY (avail < 3))
399 /* Syncword and layer tests */
400 if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) {
402 /* Sampling frequency test */
403 if (G_UNLIKELY ((data[2] & 0x3C) >> 2 == 15))
406 /* This looks like an ADTS frame header but
407 we need at least 6 bytes to proceed */
408 if (G_UNLIKELY (avail < 6)) {
413 *framesize = gst_aac_parse_adts_get_frame_len (data);
415 /* If frame has CRC, it needs 2 bytes
416 for it at the end of the header */
417 crc_size = (data[1] & 0x01) ? 0 : 2;
420 if (*framesize < 7 + crc_size)
423 /* In EOS mode this is enough. No need to examine the data further.
424 We also relax the check when we have sync, on the assumption that
425 if we're not looking at random data, we have a much higher chance
426 to get the correct sync, and this avoids losing two frames when
427 a single bit corruption happens. */
428 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
432 if (*framesize + ADTS_MAX_SIZE > avail) {
433 /* We have found a possible frame header candidate, but can't be
434 sure since we don't have enough data to check the next frame */
435 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
436 *framesize + ADTS_MAX_SIZE, avail);
437 *needed_data = *framesize + ADTS_MAX_SIZE;
438 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
439 *framesize + ADTS_MAX_SIZE);
443 if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) {
444 guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize));
446 GST_LOG ("ADTS frame found, len: %d bytes", *framesize);
447 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
448 nextlen + ADTS_MAX_SIZE);
456 gst_aac_parse_latm_get_value (GstAacParse * aacparse, GstBitReader * br,
459 guint8 bytes, i, byte;
462 if (!gst_bit_reader_get_bits_uint8 (br, &bytes, 2))
464 for (i = 0; i < bytes; ++i) {
466 if (!gst_bit_reader_get_bits_uint8 (br, &byte, 8))
474 gst_aac_parse_get_audio_object_type (GstAacParse * aacparse, GstBitReader * br,
475 guint8 * audio_object_type)
477 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 5))
479 if (*audio_object_type == 31) {
480 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 6))
482 *audio_object_type += 32;
484 GST_LOG_OBJECT (aacparse, "audio object type %u", *audio_object_type);
489 gst_aac_parse_get_audio_sample_rate (GstAacParse * aacparse, GstBitReader * br,
492 guint8 sampling_frequency_index;
493 if (!gst_bit_reader_get_bits_uint8 (br, &sampling_frequency_index, 4))
495 GST_LOG_OBJECT (aacparse, "sampling_frequency_index: %u",
496 sampling_frequency_index);
497 if (sampling_frequency_index == 0xf) {
498 guint32 sampling_rate;
499 if (!gst_bit_reader_get_bits_uint32 (br, &sampling_rate, 24))
501 *sample_rate = sampling_rate;
503 *sample_rate = loas_sample_rate_table[sampling_frequency_index];
510 /* See table 1.13 in ISO/IEC 14496-3 */
512 gst_aac_parse_read_loas_audio_specific_config (GstAacParse * aacparse,
513 GstBitReader * br, gint * sample_rate, gint * channels, guint32 * bits)
515 guint8 audio_object_type, channel_configuration;
517 if (!gst_aac_parse_get_audio_object_type (aacparse, br, &audio_object_type))
520 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
523 if (!gst_bit_reader_get_bits_uint8 (br, &channel_configuration, 4))
525 GST_LOG_OBJECT (aacparse, "channel_configuration: %d", channel_configuration);
526 *channels = loas_channels_table[channel_configuration];
530 if (audio_object_type == 5) {
531 GST_LOG_OBJECT (aacparse,
532 "Audio object type 5, so rereading sampling rate...");
533 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
537 GST_INFO_OBJECT (aacparse, "Found LOAS config: %d Hz, %d channels",
538 *sample_rate, *channels);
540 /* There's LOTS of stuff next, but we ignore it for now as we have
541 what we want (sample rate and number of channels */
542 GST_DEBUG_OBJECT (aacparse,
543 "Need more code to parse humongous LOAS data, currently ignored");
551 gst_aac_parse_read_loas_config (GstAacParse * aacparse, const guint8 * data,
552 guint avail, gint * sample_rate, gint * channels, gint * version)
557 /* No version in the bitstream, but the spec has LOAS in the MPEG-4 section */
561 gst_bit_reader_init (&br, data, avail);
563 /* skip sync word (11 bits) and size (13 bits) */
564 if (!gst_bit_reader_skip (&br, 11 + 13))
567 /* First bit is "use last config" */
568 if (!gst_bit_reader_get_bits_uint8 (&br, &u8, 1))
571 GST_DEBUG_OBJECT (aacparse, "Frame uses previous config");
572 if (!aacparse->sample_rate || !aacparse->channels) {
573 GST_WARNING_OBJECT (aacparse, "No previous config to use");
575 *sample_rate = aacparse->sample_rate;
576 *channels = aacparse->channels;
580 GST_DEBUG_OBJECT (aacparse, "Frame contains new config");
582 if (!gst_bit_reader_get_bits_uint8 (&br, &v, 1))
585 if (!gst_bit_reader_get_bits_uint8 (&br, &vA, 1))
590 GST_LOG_OBJECT (aacparse, "v %d, vA %d", v, vA);
592 guint8 same_time, subframes, num_program, prog;
595 if (!gst_aac_parse_latm_get_value (aacparse, &br, &value))
598 if (!gst_bit_reader_get_bits_uint8 (&br, &same_time, 1))
600 if (!gst_bit_reader_get_bits_uint8 (&br, &subframes, 6))
602 if (!gst_bit_reader_get_bits_uint8 (&br, &num_program, 4))
604 GST_LOG_OBJECT (aacparse, "same_time %d, subframes %d, num_program %d",
605 same_time, subframes, num_program);
607 for (prog = 0; prog <= num_program; ++prog) {
608 guint8 num_layer, layer;
609 if (!gst_bit_reader_get_bits_uint8 (&br, &num_layer, 3))
611 GST_LOG_OBJECT (aacparse, "Program %d: %d layers", prog, num_layer);
613 for (layer = 0; layer <= num_layer; ++layer) {
614 guint8 use_same_config;
615 if (prog == 0 && layer == 0) {
618 if (!gst_bit_reader_get_bits_uint8 (&br, &use_same_config, 1))
621 if (!use_same_config) {
623 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
624 sample_rate, channels, NULL))
627 guint32 bits, asc_len;
628 if (!gst_aac_parse_latm_get_value (aacparse, &br, &asc_len))
630 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
631 sample_rate, channels, &bits))
634 if (!gst_bit_reader_skip (&br, asc_len))
640 GST_LOG_OBJECT (aacparse, "More data ignored");
642 GST_WARNING_OBJECT (aacparse, "Spec says \"TBD\"...");
648 * gst_aac_parse_loas_get_frame_len:
649 * @data: block of data containing a LOAS header.
651 * This function calculates LOAS frame length from the given header.
653 * Returns: size of the LOAS frame.
656 gst_aac_parse_loas_get_frame_len (const guint8 * data)
658 return (((data[1] & 0x1f) << 8) | data[2]) + 3;
663 * gst_aac_parse_check_loas_frame:
664 * @aacparse: #GstAacParse.
665 * @data: Data to be checked.
666 * @avail: Amount of data passed.
667 * @framesize: If valid LOAS frame was found, this will be set to tell the
668 * found frame size in bytes.
669 * @needed_data: If frame was not found, this may be set to tell how much
670 * more data is needed in the next round to detect the frame
671 * reliably. This may happen when a frame header candidate
672 * is found but it cannot be guaranteed to be the header without
673 * peeking the following data.
675 * Check if the given data contains contains LOAS frame. The algorithm
676 * will examine LOAS frame header and calculate the frame size. Also, another
677 * consecutive LOAS frame header need to be present after the found frame.
678 * Otherwise the data is not considered as a valid LOAS frame. However, this
679 * "extra check" is omitted when EOS has been received. In this case it is
680 * enough when data[0] contains a valid LOAS header.
682 * This function may set the #needed_data to indicate that a possible frame
683 * candidate has been found, but more data (#needed_data bytes) is needed to
684 * be absolutely sure. When this situation occurs, FALSE will be returned.
686 * When a valid frame is detected, this function will use
687 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
688 * to set the needed bytes for next frame.This way next data chunk is already
691 * LOAS can have three different formats, if I read the spec correctly. Only
692 * one of them is supported here, as the two samples I have use this one.
694 * Returns: TRUE if the given data contains a valid LOAS header.
697 gst_aac_parse_check_loas_frame (GstAacParse * aacparse,
698 const guint8 * data, const guint avail, gboolean drain,
699 guint * framesize, guint * needed_data)
704 if (G_UNLIKELY (avail < 3))
707 if ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) {
708 *framesize = gst_aac_parse_loas_get_frame_len (data);
709 GST_DEBUG_OBJECT (aacparse, "Found %u byte LOAS frame", *framesize);
711 /* In EOS mode this is enough. No need to examine the data further.
712 We also relax the check when we have sync, on the assumption that
713 if we're not looking at random data, we have a much higher chance
714 to get the correct sync, and this avoids losing two frames when
715 a single bit corruption happens. */
716 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
720 if (*framesize + LOAS_MAX_SIZE > avail) {
721 /* We have found a possible frame header candidate, but can't be
722 sure since we don't have enough data to check the next frame */
723 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
724 *framesize + LOAS_MAX_SIZE, avail);
725 *needed_data = *framesize + LOAS_MAX_SIZE;
726 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
727 *framesize + LOAS_MAX_SIZE);
731 if ((data[*framesize] == 0x56) && ((data[*framesize + 1] & 0xe0) == 0xe0)) {
732 guint nextlen = gst_aac_parse_loas_get_frame_len (data + (*framesize));
734 GST_LOG ("LOAS frame found, len: %d bytes", *framesize);
735 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
736 nextlen + LOAS_MAX_SIZE);
743 /* caller ensure sufficient data */
745 gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data,
746 gint * rate, gint * channels, gint * object, gint * version)
750 gint sr_idx = (data[2] & 0x3c) >> 2;
752 *rate = gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
755 *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6);
758 *version = (data[1] & 0x08) ? 2 : 4;
760 *object = ((data[2] & 0xc0) >> 6) + 1;
764 * gst_aac_parse_detect_stream:
765 * @aacparse: #GstAacParse.
766 * @data: A block of data that needs to be examined for stream characteristics.
767 * @avail: Size of the given datablock.
768 * @framesize: If valid stream was found, this will be set to tell the
769 * first frame size in bytes.
770 * @skipsize: If valid stream was found, this will be set to tell the first
771 * audio frame position within the given data.
773 * Examines the given piece of data and try to detect the format of it. It
774 * checks for "ADIF" header (in the beginning of the clip) and ADTS frame
775 * header. If the stream is detected, TRUE will be returned and #framesize
776 * is set to indicate the found frame size. Additionally, #skipsize might
777 * be set to indicate the number of bytes that need to be skipped, a.k.a. the
778 * position of the frame inside given data chunk.
780 * Returns: TRUE on success.
783 gst_aac_parse_detect_stream (GstAacParse * aacparse,
784 const guint8 * data, const guint avail, gboolean drain,
785 guint * framesize, gint * skipsize)
787 gboolean found = FALSE;
788 guint need_data_adts = 0, need_data_loas;
791 GST_DEBUG_OBJECT (aacparse, "Parsing header data");
793 /* FIXME: No need to check for ADIF if we are not in the beginning of the
796 /* Can we even parse the header? */
797 if (avail < MAX (ADTS_MAX_SIZE, LOAS_MAX_SIZE)) {
798 GST_DEBUG_OBJECT (aacparse, "Not enough data to check");
802 for (i = 0; i < avail - 4; i++) {
803 if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) ||
804 ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) ||
805 strncmp ((char *) data + i, "ADIF", 4) == 0) {
806 GST_DEBUG_OBJECT (aacparse, "Found signature at offset %u", i);
810 /* Trick: tell the parent class that we didn't find the frame yet,
811 but make it skip 'i' amount of bytes. Next time we arrive
812 here we have full frame in the beginning of the data. */
825 if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain,
826 framesize, &need_data_adts)) {
829 GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize);
831 gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels,
832 &aacparse->object_type, &aacparse->mpegversion);
834 if (!channels || !framesize) {
835 GST_DEBUG_OBJECT (aacparse, "impossible ADTS configuration");
839 aacparse->header_type = DSPAAC_HEADER_ADTS;
840 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
841 aacparse->frame_samples, 2, 2);
843 GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d",
844 rate, channels, aacparse->object_type, aacparse->mpegversion);
846 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
851 if (gst_aac_parse_check_loas_frame (aacparse, data, avail, drain,
852 framesize, &need_data_loas)) {
855 GST_INFO ("LOAS, framesize: %d", *framesize);
857 aacparse->header_type = DSPAAC_HEADER_LOAS;
859 if (!gst_aac_parse_read_loas_config (aacparse, data, avail, &rate,
860 &channels, &aacparse->mpegversion)) {
861 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
865 if (rate && channels) {
866 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
867 aacparse->frame_samples, 2, 2);
869 GST_DEBUG ("LOAS: samplerate %d, channels %d, objtype %d, version %d",
870 rate, channels, aacparse->object_type, aacparse->mpegversion);
871 aacparse->sample_rate = rate;
872 aacparse->channels = channels;
875 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
880 if (need_data_adts || need_data_loas) {
881 /* This tells the parent class not to skip any data */
886 if (avail < ADIF_MAX_SIZE)
889 if (memcmp (data + i, "ADIF", 4) == 0) {
896 aacparse->header_type = DSPAAC_HEADER_ADIF;
897 aacparse->mpegversion = 4;
899 /* Skip the "ADIF" bytes */
902 /* copyright string */
904 skip_size += 9; /* skip 9 bytes */
906 bitstream_type = adif[0 + skip_size] & 0x10;
908 ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) |
909 ((unsigned int) adif[1 + skip_size] << 11) |
910 ((unsigned int) adif[2 + skip_size] << 3) |
911 ((unsigned int) adif[3 + skip_size] & 0xe0);
914 if (bitstream_type == 0) {
916 /* Buffer fullness parsing. Currently not needed... */
920 num_elems = (adif[3 + skip_size] & 0x1e);
921 GST_INFO ("ADIF num_config_elems: %d", num_elems);
923 fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) |
924 ((unsigned int) adif[4 + skip_size] << 11) |
925 ((unsigned int) adif[5 + skip_size] << 3) |
926 ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5);
928 GST_INFO ("ADIF buffer fullness: %d", fullness);
930 aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) |
931 ((adif[7 + skip_size] & 0x80) >> 7);
932 sr_idx = (adif[7 + skip_size] & 0x78) >> 3;
936 aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3;
937 sr_idx = ((adif[4 + skip_size] & 0x07) << 1) |
938 ((adif[5 + skip_size] & 0x80) >> 7);
941 /* FIXME: This gives totally wrong results. Duration calculation cannot
943 aacparse->sample_rate =
944 gst_codec_utils_aac_get_sample_rate_from_index (sr_idx);
946 /* baseparse is not given any fps,
947 * so it will give up on timestamps, seeking, etc */
949 /* FIXME: Can we assume this? */
950 aacparse->channels = 2;
952 GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d",
953 aacparse->bitrate, aacparse->sample_rate, aacparse->object_type);
955 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512);
957 /* arrange for metadata and get out of the way */
958 sinkcaps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (aacparse));
959 gst_aac_parse_set_src_caps (aacparse, sinkcaps);
961 gst_caps_unref (sinkcaps);
963 /* not syncable, not easily seekable (unless we push data from start */
964 gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE);
965 gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE);
966 gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0);
972 /* This should never happen */
977 * gst_aac_parse_get_audio_profile_object_type
978 * @aacparse: #GstAacParse.
980 * Gets the MPEG-2 profile or the MPEG-4 object type value corresponding to the
981 * mpegversion and profile of @aacparse's src pad caps, according to the
982 * values defined by table 1.A.11 in ISO/IEC 14496-3.
984 * Returns: the profile or object type value corresponding to @aacparse's src
985 * pad caps, if such a value exists; otherwise G_MAXUINT8.
988 gst_aac_parse_get_audio_profile_object_type (GstAacParse * aacparse)
991 GstStructure *srcstruct;
992 const gchar *profile;
995 srccaps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (aacparse));
996 srcstruct = gst_caps_get_structure (srccaps, 0);
997 profile = gst_structure_get_string (srcstruct, "profile");
998 if (G_UNLIKELY (profile == NULL)) {
999 gst_caps_unref (srccaps);
1003 if (g_strcmp0 (profile, "main") == 0) {
1005 } else if (g_strcmp0 (profile, "lc") == 0) {
1007 } else if (g_strcmp0 (profile, "ssr") == 0) {
1009 } else if (g_strcmp0 (profile, "ltp") == 0) {
1010 if (G_LIKELY (aacparse->mpegversion == 4))
1013 ret = G_MAXUINT8; /* LTP Object Type allowed only for MPEG-4 */
1018 gst_caps_unref (srccaps);
1023 * gst_aac_parse_get_audio_channel_configuration
1024 * @num_channels: number of audio channels.
1026 * Gets the Channel Configuration value, as defined by table 1.19 in ISO/IEC
1027 * 14496-3, for a given number of audio channels.
1029 * Returns: the Channel Configuration value corresponding to @num_channels, if
1030 * such a value exists; otherwise G_MAXUINT8.
1033 gst_aac_parse_get_audio_channel_configuration (gint num_channels)
1035 if (num_channels >= 1 && num_channels <= 6) /* Mono up to & including 5.1 */
1036 return (guint8) num_channels;
1037 else if (num_channels == 8) /* 7.1 */
1044 * gst_aac_parse_get_audio_sampling_frequency_index:
1045 * @sample_rate: audio sampling rate.
1047 * Gets the Sampling Frequency Index value, as defined by table 1.18 in ISO/IEC
1048 * 14496-3, for a given sampling rate.
1050 * Returns: the Sampling Frequency Index value corresponding to @sample_rate,
1051 * if such a value exists; otherwise G_MAXUINT8.
1054 gst_aac_parse_get_audio_sampling_frequency_index (gint sample_rate)
1056 switch (sample_rate) {
1089 * gst_aac_parse_prepend_adts_headers:
1090 * @aacparse: #GstAacParse.
1091 * @frame: raw AAC frame to which ADTS headers shall be prepended.
1093 * Prepends ADTS headers to a raw AAC audio frame.
1095 * Returns: TRUE if ADTS headers were successfully prepended; FALSE otherwise.
1098 gst_aac_parse_prepend_adts_headers (GstAacParse * aacparse,
1099 GstBaseParseFrame * frame)
1102 guint8 *adts_headers;
1105 guint8 id, profile, channel_configuration, sampling_frequency_index;
1107 id = (aacparse->mpegversion == 4) ? 0x0U : 0x1U;
1108 profile = gst_aac_parse_get_audio_profile_object_type (aacparse);
1109 if (profile == G_MAXUINT8) {
1110 GST_ERROR_OBJECT (aacparse, "Unsupported audio profile or object type");
1113 channel_configuration =
1114 gst_aac_parse_get_audio_channel_configuration (aacparse->channels);
1115 if (channel_configuration == G_MAXUINT8) {
1116 GST_ERROR_OBJECT (aacparse, "Unsupported number of channels");
1119 sampling_frequency_index =
1120 gst_aac_parse_get_audio_sampling_frequency_index (aacparse->sample_rate);
1121 if (sampling_frequency_index == G_MAXUINT8) {
1122 GST_ERROR_OBJECT (aacparse, "Unsupported sampling frequency");
1126 frame->out_buffer = gst_buffer_copy (frame->buffer);
1127 buf_size = gst_buffer_get_size (frame->out_buffer);
1128 frame_size = buf_size + ADTS_HEADERS_LENGTH;
1130 if (G_UNLIKELY (frame_size >= 0x4000)) {
1131 GST_ERROR_OBJECT (aacparse, "Frame size is too big for ADTS");
1135 adts_headers = (guint8 *) g_malloc0 (ADTS_HEADERS_LENGTH);
1137 /* Note: no error correction bits are added to the resulting ADTS frames */
1138 adts_headers[0] = 0xFFU;
1139 adts_headers[1] = 0xF0U | (id << 3) | 0x1U;
1140 adts_headers[2] = (profile << 6) | (sampling_frequency_index << 2) | 0x2U |
1141 (channel_configuration & 0x4U);
1142 adts_headers[3] = ((channel_configuration & 0x3U) << 6) | 0x30U |
1143 (guint8) (frame_size >> 11);
1144 adts_headers[4] = (guint8) ((frame_size >> 3) & 0x00FF);
1145 adts_headers[5] = (guint8) (((frame_size & 0x0007) << 5) + 0x1FU);
1146 adts_headers[6] = 0xFCU;
1148 mem = gst_memory_new_wrapped (0, adts_headers, ADTS_HEADERS_LENGTH, 0,
1149 ADTS_HEADERS_LENGTH, NULL, NULL);
1150 gst_buffer_prepend_memory (frame->out_buffer, mem);
1156 * gst_aac_parse_check_valid_frame:
1157 * @parse: #GstBaseParse.
1158 * @frame: #GstBaseParseFrame.
1159 * @skipsize: How much data parent class should skip in order to find the
1162 * Implementation of "handle_frame" vmethod in #GstBaseParse class.
1164 * Also determines frame overhead.
1165 * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have
1166 * a per-frame header. LOAS has 3 bytes.
1168 * We're making a couple of simplifying assumptions:
1170 * 1. We count Program Configuration Elements rather than searching for them
1171 * in the streams to discount them - the overhead is negligible.
1173 * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16
1174 * bits, which should still not be significant enough to warrant the
1175 * additional parsing through the headers
1177 * Returns: a #GstFlowReturn.
1179 static GstFlowReturn
1180 gst_aac_parse_handle_frame (GstBaseParse * parse,
1181 GstBaseParseFrame * frame, gint * skipsize)
1184 GstAacParse *aacparse;
1185 gboolean ret = FALSE;
1189 gint rate, channels;
1191 aacparse = GST_AAC_PARSE (parse);
1192 buffer = frame->buffer;
1194 gst_buffer_map (buffer, &map, GST_MAP_READ);
1197 lost_sync = GST_BASE_PARSE_LOST_SYNC (parse);
1199 if (aacparse->header_type == DSPAAC_HEADER_ADIF ||
1200 aacparse->header_type == DSPAAC_HEADER_NONE) {
1201 /* There is nothing to parse */
1202 framesize = map.size;
1205 } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) {
1207 ret = gst_aac_parse_detect_stream (aacparse, map.data, map.size,
1208 GST_BASE_PARSE_DRAINING (parse), &framesize, skipsize);
1210 } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
1211 guint needed_data = 1024;
1213 ret = gst_aac_parse_check_adts_frame (aacparse, map.data, map.size,
1214 GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
1217 GST_DEBUG ("buffer didn't contain valid frame");
1218 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
1222 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
1223 guint needed_data = 1024;
1225 ret = gst_aac_parse_check_loas_frame (aacparse, map.data,
1226 map.size, GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
1229 GST_DEBUG ("buffer didn't contain valid frame");
1230 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
1235 GST_DEBUG ("buffer didn't contain valid frame");
1236 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
1240 if (G_UNLIKELY (!ret))
1243 if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
1245 frame->overhead = 7;
1247 gst_aac_parse_parse_adts_header (aacparse, map.data,
1248 &rate, &channels, NULL, NULL);
1250 GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels);
1252 if (G_UNLIKELY (rate != aacparse->sample_rate
1253 || channels != aacparse->channels)) {
1254 aacparse->sample_rate = rate;
1255 aacparse->channels = channels;
1257 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1258 /* If linking fails, we need to return appropriate error */
1259 ret = GST_FLOW_NOT_LINKED;
1262 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1263 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1265 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
1266 gboolean setcaps = FALSE;
1269 frame->overhead = 3;
1271 if (!gst_aac_parse_read_loas_config (aacparse, map.data, map.size, &rate,
1273 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
1274 } else if (G_UNLIKELY (rate != aacparse->sample_rate
1275 || channels != aacparse->channels)) {
1276 aacparse->sample_rate = rate;
1277 aacparse->channels = channels;
1279 GST_INFO_OBJECT (aacparse, "New LOAS config: %d Hz, %d channels", rate,
1283 /* We want to set caps both at start, and when rate/channels change.
1284 Since only some LOAS frames have that info, we may receive frames
1285 before knowing about rate/channels. */
1287 || !gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (aacparse))) {
1288 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1289 /* If linking fails, we need to return appropriate error */
1290 ret = GST_FLOW_NOT_LINKED;
1293 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1294 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1298 if (aacparse->header_type == DSPAAC_HEADER_NONE
1299 && aacparse->output_header_type == DSPAAC_HEADER_ADTS) {
1300 if (!gst_aac_parse_prepend_adts_headers (aacparse, frame)) {
1301 GST_ERROR_OBJECT (aacparse, "Failed to prepend ADTS headers to frame");
1302 ret = GST_FLOW_ERROR;
1307 gst_buffer_unmap (buffer, &map);
1310 /* found, skip if needed */
1319 if (ret && framesize <= map.size) {
1320 return gst_base_parse_finish_frame (parse, frame, framesize);
1326 static GstFlowReturn
1327 gst_aac_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
1329 GstAacParse *aacparse = GST_AAC_PARSE (parse);
1331 if (!aacparse->sent_codec_tag) {
1332 GstTagList *taglist;
1335 taglist = gst_tag_list_new_empty ();
1338 caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
1339 gst_pb_utils_add_codec_description_to_tag_list (taglist,
1340 GST_TAG_AUDIO_CODEC, caps);
1341 gst_caps_unref (caps);
1343 gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (aacparse),
1344 gst_event_new_tag (taglist));
1346 /* also signals the end of first-frame processing */
1347 aacparse->sent_codec_tag = TRUE;
1350 /* As a special case, we can remove the ADTS framing and output raw AAC. */
1351 if (aacparse->header_type == DSPAAC_HEADER_ADTS
1352 && aacparse->output_header_type == DSPAAC_HEADER_NONE) {
1355 gst_buffer_map (frame->buffer, &map, GST_MAP_READ);
1356 header_size = (map.data[1] & 1) ? 7 : 9; /* optional CRC */
1357 gst_buffer_unmap (frame->buffer, &map);
1358 gst_buffer_resize (frame->buffer, header_size,
1359 gst_buffer_get_size (frame->buffer) - header_size);
1367 * gst_aac_parse_start:
1368 * @parse: #GstBaseParse.
1370 * Implementation of "start" vmethod in #GstBaseParse class.
1372 * Returns: TRUE if startup succeeded.
1375 gst_aac_parse_start (GstBaseParse * parse)
1377 GstAacParse *aacparse;
1379 aacparse = GST_AAC_PARSE (parse);
1380 GST_DEBUG ("start");
1381 aacparse->frame_samples = 1024;
1382 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
1383 aacparse->sent_codec_tag = FALSE;
1389 * gst_aac_parse_stop:
1390 * @parse: #GstBaseParse.
1392 * Implementation of "stop" vmethod in #GstBaseParse class.
1394 * Returns: TRUE is stopping succeeded.
1397 gst_aac_parse_stop (GstBaseParse * parse)
1404 remove_fields (GstCaps * caps)
1408 n = gst_caps_get_size (caps);
1409 for (i = 0; i < n; i++) {
1410 GstStructure *s = gst_caps_get_structure (caps, i);
1412 gst_structure_remove_field (s, "framed");
1417 gst_aac_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter)
1419 GstCaps *peercaps, *templ;
1422 templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
1425 GstCaps *fcopy = gst_caps_copy (filter);
1426 /* Remove the fields we convert */
1427 remove_fields (fcopy);
1428 peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), fcopy);
1429 gst_caps_unref (fcopy);
1431 peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), NULL);
1434 peercaps = gst_caps_make_writable (peercaps);
1435 /* Remove the fields we convert */
1436 remove_fields (peercaps);
1438 res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
1439 gst_caps_unref (peercaps);
1440 gst_caps_unref (templ);
1446 GstCaps *intersection;
1449 gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
1450 gst_caps_unref (res);