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 "gstaacparse.h"
50 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
53 GST_STATIC_CAPS ("audio/mpeg, "
54 "framed = (boolean) true, " "mpegversion = (int) { 2, 4 }, "
55 "stream-format = (string) { raw, adts, adif };"));
57 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
60 GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) { 2, 4 };"));
62 GST_DEBUG_CATEGORY_STATIC (aacparse_debug);
63 #define GST_CAT_DEFAULT aacparse_debug
66 #define ADIF_MAX_SIZE 40 /* Should be enough */
67 #define ADTS_MAX_SIZE 10 /* Should be enough */
70 #define AAC_FRAME_DURATION(parse) (GST_SECOND/parse->frames_per_sec)
72 gboolean gst_aac_parse_start (GstBaseParse * parse);
73 gboolean gst_aac_parse_stop (GstBaseParse * parse);
75 static gboolean gst_aac_parse_sink_setcaps (GstBaseParse * parse,
78 gboolean gst_aac_parse_check_valid_frame (GstBaseParse * parse,
79 GstBaseParseFrame * frame, guint * size, gint * skipsize);
81 GstFlowReturn gst_aac_parse_parse_frame (GstBaseParse * parse,
82 GstBaseParseFrame * frame);
84 gboolean gst_aac_parse_convert (GstBaseParse * parse,
86 gint64 src_value, GstFormat dest_format, gint64 * dest_value);
88 gint gst_aac_parse_get_frame_overhead (GstBaseParse * parse,
91 gboolean gst_aac_parse_event (GstBaseParse * parse, GstEvent * event);
93 G_DEFINE_TYPE (GstAacParse, gst_aac_parse, GST_TYPE_BASE_PARSE);
96 gst_aac_parse_get_sample_rate_from_index (guint sr_idx)
98 static const guint aac_sample_rates[] = { 96000, 88200, 64000, 48000, 44100,
99 32000, 24000, 22050, 16000, 12000, 11025, 8000
102 if (sr_idx < G_N_ELEMENTS (aac_sample_rates))
103 return aac_sample_rates[sr_idx];
104 GST_WARNING ("Invalid sample rate index %u", sr_idx);
109 * gst_aac_parse_class_init:
110 * @klass: #GstAacParseClass.
114 gst_aac_parse_class_init (GstAacParseClass * klass)
116 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
117 GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
119 GST_DEBUG_CATEGORY_INIT (aacparse_debug, "aacparse", 0,
120 "AAC audio stream parser");
122 gst_element_class_add_pad_template (element_class,
123 gst_static_pad_template_get (&sink_template));
124 gst_element_class_add_pad_template (element_class,
125 gst_static_pad_template_get (&src_template));
127 gst_element_class_set_details_simple (element_class,
128 "AAC audio stream parser", "Codec/Parser/Audio",
129 "Advanced Audio Coding parser", "Stefan Kost <stefan.kost@nokia.com>");
131 parse_class->start = GST_DEBUG_FUNCPTR (gst_aac_parse_start);
132 parse_class->stop = GST_DEBUG_FUNCPTR (gst_aac_parse_stop);
133 parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_aac_parse_sink_setcaps);
134 parse_class->parse_frame = GST_DEBUG_FUNCPTR (gst_aac_parse_parse_frame);
135 parse_class->check_valid_frame =
136 GST_DEBUG_FUNCPTR (gst_aac_parse_check_valid_frame);
141 * gst_aac_parse_init:
142 * @aacparse: #GstAacParse.
143 * @klass: #GstAacParseClass.
147 gst_aac_parse_init (GstAacParse * aacparse)
149 GST_DEBUG ("initialized");
154 * gst_aac_parse_set_src_caps:
155 * @aacparse: #GstAacParse.
156 * @sink_caps: (proposed) caps of sink pad
158 * Set source pad caps according to current knowledge about the
161 * Returns: TRUE if caps were successfully set.
164 gst_aac_parse_set_src_caps (GstAacParse * aacparse, GstCaps * sink_caps)
167 GstCaps *src_caps = NULL;
168 gboolean res = FALSE;
169 const gchar *stream_format;
171 GST_DEBUG_OBJECT (aacparse, "sink caps: %" GST_PTR_FORMAT, sink_caps);
173 src_caps = gst_caps_copy (sink_caps);
175 src_caps = gst_caps_new_empty_simple ("audio/mpeg");
177 gst_caps_set_simple (src_caps, "framed", G_TYPE_BOOLEAN, TRUE,
178 "mpegversion", G_TYPE_INT, aacparse->mpegversion, NULL);
180 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";
191 stream_format = NULL;
194 s = gst_caps_get_structure (src_caps, 0);
195 if (aacparse->sample_rate > 0)
196 gst_structure_set (s, "rate", G_TYPE_INT, aacparse->sample_rate, NULL);
197 if (aacparse->channels > 0)
198 gst_structure_set (s, "channels", G_TYPE_INT, aacparse->channels, NULL);
200 gst_structure_set (s, "stream-format", G_TYPE_STRING, stream_format, NULL);
202 GST_DEBUG_OBJECT (aacparse, "setting src caps: %" GST_PTR_FORMAT, src_caps);
204 res = gst_pad_set_caps (GST_BASE_PARSE (aacparse)->srcpad, src_caps);
205 gst_caps_unref (src_caps);
211 * gst_aac_parse_sink_setcaps:
215 * Implementation of "set_sink_caps" vmethod in #GstBaseParse class.
217 * Returns: TRUE on success.
220 gst_aac_parse_sink_setcaps (GstBaseParse * parse, GstCaps * caps)
222 GstAacParse *aacparse;
223 GstStructure *structure;
227 aacparse = GST_AAC_PARSE (parse);
228 structure = gst_caps_get_structure (caps, 0);
229 caps_str = gst_caps_to_string (caps);
231 GST_DEBUG_OBJECT (aacparse, "setcaps: %s", caps_str);
234 /* This is needed at least in case of RTP
235 * Parses the codec_data information to get ObjectType,
236 * number of channels and samplerate */
237 value = gst_structure_get_value (structure, "codec_data");
239 GstBuffer *buf = gst_value_get_buffer (value);
246 data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
248 sr_idx = ((data[0] & 0x07) << 1) | ((data[1] & 0x80) >> 7);
249 aacparse->object_type = (data[0] & 0xf8) >> 3;
250 aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
251 aacparse->channels = (data[1] & 0x78) >> 3;
252 aacparse->header_type = DSPAAC_HEADER_NONE;
253 aacparse->mpegversion = 4;
254 aacparse->frame_samples = (data[1] & 4) ? 960 : 1024;
255 gst_buffer_unmap (buf, data, size);
257 GST_DEBUG ("codec_data: object_type=%d, sample_rate=%d, channels=%d, "
258 "samples=%d", aacparse->object_type, aacparse->sample_rate,
259 aacparse->channels, aacparse->frame_samples);
261 /* arrange for metadata and get out of the way */
262 gst_aac_parse_set_src_caps (aacparse, caps);
263 gst_base_parse_set_passthrough (parse, TRUE);
267 /* caps info overrides */
268 gst_structure_get_int (structure, "rate", &aacparse->sample_rate);
269 gst_structure_get_int (structure, "channels", &aacparse->channels);
271 gst_base_parse_set_passthrough (parse, FALSE);
279 * gst_aac_parse_adts_get_frame_len:
280 * @data: block of data containing an ADTS header.
282 * This function calculates ADTS frame length from the given header.
284 * Returns: size of the ADTS frame.
287 gst_aac_parse_adts_get_frame_len (const guint8 * data)
289 return ((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] & 0xe0) >> 5);
294 * gst_aac_parse_check_adts_frame:
295 * @aacparse: #GstAacParse.
296 * @data: Data to be checked.
297 * @avail: Amount of data passed.
298 * @framesize: If valid ADTS frame was found, this will be set to tell the
299 * found frame size in bytes.
300 * @needed_data: If frame was not found, this may be set to tell how much
301 * more data is needed in the next round to detect the frame
302 * reliably. This may happen when a frame header candidate
303 * is found but it cannot be guaranteed to be the header without
304 * peeking the following data.
306 * Check if the given data contains contains ADTS frame. The algorithm
307 * will examine ADTS frame header and calculate the frame size. Also, another
308 * consecutive ADTS frame header need to be present after the found frame.
309 * Otherwise the data is not considered as a valid ADTS frame. However, this
310 * "extra check" is omitted when EOS has been received. In this case it is
311 * enough when data[0] contains a valid ADTS header.
313 * This function may set the #needed_data to indicate that a possible frame
314 * candidate has been found, but more data (#needed_data bytes) is needed to
315 * be absolutely sure. When this situation occurs, FALSE will be returned.
317 * When a valid frame is detected, this function will use
318 * gst_base_parse_set_min_frame_size() function from #GstBaseParse class
319 * to set the needed bytes for next frame.This way next data chunk is already
322 * Returns: TRUE if the given data contains a valid ADTS header.
325 gst_aac_parse_check_adts_frame (GstAacParse * aacparse,
326 const guint8 * data, const guint avail, gboolean drain,
327 guint * framesize, guint * needed_data)
329 if (G_UNLIKELY (avail < 2))
332 if ((data[0] == 0xff) && ((data[1] & 0xf6) == 0xf0)) {
333 *framesize = gst_aac_parse_adts_get_frame_len (data);
335 /* In EOS mode this is enough. No need to examine the data further.
336 We also relax the check when we have sync, on the assumption that
337 if we're not looking at random data, we have a much higher chance
338 to get the correct sync, and this avoids losing two frames when
339 a single bit corruption happens. */
340 if (drain || !GST_BASE_PARSE_LOST_SYNC (aacparse)) {
344 if (*framesize + ADTS_MAX_SIZE > avail) {
345 /* We have found a possible frame header candidate, but can't be
346 sure since we don't have enough data to check the next frame */
347 GST_DEBUG ("NEED MORE DATA: we need %d, available %d",
348 *framesize + ADTS_MAX_SIZE, avail);
349 *needed_data = *framesize + ADTS_MAX_SIZE;
350 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
351 *framesize + ADTS_MAX_SIZE);
355 if ((data[*framesize] == 0xff) && ((data[*framesize + 1] & 0xf6) == 0xf0)) {
356 guint nextlen = gst_aac_parse_adts_get_frame_len (data + (*framesize));
358 GST_LOG ("ADTS frame found, len: %d bytes", *framesize);
359 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
360 nextlen + ADTS_MAX_SIZE);
367 /* caller ensure sufficient data */
369 gst_aac_parse_parse_adts_header (GstAacParse * aacparse, const guint8 * data,
370 gint * rate, gint * channels, gint * object, gint * version)
374 gint sr_idx = (data[2] & 0x3c) >> 2;
376 *rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
379 *channels = ((data[2] & 0x01) << 2) | ((data[3] & 0xc0) >> 6);
382 *version = (data[1] & 0x08) ? 2 : 4;
384 *object = (data[2] & 0xc0) >> 6;
388 * gst_aac_parse_detect_stream:
389 * @aacparse: #GstAacParse.
390 * @data: A block of data that needs to be examined for stream characteristics.
391 * @avail: Size of the given datablock.
392 * @framesize: If valid stream was found, this will be set to tell the
393 * first frame size in bytes.
394 * @skipsize: If valid stream was found, this will be set to tell the first
395 * audio frame position within the given data.
397 * Examines the given piece of data and try to detect the format of it. It
398 * checks for "ADIF" header (in the beginning of the clip) and ADTS frame
399 * header. If the stream is detected, TRUE will be returned and #framesize
400 * is set to indicate the found frame size. Additionally, #skipsize might
401 * be set to indicate the number of bytes that need to be skipped, a.k.a. the
402 * position of the frame inside given data chunk.
404 * Returns: TRUE on success.
407 gst_aac_parse_detect_stream (GstAacParse * aacparse,
408 const guint8 * data, const guint avail, gboolean drain,
409 guint * framesize, gint * skipsize)
411 gboolean found = FALSE;
415 GST_DEBUG_OBJECT (aacparse, "Parsing header data");
417 /* FIXME: No need to check for ADIF if we are not in the beginning of the
420 /* Can we even parse the header? */
421 if (avail < ADTS_MAX_SIZE)
424 for (i = 0; i < avail - 4; i++) {
425 if (((data[i] == 0xff) && ((data[i + 1] & 0xf6) == 0xf0)) ||
426 strncmp ((char *) data + i, "ADIF", 4) == 0) {
430 /* Trick: tell the parent class that we didn't find the frame yet,
431 but make it skip 'i' amount of bytes. Next time we arrive
432 here we have full frame in the beginning of the data. */
445 if (gst_aac_parse_check_adts_frame (aacparse, data, avail, drain,
446 framesize, &need_data)) {
449 GST_INFO ("ADTS ID: %d, framesize: %d", (data[1] & 0x08) >> 3, *framesize);
451 aacparse->header_type = DSPAAC_HEADER_ADTS;
452 gst_aac_parse_parse_adts_header (aacparse, data, &rate, &channels,
453 &aacparse->object_type, &aacparse->mpegversion);
455 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse), rate,
456 aacparse->frame_samples, 2, 2);
458 GST_DEBUG ("ADTS: samplerate %d, channels %d, objtype %d, version %d",
459 rate, channels, aacparse->object_type, aacparse->mpegversion);
461 gst_base_parse_set_syncable (GST_BASE_PARSE (aacparse), TRUE);
464 } else if (need_data) {
465 /* This tells the parent class not to skip any data */
470 if (avail < ADIF_MAX_SIZE)
473 if (memcmp (data + i, "ADIF", 4) == 0) {
480 aacparse->header_type = DSPAAC_HEADER_ADIF;
481 aacparse->mpegversion = 4;
483 /* Skip the "ADIF" bytes */
486 /* copyright string */
488 skip_size += 9; /* skip 9 bytes */
490 bitstream_type = adif[0 + skip_size] & 0x10;
492 ((unsigned int) (adif[0 + skip_size] & 0x0f) << 19) |
493 ((unsigned int) adif[1 + skip_size] << 11) |
494 ((unsigned int) adif[2 + skip_size] << 3) |
495 ((unsigned int) adif[3 + skip_size] & 0xe0);
498 if (bitstream_type == 0) {
500 /* Buffer fullness parsing. Currently not needed... */
504 num_elems = (adif[3 + skip_size] & 0x1e);
505 GST_INFO ("ADIF num_config_elems: %d", num_elems);
507 fullness = ((unsigned int) (adif[3 + skip_size] & 0x01) << 19) |
508 ((unsigned int) adif[4 + skip_size] << 11) |
509 ((unsigned int) adif[5 + skip_size] << 3) |
510 ((unsigned int) (adif[6 + skip_size] & 0xe0) >> 5);
512 GST_INFO ("ADIF buffer fullness: %d", fullness);
514 aacparse->object_type = ((adif[6 + skip_size] & 0x01) << 1) |
515 ((adif[7 + skip_size] & 0x80) >> 7);
516 sr_idx = (adif[7 + skip_size] & 0x78) >> 3;
520 aacparse->object_type = (adif[4 + skip_size] & 0x18) >> 3;
521 sr_idx = ((adif[4 + skip_size] & 0x07) << 1) |
522 ((adif[5 + skip_size] & 0x80) >> 7);
525 /* FIXME: This gives totally wrong results. Duration calculation cannot
527 aacparse->sample_rate = gst_aac_parse_get_sample_rate_from_index (sr_idx);
529 /* baseparse is not given any fps,
530 * so it will give up on timestamps, seeking, etc */
532 /* FIXME: Can we assume this? */
533 aacparse->channels = 2;
535 GST_INFO ("ADIF: br=%d, samplerate=%d, objtype=%d",
536 aacparse->bitrate, aacparse->sample_rate, aacparse->object_type);
538 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), 512);
540 /* arrange for metadata and get out of the way */
541 sinkcaps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (aacparse));
542 gst_aac_parse_set_src_caps (aacparse, sinkcaps);
543 gst_caps_unref (sinkcaps);
545 /* not syncable, not easily seekable (unless we push data from start */
546 gst_base_parse_set_syncable (GST_BASE_PARSE_CAST (aacparse), FALSE);
547 gst_base_parse_set_passthrough (GST_BASE_PARSE_CAST (aacparse), TRUE);
548 gst_base_parse_set_average_bitrate (GST_BASE_PARSE_CAST (aacparse), 0);
554 /* This should never happen */
560 * gst_aac_parse_check_valid_frame:
561 * @parse: #GstBaseParse.
562 * @buffer: #GstBuffer.
563 * @framesize: If the buffer contains a valid frame, its size will be put here
564 * @skipsize: How much data parent class should skip in order to find the
567 * Implementation of "check_valid_frame" vmethod in #GstBaseParse class.
569 * Returns: TRUE if buffer contains a valid frame.
572 gst_aac_parse_check_valid_frame (GstBaseParse * parse,
573 GstBaseParseFrame * frame, guint * framesize, gint * skipsize)
577 GstAacParse *aacparse;
578 gboolean ret = FALSE;
582 aacparse = GST_AAC_PARSE (parse);
583 buffer = frame->buffer;
585 data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
587 lost_sync = GST_BASE_PARSE_LOST_SYNC (parse);
589 if (aacparse->header_type == DSPAAC_HEADER_ADIF ||
590 aacparse->header_type == DSPAAC_HEADER_NONE) {
591 /* There is nothing to parse */
595 } else if (aacparse->header_type == DSPAAC_HEADER_NOT_PARSED || lost_sync) {
597 ret = gst_aac_parse_detect_stream (aacparse, data, size,
598 GST_BASE_PARSE_DRAINING (parse), framesize, skipsize);
600 } else if (aacparse->header_type == DSPAAC_HEADER_ADTS) {
601 guint needed_data = 1024;
603 ret = gst_aac_parse_check_adts_frame (aacparse, data, size,
604 GST_BASE_PARSE_DRAINING (parse), framesize, &needed_data);
607 GST_DEBUG ("buffer didn't contain valid frame");
608 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
613 GST_DEBUG ("buffer didn't contain valid frame");
614 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse),
617 gst_buffer_unmap (buffer, data, size);
624 * gst_aac_parse_parse_frame:
625 * @parse: #GstBaseParse.
626 * @buffer: #GstBuffer.
628 * Implementation of "parse_frame" vmethod in #GstBaseParse class.
630 * Also determines frame overhead.
631 * ADTS streams have a 7 byte header in each frame. MP4 and ADIF streams don't have
632 * a per-frame header.
634 * We're making a couple of simplifying assumptions:
636 * 1. We count Program Configuration Elements rather than searching for them
637 * in the streams to discount them - the overhead is negligible.
639 * 2. We ignore CRC. This has a worst-case impact of (num_raw_blocks + 1)*16
640 * bits, which should still not be significant enough to warrant the
641 * additional parsing through the headers
643 * Returns: GST_FLOW_OK if frame was successfully parsed and can be pushed
644 * forward. Otherwise appropriate error is returned.
647 gst_aac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
649 GstAacParse *aacparse;
651 GstFlowReturn ret = GST_FLOW_OK;
656 aacparse = GST_AAC_PARSE (parse);
657 buffer = frame->buffer;
659 if (G_UNLIKELY (aacparse->header_type != DSPAAC_HEADER_ADTS))
665 data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
666 gst_aac_parse_parse_adts_header (aacparse, data,
667 &rate, &channels, NULL, NULL);
668 gst_buffer_unmap (buffer, data, size);
670 GST_LOG_OBJECT (aacparse, "rate: %d, chans: %d", rate, channels);
672 if (G_UNLIKELY (rate != aacparse->sample_rate
673 || channels != aacparse->channels)) {
676 aacparse->sample_rate = rate;
677 aacparse->channels = channels;
679 sinkcaps = gst_pad_get_current_caps (GST_BASE_PARSE (aacparse)->sinkpad);
680 if (!gst_aac_parse_set_src_caps (aacparse, sinkcaps)) {
681 /* If linking fails, we need to return appropriate error */
682 gst_caps_unref (sinkcaps);
683 ret = GST_FLOW_NOT_LINKED;
685 gst_caps_unref (sinkcaps);
687 gst_base_parse_set_frame_rate (GST_BASE_PARSE (aacparse),
688 aacparse->sample_rate, aacparse->frame_samples, 2, 2);
696 * gst_aac_parse_start:
697 * @parse: #GstBaseParse.
699 * Implementation of "start" vmethod in #GstBaseParse class.
701 * Returns: TRUE if startup succeeded.
704 gst_aac_parse_start (GstBaseParse * parse)
706 GstAacParse *aacparse;
708 aacparse = GST_AAC_PARSE (parse);
710 aacparse->frame_samples = 1024;
711 gst_base_parse_set_min_frame_size (GST_BASE_PARSE (aacparse), ADTS_MAX_SIZE);
717 * gst_aac_parse_stop:
718 * @parse: #GstBaseParse.
720 * Implementation of "stop" vmethod in #GstBaseParse class.
722 * Returns: TRUE is stopping succeeded.
725 gst_aac_parse_stop (GstBaseParse * parse)