1 /*****************************************************************************
2 * mpeg4audio.c: parse and packetize an MPEG 4 audio stream
3 *****************************************************************************
4 * Copyright (C) 2001, 2002, 2006 VLC authors and VideoLAN
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@netcourrier.com>
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation; either version 2.1 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this program; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
36 #include <vlc_block.h>
39 #include <vlc_block_helper.h>
40 #include "packetizer_helper.h"
46 * AudioObjectType 5 bits
47 * samplingFrequencyIndex 4 bits
48 * if (samplingFrequencyIndex == 0xF)
49 * samplingFrequency 24 bits
50 * channelConfiguration 4 bits
52 * FrameLengthFlag 1 bit 1024 or 960
53 * DependsOnCoreCoder 1 bit (always 0)
54 * ExtensionFlag 1 bit (always 0)
57 /*****************************************************************************
58 * decoder_sys_t : decoder descriptor
59 *****************************************************************************/
65 int i_sbr; // 0: no sbr, 1: sbr, -1: unknown
66 int i_ps; // 0: no ps, 1: ps, -1: unknown
75 int i_frame_length; // 1024 or 960
79 #define LATM_MAX_EXTRA_SIZE 64
85 int i_frame_length_type;
86 int i_frame_length; // type 1
87 int i_frame_length_index; // type 3 4 5 6 7
91 /* Raw configuration */
93 uint8_t extra[LATM_MAX_EXTRA_SIZE];
97 #define LATM_MAX_LAYER (8)
98 #define LATM_MAX_PROGRAM (16)
101 int b_same_time_framing;
105 int pi_layers[LATM_MAX_PROGRAM];
107 int pi_stream[LATM_MAX_PROGRAM][LATM_MAX_LAYER];
110 latm_stream_t stream[LATM_MAX_PROGRAM*LATM_MAX_LAYER];
113 int i_crc; /* -1 if not set */
124 block_bytestream_t bytestream;
133 unsigned int i_channels;
134 unsigned int i_rate, i_frame_length, i_header_size;
150 static const int pi_sample_rates[16] =
152 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
153 16000, 12000, 11025, 8000, 7350, 0, 0, 0
156 #define ADTS_HEADER_SIZE 9
157 #define LOAS_HEADER_SIZE 3
159 /****************************************************************************
161 ****************************************************************************/
162 static int OpenPacketizer(vlc_object_t *);
163 static void ClosePacketizer(vlc_object_t *);
165 static block_t *PacketizeRawBlock (decoder_t *, block_t **);
166 static block_t *PacketizeStreamBlock(decoder_t *, block_t **);
168 /*****************************************************************************
170 *****************************************************************************/
172 set_category(CAT_SOUT)
173 set_subcategory(SUBCAT_SOUT_PACKETIZER)
174 set_description(N_("MPEG4 audio packetizer"))
175 set_capability("packetizer", 50)
176 set_callbacks(OpenPacketizer, ClosePacketizer)
179 /*****************************************************************************
180 * OpenPacketizer: probe the packetizer and return score
181 *****************************************************************************/
182 static int OpenPacketizer(vlc_object_t *p_this)
184 decoder_t *p_dec = (decoder_t*)p_this;
185 decoder_sys_t *p_sys;
187 if (p_dec->fmt_in.i_codec != VLC_CODEC_MP4A)
190 /* Allocate the memory needed to store the decoder's structure */
191 if ((p_dec->p_sys = p_sys = (decoder_sys_t *)malloc(sizeof(decoder_sys_t))) == NULL)
195 p_sys->i_state = STATE_NOSYNC;
196 date_Set(&p_sys->end_date, 0);
197 block_BytestreamInit(&p_sys->bytestream);
198 p_sys->b_latm_cfg = false;
200 /* Set output properties */
201 p_dec->fmt_out.i_cat = AUDIO_ES;
202 p_dec->fmt_out.i_codec = VLC_CODEC_MP4A;
204 msg_Dbg(p_dec, "running MPEG4 audio packetizer");
206 if (p_dec->fmt_in.i_extra > 0) {
207 uint8_t *p_config = (uint8_t*)p_dec->fmt_in.p_extra;
210 i_index = ((p_config[0] << 1) | (p_config[1] >> 7)) & 0x0f;
211 if (i_index != 0x0f) {
212 p_dec->fmt_out.audio.i_rate = pi_sample_rates[i_index];
213 p_dec->fmt_out.audio.i_frame_length =
214 ((p_config[1] >> 2) & 0x01) ? 960 : 1024;
216 p_dec->fmt_out.audio.i_rate = ((p_config[1] & 0x7f) << 17) |
217 (p_config[2] << 9) | (p_config[3] << 1) |
219 p_dec->fmt_out.audio.i_frame_length =
220 ((p_config[4] >> 2) & 0x01) ? 960 : 1024;
223 p_dec->fmt_out.audio.i_channels =
224 (p_config[i_index == 0x0f ? 4 : 1] >> 3) & 0x0f;
226 msg_Dbg(p_dec, "AAC %dHz %d samples/frame",
227 p_dec->fmt_out.audio.i_rate,
228 p_dec->fmt_out.audio.i_frame_length);
230 date_Init(&p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1);
232 p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
233 p_dec->fmt_out.p_extra = malloc(p_dec->fmt_in.i_extra);
234 if (!p_dec->fmt_out.p_extra) {
235 p_dec->fmt_out.i_extra = 0;
238 memcpy(p_dec->fmt_out.p_extra, p_dec->fmt_in.p_extra,
239 p_dec->fmt_in.i_extra);
242 p_dec->pf_packetize = PacketizeRawBlock;
243 p_sys->i_type = TYPE_RAW;
245 msg_Dbg(p_dec, "no decoder specific info, must be an ADTS or LOAS stream");
247 date_Init(&p_sys->end_date, p_dec->fmt_in.audio.i_rate, 1);
249 /* We will try to create a AAC Config from adts/loas */
250 p_dec->fmt_out.i_extra = 0;
251 p_dec->fmt_out.p_extra = NULL;
254 p_dec->pf_packetize = PacketizeStreamBlock;
255 p_sys->i_type = TYPE_NONE;
261 /****************************************************************************
262 * PacketizeRawBlock: the whole thing
263 ****************************************************************************
264 * This function must be fed with complete frames.
265 ****************************************************************************/
266 static block_t *PacketizeRawBlock(decoder_t *p_dec, block_t **pp_block)
268 decoder_sys_t *p_sys = p_dec->p_sys;
271 if (!pp_block || !*pp_block)
274 if ((*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
275 date_Set(&p_sys->end_date, 0);
276 block_Release(*pp_block);
281 *pp_block = NULL; /* Don't reuse this block */
283 if (!date_Get(&p_sys->end_date) && p_block->i_pts <= VLC_TS_INVALID) {
284 /* We've just started the stream, wait for the first PTS. */
285 block_Release(p_block);
287 } else if (p_block->i_pts > VLC_TS_INVALID &&
288 p_block->i_pts != date_Get(&p_sys->end_date)) {
289 date_Set(&p_sys->end_date, p_block->i_pts);
292 p_block->i_pts = p_block->i_dts = date_Get(&p_sys->end_date);
294 p_block->i_length = date_Increment(&p_sys->end_date,
295 p_dec->fmt_out.audio.i_frame_length) - p_block->i_pts;
300 /****************************************************************************
302 ****************************************************************************/
303 static int ADTSSyncInfo(decoder_t * p_dec, const uint8_t * p_buf,
304 unsigned int * pi_channels,
305 unsigned int * pi_sample_rate,
306 unsigned int * pi_frame_length,
307 unsigned int * pi_header_size)
309 int i_profile, i_sample_rate_idx, i_frame_size;
312 /* Fixed header between frames */
313 //int i_id = ((p_buf[1] >> 3) & 0x01) ? 2 : 4; /* MPEG-2 or 4 */
314 b_crc = !(p_buf[1] & 0x01);
315 i_profile = p_buf[2] >> 6;
316 i_sample_rate_idx = (p_buf[2] >> 2) & 0x0f;
317 *pi_sample_rate = pi_sample_rates[i_sample_rate_idx];
318 //private_bit = (p_buf[2] >> 1) & 0x01;
319 *pi_channels = ((p_buf[2] & 0x01) << 2) | ((p_buf[3] >> 6) & 0x03);
320 if (*pi_channels == 0) /* workaround broken streams */
322 //original_copy = (p_buf[3] >> 5) & 0x01;
323 //home = (p_buf[3] >> 4) & 0x01;
325 /* Variable header */
326 //copyright_id_bit = (p_buf[3] >> 3) & 0x01;
327 //copyright_id_start = (p_buf[3] >> 2) & 0x01;
328 i_frame_size = ((p_buf[3] & 0x03) << 11) | (p_buf[4] << 3) |
329 ((p_buf[5] >> 5) /*& 0x7*/);
330 //uint16_t buffer_fullness = ((p_buf[5] & 0x1f) << 6) | (p_buf[6] >> 2);
331 unsigned short i_raw_blocks_in_frame = p_buf[6] & 0x03;
333 if (!*pi_sample_rate || !i_frame_size) {
334 msg_Warn(p_dec, "Invalid ADTS header");
338 *pi_frame_length = 1024;
340 if (i_raw_blocks_in_frame == 0) {
342 msg_Warn(p_dec, "ADTS CRC not supported");
343 //uint16_t crc = (p_buf[7] << 8) | p_buf[8];
346 msg_Err(p_dec, "Multiple blocks per frame in ADTS not supported");
350 const uint8_t *p_pos = p_buf + 7;
352 uint16_t i_block_pos[3];
354 for (i = 0 ; i < i_raw_blocks_in_frame ; i++) {
355 /* the 1st block's position is known ... */
356 i_block_pos[i] = (*p_pos << 8) | *(p_pos+1);
359 crc_block = (*p_pos << 8) | *(p_pos+1);
362 for (i = 0 ; i <= i_raw_blocks_in_frame ; i++) {
365 msg_Err(p_dec, "ADTS CRC not supported");
366 //uint16_t crc = (*p_pos << 8) | *(p_pos+1);
374 /* Build the decoder specific info header */
375 if (!p_dec->fmt_out.i_extra) {
376 p_dec->fmt_out.p_extra = malloc(2);
377 if (!p_dec->fmt_out.p_extra) {
378 p_dec->fmt_out.i_extra = 0;
381 p_dec->fmt_out.i_extra = 2;
382 ((uint8_t *)p_dec->fmt_out.p_extra)[0] =
383 (i_profile + 1) << 3 | (i_sample_rate_idx >> 1);
384 ((uint8_t *)p_dec->fmt_out.p_extra)[1] =
385 ((i_sample_rate_idx & 0x01) << 7) | (*pi_channels <<3);
388 /* ADTS header length */
389 *pi_header_size = b_crc ? 9 : 7;
391 return i_frame_size - *pi_header_size;
394 /****************************************************************************
396 ****************************************************************************/
397 static int LOASSyncInfo(uint8_t p_header[LOAS_HEADER_SIZE], unsigned int *pi_header_size)
400 return ((p_header[1] & 0x1f) << 8) + p_header[2];
403 static int Mpeg4GAProgramConfigElement(bs_t *s)
405 /* TODO compute channels count ? */
406 int i_tag = bs_read(s, 4);
409 bs_skip(s, 2 + 4); // object type + sampling index
410 int i_num_front = bs_read(s, 4);
411 int i_num_side = bs_read(s, 4);
412 int i_num_back = bs_read(s, 4);
413 int i_num_lfe = bs_read(s, 2);
414 int i_num_assoc_data = bs_read(s, 3);
415 int i_num_valid_cc = bs_read(s, 4);
418 bs_skip(s, 4); // mono downmix
420 bs_skip(s, 4); // stereo downmix
422 bs_skip(s, 2+1); // matrix downmix + pseudo_surround
424 bs_skip(s, i_num_front * (1+4));
425 bs_skip(s, i_num_side * (1+4));
426 bs_skip(s, i_num_back * (1+4));
427 bs_skip(s, i_num_lfe * (4));
428 bs_skip(s, i_num_assoc_data * (4));
429 bs_skip(s, i_num_valid_cc * (5));
431 int i_comment = bs_read(s, 8);
432 bs_skip(s, i_comment * 8);
436 static int Mpeg4GASpecificConfig(mpeg4_cfg_t *p_cfg, bs_t *s)
438 p_cfg->i_frame_length = bs_read1(s) ? 960 : 1024;
440 if (bs_read1(s)) // depend on core coder
441 bs_skip(s, 14); // core coder delay
443 int i_extension_flag = bs_read1(s);
444 if (p_cfg->i_channel == 0)
445 Mpeg4GAProgramConfigElement(s);
446 if (p_cfg->i_object_type == 6 || p_cfg->i_object_type == 20)
447 bs_skip(s, 3); // layer
449 if (i_extension_flag) {
450 if (p_cfg->i_object_type == 22)
451 bs_skip(s, 5 + 11); // numOfSubFrame + layer length
452 if (p_cfg->i_object_type == 17 || p_cfg->i_object_type == 19 ||
453 p_cfg->i_object_type == 20 || p_cfg->i_object_type == 23)
454 bs_skip(s, 1+1+1); // ER data : section scale spectral */
455 if (bs_read1(s)) // extension 3
456 fprintf(stderr, "Mpeg4GASpecificConfig: error 1\n");
461 static int Mpeg4ReadAudioObjectType(bs_t *s)
463 int i_type = bs_read(s, 5);
465 i_type = 32 + bs_read(s, 6);
469 static int Mpeg4ReadAudioSamplerate(bs_t *s)
471 int i_index = bs_read(s, 4);
473 return pi_sample_rates[i_index];
474 return bs_read(s, 24);
477 static int Mpeg4ReadAudioSpecificInfo(mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_t *p_extra, bs_t *s, int i_max_size)
480 static const char *ppsz_otype[] = {
482 "AAC Main", "AAC LC", "AAC SSR", "AAC LTP", "SBR", "AAC Scalable",
485 "Reserved", "Reserved",
487 "Main Synthetic", "Wavetables Synthesis", "General MIDI",
488 "Algorithmic Synthesis and Audio FX",
491 "ER AAC LTP", "ER AAC Scalable", "ER TwinVQ", "ER BSAC", "ER AAC LD",
492 "ER CELP", "ER HVXC", "ER HILN", "ER Parametric",
494 "PS", "Reserved", "Escape",
495 "Layer 1", "Layer 2", "Layer 3",
499 const int i_pos_start = bs_pos(s);
504 memset(p_cfg, 0, sizeof(*p_cfg));
507 p_cfg->i_object_type = Mpeg4ReadAudioObjectType(s);
508 p_cfg->i_samplerate = Mpeg4ReadAudioSamplerate(s);
510 p_cfg->i_channel = bs_read(s, 4);
511 if (p_cfg->i_channel == 7)
512 p_cfg->i_channel = 8; // 7.1
513 else if (p_cfg->i_channel >= 8)
514 p_cfg->i_channel = -1;
518 p_cfg->extension.i_object_type = 0;
519 p_cfg->extension.i_samplerate = 0;
520 if (p_cfg->i_object_type == 5 || p_cfg->i_object_type == 29) {
522 if (p_cfg->i_object_type == 29)
524 p_cfg->extension.i_object_type = 5;
525 p_cfg->extension.i_samplerate = Mpeg4ReadAudioSamplerate(s);
527 p_cfg->i_object_type = Mpeg4ReadAudioObjectType(s);
530 switch(p_cfg->i_object_type)
532 case 1: case 2: case 3: case 4:
534 case 17: case 19: case 20: case 21: case 22: case 23:
535 Mpeg4GASpecificConfig(p_cfg, s);
538 // CelpSpecificConfig();
541 // HvxcSpecificConfig();
544 // TTSSSpecificConfig();
546 case 13: case 14: case 15: case 16:
547 // StructuredAudioSpecificConfig();
550 // ERCelpSpecificConfig();
553 // ERHvxcSpecificConfig();
556 // ParametricSpecificConfig();
559 // SSCSpecificConfig();
561 case 32: case 33: case 34:
562 // MPEG_1_2_SpecificConfig();
565 // DSTSpecificConfig();
568 // ALSSpecificConfig();
574 switch(p_cfg->i_object_type)
576 case 17: case 19: case 20: case 21: case 22: case 23:
577 case 24: case 25: case 26: case 27:
579 int epConfig = bs_read(s, 2);
580 if (epConfig == 2 || epConfig == 3)
581 //ErrorProtectionSpecificConfig();
584 // TODO : directMapping
592 if (p_cfg->extension.i_object_type != 5 && i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 16 &&
593 bs_read(s, 11) == 0x2b7) {
594 p_cfg->extension.i_object_type = Mpeg4ReadAudioObjectType(s);
595 if (p_cfg->extension.i_object_type == 5) {
596 p_cfg->i_sbr = bs_read1(s);
597 if (p_cfg->i_sbr == 1) {
598 p_cfg->extension.i_samplerate = Mpeg4ReadAudioSamplerate(s);
599 if (i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 12 && bs_read(s, 11) == 0x548)
600 p_cfg->i_ps = bs_read1(s);
605 //fprintf(stderr, "Mpeg4ReadAudioSpecificInfo: t=%s(%d)f=%d c=%d sbr=%d\n",
606 // ppsz_otype[p_cfg->i_object_type], p_cfg->i_object_type, p_cfg->i_samplerate, p_cfg->i_channel, p_cfg->i_sbr);
608 i_bits = bs_pos(s) - i_pos_start;
610 *pi_extra = __MIN((i_bits + 7) / 8, LATM_MAX_EXTRA_SIZE);
611 for (i = 0; i < *pi_extra; i++) {
612 const int i_read = __MIN(8, i_bits - 8*i);
613 p_extra[i] = bs_read(&s_sav, i_read) << (8-i_read);
618 static int LatmGetValue(bs_t *s)
620 int i_bytes = bs_read(s, 2);
622 for (int i = 0; i < i_bytes; i++)
623 v = (v << 8) + bs_read(s, 8);
628 static int LatmReadStreamMuxConfiguration(latm_mux_t *m, bs_t *s)
633 i_mux_version = bs_read(s, 1);
636 i_mux_versionA = bs_read(s, 1);
638 if (i_mux_versionA != 0) /* support only A=0 */
641 memset(m, 0, sizeof(*m));
643 if (i_mux_versionA == 0)
644 if (i_mux_version == 1)
645 LatmGetValue(s); /* taraBufferFullness */
647 m->b_same_time_framing = bs_read1(s);
648 m->i_sub_frames = 1 + bs_read(s, 6);
649 m->i_programs = 1 + bs_read(s, 4);
651 for (int i_program = 0; i_program < m->i_programs; i_program++) {
652 m->pi_layers[i_program] = 1+bs_read(s, 3);
654 for (int i_layer = 0; i_layer < m->pi_layers[i_program]; i_layer++) {
655 latm_stream_t *st = &m->stream[m->i_streams];
658 m->pi_stream[i_program][i_layer] = m->i_streams;
659 st->i_program = i_program;
660 st->i_layer = i_layer;
662 b_previous_cfg = false;
663 if (i_program != 0 || i_layer != 0)
664 b_previous_cfg = bs_read1(s);
666 if (b_previous_cfg) {
667 assert(m->i_streams > 0);
668 st->cfg = m->stream[m->i_streams-1].cfg;
671 if (i_mux_version == 1)
672 i_cfg_size = LatmGetValue(s);
673 i_cfg_size -= Mpeg4ReadAudioSpecificInfo(&st->cfg, &st->i_extra, st->extra, s, i_cfg_size);
675 bs_skip(s, i_cfg_size);
678 st->i_frame_length_type = bs_read(s, 3);
679 switch(st->i_frame_length_type)
683 bs_skip(s, 8); /* latmBufferFullnes */
684 if (!m->b_same_time_framing)
685 if (st->cfg.i_object_type == 6 || st->cfg.i_object_type == 20 ||
686 st->cfg.i_object_type == 8 || st->cfg.i_object_type == 24)
687 bs_skip(s, 6); /* eFrameOffset */
691 st->i_frame_length = bs_read(s, 9);
693 case 3: case 4: case 5:
694 st->i_frame_length_index = bs_read(s, 6); // celp
697 st->i_frame_length_index = bs_read(s, 1); // hvxc
708 if (i_mux_version == 1)
709 m->i_other_data = LatmGetValue(s);
713 b_continue = bs_read1(s);
714 m->i_other_data = (m->i_other_data << 8) + bs_read(s, 8);
715 } while (b_continue);
722 m->i_crc = bs_read(s, 8);
727 static int LOASParse(decoder_t *p_dec, uint8_t *p_buffer, int i_buffer)
729 decoder_sys_t *p_sys = p_dec->p_sys;
731 int i_accumulated = 0;
733 bs_init(&s, p_buffer, i_buffer);
735 /* Read the stream mux configuration if present */
736 if (!bs_read1(&s) && !LatmReadStreamMuxConfiguration(&p_sys->latm, &s) &&
737 p_sys->latm.i_streams > 0) {
738 const latm_stream_t *st = &p_sys->latm.stream[0];
740 p_sys->i_channels = st->cfg.i_channel;
741 p_sys->i_rate = st->cfg.i_samplerate;
742 p_sys->i_frame_length = st->cfg.i_frame_length;
744 /* FIXME And if it changes ? */
745 if (p_sys->i_channels && p_sys->i_rate && p_sys->i_frame_length > 0) {
746 if (!p_dec->fmt_out.i_extra && st->i_extra > 0) {
747 p_dec->fmt_out.i_extra = st->i_extra;
748 p_dec->fmt_out.p_extra = malloc(st->i_extra);
749 if (!p_dec->fmt_out.p_extra) {
750 p_dec->fmt_out.i_extra = 0;
753 memcpy(p_dec->fmt_out.p_extra, st->extra, st->i_extra);
755 p_sys->b_latm_cfg = true;
759 /* Wait for the configuration */
760 if (!p_sys->b_latm_cfg)
763 /* FIXME do we need to split the subframe into independent packet ? */
764 if (p_sys->latm.i_sub_frames > 1)
765 msg_Err(p_dec, "latm sub frames not yet supported, please send a sample");
767 for (int i_sub = 0; i_sub < p_sys->latm.i_sub_frames; i_sub++) {
768 int pi_payload[LATM_MAX_PROGRAM][LATM_MAX_LAYER];
769 if (p_sys->latm.b_same_time_framing) {
771 for (int i_program = 0; i_program < p_sys->latm.i_programs; i_program++) {
772 for (int i_layer = 0; i_layer < p_sys->latm.pi_layers[i_program]; i_layer++) {
773 latm_stream_t *st = &p_sys->latm.stream[p_sys->latm.pi_stream[i_program][i_layer]];
774 if (st->i_frame_length_type == 0) {
777 int i_tmp = bs_read(&s, 8);
782 pi_payload[i_program][i_layer] = i_payload;
783 } else if (st->i_frame_length_type == 1) {
784 pi_payload[i_program][i_layer] = st->i_frame_length / 8; /* XXX not correct */
785 } else if ((st->i_frame_length_type == 3) ||
786 (st->i_frame_length_type == 5) ||
787 (st->i_frame_length_type == 7)) {
788 bs_skip(&s, 2); // muxSlotLengthCoded
789 pi_payload[i_program][i_layer] = 0; /* TODO */
791 pi_payload[i_program][i_layer] = 0; /* TODO */
797 for (int i_program = 0; i_program < p_sys->latm.i_programs; i_program++) {
798 for (int i_layer = 0; i_layer < p_sys->latm.pi_layers[i_program]; i_layer++) {
799 /* XXX we only extract 1 stream */
800 if (i_program != 0 || i_layer != 0)
803 if (pi_payload[i_program][i_layer] <= 0)
806 /* FIXME that's slow (and a bit ugly to write in place) */
807 for (int i = 0; i < pi_payload[i_program][i_layer]; i++) {
808 if (i_accumulated >= i_buffer)
810 p_buffer[i_accumulated++] = bs_read(&s, 8);
815 const int i_chunks = bs_read(&s, 4);
819 msg_Err(p_dec, "latm without same time frameing not yet supported, please send a sample");
821 for (int i_chunk = 0; i_chunk < i_chunks; i_chunk++) {
822 const int streamIndex = bs_read(&s, 4);
823 latm_stream_t *st = &p_sys->latm.stream[streamIndex];
824 const int i_program = st->i_program;
825 const int i_layer = st->i_layer;
827 pi_program[i_chunk] = i_program;
828 pi_layer[i_chunk] = i_layer;
830 if (st->i_frame_length_type == 0) {
833 int i_tmp = bs_read(&s, 8);
838 pi_payload[i_program][i_layer] = i_payload;
839 bs_skip(&s, 1); // auEndFlag
840 } else if (st->i_frame_length_type == 1) {
841 pi_payload[i_program][i_layer] = st->i_frame_length / 8; /* XXX not correct */
842 } else if ((st->i_frame_length_type == 3) ||
843 (st->i_frame_length_type == 5) ||
844 (st->i_frame_length_type == 7)) {
845 bs_read(&s, 2); // muxSlotLengthCoded
848 for (int i_chunk = 0; i_chunk < i_chunks; i_chunk++) {
849 //const int i_program = pi_program[i_chunk];
850 //const int i_layer = pi_layer[i_chunk];
858 if (p_sys->latm.i_other_data > 0)
863 return i_accumulated;
866 /****************************************************************************
867 * PacketizeStreamBlock: ADTS/LOAS packetizer
868 ****************************************************************************/
869 static void SetupOutput(decoder_t *p_dec, block_t *p_block);
870 static block_t *PacketizeStreamBlock(decoder_t *p_dec, block_t **pp_block)
872 decoder_sys_t *p_sys = p_dec->p_sys;
873 uint8_t p_header[ADTS_HEADER_SIZE + LOAS_HEADER_SIZE];
874 block_t *p_out_buffer;
877 if (!pp_block || !*pp_block)
880 if ((*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
881 if ((*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED) {
882 p_sys->i_state = STATE_NOSYNC;
883 block_BytestreamEmpty(&p_sys->bytestream);
885 date_Set(&p_sys->end_date, 0);
886 block_Release(*pp_block);
890 if (!date_Get(&p_sys->end_date) && (*pp_block)->i_pts <= VLC_TS_INVALID) {
891 /* We've just started the stream, wait for the first PTS. */
892 block_Release(*pp_block);
896 block_BytestreamPush(&p_sys->bytestream, *pp_block);
900 switch(p_sys->i_state)
904 while (block_PeekBytes(&p_sys->bytestream, p_header, 2)
907 /* Look for sync word - should be 0xfff(adts) or 0x2b7(loas) */
908 if (p_header[0] == 0xff && (p_header[1] & 0xf6) == 0xf0) {
909 if (p_sys->i_type != TYPE_ADTS)
910 msg_Dbg(p_dec, "detected ADTS format");
912 p_sys->i_state = STATE_SYNC;
913 p_sys->i_type = TYPE_ADTS;
915 } else if (p_header[0] == 0x56 && (p_header[1] & 0xe0) == 0xe0) {
916 if (p_sys->i_type != TYPE_LOAS)
917 msg_Dbg(p_dec, "detected LOAS format");
919 p_sys->i_state = STATE_SYNC;
920 p_sys->i_type = TYPE_LOAS;
923 block_SkipByte(&p_sys->bytestream);
925 if (p_sys->i_state != STATE_SYNC) {
926 block_BytestreamFlush(&p_sys->bytestream);
933 /* New frame, set the Presentation Time Stamp */
934 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
935 if (p_sys->i_pts > VLC_TS_INVALID &&
936 p_sys->i_pts != date_Get(&p_sys->end_date))
937 date_Set(&p_sys->end_date, p_sys->i_pts);
938 p_sys->i_state = STATE_HEADER;
942 if (p_sys->i_type == TYPE_ADTS) {
943 /* Get ADTS frame header (ADTS_HEADER_SIZE bytes) */
944 if (block_PeekBytes(&p_sys->bytestream, p_header,
945 ADTS_HEADER_SIZE) != VLC_SUCCESS)
946 return NULL; /* Need more data */
948 /* Check if frame is valid and get frame info */
949 p_sys->i_frame_size = ADTSSyncInfo(p_dec, p_header,
952 &p_sys->i_frame_length,
953 &p_sys->i_header_size);
955 assert(p_sys->i_type == TYPE_LOAS);
956 /* Get LOAS frame header (LOAS_HEADER_SIZE bytes) */
957 if (block_PeekBytes(&p_sys->bytestream, p_header,
958 LOAS_HEADER_SIZE) != VLC_SUCCESS)
959 return NULL; /* Need more data */
961 /* Check if frame is valid and get frame info */
962 p_sys->i_frame_size = LOASSyncInfo(p_header, &p_sys->i_header_size);
965 if (p_sys->i_frame_size <= 0) {
966 msg_Dbg(p_dec, "emulated sync word");
967 block_SkipByte(&p_sys->bytestream);
968 p_sys->i_state = STATE_NOSYNC;
972 p_sys->i_state = STATE_NEXT_SYNC;
974 case STATE_NEXT_SYNC:
975 /* TODO: If p_block == NULL, flush the buffer without checking the
977 if (p_sys->bytestream.p_block == NULL) {
978 p_sys->i_state = STATE_NOSYNC;
979 block_BytestreamFlush(&p_sys->bytestream);
983 /* Check if next expected frame contains the sync word */
984 if (block_PeekOffsetBytes(&p_sys->bytestream, p_sys->i_frame_size
985 + p_sys->i_header_size, p_header, 2) != VLC_SUCCESS)
986 return NULL; /* Need more data */
988 assert((p_sys->i_type == TYPE_ADTS) || (p_sys->i_type == TYPE_LOAS));
989 if (((p_sys->i_type == TYPE_ADTS) &&
990 (p_header[0] != 0xff || (p_header[1] & 0xf6) != 0xf0)) ||
991 ((p_sys->i_type == TYPE_LOAS) &&
992 (p_header[0] != 0x56 || (p_header[1] & 0xe0) != 0xe0))) {
993 msg_Dbg(p_dec, "emulated sync word "
994 "(no sync on following frame)");
995 p_sys->i_state = STATE_NOSYNC;
996 block_SkipByte(&p_sys->bytestream);
1000 p_sys->i_state = STATE_SEND_DATA;
1003 case STATE_GET_DATA:
1004 /* Make sure we have enough data.
1005 * (Not useful if we went through NEXT_SYNC) */
1006 if (block_WaitBytes(&p_sys->bytestream, p_sys->i_frame_size +
1007 p_sys->i_header_size) != VLC_SUCCESS)
1008 return NULL; /* Need more data */
1009 p_sys->i_state = STATE_SEND_DATA;
1011 case STATE_SEND_DATA:
1012 /* When we reach this point we already know we have enough
1013 * data available. */
1015 p_out_buffer = block_Alloc(p_sys->i_frame_size);
1016 if (!p_out_buffer) {
1017 //p_dec->b_error = true;
1020 p_buf = p_out_buffer->p_buffer;
1022 /* Skip the ADTS/LOAS header */
1023 block_SkipBytes(&p_sys->bytestream, p_sys->i_header_size);
1025 if (p_sys->i_type == TYPE_ADTS) {
1026 /* Copy the whole frame into the buffer */
1027 block_GetBytes(&p_sys->bytestream, p_buf, p_sys->i_frame_size);
1029 assert(p_sys->i_type == TYPE_LOAS);
1030 /* Copy the whole frame into the buffer and parse/extract it */
1031 block_GetBytes(&p_sys->bytestream, p_buf, p_sys->i_frame_size);
1032 p_out_buffer->i_buffer = LOASParse(p_dec, p_buf, p_sys->i_frame_size);
1033 if (p_out_buffer->i_buffer <= 0) {
1034 if (!p_sys->b_latm_cfg)
1035 msg_Warn(p_dec, "waiting for header");
1037 block_Release(p_out_buffer);
1038 p_out_buffer = NULL;
1039 p_sys->i_state = STATE_NOSYNC;
1043 SetupOutput(p_dec, p_out_buffer);
1044 /* Make sure we don't reuse the same pts twice */
1045 if (p_sys->i_pts == p_sys->bytestream.p_block->i_pts)
1046 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = VLC_TS_INVALID;
1048 /* So p_block doesn't get re-added several times */
1049 *pp_block = block_BytestreamPop(&p_sys->bytestream);
1051 p_sys->i_state = STATE_NOSYNC;
1053 return p_out_buffer;
1060 /*****************************************************************************
1062 *****************************************************************************/
1063 static void SetupOutput(decoder_t *p_dec, block_t *p_block)
1065 decoder_sys_t *p_sys = p_dec->p_sys;
1067 if (p_dec->fmt_out.audio.i_rate != p_sys->i_rate) {
1068 msg_Info(p_dec, "AAC channels: %d samplerate: %d",
1069 p_sys->i_channels, p_sys->i_rate);
1071 const mtime_t i_end_date = date_Get(&p_sys->end_date);
1072 date_Init(&p_sys->end_date, p_sys->i_rate, 1);
1073 date_Set(&p_sys->end_date, i_end_date);
1076 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
1077 p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
1078 p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->i_frame_size;
1079 p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
1082 p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
1083 p_dec->fmt_out.audio.i_physical_channels = p_sys->i_channels_conf;
1086 p_block->i_pts = p_block->i_dts = date_Get(&p_sys->end_date);
1089 date_Increment(&p_sys->end_date, p_sys->i_frame_length) - p_block->i_pts;
1092 /*****************************************************************************
1093 * ClosePacketizer: clean up the packetizer
1094 *****************************************************************************/
1095 static void ClosePacketizer(vlc_object_t *p_this)
1097 decoder_t *p_dec = (decoder_t *)p_this;
1098 decoder_sys_t *p_sys = p_dec->p_sys;
1100 block_BytestreamRelease(&p_sys->bytestream);