2 * Copyright (C) 2016 Sebastian Dröge <sebastian@centricular.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
24 #include "gstfdkaac.h"
25 #include "gstfdkaacdec.h"
27 #include <gst/pbutils/pbutils.h>
32 * - LOAS / LATM support
36 #ifndef HAVE_FDK_AAC_0_1_4
37 #define AAC_PCM_MAX_OUTPUT_CHANNELS AAC_PCM_OUTPUT_CHANNELS
38 #define CHANNELS_CAPS_STR "channels = (int) [1, 6]"
40 #define CHANNELS_CAPS_STR "channels = (int) [1, 8]"
43 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
46 GST_STATIC_CAPS ("audio/mpeg, "
47 "mpegversion = (int) {2, 4}, "
48 "stream-format = (string) { adts, adif, raw }, " CHANNELS_CAPS_STR)
51 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
54 GST_STATIC_CAPS ("audio/x-raw, "
55 "format = (string) " GST_AUDIO_NE (S16) ", "
56 "layout = (string) interleaved, "
57 "rate = (int) [8000, 96000], " CHANNELS_CAPS_STR)
60 GST_DEBUG_CATEGORY_STATIC (gst_fdkaacdec_debug);
61 #define GST_CAT_DEFAULT gst_fdkaacdec_debug
63 static gboolean gst_fdkaacdec_start (GstAudioDecoder * dec);
64 static gboolean gst_fdkaacdec_stop (GstAudioDecoder * dec);
65 static gboolean gst_fdkaacdec_set_format (GstAudioDecoder * dec,
67 static GstFlowReturn gst_fdkaacdec_handle_frame (GstAudioDecoder * dec,
69 static void gst_fdkaacdec_flush (GstAudioDecoder * dec, gboolean hard);
71 G_DEFINE_TYPE (GstFdkAacDec, gst_fdkaacdec, GST_TYPE_AUDIO_DECODER);
72 GST_ELEMENT_REGISTER_DEFINE (fdkaacdec, "fdkaacdec", GST_RANK_MARGINAL,
76 gst_fdkaacdec_start (GstAudioDecoder * dec)
78 GstFdkAacDec *self = GST_FDKAACDEC (dec);
80 GST_DEBUG_OBJECT (self, "start");
82 gst_audio_info_init (&self->info);
83 self->sample_rate = 0;
89 gst_fdkaacdec_stop (GstAudioDecoder * dec)
91 GstFdkAacDec *self = GST_FDKAACDEC (dec);
93 GST_DEBUG_OBJECT (self, "stop");
95 g_free (self->decode_buffer);
96 self->decode_buffer = NULL;
99 aacDecoder_Close (self->dec);
106 gst_fdkaacdec_set_format (GstAudioDecoder * dec, GstCaps * caps)
108 GstFdkAacDec *self = GST_FDKAACDEC (dec);
109 TRANSPORT_TYPE transport_format;
111 const gchar *stream_format;
112 AAC_DECODER_ERROR err;
116 gst_fdkaacdec_handle_frame (dec, NULL);
117 aacDecoder_Close (self->dec);
121 s = gst_caps_get_structure (caps, 0);
122 stream_format = gst_structure_get_string (s, "stream-format");
123 if (strcmp (stream_format, "raw") == 0) {
124 transport_format = TT_MP4_RAW;
125 } else if (strcmp (stream_format, "adif") == 0) {
126 transport_format = TT_MP4_ADIF;
127 } else if (strcmp (stream_format, "adts") == 0) {
128 transport_format = TT_MP4_ADTS;
130 g_assert_not_reached ();
133 self->dec = aacDecoder_Open (transport_format, 1);
135 GST_ERROR_OBJECT (self, "Failed to open decoder");
139 if (transport_format == TT_MP4_RAW) {
140 GstBuffer *codec_data = NULL;
145 gst_structure_get (s, "codec_data", GST_TYPE_BUFFER, &codec_data, NULL);
148 GST_ERROR_OBJECT (self, "Raw AAC without codec_data not supported");
152 gst_buffer_map (codec_data, &map, GST_MAP_READ);
156 if ((err = aacDecoder_ConfigRaw (self->dec, &data, &size)) != AAC_DEC_OK) {
157 gst_buffer_unmap (codec_data, &map);
158 gst_buffer_unref (codec_data);
159 GST_ERROR_OBJECT (self, "Invalid codec_data: %d", err);
163 gst_buffer_unmap (codec_data, &map);
164 gst_buffer_unref (codec_data);
167 err = aacDecoder_SetParam (self->dec, AAC_PCM_MAX_OUTPUT_CHANNELS, 0);
168 if (err != AAC_DEC_OK) {
169 GST_ERROR_OBJECT (self, "Failed to disable downmixing: %d", err);
173 /* Choose WAV channel mapping to get interleaving even with libfdk-aac 2.0.0
174 * The pChannelIndices retain the indices from the standard MPEG mapping so
175 * we're agnostic to the actual order. */
176 err = aacDecoder_SetParam (self->dec, AAC_PCM_OUTPUT_CHANNEL_MAPPING, 1);
177 if (err != AAC_DEC_OK) {
178 GST_ERROR_OBJECT (self, "Failed to set output channel mapping: %d", err);
182 /* 64 channels * 2048 samples * 2 bytes per sample */
183 if (!self->decode_buffer) {
184 self->decode_buffer_size = 64 * 2048;
185 self->decode_buffer = g_new (gint16, self->decode_buffer_size);
192 gst_fdkaacdec_map_channels (GstFdkAacDec * self, const CStreamInfo * in,
195 GstAudioChannelPosition *positions = self->positions;
196 AUDIO_CHANNEL_TYPE *channel_types = in->pChannelType;
197 UCHAR *channel_indices = in->pChannelIndices;
198 INT i, channels = in->numChannels;
199 guint64 mask_mapped = 0;
201 #define DEF_CHANSET(name, max) \
202 GstAudioChannelPosition *set_ ## name[max] = {NULL}; \
203 guint n_ ## name = 0, mapped_ ## name = 0
205 #define PUSH_CHAN(name, index, pos_index) G_STMT_START { \
206 if ((index) >= G_N_ELEMENTS (set_ ## name)) { \
207 GST_WARNING_OBJECT (self, "Too many %s channels (%d)", \
208 #name, (gint) (index)); \
210 } else if (set_ ## name[index] != NULL) { \
211 GST_WARNING_OBJECT (self, "Channel %s[%d] already mapped", \
212 #name, (gint) (index)); \
215 GST_DEBUG_OBJECT (self, "Mapping channel %s[%d] to %d", \
216 #name, (gint) (index), (gint) pos_index); \
217 set_ ## name[index] = &positions[pos_index]; \
218 n_ ## name = MAX (n_ ## name, (index) + 1); \
222 #define SHIFT_CHAN(name, pos) G_STMT_START { \
223 if (mask_mapped & GST_AUDIO_CHANNEL_POSITION_MASK (pos)) { \
224 GST_WARNING_OBJECT (self, "Position %s already mapped", #pos); \
226 } else if (set_ ## name[mapped_ ## name] == NULL) { \
227 GST_WARNING_OBJECT (self, "Channel %s[%u] is a hole", \
228 #name, mapped_ ## name); \
231 GST_DEBUG_OBJECT (self, "Mapping channel %s[%u] to %s", \
232 #name, mapped_ ## name, #pos); \
233 *set_ ## name[mapped_ ## name ++] = GST_AUDIO_CHANNEL_POSITION_ ## pos; \
234 mask_mapped |= GST_AUDIO_CHANNEL_POSITION_MASK (pos); \
238 DEF_CHANSET (front, 7);
239 DEF_CHANSET (side, 2);
240 DEF_CHANSET (rear, 5);
241 DEF_CHANSET (lfe, 2);
242 DEF_CHANSET (top_front, 3);
243 DEF_CHANSET (top_center, 3);
244 DEF_CHANSET (top_rear, 3);
245 DEF_CHANSET (bottom_front, 3);
247 if (self->channels == channels &&
248 memcmp (self->channel_types, channel_types,
249 channels * sizeof *channel_types) == 0 &&
250 memcmp (self->channel_indices, channel_indices,
251 channels * sizeof *channel_indices) == 0) {
252 GST_TRACE_OBJECT (self, "Reusing cached positions for %d channels",
257 self->channels = channels;
258 memcpy (self->channel_types, channel_types, channels * sizeof *channel_types);
259 memcpy (self->channel_indices, channel_indices,
260 channels * sizeof *channel_indices);
263 for (i = 0; i < channels; i++) {
264 guint8 type = in->pChannelType[i];
265 guint8 index = in->pChannelIndices[i];
269 PUSH_CHAN (front, index, i);
272 PUSH_CHAN (side, index, i);
275 PUSH_CHAN (rear, index, i);
278 PUSH_CHAN (lfe, index, i);
281 PUSH_CHAN (top_front, index, i);
284 PUSH_CHAN (top_center, index, i);
287 PUSH_CHAN (top_rear, index, i);
289 #ifdef HAVE_FDK_AAC_0_1_4
290 case ACT_FRONT_BOTTOM:
291 PUSH_CHAN (bottom_front, index, i);
295 GST_INFO_OBJECT (self, "Channel %d is unpositioned", i);
298 GST_ERROR_OBJECT (self, "Channel %d has unknown type %d", i, type);
303 /* Outwards from the front center, following ISO/IEC 13818-7 8.5.2.2
304 * "Explicit channel mapping using a program_config_element()" */
307 SHIFT_CHAN (front, FRONT_CENTER);
309 SHIFT_CHAN (front, FRONT_LEFT_OF_CENTER);
310 SHIFT_CHAN (front, FRONT_RIGHT_OF_CENTER);
311 SHIFT_CHAN (front, FRONT_LEFT);
312 SHIFT_CHAN (front, FRONT_RIGHT);
313 SHIFT_CHAN (front, WIDE_LEFT);
314 SHIFT_CHAN (front, WIDE_RIGHT);
318 SHIFT_CHAN (front, FRONT_CENTER);
320 SHIFT_CHAN (front, FRONT_LEFT_OF_CENTER);
321 SHIFT_CHAN (front, FRONT_RIGHT_OF_CENTER);
322 SHIFT_CHAN (front, WIDE_LEFT);
323 SHIFT_CHAN (front, WIDE_RIGHT);
327 SHIFT_CHAN (front, FRONT_CENTER);
329 SHIFT_CHAN (front, FRONT_LEFT);
330 SHIFT_CHAN (front, FRONT_RIGHT);
334 SHIFT_CHAN (front, FRONT_CENTER);
341 SHIFT_CHAN (side, SIDE_LEFT);
342 SHIFT_CHAN (side, SIDE_RIGHT);
346 GST_ERROR_OBJECT (self, "Single side channel not supported");
350 /* Inwards to the rear center */
353 SHIFT_CHAN (rear, SURROUND_LEFT);
354 SHIFT_CHAN (rear, SURROUND_RIGHT);
355 SHIFT_CHAN (rear, REAR_LEFT);
356 SHIFT_CHAN (rear, REAR_RIGHT);
357 SHIFT_CHAN (rear, REAR_CENTER);
361 SHIFT_CHAN (rear, SURROUND_LEFT);
362 SHIFT_CHAN (rear, SURROUND_RIGHT);
363 SHIFT_CHAN (rear, REAR_LEFT);
364 SHIFT_CHAN (rear, REAR_RIGHT);
368 SHIFT_CHAN (rear, SURROUND_LEFT);
369 SHIFT_CHAN (rear, SURROUND_RIGHT);
370 SHIFT_CHAN (rear, REAR_CENTER);
374 SHIFT_CHAN (rear, SURROUND_LEFT);
375 SHIFT_CHAN (rear, SURROUND_RIGHT);
379 SHIFT_CHAN (rear, REAR_CENTER);
385 SHIFT_CHAN (lfe, LFE1);
386 SHIFT_CHAN (lfe, LFE2);
390 SHIFT_CHAN (lfe, LFE1);
394 switch (n_top_front) {
396 SHIFT_CHAN (top_front, TOP_FRONT_CENTER);
398 SHIFT_CHAN (top_front, TOP_FRONT_LEFT);
399 SHIFT_CHAN (top_front, TOP_FRONT_RIGHT);
403 SHIFT_CHAN (top_front, TOP_FRONT_CENTER);
407 switch (n_top_center) {
409 SHIFT_CHAN (top_center, TOP_CENTER);
411 SHIFT_CHAN (top_center, TOP_SIDE_LEFT);
412 SHIFT_CHAN (top_center, TOP_SIDE_RIGHT);
416 SHIFT_CHAN (top_center, TOP_CENTER);
420 switch (n_top_rear) {
422 SHIFT_CHAN (top_rear, TOP_REAR_LEFT);
423 SHIFT_CHAN (top_rear, TOP_REAR_RIGHT);
424 SHIFT_CHAN (top_rear, TOP_REAR_CENTER);
428 SHIFT_CHAN (top_rear, TOP_REAR_LEFT);
429 SHIFT_CHAN (top_rear, TOP_REAR_RIGHT);
433 SHIFT_CHAN (top_rear, TOP_REAR_CENTER);
437 switch (n_bottom_front) {
439 SHIFT_CHAN (bottom_front, BOTTOM_FRONT_CENTER);
441 SHIFT_CHAN (bottom_front, BOTTOM_FRONT_LEFT);
442 SHIFT_CHAN (bottom_front, BOTTOM_FRONT_RIGHT);
446 SHIFT_CHAN (bottom_front, BOTTOM_FRONT_CENTER);
450 if (mask_mapped != 0) {
451 GST_INFO_OBJECT (self, "Mapped %d front, %d side, %d rear, %d lfe,"
452 " %d top front, %d top center, %d top rear, %d bottom front channels",
453 mapped_front, mapped_side, mapped_rear, mapped_lfe, mapped_top_front,
454 mapped_top_center, mapped_top_rear, mapped_bottom_front);
459 GST_INFO_OBJECT (self, "Mapped a mono channel");
460 positions[0] = GST_AUDIO_CHANNEL_POSITION_MONO;
466 GST_WARNING_OBJECT (self, "Mapped %d channels, without positions",
468 for (i = 0; i < channels; i++)
469 positions[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
473 GST_ERROR_OBJECT (self, "No channels to map");
482 gst_fdkaacdec_map_channel_config (GstFdkAacDec * self, const CStreamInfo * in,
485 const GstFdkAacChannelLayout *layout;
486 CHANNEL_MODE config = in->channelConfig;
487 INT channels = in->numChannels;
490 return gst_fdkaacdec_map_channels (self, in, updated);
493 if (self->config == config && self->channels == channels) {
494 GST_TRACE_OBJECT (self,
495 "Reusing cached positions for channelConfig %d (%d channels)",
500 self->config = config;
501 self->channels = channels;
504 for (layout = channel_layouts; layout->channels; layout++) {
505 if (layout->mode == config && layout->channels == channels)
509 if (!layout->channels) {
510 GST_WARNING_OBJECT (self, "Unknown channelConfig %d (%d channels)",
512 return gst_fdkaacdec_map_channels (self, in, updated);
515 GST_INFO_OBJECT (self, "Known channelConfig %d (%d channels)",
517 memcpy (self->positions, layout->positions,
518 channels * sizeof *self->positions);
524 gst_fdkaacdec_update_info (GstFdkAacDec * self)
526 GstAudioChannelPosition positions[64];
527 GstAudioInfo *info = &self->info;
528 gint channels = self->channels;
530 memcpy (positions, self->positions, channels * sizeof *positions);
532 if (!gst_audio_channel_positions_to_valid_order (positions, channels)) {
533 GST_ERROR_OBJECT (self, "Failed to reorder channels");
537 gst_audio_info_set_format (info, GST_AUDIO_FORMAT_S16, self->sample_rate,
538 channels, positions);
540 if (!gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (self), info)) {
541 GST_ERROR_OBJECT (self, "Failed to set output format");
545 self->need_reorder = memcmp (positions, self->positions,
546 channels * sizeof *positions) != 0;
551 gst_fdkaacdec_handle_frame (GstAudioDecoder * dec, GstBuffer * inbuf)
553 GstFdkAacDec *self = GST_FDKAACDEC (dec);
554 GstFlowReturn ret = GST_FLOW_OK;
557 AAC_DECODER_ERROR err;
560 CStreamInfo *stream_info;
561 gboolean updated = FALSE;
564 gst_buffer_ref (inbuf);
565 gst_buffer_map (inbuf, &imap, GST_MAP_READ);
566 valid = size = imap.size;
568 err = aacDecoder_Fill (self->dec, (guint8 **) & imap.data, &size, &valid);
569 if (err != AAC_DEC_OK) {
570 GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL),
571 ("filling error: %d", err), ret);
575 if (GST_BUFFER_IS_DISCONT (inbuf)) {
576 flags |= AACDEC_INTR;
579 flags |= AACDEC_FLUSH;
582 err = aacDecoder_DecodeFrame (self->dec, self->decode_buffer,
583 self->decode_buffer_size, flags);
584 if (err == AAC_DEC_TRANSPORT_SYNC_ERROR) {
588 } else if ((err != AAC_DEC_OK) && (flags & AACDEC_FLUSH)) {
590 * A flush/drain was requested when set_format got called. When a flush
591 * gets requested, aacDecoder_DecodeFrame may not return AAC_DEC_OK. Do
592 * not report a decoding error with GST_AUDIO_DECODER_ERROR for this case.
594 GST_LOG_OBJECT (self, "Decoder flush was requested");
597 } else if (err != AAC_DEC_OK) {
598 GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL),
599 ("decoding error: %d", err), ret);
603 stream_info = aacDecoder_GetStreamInfo (self->dec);
605 GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL),
606 ("failed to get stream info"), ret);
610 if (stream_info->sampleRate != self->sample_rate) {
611 self->sample_rate = stream_info->sampleRate;
615 if (!gst_fdkaacdec_map_channel_config (self, stream_info, &updated)) {
616 ret = GST_FLOW_NOT_NEGOTIATED;
620 if (updated && !gst_fdkaacdec_update_info (self)) {
621 ret = GST_FLOW_NOT_NEGOTIATED;
626 gst_audio_decoder_allocate_output_buffer (dec,
627 stream_info->frameSize * GST_AUDIO_INFO_BPF (&self->info));
629 gst_buffer_fill (outbuf, 0, self->decode_buffer,
630 gst_buffer_get_size (outbuf));
632 if (self->need_reorder) {
633 gst_audio_buffer_reorder_channels (outbuf,
634 GST_AUDIO_INFO_FORMAT (&self->info),
635 GST_AUDIO_INFO_CHANNELS (&self->info),
636 self->positions, self->info.position);
640 ret = gst_audio_decoder_finish_frame (dec, outbuf, 1);
645 gst_buffer_unmap (inbuf, &imap);
646 gst_buffer_unref (inbuf);
653 gst_fdkaacdec_flush (GstAudioDecoder * dec, gboolean hard)
655 GstFdkAacDec *self = GST_FDKAACDEC (dec);
658 AAC_DECODER_ERROR err;
659 err = aacDecoder_DecodeFrame (self->dec, self->decode_buffer,
660 self->decode_buffer_size, AACDEC_FLUSH);
661 if (err != AAC_DEC_OK) {
662 GST_ERROR_OBJECT (self, "flushing error: %d", err);
668 gst_fdkaacdec_init (GstFdkAacDec * self)
672 gst_audio_decoder_set_drainable (GST_AUDIO_DECODER (self), TRUE);
673 gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (self), TRUE);
677 gst_fdkaacdec_class_init (GstFdkAacDecClass * klass)
679 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
680 GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass);
682 base_class->start = GST_DEBUG_FUNCPTR (gst_fdkaacdec_start);
683 base_class->stop = GST_DEBUG_FUNCPTR (gst_fdkaacdec_stop);
684 base_class->set_format = GST_DEBUG_FUNCPTR (gst_fdkaacdec_set_format);
685 base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_fdkaacdec_handle_frame);
686 base_class->flush = GST_DEBUG_FUNCPTR (gst_fdkaacdec_flush);
688 gst_element_class_add_static_pad_template (element_class, &sink_template);
689 gst_element_class_add_static_pad_template (element_class, &src_template);
691 gst_element_class_set_static_metadata (element_class, "FDK AAC audio decoder",
692 "Codec/Decoder/Audio", "FDK AAC audio decoder",
693 "Sebastian Dröge <sebastian@centricular.com>");
695 GST_DEBUG_CATEGORY_INIT (gst_fdkaacdec_debug, "fdkaacdec", 0,