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., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, 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 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 gboolean gst_aac_parse_convert (GstBaseParse * parse,
97 gint64 src_value, GstFormat dest_format, gint64 * dest_value);
99 gint gst_aac_parse_get_frame_overhead (GstBaseParse * parse,
102 gboolean gst_aac_parse_event (GstBaseParse * parse, GstEvent * event);
104 G_DEFINE_TYPE (GstAacParse, gst_aac_parse, GST_TYPE_BASE_PARSE);
107 gst_aac_parse_get_sample_rate_from_index (guint sr_idx)
109 static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, 44100,
110 32000, 24000, 22050, 16000, 12000, 11025, 8000
113 if (sr_idx < G_N_ELEMENTS (aac_sample_rates))
114 return aac_sample_rates[sr_idx];
115 GST_WARNING ("Invalid sample rate index %u", sr_idx);
120 * gst_aac_parse_class_init:
121 * @klass: #GstAacParseClass.
125 gst_aac_parse_class_init (GstAacParseClass * klass)
127 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
128 GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
130 GST_DEBUG_CATEGORY_INIT (aacparse_debug, "aacparse", 0,
131 "AAC audio stream parser");
133 gst_element_class_add_pad_template (element_class,
134 gst_static_pad_template_get (&sink_template));
135 gst_element_class_add_pad_template (element_class,
136 gst_static_pad_template_get (&src_template));
138 gst_element_class_set_details_simple (element_class,
139 "AAC audio stream parser", "Codec/Parser/Audio",
140 "Advanced Audio Coding parser", "Stefan Kost <stefan.kost@nokia.com>");
142 parse_class->start = GST_DEBUG_FUNCPTR (gst_aac_parse_start);
143 parse_class->stop = GST_DEBUG_FUNCPTR (gst_aac_parse_stop);
144 parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_setcaps);
145 parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_getcaps);
146 parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_handle_frame);
151 * gst_aac_parse_init:
152 * @aacparse: #GstAacParse.
153 * @klass: #GstAacParseClass.
157 gst_aac_parse_init (GstAacParse * aacparse)
159 GST_DEBUG ("initialized");
164 * gst_aac_parse_set_src_caps:
165 * @aacparse: #GstAacParse.
166 * @sink_caps: (proposed) caps of sink pad
168 * Set source pad caps according to current knowledge about the
171 * Returns: TRUE if caps were successfully set.
174 gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps)
177 GstCaps *src_caps = NULL;
178 gboolean res = FALSE;
179 const gchar *stream_format;
181 GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps);
183 src_caps = gst_caps_copy (sink_caps);
185 src_caps = gst_caps_new_empty_simple ("audio/mpeg");
187 gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE,
188 "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL);
190 switch (aacparse->header_type) {
191 case DSPAAC_HEADER_NONE:
192 stream_format = "raw";
194 case DSPAAC_HEADER_ADTS:
195 stream_format = "adts";
197 case DSPAAC_HEADER_ADIF:
198 stream_format = "adif";
200 case DSPAAC_HEADER_LOAS:
201 stream_format = "loas";
204 stream_format = NULL;
207 s = gst_caps_get_structure (src_caps, 0);
208 if (aacparse->sample_rate > 0)
209 gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL);
210 if (aacparse->channels > 0)
211 gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL);
213 gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL);
215 GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
217 res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
218 gst_caps_unref (src_caps);
224 * gst_aac_parse_sink_setcaps:
228 * Implementation of "set_sink_caps" vmethod in #GstBaseParse class.
230 * Returns: TRUE on success.
233 gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
235 GstAacParse *aacparse;
236 GstStructure *structure;
240 aacparse = GST_AAC_PARSE (parse);
241 structure = gst_caps_get_structure (caps, 0);
242 caps_str = gst_caps_to_string (caps);
244 GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str);
247 /* This is needed at least in case of RTP
248 * Parses the codec_data information to get ObjectType,
249 * number of channels and samplerate */
250 value = gst_structure_get_value (structure, "codec_data");
252 GstBuffer *buf = gst_value_get_buffer (value);
258 gst_buffer_map (buf, &map, GST_MAP_READ);
260 sr_idx = ((map.data[0] & 0x07) << 1) | ((map.data[1] & 0x80) >> 7);
261 aacparse->object_type = (map.data[0] & 0xf8) >> 3;
262 aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
263 aacparse->channels = (map.data[1] & 0x78) >> 3;
264 aacparse->header_type = DSPAAC_HEADER_NONE;
265 aacparse->mpegversion = 4;
266 aacparse->frame_samples = (map.data[1] & 4) ? 960 : 1024;
267 gst_buffer_unmap (buf, &map);
269 GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, "
270 "samples=%d", aacparse->object_type, aacparse->sample_rate,
271 aacparse->channels, aacparse->frame_samples);
273 /* arrange for metadata and get out of the way */
274 gst_aac_parse_set_src_caps (aacparse, caps);
275 gst_base_parse_set_passthrough (parse, TRUE);
279 /* caps info overrides */
280 gst_structure_get_int (structure, "rate", &aacparse->sample_rate);
281 gst_structure_get_int (structure, "channels", &aacparse->channels);
283 gst_base_parse_set_passthrough (parse, FALSE);
291 * gst_aac_parse_adts_get_frame_len:
292 * @data: block of data containing an ADTS header.
294 * This function calculates ADTS frame length from the given header.
296 * Returns: size of the ADTS frame.
299 gst_aac_parse_adts_get_frame_len (const guint8 * data)
301 return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5);
306 * gst_aac_parse_check_adts_frame:
307 * @aacparse: #GstAacParse.
308 * @data: Data to be checked.
309 * @avail: Amount of data passed.
310 * @framesize: If valid ADTS frame was found, this will be set to tell the
311 * found frame size in bytes.
312 * @needed_data: If frame was not found, this may be set to tell how much
313 * more data is needed in the next round to detect the frame
314 * reliably. This may happen when a frame header candidate
315 * is found but it cannot be guaranteed to be the header without
316 * peeking the following data.
318 * Check if the given data contains contains ADTS frame. The algorithm
319 * will examine ADTS frame header and calculate the frame size. Also, another
320 * consecutive ADTS frame header need to be present after the found frame.
321 * Otherwise the data is not considered as a valid ADTS frame. However, this
322 * "extra check" is omitted when EOS has been received. In this case it is
323 * enough when data[0] contains a valid ADTS header.
325 * This function may set the #needed_data to indicate that a possible frame
326 * candidate has been found, but more data (#needed_data bytes) is needed to
327 * be absolutely sure. When this situation occurs, FALSE will be returned.
329 * When a valid frame is detected, this function will use
330 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
331 * to set the needed bytes for next frame.This way next data chunk is already
334 * Returns: TRUE if the given data contains a valid ADTS header.
337 gst_aac_parse_check_adts_frame (GstAacParse * aacparse,
338 const guint8 * data, const guint avail, gboolean drain,
339 guint * framesize, guint * needed_data)
343 if (G_UNLIKELY (avail < 2))
346 if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) {
347 *framesize = gst_aac_parse_adts_get_frame_len (data);
349 /* In EOS mode this is enough. No need to examine the data further.
350 We also relax the check when we have sync, on the assumption that
351 if we're not looking at random data, we have a much higher chance
352 to get the correct sync, and this avoids losing two frames when
353 a single bit corruption happens. */
354 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
358 if (*framesize + ADTS_MAX_SIZE > avail) {
359 /* We have found a possible frame header candidate, but can't be
360 sure since we don't have enough data to check the next frame */
361 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
362 *framesize + ADTS_MAX_SIZE, avail);
363 *needed_data = *framesize + ADTS_MAX_SIZE;
364 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
365 *framesize + ADTS_MAX_SIZE);
369 if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) {
370 guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize));
372 GST_LOG ("ADTS frame found, len: %d bytes", *framesize);
373 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
374 nextlen + ADTS_MAX_SIZE);
382 gst_aac_parse_latm_get_value (GstAacParse * aacparse, GstBitReader * br,
385 guint8 bytes, i, byte;
388 if (!gst_bit_reader_get_bits_uint8 (br, &bytes, 2))
390 for (i = 0; i < bytes; ++i) {
392 if (!gst_bit_reader_get_bits_uint8 (br, &byte, 8))
400 gst_aac_parse_get_audio_object_type (GstAacParse * aacparse, GstBitReader * br,
401 guint8 * audio_object_type)
403 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 5))
405 if (*audio_object_type == 31) {
406 if (!gst_bit_reader_get_bits_uint8 (br, audio_object_type, 6))
408 *audio_object_type += 32;
410 GST_LOG_OBJECT (aacparse, "audio object type %u", *audio_object_type);
415 gst_aac_parse_get_audio_sample_rate (GstAacParse * aacparse, GstBitReader * br,
418 guint8 sampling_frequency_index;
419 if (!gst_bit_reader_get_bits_uint8 (br, &sampling_frequency_index, 4))
421 GST_LOG_OBJECT (aacparse, "sampling_frequency_index: %u",
422 sampling_frequency_index);
423 if (sampling_frequency_index == 0xf) {
424 guint32 sampling_rate;
425 if (!gst_bit_reader_get_bits_uint32 (br, &sampling_rate, 24))
427 *sample_rate = sampling_rate;
429 *sample_rate = loas_sample_rate_table[sampling_frequency_index];
436 /* See table 1.13 in ISO/IEC 14496-3 */
438 gst_aac_parse_read_loas_audio_specific_config (GstAacParse * aacparse,
439 GstBitReader * br, gint * sample_rate, gint * channels, guint32 * bits)
441 guint8 audio_object_type, channel_configuration;
443 if (!gst_aac_parse_get_audio_object_type (aacparse, br, &audio_object_type))
446 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
449 if (!gst_bit_reader_get_bits_uint8 (br, &channel_configuration, 4))
451 GST_LOG_OBJECT (aacparse, "channel_configuration: %d", channel_configuration);
452 *channels = loas_channels_table[channel_configuration];
456 if (audio_object_type == 5) {
457 GST_LOG_OBJECT (aacparse,
458 "Audio object type 5, so rereading sampling rate...");
459 if (!gst_aac_parse_get_audio_sample_rate (aacparse, br, sample_rate))
463 GST_INFO_OBJECT (aacparse, "Found LOAS config: %d Hz, %d channels",
464 *sample_rate, *channels);
466 /* There's LOTS of stuff next, but we ignore it for now as we have
467 what we want (sample rate and number of channels */
468 GST_DEBUG_OBJECT (aacparse,
469 "Need more code to parse humongous LOAS data, currently ignored");
477 gst_aac_parse_read_loas_config (GstAacParse * aacparse, const guint8 * data,
478 guint avail, gint * sample_rate, gint * channels, gint * version)
483 /* No version in the bitstream, but the spec has LOAS in the MPEG-4 section */
487 gst_bit_reader_init (&br, data, avail);
489 /* skip sync word (11 bits) and size (13 bits) */
490 gst_bit_reader_skip (&br, 11 + 13);
492 /* First bit is "use last config" */
493 if (!gst_bit_reader_get_bits_uint8 (&br, &u8, 1))
496 GST_DEBUG_OBJECT (aacparse, "Frame uses previous config");
497 if (!aacparse->sample_rate || !aacparse->channels) {
498 GST_WARNING_OBJECT (aacparse, "No previous config to use");
500 *sample_rate = aacparse->sample_rate;
501 *channels = aacparse->channels;
505 GST_DEBUG_OBJECT (aacparse, "Frame contains new config");
507 if (!gst_bit_reader_get_bits_uint8 (&br, &v, 1))
510 if (!gst_bit_reader_get_bits_uint8 (&br, &vA, 1))
515 GST_LOG_OBJECT (aacparse, "v %d, vA %d", v, vA);
517 guint8 same_time, subframes, num_program, prog;
520 if (!gst_aac_parse_latm_get_value (aacparse, &br, &value))
523 if (!gst_bit_reader_get_bits_uint8 (&br, &same_time, 1))
525 if (!gst_bit_reader_get_bits_uint8 (&br, &subframes, 6))
527 if (!gst_bit_reader_get_bits_uint8 (&br, &num_program, 4))
529 GST_LOG_OBJECT (aacparse, "same_time %d, subframes %d, num_program %d",
530 same_time, subframes, num_program);
532 for (prog = 0; prog <= num_program; ++prog) {
533 guint8 num_layer, layer;
534 if (!gst_bit_reader_get_bits_uint8 (&br, &num_layer, 3))
536 GST_LOG_OBJECT (aacparse, "Program %d: %d layers", prog, num_layer);
538 for (layer = 0; layer <= num_layer; ++layer) {
539 guint8 use_same_config;
540 if (prog == 0 && layer == 0) {
543 if (!gst_bit_reader_get_bits_uint8 (&br, &use_same_config, 1))
546 if (!use_same_config) {
548 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
549 sample_rate, channels, NULL))
552 guint32 bits, asc_len;
553 if (!gst_aac_parse_latm_get_value (aacparse, &br, &asc_len))
555 if (!gst_aac_parse_read_loas_audio_specific_config (aacparse, &br,
556 sample_rate, channels, &bits))
559 gst_bit_reader_skip (&br, asc_len);
564 GST_WARNING_OBJECT (aacparse, "More data ignored");
566 GST_WARNING_OBJECT (aacparse, "Spec says \"TBD\"...");
572 * gst_aac_parse_loas_get_frame_len:
573 * @data: block of data containing a LOAS header.
575 * This function calculates LOAS frame length from the given header.
577 * Returns: size of the LOAS frame.
580 gst_aac_parse_loas_get_frame_len (const guint8 * data)
582 return (((data[1] & 0x1f) << 8) | data[2]) + 3;
587 * gst_aac_parse_check_loas_frame:
588 * @aacparse: #GstAacParse.
589 * @data: Data to be checked.
590 * @avail: Amount of data passed.
591 * @framesize: If valid LOAS frame was found, this will be set to tell the
592 * found frame size in bytes.
593 * @needed_data: If frame was not found, this may be set to tell how much
594 * more data is needed in the next round to detect the frame
595 * reliably. This may happen when a frame header candidate
596 * is found but it cannot be guaranteed to be the header without
597 * peeking the following data.
599 * Check if the given data contains contains LOAS frame. The algorithm
600 * will examine LOAS frame header and calculate the frame size. Also, another
601 * consecutive LOAS frame header need to be present after the found frame.
602 * Otherwise the data is not considered as a valid LOAS frame. However, this
603 * "extra check" is omitted when EOS has been received. In this case it is
604 * enough when data[0] contains a valid LOAS header.
606 * This function may set the #needed_data to indicate that a possible frame
607 * candidate has been found, but more data (#needed_data bytes) is needed to
608 * be absolutely sure. When this situation occurs, FALSE will be returned.
610 * When a valid frame is detected, this function will use
611 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
612 * to set the needed bytes for next frame.This way next data chunk is already
615 * LOAS can have three different formats, if I read the spec correctly. Only
616 * one of them is supported here, as the two samples I have use this one.
618 * Returns: TRUE if the given data contains a valid LOAS header.
621 gst_aac_parse_check_loas_frame (GstAacParse * aacparse,
622 const guint8 * data, const guint avail, gboolean drain,
623 guint * framesize, guint * needed_data)
628 if (G_UNLIKELY (avail < 3))
631 if ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) {
632 *framesize = gst_aac_parse_loas_get_frame_len (data);
633 GST_DEBUG_OBJECT (aacparse, "Found %u byte LOAS frame", *framesize);
635 /* In EOS mode this is enough. No need to examine the data further.
636 We also relax the check when we have sync, on the assumption that
637 if we're not looking at random data, we have a much higher chance
638 to get the correct sync, and this avoids losing two frames when
639 a single bit corruption happens. */
640 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
644 if (*framesize + LOAS_MAX_SIZE > avail) {
645 /* We have found a possible frame header candidate, but can't be
646 sure since we don't have enough data to check the next frame */
647 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
648 *framesize + LOAS_MAX_SIZE, avail);
649 *needed_data = *framesize + LOAS_MAX_SIZE;
650 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
651 *framesize + LOAS_MAX_SIZE);
655 if ((data[*framesize] == 0x56) && ((data[*framesize + 1] & 0xe0) == 0xe0)) {
656 guint nextlen = gst_aac_parse_loas_get_frame_len (data + (*framesize));
658 GST_LOG ("LOAS frame found, len: %d bytes", *framesize);
659 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
660 nextlen + LOAS_MAX_SIZE);
667 /* caller ensure sufficient data */
669 gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data,
670 gint * rate, gint * channels, gint * object, gint * version)
674 gint sr_idx = (data[2] & 0x3c) >> 2;
676 *rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
679 *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6);
682 *version = (data[1] & 0x08) ? 2 : 4;
684 *object = (data[2] & 0xc0) >> 6;
688 * gst_aac_parse_detect_stream:
689 * @aacparse: #GstAacParse.
690 * @data: A block of data that needs to be examined for stream characteristics.
691 * @avail: Size of the given datablock.
692 * @framesize: If valid stream was found, this will be set to tell the
693 * first frame size in bytes.
694 * @skipsize: If valid stream was found, this will be set to tell the first
695 * audio frame position within the given data.
697 * Examines the given piece of data and try to detect the format of it. It
698 * checks for "ADIF" header (in the beginning of the clip) and ADTS frame
699 * header. If the stream is detected, TRUE will be returned and #framesize
700 * is set to indicate the found frame size. Additionally, #skipsize might
701 * be set to indicate the number of bytes that need to be skipped, a.k.a. the
702 * position of the frame inside given data chunk.
704 * Returns: TRUE on success.
707 gst_aac_parse_detect_stream (GstAacParse * aacparse,
708 const guint8 * data, const guint avail, gboolean drain,
709 guint * framesize, gint * skipsize)
711 gboolean found = FALSE;
712 guint need_data_adts = 0, need_data_loas;
715 GST_DEBUG_OBJECT (aacparse, "Parsing header data");
717 /* FIXME: No need to check for ADIF if we are not in the beginning of the
720 /* Can we even parse the header? */
721 if (avail < MAX (ADTS_MAX_SIZE, LOAS_MAX_SIZE)) {
722 GST_DEBUG_OBJECT (aacparse, "Not enough data to check");
726 for (i = 0; i < avail - 4; i++) {
727 if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) ||
728 ((data[0] == 0x56) && ((data[1] & 0xe0) == 0xe0)) ||
729 strncmp ((char *) data + i, "ADIF", 4) == 0) {
730 GST_DEBUG_OBJECT (aacparse, "Found ADIF signature at offset %u", i);
734 /* Trick: tell the parent class that we didn't find the frame yet,
735 but make it skip 'i' amount of bytes. Next time we arrive
736 here we have full frame in the beginning of the data. */
749 if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain,
750 framesize, &need_data_adts)) {
753 GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize);
755 aacparse->header_type = DSPAAC_HEADER_ADTS;
756 gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels,
757 &aacparse->object_type, &aacparse->mpegversion);
759 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
760 aacparse->frame_samples, 2, 2);
762 GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d",
763 rate, channels, aacparse->object_type, aacparse->mpegversion);
765 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
770 if (gst_aac_parse_check_loas_frame (aacparse, data, avail, drain,
771 framesize, &need_data_loas)) {
774 GST_INFO ("LOAS, framesize: %d", *framesize);
776 aacparse->header_type = DSPAAC_HEADER_LOAS;
778 if (!gst_aac_parse_read_loas_config (aacparse, data, avail, &rate,
779 &channels, &aacparse->mpegversion)) {
780 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
784 if (rate && channels) {
785 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
786 aacparse->frame_samples, 2, 2);
788 GST_DEBUG ("LOAS: samplerate %d, channels %d, objtype %d, version %d",
789 rate, channels, aacparse->object_type, aacparse->mpegversion);
790 aacparse->sample_rate = rate;
791 aacparse->channels = channels;
794 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
799 if (need_data_adts || need_data_loas) {
800 /* This tells the parent class not to skip any data */
805 if (avail < ADIF_MAX_SIZE)
808 if (memcmp (data + i, "ADIF", 4) == 0) {
815 aacparse->header_type = DSPAAC_HEADER_ADIF;
816 aacparse->mpegversion = 4;
818 /* Skip the "ADIF" bytes */
821 /* copyright string */
823 skip_size += 9; /* skip 9 bytes */
825 bitstream_type = adif[0 + skip_size] & 0x10;
827 ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) |
828 ((unsigned int) adif[1 + skip_size] << 11) |
829 ((unsigned int) adif[2 + skip_size] << 3) |
830 ((unsigned int) adif[3 + skip_size] & 0xe0);
833 if (bitstream_type == 0) {
835 /* Buffer fullness parsing. Currently not needed... */
839 num_elems = (adif[3 + skip_size] & 0x1e);
840 GST_INFO ("ADIF num_config_elems: %d", num_elems);
842 fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) |
843 ((unsigned int) adif[4 + skip_size] << 11) |
844 ((unsigned int) adif[5 + skip_size] << 3) |
845 ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5);
847 GST_INFO ("ADIF buffer fullness: %d", fullness);
849 aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) |
850 ((adif[7 + skip_size] & 0x80) >> 7);
851 sr_idx = (adif[7 + skip_size] & 0x78) >> 3;
855 aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3;
856 sr_idx = ((adif[4 + skip_size] & 0x07) << 1) |
857 ((adif[5 + skip_size] & 0x80) >> 7);
860 /* FIXME: This gives totally wrong results. Duration calculation cannot
862 aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
864 /* baseparse is not given any fps,
865 * so it will give up on timestamps, seeking, etc */
867 /* FIXME: Can we assume this? */
868 aacparse->channels = 2;
870 GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d",
871 aacparse->bitrate, aacparse->sample_rate, aacparse->object_type);
873 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512);
875 /* arrange for metadata and get out of the way */
876 sinkcaps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (aacparse));
877 gst_aac_parse_set_src_caps (aacparse, sinkcaps);
879 gst_caps_unref (sinkcaps);
881 /* not syncable, not easily seekable (unless we push data from start */
882 gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE);
883 gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE);
884 gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0);
890 /* This should never happen */
896 * gst_aac_parse_check_valid_frame:
897 * @parse: #GstBaseParse.
898 * @frame: #GstBaseParseFrame.
899 * @skipsize: How much data parent class should skip in order to find the
902 * Implementation of "handle_frame" vmethod in #GstBaseParse class.
904 * Also determines frame overhead.
905 * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have
906 * a per-frame header. LOAS has 3 bytes.
908 * We're making a couple of simplifying assumptions:
910 * 1. We count Program Configuration Elements rather than searching for them
911 * in the streams to discount them - the overhead is negligible.
913 * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16
914 * bits, which should still not be significant enough to warrant the
915 * additional parsing through the headers
917 * Returns: a #GstFlowReturn.
920 gst_aac_parse_handle_frame (GstBaseParse * parse,
921 GstBaseParseFrame * frame, gint * skipsize)
924 GstAacParse *aacparse;
925 gboolean ret = FALSE;
931 aacparse = GST_AAC_PARSE (parse);
932 buffer = frame->buffer;
934 gst_buffer_map (buffer, &map, GST_MAP_READ);
937 lost_sync = GST_BASE_PARSE_LOST_SYNC (parse);
939 if (aacparse->header_type == DSPAAC_HEADER_ADIF ||
940 aacparse->header_type == DSPAAC_HEADER_NONE) {
941 /* There is nothing to parse */
942 framesize = map.size;
945 } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) {
947 ret = gst_aac_parse_detect_stream (aacparse, map.data, map.size,
948 GST_BASE_PARSE_DRAINING (parse), &framesize, skipsize);
950 } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
951 guint needed_data = 1024;
953 ret = gst_aac_parse_check_adts_frame (aacparse, map.data, map.size,
954 GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
957 GST_DEBUG ("buffer didn't contain valid frame");
958 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
962 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
963 guint needed_data = 1024;
965 ret = gst_aac_parse_check_loas_frame (aacparse, map.data,
966 map.size, GST_BASE_PARSE_DRAINING (parse), &framesize, &needed_data);
969 GST_DEBUG ("buffer didn't contain valid frame");
970 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
975 GST_DEBUG ("buffer didn't contain valid frame");
976 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
980 if (G_UNLIKELY (!ret))
983 if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
987 gst_aac_parse_parse_adts_header (aacparse, map.data,
988 &rate, &channels, NULL, NULL);
990 GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels);
992 if (G_UNLIKELY (rate != aacparse->sample_rate
993 || channels != aacparse->channels)) {
994 aacparse->sample_rate = rate;
995 aacparse->channels = channels;
997 GST_DEBUG_OBJECT (aacparse, "here");
999 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1000 /* If linking fails, we need to return appropriate error */
1001 ret = GST_FLOW_NOT_LINKED;
1004 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1005 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1007 } else if (aacparse->header_type == DSPAAC_HEADER_LOAS) {
1008 gboolean setcaps = FALSE;
1011 frame->overhead = 3;
1013 if (!gst_aac_parse_read_loas_config (aacparse, map.data, map.size, &rate,
1015 GST_WARNING_OBJECT (aacparse, "Error reading LOAS config");
1016 } else if (G_UNLIKELY (rate != aacparse->sample_rate
1017 || channels != aacparse->channels)) {
1018 aacparse->sample_rate = rate;
1019 aacparse->channels = channels;
1021 GST_INFO_OBJECT (aacparse, "New LOAS config: %d Hz, %d channels", rate,
1025 /* We want to set caps both at start, and when rate/channels change.
1026 Since only some LOAS frames have that info, we may receive frames
1027 before knowing about rate/channels. */
1029 || !gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (aacparse))) {
1030 if (!gst_aac_parse_set_src_caps (aacparse, NULL)) {
1031 /* If linking fails, we need to return appropriate error */
1032 ret = GST_FLOW_NOT_LINKED;
1035 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
1036 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
1041 gst_buffer_unmap (buffer, &map);
1044 /* found, skip if needed */
1053 if (ret && framesize <= map.size) {
1054 return gst_base_parse_finish_frame (parse, frame, framesize);
1062 * gst_aac_parse_start:
1063 * @parse: #GstBaseParse.
1065 * Implementation of "start" vmethod in #GstBaseParse class.
1067 * Returns: TRUE if startup succeeded.
1070 gst_aac_parse_start (GstBaseParse * parse)
1072 GstAacParse *aacparse;
1074 aacparse = GST_AAC_PARSE (parse);
1075 GST_DEBUG ("start");
1076 aacparse->frame_samples = 1024;
1077 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
1083 * gst_aac_parse_stop:
1084 * @parse: #GstBaseParse.
1086 * Implementation of "stop" vmethod in #GstBaseParse class.
1088 * Returns: TRUE is stopping succeeded.
1091 gst_aac_parse_stop (GstBaseParse * parse)
1098 gst_aac_parse_sink_getcaps (GstBaseParse * parse, GstCaps * filter)
1103 /* FIXME: handle filter caps */
1105 peercaps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (parse));
1109 /* Remove the framed field */
1110 peercaps = gst_caps_make_writable (peercaps);
1111 n = gst_caps_get_size (peercaps);
1112 for (i = 0; i < n; i++) {
1113 GstStructure *s = gst_caps_get_structure (peercaps, i);
1115 gst_structure_remove_field (s, "framed");
1119 gst_caps_intersect_full (peercaps,
1120 gst_pad_get_pad_template_caps (GST_BASE_PARSE_SRC_PAD (parse)),
1121 GST_CAPS_INTERSECT_FIRST);
1122 gst_caps_unref (peercaps);
1125 gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_PARSE_SINK_PAD