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 "gstaacparse.h"
51 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
54 GST_STATIC_CAPS ("audio/mpeg, "
55 "framed = (boolean) true, " "mpegversion = (int) { 2, 4 }, "
56 "stream-format = (string) { raw, adts, adif, loas };"));
58 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
61 GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) { 2, 4 };"));
63 GST_DEBUG_CATEGORY_STATIC (aacparse_debug);
64 #define GST_CAT_DEFAULT aacparse_debug
67 #define ADIF_MAX_SIZE 40 /* Should be enough */
68 #define ADTS_MAX_SIZE 10 /* Should be enough */
69 #define LOAS_MAX_SIZE 3 /* Should be enough */
72 #define AAC_FRAME_DURATION(parse) (GST_SECOND/parse->frames_per_sec)
74 static const gint loas_sample_rate_table[32] = {
75 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
76 16000, 12000, 11025, 8000, 7350, 0, 0, 0
79 static const gint loas_channels_table[32] = {
80 0, 1, 2, 3, 4, 5, 6, 8,
81 0, 0, 0, 0, 0, 0, 0, 0
84 static gboolean gst_aac_parse_start (GstBaseParse * parse);
85 static gboolean gst_aac_parse_stop (GstBaseParse * parse);
87 static gboolean gst_aac_parse_sink_setcaps (GstBaseParse * parse,
89 static GstCaps *gst_aac_parse_sink_getcaps (GstBaseParse * parse,
92 static GstFlowReturn gst_aac_parse_handle_frame (GstBaseParse * parse,
93 GstBaseParseFrame * frame, gint * skipsize);
95 G_DEFINE_TYPE (GstAacParse, gst_aac_parse, GST_TYPE_BASE_PARSE);
98 gst_aac_parse_get_sample_rate_from_index (guint sr_idx)
100 static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, 44100,
101 32000, 24000, 22050, 16000, 12000, 11025, 8000
104 if (sr_idx < G_N_ELEMENTS (aac_sample_rates))
105 return aac_sample_rates[sr_idx];
106 GST_WARNING ("Invalid sample rate index %u", sr_idx);
111 * gst_aac_parse_class_init:
112 * @klass: #GstAacParseClass.
116 gst_aac_parse_class_init (GstAacParseClass * klass)
118 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
119 GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
121 GST_DEBUG_CATEGORY_INIT (aacparse_debug, "aacparse", 0,
122 "AAC audio stream parser");
124 gst_element_class_add_pad_template (element_class,
125 gst_static_pad_template_get (&sink_template));
126 gst_element_class_add_pad_template (element_class,
127 gst_static_pad_template_get (&src_template));
129 gst_element_class_set_static_metadata (element_class,
130 "AAC audio stream parser", "Codec/Parser/Audio",
131 "Advanced Audio Coding parser", "Stefan Kost <stefan.kost@nokia.com>");
133 parse_class->start = GST_DEBUG_FUNCPTR (gst_aac_parse_start);
134 parse_class->stop = GST_DEBUG_FUNCPTR (gst_aac_parse_stop);
135 parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_setcaps);
136 parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_getcaps);
137 parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_handle_frame);
142 * gst_aac_parse_init:
143 * @aacparse: #GstAacParse.
144 * @klass: #GstAacParseClass.
148 gst_aac_parse_init (GstAacParse * aacparse)
150 GST_DEBUG ("initialized");
155 * gst_aac_parse_set_src_caps:
156 * @aacparse: #GstAacParse.
157 * @sink_caps: (proposed) caps of sink pad
159 * Set source pad caps according to current knowledge about the
162 * Returns: TRUE if caps were successfully set.
165 gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps)
168 GstCaps *src_caps = NULL;
169 gboolean res = FALSE;
170 const gchar *stream_format;
172 GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps);
174 src_caps = gst_caps_copy (sink_caps);
176 src_caps = gst_caps_new_empty_simple ("audio/mpeg");
178 gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE,
179 "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL);
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 s = gst_caps_get_structure (src_caps, 0);
199 if (aacparse->sample_rate > 0)
200 gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL);
201 if (aacparse->channels > 0)
202 gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL);
204 gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL);
206 GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
208 res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
209 gst_caps_unref (src_caps);
215 * gst_aac_parse_sink_setcaps:
219 * Implementation of "set_sink_caps" vmethod in #GstBaseParse class.
221 * Returns: TRUE on success.
224 gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
226 GstAacParse *aacparse;
227 GstStructure *structure;
231 aacparse = GST_AAC_PARSE (parse);
232 structure = gst_caps_get_structure (caps, 0);
233 caps_str = gst_caps_to_string (caps);
235 GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str);
238 /* This is needed at least in case of RTP
239 * Parses the codec_data information to get ObjectType,
240 * number of channels and samplerate */
241 value = gst_structure_get_value (structure, "codec_data");
243 GstBuffer *buf = gst_value_get_buffer (value);
249 gst_buffer_map (buf, &map, GST_MAP_READ);
251 sr_idx = ((map.data[0] & 0x07) << 1) | ((map.data[1] & 0x80) >> 7);
252 aacparse->object_type = (map.data[0] & 0xf8) >> 3;
253 aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
254 aacparse->channels = (map.data[1] & 0x78) >> 3;
255 aacparse->header_type = DSPAAC_HEADER_NONE;
256 aacparse->mpegversion = 4;
257 aacparse->frame_samples = (map.data[1] & 4) ? 960 : 1024;
258 gst_buffer_unmap (buf, &map);
260 GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, "
261 "samples=%d", aacparse->object_type, aacparse->sample_rate,
262 aacparse->channels, aacparse->frame_samples);
264 /* arrange for metadata and get out of the way */
265 gst_aac_parse_set_src_caps (aacparse, caps);
266 gst_base_parse_set_passthrough (parse, TRUE);
270 /* caps info overrides */
271 gst_structure_get_int (structure, "rate", &aacparse->sample_rate);
272 gst_structure_get_int (structure, "channels", &aacparse->channels);
274 aacparse->sample_rate = 0;
275 aacparse->channels = 0;
276 aacparse->header_type = DSPAAC_HEADER_NOT_PARSED;
277 gst_base_parse_set_passthrough (parse, FALSE);
285 * gst_aac_parse_adts_get_frame_len:
286 * @data: block of data containing an ADTS header.
288 * This function calculates ADTS frame length from the given header.
290 * Returns: size of the ADTS frame.
293 gst_aac_parse_adts_get_frame_len (const guint8 * data)
295 return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5);
300 * gst_aac_parse_check_adts_frame:
301 * @aacparse: #GstAacParse.
302 * @data: Data to be checked.
303 * @avail: Amount of data passed.
304 * @framesize: If valid ADTS frame was found, this will be set to tell the
305 * found frame size in bytes.
306 * @needed_data: If frame was not found, this may be set to tell how much
307 * more data is needed in the next round to detect the frame
308 * reliably. This may happen when a frame header candidate
309 * is found but it cannot be guaranteed to be the header without
310 * peeking the following data.
312 * Check if the given data contains contains ADTS frame. The algorithm
313 * will examine ADTS frame header and calculate the frame size. Also, another
314 * consecutive ADTS frame header need to be present after the found frame.
315 * Otherwise the data is not considered as a valid ADTS frame. However, this
316 * "extra check" is omitted when EOS has been received. In this case it is
317 * enough when data[0] contains a valid ADTS header.
319 * This function may set the #needed_data to indicate that a possible frame
320 * candidate has been found, but more data (#needed_data bytes) is needed to
321 * be absolutely sure. When this situation occurs, FALSE will be returned.
323 * When a valid frame is detected, this function will use
324 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
325 * to set the needed bytes for next frame.This way next data chunk is already
328 * Returns: TRUE if the given data contains a valid ADTS header.
331 gst_aac_parse_check_adts_frame (GstAacParse * aacparse,
332 const guint8 * data, const guint avail, gboolean drain,
333 guint * framesize, guint * needed_data)
337 if (G_UNLIKELY (avail < 2))
340 if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) {
341 *framesize = gst_aac_parse_adts_get_frame_len (data);
343 /* In EOS mode this is enough. No need to examine the data further.
344 We also relax the check when we have sync, on the assumption that
345 if we're not looking at random data, we have a much higher chance
346 to get the correct sync, and this avoids losing two frames when
347 a single bit corruption happens. */
348 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
352 if (*framesize + ADTS_MAX_SIZE > avail) {
353 /* We have found a possible frame header candidate, but can't be
354 sure since we don't have enough data to check the next frame */
355 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
356 *framesize + ADTS_MAX_SIZE, avail);
357 *needed_data = *framesize + ADTS_MAX_SIZE;
358 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
359 *framesize + ADTS_MAX_SIZE);
363 if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) {
364 guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize));
366 GST_LOG ("ADTS frame found, len: %d bytes", *framesize);
367 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
368 nextlen + ADTS_MAX_SIZE);
376 gst_aac_parse_latm_get_value (GstAacParse * aacparse, GstBitReader * br,
379 guint8 bytes, i, byte;
382 if (!gst_bit_reader_get_bits_uint8 (br, &bytes, 2))
384 for (i = 0; i < bytes; ++i) {
386 if (!gst_bit_reader_get_bits_uint8 (br, &byte, 8))
394 gst_aac_parse_get_audio_object_type (GstAacParse * aacparse, GstBitReader * br,
395 guint8 * audio_object_type)
397 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 5))
399 if (*audio_object_type == 31) {
400 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 6))
402 *audio_object_type += 32;
404 GST_LOG_OBJECT (aacparse, "audio object type %u", *audio_object_type);
409 gst_aac_parse_get_audio_sample_rate (GstAacParse * aacparse, GstBitReader * br,
412 guint8 sampling_frequency_index;
413 if (!gst_bit_reader_get_bits_uint8 (br, &sampling_frequency_index, 4))
415 GST_LOG_OBJECT (aacparse, "sampling_frequency_index: %u",
416 sampling_frequency_index);
417 if (sampling_frequency_index == 0xf) {
418 guint32 sampling_rate;
419 if (!gst_bit_reader_get_bits_uint32 (br, &sampling_rate, 24))
421 *sample_rate = sampling_rate;
423 *sample_rate = loas_sample_rate_table[sampling_frequency_index];
430 /* See table 1.13 in ISO/IEC 14496-3 */
432 gst_aac_parse_read_loas_audio_specific_config (GstAacParse * aacparse,
433 GstBitReader * br, gint * sample_rate, gint * channels, guint32 * bits)
435 guint8 audio_object_type, channel_configuration;
437 if (!gst_aac_parse_get_audio_object_type (aacparse, br, &audio_object_type))
440 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
443 if (!gst_bit_reader_get_bits_uint8 (br, &channel_configuration, 4))
445 GST_LOG_OBJECT (aacparse, "channel_configuration: %d", channel_configuration);
446 *channels = loas_channels_table[channel_configuration];
450 if (audio_object_type == 5) {
451 GST_LOG_OBJECT (aacparse,
452 "Audio object type 5, so rereading sampling rate...");
453 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
457 GST_INFO_OBJECT (aacparse, "Found LOAS config: %d Hz, %d channels",
458 *sample_rate, *channels);
460 /* There's LOTS of stuff next, but we ignore it for now as we have
461 what we want (sample rate and number of channels */
462 GST_DEBUG_OBJECT (aacparse,
463 "Need more code to parse humongous LOAS data, currently ignored");
471 gst_aac_parse_read_loas_config (GstAacParse * aacparse, const guint8 * data,
472 guint avail, gint * sample_rate, gint * channels, gint * version)
477 /* No version in the bitstream, but the spec has LOAS in the MPEG-4 section */
481 gst_bit_reader_init (&br, data, avail);
483 /* skip sync word (11 bits) and size (13 bits) */
484 if (!gst_bit_reader_skip (&br, 11 + 13))
487 /* First bit is "use last config" */
488 if (!gst_bit_reader_get_bits_uint8 (&br, &u8, 1))
491 GST_DEBUG_OBJECT (aacparse, "Frame uses previous config");
492 if (!aacparse->sample_rate || !aacparse->channels) {
493 GST_WARNING_OBJECT (aacparse, "No previous config to use");
495 *sample_rate = aacparse->sample_rate;
496 *channels = aacparse->channels;
500 GST_DEBUG_OBJECT (aacparse, "Frame contains new config");
502 if (!gst_bit_reader_get_bits_uint8 (&br, &v, 1))
505 if (!gst_bit_reader_get_bits_uint8 (&br, &vA, 1))
510 GST_LOG_OBJECT (aacparse, "v %d, vA %d", v, vA);
512 guint8 same_time, subframes, num_program, prog;
515 if (!gst_aac_parse_latm_get_value (aacparse, &br, &value))
518 if (!gst_bit_reader_get_bits_uint8 (&br, &same_time, 1))
520 if (!gst_bit_reader_get_bits_uint8 (&br, &subframes, 6))
522 if (!gst_bit_reader_get_bits_uint8 (&br, &num_program, 4))
524 GST_LOG_OBJECT (aacparse, "same_time %d, subframes %d, num_program %d",
525 same_time, subframes, num_program);
527 for (prog = 0; prog <= num_program; ++prog) {
528 guint8 num_layer, layer;
529 if (!gst_bit_reader_get_bits_uint8 (&br, &num_layer, 3))
531 GST_LOG_OBJECT (aacparse, "Program %d: %d layers", prog, num_layer);
533 for (layer = 0; layer <= num_layer; ++layer) {
534 guint8 use_same_config;
535 if (prog == 0 && layer == 0) {
538 if (!gst_bit_reader_get_bits_uint8 (&br, &use_same_config, 1))
541 if (!use_same_config) {
543 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
544 sample_rate, channels, NULL))
547 guint32 bits, asc_len;
548 if (!gst_aac_parse_latm_get_value (aacparse, &br, &asc_len))
550 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
551 sample_rate, channels, &bits))
554 if (!gst_bit_reader_skip (&br, asc_len))
560 GST_LOG_OBJECT (aacparse, "More data ignored");
562 GST_WARNING_OBJECT (aacparse, "Spec says \"TBD\"...");
568 * gst_aac_parse_loas_get_frame_len:
569 * @data: block of data containing a LOAS header.
571 * This function calculates LOAS frame length from the given header.
573 * Returns: size of the LOAS frame.
576 gst_aac_parse_loas_get_frame_len (const guint8 * data)
578 return (((data[1] & 0x1f) << 8) | data[2]) + 3;
583 * gst_aac_parse_check_loas_frame:
584 * @aacparse: #GstAacParse.
585 * @data: Data to be checked.
586 * @avail: Amount of data passed.
587 * @framesize: If valid LOAS frame was found, this will be set to tell the
588 * found frame size in bytes.
589 * @needed_data: If frame was not found, this may be set to tell how much
590 * more data is needed in the next round to detect the frame
591 * reliably. This may happen when a frame header candidate
592 * is found but it cannot be guaranteed to be the header without
593 * peeking the following data.
595 * Check if the given data contains contains LOAS frame. The algorithm
596 * will examine LOAS frame header and calculate the frame size. Also, another
597 * consecutive LOAS frame header need to be present after the found frame.
598 * Otherwise the data is not considered as a valid LOAS frame. However, this
599 * "extra check" is omitted when EOS has been received. In this case it is
600 * enough when data[0] contains a valid LOAS header.
602 * This function may set the #needed_data to indicate that a possible frame
603 * candidate has been found, but more data (#needed_data bytes) is needed to
604 * be absolutely sure. When this situation occurs, FALSE will be returned.
606 * When a valid frame is detected, this function will use
607 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
608 * to set the needed bytes for next frame.This way next data chunk is already
611 * LOAS can have three different formats, if I read the spec correctly. Only
612 * one of them is supported here, as the two samples I have use this one.
614 * Returns: TRUE if the given data contains a valid LOAS header.
617 gst_aac_parse_check_loas_frame (GstAacParse * aacparse,
618 const guint8 * data, const guint avail, gboolean drain,
619 guint * framesize, guint * needed_data)
624 if (G_UNLIKELY (avail < 3))
627 if ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) {
628 *framesize = gst_aac_parse_loas_get_frame_len (data);
629 GST_DEBUG_OBJECT (aacparse, "Found %u byte LOAS frame", *framesize);
631 /* In EOS mode this is enough. No need to examine the data further.
632 We also relax the check when we have sync, on the assumption that
633 if we're not looking at random data, we have a much higher chance
634 to get the correct sync, and this avoids losing two frames when
635 a single bit corruption happens. */
636 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
640 if (*framesize + LOAS_MAX_SIZE > avail) {
641 /* We have found a possible frame header candidate, but can't be
642 sure since we don't have enough data to check the next frame */
643 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
644 *framesize + LOAS_MAX_SIZE, avail);
645 *needed_data = *framesize + LOAS_MAX_SIZE;
646 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
647 *framesize + LOAS_MAX_SIZE);
651 if ((data[*framesize] == 0x56) && ((data[*framesize + 1] & 0xe0) == 0xe0)) {
652 guint nextlen = gst_aac_parse_loas_get_frame_len (data + (*framesize));
654 GST_LOG ("LOAS frame found, len: %d bytes", *framesize);
655 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
656 nextlen + LOAS_MAX_SIZE);
663 /* caller ensure sufficient data */
665 gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data,
666 gint * rate, gint * channels, gint * object, gint * version)
670 gint sr_idx = (data[2] & 0x3c) >> 2;
672 *rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
675 *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6);
678 *version = (data[1] & 0x08) ? 2 : 4;
680 *object = (data[2] & 0xc0) >> 6;
684 * gst_aac_parse_detect_stream:
685 * @aacparse: #GstAacParse.
686 * @data: A block of data that needs to be examined for stream characteristics.
687 * @avail: Size of the given datablock.
688 * @framesize: If valid stream was found, this will be set to tell the
689 * first frame size in bytes.
690 * @skipsize: If valid stream was found, this will be set to tell the first
691 * audio frame position within the given data.
693 * Examines the given piece of data and try to detect the format of it. It
694 * checks for "ADIF" header (in the beginning of the clip) and ADTS frame
695 * header. If the stream is detected, TRUE will be returned and #framesize
696 * is set to indicate the found frame size. Additionally, #skipsize might
697 * be set to indicate the number of bytes that need to be skipped, a.k.a. the
698 * position of the frame inside given data chunk.
700 * Returns: TRUE on success.
703 gst_aac_parse_detect_stream (GstAacParse * aacparse,
704 const guint8 * data, const guint avail, gboolean drain,
705 guint * framesize, gint * skipsize)
707 gboolean found = FALSE;
708 guint need_data_adts = 0, need_data_loas;
711 GST_DEBUG_OBJECT (aacparse, "Parsing header data");
713 /* FIXME: No need to check for ADIF if we are not in the beginning of the
716 /* Can we even parse the header? */
717 if (avail < MAX (ADTS_MAX_SIZE, LOAS_MAX_SIZE)) {
718 GST_DEBUG_OBJECT (aacparse, "Not enough data to check");
722 for (i = 0; i < avail - 4; i++) {
723 if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) ||
724 ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) ||
725 strncmp ((char *) data + i, "ADIF", 4) == 0) {
726 GST_DEBUG_OBJECT (aacparse, "Found signature at offset %u", i);
730 /* Trick: tell the parent class that we didn't find the frame yet,
731 but make it skip 'i' amount of bytes. Next time we arrive
732 here we have full frame in the beginning of the data. */
745 if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain,
746 framesize, &need_data_adts)) {
749 GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize);
751 gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels,
752 &aacparse->object_type, &aacparse->mpegversion);
754 if (!channels || !framesize) {
755 GST_DEBUG_OBJECT (aacparse, "impossible ADTS configuration");
759 aacparse->header_type = DSPAAC_HEADER_ADTS;
760 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
761 aacparse->frame_samples, 2, 2);
763 GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d",
764 rate, channels, aacparse->object_type, aacparse->mpegversion);
766 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
771 if (gst_aac_parse_check_loas_frame (aacparse, data, avail, drain,
772 framesize, &need_data_loas)) {
775 GST_INFO ("LOAS, framesize: %d", *framesize);
777 aacparse->header_type = DSPAAC_HEADER_LOAS;
779 if (!gst_aac_parse_read_loas_config (aacparse, data, avail, &rate,
780 &channels, &aacparse->mpegversion)) {
781 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
785 if (rate && channels) {
786 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
787 aacparse->frame_samples, 2, 2);
789 GST_DEBUG ("LOAS: samplerate %d, channels %d, objtype %d, version %d",
790 rate, channels, aacparse->object_type, aacparse->mpegversion);
791 aacparse->sample_rate = rate;
792 aacparse->channels = channels;
795 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
800 if (need_data_adts || need_data_loas) {
801 /* This tells the parent class not to skip any data */
806 if (avail < ADIF_MAX_SIZE)
809 if (memcmp (data + i, "ADIF", 4) == 0) {
816 aacparse->header_type = DSPAAC_HEADER_ADIF;
817 aacparse->mpegversion = 4;
819 /* Skip the "ADIF" bytes */
822 /* copyright string */
824 skip_size += 9; /* skip 9 bytes */
826 bitstream_type = adif[0 + skip_size] & 0x10;
828 ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) |
829 ((unsigned int) adif[1 + skip_size] << 11) |
830 ((unsigned int) adif[2 + skip_size] << 3) |
831 ((unsigned int) adif[3 + skip_size] & 0xe0);
834 if (bitstream_type == 0) {
836 /* Buffer fullness parsing. Currently not needed... */
840 num_elems = (adif[3 + skip_size] & 0x1e);
841 GST_INFO ("ADIF num_config_elems: %d", num_elems);
843 fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) |
844 ((unsigned int) adif[4 + skip_size] << 11) |
845 ((unsigned int) adif[5 + skip_size] << 3) |
846 ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5);
848 GST_INFO ("ADIF buffer fullness: %d", fullness);
850 aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) |
851 ((adif[7 + skip_size] & 0x80) >> 7);
852 sr_idx = (adif[7 + skip_size] & 0x78) >> 3;
856 aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3;
857 sr_idx = ((adif[4 + skip_size] & 0x07) << 1) |
858 ((adif[5 + skip_size] & 0x80) >> 7);
861 /* FIXME: This gives totally wrong results. Duration calculation cannot
863 aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
865 /* baseparse is not given any fps,
866 * so it will give up on timestamps, seeking, etc */
868 /* FIXME: Can we assume this? */
869 aacparse->channels = 2;
871 GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d",
872 aacparse->bitrate, aacparse->sample_rate, aacparse->object_type);
874 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512);
876 /* arrange for metadata and get out of the way */
877 sinkcaps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (aacparse));
878 gst_aac_parse_set_src_caps (aacparse, sinkcaps);
880 gst_caps_unref (sinkcaps);
882 /* not syncable, not easily seekable (unless we push data from start */
883 gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE);
884 gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE);
885 gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0);
891 /* This should never happen */
897 * gst_aac_parse_check_valid_frame:
898 * @parse: #GstBaseParse.
899 * @frame: #GstBaseParseFrame.
900 * @skipsize: How much data parent class should skip in order to find the
903 * Implementation of "handle_frame" vmethod in #GstBaseParse class.
905 * Also determines frame overhead.
906 * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have
907 * a per-frame header. LOAS has 3 bytes.
909 * We're making a couple of simplifying assumptions:
911 * 1. We count Program Configuration Elements rather than searching for them
912 * in the streams to discount them - the overhead is negligible.
914 * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16
915 * bits, which should still not be significant enough to warrant the
916 * additional parsing through the headers
918 * Returns: a #GstFlowReturn.
921 gst_aac_parse_handle_frame (GstBaseParse * parse,
922 GstBaseParseFrame * frame, gint * skipsize)
925 GstAacParse *aacparse;
926 gboolean ret = FALSE;
932 aacparse = GST_AAC_PARSE (parse);
933 buffer = frame->buffer;
935 gst_buffer_map (buffer, &map, GST_MAP_READ);
938 lost_sync = GST_BASE_PARSE_LOST_SYNC (parse);
940 if (aacparse->header_type == DSPAAC_HEADER_ADIF ||
941 aacparse->header_type == DSPAAC_HEADER_NONE) {
942 /* There is nothing to parse */
943 framesize = map.size;
946 } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) {
948 ret = gst_aac_parse_detect_stream (aacparse, map.data, map.size,
949 GST_BASE_PARSE_DRAINING (parse), &framesize, skipsize);
951 } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
952 guint needed_data = 1024;
954 ret = gst_aac_parse_check_adts_frame (aacparse, map.data, map.size,
955 GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
958 GST_DEBUG ("buffer didn't contain valid frame");
959 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
963 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
964 guint needed_data = 1024;
966 ret = gst_aac_parse_check_loas_frame (aacparse, map.data,
967 map.size, GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
970 GST_DEBUG ("buffer didn't contain valid frame");
971 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
976 GST_DEBUG ("buffer didn't contain valid frame");
977 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
981 if (G_UNLIKELY (!ret))
984 if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
988 gst_aac_parse_parse_adts_header (aacparse, map.data,
989 &rate, &channels, NULL, NULL);
991 GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels);
993 if (G_UNLIKELY (rate != aacparse->sample_rate
994 || channels != aacparse->channels)) {
995 aacparse->sample_rate = rate;
996 aacparse->channels = channels;
998 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
999 /* If linking fails, we need to return appropriate error */
1000 ret = GST_FLOW_NOT_LINKED;
1003 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1004 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1006 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
1007 gboolean setcaps = FALSE;
1010 frame->overhead = 3;
1012 if (!gst_aac_parse_read_loas_config (aacparse, map.data, map.size, &rate,
1014 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
1015 } else if (G_UNLIKELY (rate != aacparse->sample_rate
1016 || channels != aacparse->channels)) {
1017 aacparse->sample_rate = rate;
1018 aacparse->channels = channels;
1020 GST_INFO_OBJECT (aacparse, "New LOAS config: %d Hz, %d channels", rate,
1024 /* We want to set caps both at start, and when rate/channels change.
1025 Since only some LOAS frames have that info, we may receive frames
1026 before knowing about rate/channels. */
1028 || !gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (aacparse))) {
1029 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1030 /* If linking fails, we need to return appropriate error */
1031 ret = GST_FLOW_NOT_LINKED;
1034 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1035 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1040 gst_buffer_unmap (buffer, &map);
1043 /* found, skip if needed */
1052 if (ret && framesize <= map.size) {
1053 return gst_base_parse_finish_frame (parse, frame, framesize);
1061 * gst_aac_parse_start:
1062 * @parse: #GstBaseParse.
1064 * Implementation of "start" vmethod in #GstBaseParse class.
1066 * Returns: TRUE if startup succeeded.
1069 gst_aac_parse_start (GstBaseParse * parse)
1071 GstAacParse *aacparse;
1073 aacparse = GST_AAC_PARSE (parse);
1074 GST_DEBUG ("start");
1075 aacparse->frame_samples = 1024;
1076 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
1082 * gst_aac_parse_stop:
1083 * @parse: #GstBaseParse.
1085 * Implementation of "stop" vmethod in #GstBaseParse class.
1087 * Returns: TRUE is stopping succeeded.
1090 gst_aac_parse_stop (GstBaseParse * parse)
1097 gst_aac_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter)
1099 GstCaps *peercaps, *templ;
1102 templ = gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD (parse));
1103 peercaps = gst_pad_peer_query_caps (GST_BASE_PARSE_SRC_PAD (parse), filter);
1107 /* Remove the framed field */
1108 peercaps = gst_caps_make_writable (peercaps);
1109 n = gst_caps_get_size (peercaps);
1110 for (i = 0; i < n; i++) {
1111 GstStructure *s = gst_caps_get_structure (peercaps, i);
1113 gst_structure_remove_field (s, "framed");
1116 res = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
1117 gst_caps_unref (peercaps);
1118 res = gst_caps_make_writable (res);
1120 /* Append the template caps because we still want to accept
1121 * caps without any fields in the case upstream does not
1124 gst_caps_append (res, templ);
1130 GstCaps *intersection;
1133 gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
1134 gst_caps_unref (res);