1 /*****************************************************************************
2 * mpeg4audio.c: parse and packetize an MPEG 4 audio stream
3 *****************************************************************************
4 * Copyright (C) 2001, 2002, 2006 the VideoLAN team
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
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 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 General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
36 #include <vlc_codec.h>
37 #include <vlc_block.h>
40 #include <vlc_block_helper.h>
41 #include "packetizer_helper.h"
47 * AudioObjectType 5 bits
48 * samplingFrequencyIndex 4 bits
49 * if (samplingFrequencyIndex == 0xF)
50 * samplingFrequency 24 bits
51 * channelConfiguration 4 bits
53 * FrameLengthFlag 1 bit 1024 or 960
54 * DependsOnCoreCoder 1 bit (always 0)
55 * ExtensionFlag 1 bit (always 0)
58 /*****************************************************************************
59 * decoder_sys_t : decoder descriptor
60 *****************************************************************************/
66 int i_sbr; // 0: no sbr, 1: sbr, -1: unknown
67 int i_ps; // 0: no ps, 1: ps, -1: unknown
76 int i_frame_length; // 1024 or 960
80 #define LATM_MAX_EXTRA_SIZE 64
86 int i_frame_length_type;
87 int i_frame_length; // type 1
88 int i_frame_length_index; // type 3 4 5 6 7
92 /* Raw configuration */
94 uint8_t extra[LATM_MAX_EXTRA_SIZE];
98 #define LATM_MAX_LAYER (8)
99 #define LATM_MAX_PROGRAM (16)
102 int b_same_time_framing;
106 int pi_layers[LATM_MAX_PROGRAM];
108 int pi_stream[LATM_MAX_PROGRAM][LATM_MAX_LAYER];
111 latm_stream_t stream[LATM_MAX_PROGRAM*LATM_MAX_LAYER];
114 int i_crc; /* -1 if not set */
125 block_bytestream_t bytestream;
134 unsigned int i_channels;
135 unsigned int i_rate, i_frame_length, i_header_size;
151 static const int pi_sample_rates[16] =
153 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
154 16000, 12000, 11025, 8000, 7350, 0, 0, 0
157 #define ADTS_HEADER_SIZE 9
158 #define LOAS_HEADER_SIZE 3
160 /****************************************************************************
162 ****************************************************************************/
163 static int OpenPacketizer( vlc_object_t * );
164 static void ClosePacketizer( vlc_object_t * );
166 static block_t *PacketizeRawBlock ( decoder_t *, block_t ** );
167 static block_t *PacketizeStreamBlock( decoder_t *, block_t ** );
169 /*****************************************************************************
171 *****************************************************************************/
173 set_category( CAT_SOUT )
174 set_subcategory( SUBCAT_SOUT_PACKETIZER )
175 set_description( N_("MPEG4 audio packetizer") )
176 set_capability( "packetizer", 50 )
177 set_callbacks( OpenPacketizer, ClosePacketizer )
180 /*****************************************************************************
181 * OpenPacketizer: probe the packetizer and return score
182 *****************************************************************************/
183 static int OpenPacketizer( vlc_object_t *p_this )
185 decoder_t *p_dec = (decoder_t*)p_this;
186 decoder_sys_t *p_sys;
188 if( p_dec->fmt_in.i_codec != VLC_CODEC_MP4A )
193 /* Allocate the memory needed to store the decoder's structure */
194 if( ( p_dec->p_sys = p_sys =
195 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
199 p_sys->i_state = STATE_NOSYNC;
200 date_Set( &p_sys->end_date, 0 );
201 block_BytestreamInit( &p_sys->bytestream );
202 p_sys->b_latm_cfg = false;
204 /* Set output properties */
205 p_dec->fmt_out.i_cat = AUDIO_ES;
206 p_dec->fmt_out.i_codec = VLC_CODEC_MP4A;
208 msg_Dbg( p_dec, "running MPEG4 audio packetizer" );
210 if( p_dec->fmt_in.i_extra > 0 )
212 uint8_t *p_config = (uint8_t*)p_dec->fmt_in.p_extra;
215 i_index = ( ( p_config[0] << 1 ) | ( p_config[1] >> 7 ) ) & 0x0f;
216 if( i_index != 0x0f )
218 p_dec->fmt_out.audio.i_rate = pi_sample_rates[i_index];
219 p_dec->fmt_out.audio.i_frame_length =
220 (( p_config[1] >> 2 ) & 0x01) ? 960 : 1024;
224 p_dec->fmt_out.audio.i_rate = ( ( p_config[1] & 0x7f ) << 17 ) |
225 ( p_config[2] << 9 ) | ( p_config[3] << 1 ) |
226 ( p_config[4] >> 7 );
227 p_dec->fmt_out.audio.i_frame_length =
228 (( p_config[4] >> 2 ) & 0x01) ? 960 : 1024;
231 p_dec->fmt_out.audio.i_channels =
232 (p_config[i_index == 0x0f ? 4 : 1] >> 3) & 0x0f;
234 msg_Dbg( p_dec, "AAC %dHz %d samples/frame",
235 p_dec->fmt_out.audio.i_rate,
236 p_dec->fmt_out.audio.i_frame_length );
238 date_Init( &p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1 );
240 p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
241 p_dec->fmt_out.p_extra = malloc( p_dec->fmt_in.i_extra );
242 if( !p_dec->fmt_out.p_extra )
244 p_dec->fmt_out.i_extra = 0;
247 memcpy( p_dec->fmt_out.p_extra, p_dec->fmt_in.p_extra,
248 p_dec->fmt_in.i_extra );
251 p_dec->pf_packetize = PacketizeRawBlock;
252 p_sys->i_type = TYPE_RAW;
256 msg_Dbg( p_dec, "no decoder specific info, must be an ADTS or LOAS stream" );
258 date_Init( &p_sys->end_date, p_dec->fmt_in.audio.i_rate, 1 );
260 /* We will try to create a AAC Config from adts/loas */
261 p_dec->fmt_out.i_extra = 0;
262 p_dec->fmt_out.p_extra = NULL;
265 p_dec->pf_packetize = PacketizeStreamBlock;
266 p_sys->i_type = TYPE_NONE;
272 /****************************************************************************
273 * PacketizeRawBlock: the whole thing
274 ****************************************************************************
275 * This function must be fed with complete frames.
276 ****************************************************************************/
277 static block_t *PacketizeRawBlock( decoder_t *p_dec, block_t **pp_block )
279 decoder_sys_t *p_sys = p_dec->p_sys;
282 if( !pp_block || !*pp_block ) return NULL;
284 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
286 date_Set( &p_sys->end_date, 0 );
287 block_Release( *pp_block );
292 *pp_block = NULL; /* Don't reuse this block */
294 if( !date_Get( &p_sys->end_date ) && p_block->i_pts <= VLC_TS_INVALID )
296 /* We've just started the stream, wait for the first PTS. */
297 block_Release( p_block );
300 else if( p_block->i_pts > VLC_TS_INVALID &&
301 p_block->i_pts != date_Get( &p_sys->end_date ) )
303 date_Set( &p_sys->end_date, p_block->i_pts );
306 p_block->i_pts = p_block->i_dts = date_Get( &p_sys->end_date );
308 p_block->i_length = date_Increment( &p_sys->end_date,
309 p_dec->fmt_out.audio.i_frame_length ) - p_block->i_pts;
314 /****************************************************************************
316 ****************************************************************************/
317 static int ADTSSyncInfo( decoder_t * p_dec, const uint8_t * p_buf,
318 unsigned int * pi_channels,
319 unsigned int * pi_sample_rate,
320 unsigned int * pi_frame_length,
321 unsigned int * pi_header_size )
323 int i_profile, i_sample_rate_idx, i_frame_size;
326 /* Fixed header between frames */
327 //int i_id = ( (p_buf[1] >> 3) & 0x01) ? 2 : 4; /* MPEG-2 or 4 */
328 b_crc = !(p_buf[1] & 0x01);
329 i_profile = p_buf[2] >> 6;
330 i_sample_rate_idx = (p_buf[2] >> 2) & 0x0f;
331 *pi_sample_rate = pi_sample_rates[i_sample_rate_idx];
332 //private_bit = (p_buf[2] >> 1) & 0x01;
333 *pi_channels = ((p_buf[2] & 0x01) << 2) | ((p_buf[3] >> 6) & 0x03);
334 //original_copy = (p_buf[3] >> 5) & 0x01;
335 //home = (p_buf[3] >> 4) & 0x01;
337 /* Variable header */
338 //copyright_id_bit = (p_buf[3] >> 3) & 0x01;
339 //copyright_id_start = (p_buf[3] >> 2) & 0x01;
340 i_frame_size = ((p_buf[3] & 0x03) << 11) | (p_buf[4] << 3) |
341 ((p_buf[5] >> 5) /*& 0x7*/);
342 //uint16_t buffer_fullness = ((p_buf[5] & 0x1f) << 6) | (p_buf[6] >> 2);
343 unsigned short i_raw_blocks_in_frame = p_buf[6] & 0x03;
345 if( !*pi_sample_rate || !*pi_channels || !i_frame_size )
347 msg_Warn( p_dec, "Invalid ADTS header" );
351 *pi_frame_length = 1024;
353 if( i_raw_blocks_in_frame == 0 )
357 msg_Warn( p_dec, "ADTS CRC not supported" );
358 //uint16_t crc = (p_buf[7] << 8) | p_buf[8];
363 msg_Err( p_dec, "Multiple blocks per frame in ADTS not supported" );
367 const uint8_t *p_pos = p_buf + 7;
369 uint16_t i_block_pos[3];
372 for( i = 0 ; i < i_raw_blocks_in_frame ; i++ )
373 { /* the 1st block's position is known ... */
374 i_block_pos[i] = (*p_pos << 8) | *(p_pos+1);
377 crc_block = (*p_pos << 8) | *(p_pos+1);
380 for( i = 0 ; i <= i_raw_blocks_in_frame ; i++ )
385 msg_Err( p_dec, "ADTS CRC not supported" );
386 //uint16_t crc = (*p_pos << 8) | *(p_pos+1);
394 /* Build the decoder specific info header */
395 if( !p_dec->fmt_out.i_extra )
397 p_dec->fmt_out.p_extra = malloc( 2 );
398 if( !p_dec->fmt_out.p_extra )
400 p_dec->fmt_out.i_extra = 0;
403 p_dec->fmt_out.i_extra = 2;
404 ((uint8_t *)p_dec->fmt_out.p_extra)[0] =
405 (i_profile + 1) << 3 | (i_sample_rate_idx >> 1);
406 ((uint8_t *)p_dec->fmt_out.p_extra)[1] =
407 ((i_sample_rate_idx & 0x01) << 7) | (*pi_channels <<3);
410 /* ADTS header length */
411 *pi_header_size = b_crc ? 9 : 7;
413 return i_frame_size - *pi_header_size;
416 /****************************************************************************
418 ****************************************************************************/
419 static int LOASSyncInfo( uint8_t p_header[LOAS_HEADER_SIZE], unsigned int *pi_header_size )
422 return ( ( p_header[1] & 0x1f ) << 8 ) + p_header[2];
425 static int Mpeg4GAProgramConfigElement( bs_t *s )
427 /* TODO compute channels count ? */
428 int i_tag = bs_read( s, 4 );
431 bs_skip( s, 2 + 4 ); // object type + sampling index
432 int i_num_front = bs_read( s, 4 );
433 int i_num_side = bs_read( s, 4 );
434 int i_num_back = bs_read( s, 4 );
435 int i_num_lfe = bs_read( s, 2 );
436 int i_num_assoc_data = bs_read( s, 3 );
437 int i_num_valid_cc = bs_read( s, 4 );
440 bs_skip( s, 4 ); // mono downmix
442 bs_skip( s, 4 ); // stereo downmix
444 bs_skip( s, 2+1 ); // matrix downmix + pseudo_surround
446 bs_skip( s, i_num_front * (1+4) );
447 bs_skip( s, i_num_side * (1+4) );
448 bs_skip( s, i_num_back * (1+4) );
449 bs_skip( s, i_num_lfe * (4) );
450 bs_skip( s, i_num_assoc_data * (4) );
451 bs_skip( s, i_num_valid_cc * (5) );
453 int i_comment = bs_read( s, 8 );
454 bs_skip( s, i_comment * 8 );
458 static int Mpeg4GASpecificConfig( mpeg4_cfg_t *p_cfg, bs_t *s )
460 p_cfg->i_frame_length = bs_read1(s) ? 960 : 1024;
462 if( bs_read1( s ) ) // depend on core coder
463 bs_skip( s, 14 ); // core coder delay
465 int i_extension_flag = bs_read1( s );
466 if( p_cfg->i_channel == 0 )
468 Mpeg4GAProgramConfigElement( s );
470 if( p_cfg->i_object_type == 6 || p_cfg->i_object_type == 20 )
471 bs_skip( s, 3 ); // layer
473 if( i_extension_flag )
475 if( p_cfg->i_object_type == 22 )
477 bs_skip( s, 5 + 11 ); // numOfSubFrame + layer length
479 if( p_cfg->i_object_type == 17 || p_cfg->i_object_type == 19 ||
480 p_cfg->i_object_type == 20 || p_cfg->i_object_type == 23 )
482 bs_skip( s, 1+1+1 ); // ER data : section scale spectral */
484 if( bs_read1( s ) ) // extension 3
485 fprintf( stderr, "Mpeg4GASpecificConfig: error 1\n" );
490 static int Mpeg4ReadAudioObjectType( bs_t *s )
492 int i_type = bs_read( s, 5 );
494 i_type = 32 + bs_read( s, 6 );
498 static int Mpeg4ReadAudioSamplerate( bs_t *s )
500 int i_index = bs_read( s, 4 );
501 if( i_index != 0x0f )
502 return pi_sample_rates[i_index];
503 return bs_read( s, 24 );
506 static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_t *p_extra, bs_t *s, int i_max_size )
509 static const char *ppsz_otype[] = {
511 "AAC Main", "AAC LC", "AAC SSR", "AAC LTP", "SBR", "AAC Scalable",
514 "Reserved", "Reserved",
516 "Main Synthetic", "Wavetables Synthesis", "General MIDI",
517 "Algorithmic Synthesis and Audio FX",
520 "ER AAC LTP", "ER AAC Scalable", "ER TwinVQ", "ER BSAC", "ER AAC LD",
521 "ER CELP", "ER HVXC", "ER HILN", "ER Parametric",
523 "PS", "Reserved", "Escape",
524 "Layer 1", "Layer 2", "Layer 3",
528 const int i_pos_start = bs_pos( s );
533 memset( p_cfg, 0, sizeof(*p_cfg) );
536 p_cfg->i_object_type = Mpeg4ReadAudioObjectType( s );
537 p_cfg->i_samplerate = Mpeg4ReadAudioSamplerate( s );
539 p_cfg->i_channel = bs_read( s, 4 );
540 if( p_cfg->i_channel == 7 )
541 p_cfg->i_channel = 8; // 7.1
542 else if( p_cfg->i_channel >= 8 )
543 p_cfg->i_channel = -1;
547 p_cfg->extension.i_object_type = 0;
548 p_cfg->extension.i_samplerate = 0;
549 if( p_cfg->i_object_type == 5 || p_cfg->i_object_type == 29 )
552 if( p_cfg->i_object_type == 29 )
554 p_cfg->extension.i_object_type = 5;
555 p_cfg->extension.i_samplerate = Mpeg4ReadAudioSamplerate( s );
557 p_cfg->i_object_type = Mpeg4ReadAudioObjectType( s );
560 switch( p_cfg->i_object_type )
562 case 1: case 2: case 3: case 4:
564 case 17: case 19: case 20: case 21: case 22: case 23:
565 Mpeg4GASpecificConfig( p_cfg, s );
568 // CelpSpecificConfig();
571 // HvxcSpecificConfig();
574 // TTSSSpecificConfig();
576 case 13: case 14: case 15: case 16:
577 // StructuredAudioSpecificConfig();
580 // ERCelpSpecificConfig();
583 // ERHvxcSpecificConfig();
586 // ParametricSpecificConfig();
589 // SSCSpecificConfig();
591 case 32: case 33: case 34:
592 // MPEG_1_2_SpecificConfig();
595 // DSTSpecificConfig();
598 // ALSSpecificConfig();
604 switch( p_cfg->i_object_type )
606 case 17: case 19: case 20: case 21: case 22: case 23:
607 case 24: case 25: case 26: case 27:
609 int epConfig = bs_read( s, 2 );
610 if( epConfig == 2 || epConfig == 3 )
612 //ErrorProtectionSpecificConfig();
616 int directMapping = bs_read1( s );
628 if( p_cfg->extension.i_object_type != 5 && i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 16 &&
629 bs_read( s, 11 ) == 0x2b7 )
631 p_cfg->extension.i_object_type = Mpeg4ReadAudioObjectType( s );
632 if( p_cfg->extension.i_object_type == 5 )
634 p_cfg->i_sbr = bs_read1( s );
635 if( p_cfg->i_sbr == 1 )
637 p_cfg->extension.i_samplerate = Mpeg4ReadAudioSamplerate( s );
638 if( i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 12 && bs_read( s, 11 ) == 0x548 )
640 p_cfg->i_ps = bs_read1( s );
646 //fprintf( stderr, "Mpeg4ReadAudioSpecificInfo: t=%s(%d)f=%d c=%d sbr=%d\n",
647 // ppsz_otype[p_cfg->i_object_type], p_cfg->i_object_type, p_cfg->i_samplerate, p_cfg->i_channel, p_cfg->i_sbr );
649 i_bits = bs_pos(s) - i_pos_start;
651 *pi_extra = __MIN( ( i_bits + 7 ) / 8, LATM_MAX_EXTRA_SIZE );
652 for( i = 0; i < *pi_extra; i++ )
654 const int i_read = __MIN( 8, i_bits - 8*i );
655 p_extra[i] = bs_read( &s_sav, i_read ) << (8-i_read);
660 static int LatmGetValue( bs_t *s )
662 int i_bytes = bs_read( s, 2 );
665 for( i = 0; i < i_bytes; i++ )
666 v = (v << 8) + bs_read( s, 8 );
671 static int LatmReadStreamMuxConfiguration( latm_mux_t *m, bs_t *s )
677 i_mux_version = bs_read( s, 1 );
680 i_mux_versionA = bs_read( s, 1 );
682 if( i_mux_versionA != 0 ) /* support only A=0 */
685 memset( m, 0, sizeof(*m) );
687 if( i_mux_versionA == 0 )
689 if( i_mux_version == 1 )
691 LatmGetValue(s); /* taraBufferFullness */
695 m->b_same_time_framing = bs_read1( s );
696 m->i_sub_frames = 1 + bs_read( s, 6 );
697 m->i_programs = 1 + bs_read( s, 4 );
699 for( i_program = 0; i_program < m->i_programs; i_program++ )
703 m->pi_layers[i_program] = 1+bs_read( s, 3 );
705 for( i_layer = 0; i_layer < m->pi_layers[i_program]; i_layer++ )
707 latm_stream_t *st = &m->stream[m->i_streams];
710 m->pi_stream[i_program][i_layer] = m->i_streams;
711 st->i_program = i_program;
712 st->i_layer = i_layer;
714 b_previous_cfg = false;
715 if( i_program != 0 || i_layer != 0 )
716 b_previous_cfg = bs_read1( s );
720 assert( m->i_streams > 0 );
721 st->cfg = m->stream[m->i_streams-1].cfg;
726 if( i_mux_version == 1 )
727 i_cfg_size = LatmGetValue(s);
728 i_cfg_size -= Mpeg4ReadAudioSpecificInfo( &st->cfg, &st->i_extra, st->extra, s, i_cfg_size );
730 bs_skip( s, i_cfg_size );
733 st->i_frame_length_type = bs_read( s, 3 );
734 switch( st->i_frame_length_type )
738 bs_skip( s, 8 ); /* latmBufferFullnes */
739 if( !m->b_same_time_framing )
741 if( st->cfg.i_object_type == 6 || st->cfg.i_object_type == 20 ||
742 st->cfg.i_object_type == 8 || st->cfg.i_object_type == 24 )
744 bs_skip( s, 6 ); /* eFrameOffset */
750 st->i_frame_length = bs_read( s, 9 );
752 case 3: case 4: case 5:
753 st->i_frame_length_index = bs_read( s, 6 ); // celp
756 st->i_frame_length_index = bs_read( s, 1 ); // hvxc
768 if( i_mux_version == 1 )
770 m->i_other_data = LatmGetValue( s );
776 b_continue = bs_read1(s);
777 m->i_other_data = (m->i_other_data << 8) + bs_read( s, 8 );
778 } while( b_continue );
785 m->i_crc = bs_read( s, 8 );
790 static int LOASParse( decoder_t *p_dec, uint8_t *p_buffer, int i_buffer )
792 decoder_sys_t *p_sys = p_dec->p_sys;
795 int i_accumulated = 0;
797 bs_init( &s, p_buffer, i_buffer );
799 /* Read the stream mux configuration if present */
800 if( !bs_read1( &s ) )
802 if( !LatmReadStreamMuxConfiguration( &p_sys->latm, &s ) &&
803 p_sys->latm.i_streams > 0 )
805 const latm_stream_t *st = &p_sys->latm.stream[0];
807 p_sys->i_channels = st->cfg.i_channel;
808 p_sys->i_rate = st->cfg.i_samplerate;
809 p_sys->i_frame_length = st->cfg.i_frame_length;
811 /* FIXME And if it changes ? */
812 if( !p_dec->fmt_out.i_extra && st->i_extra > 0 )
814 p_dec->fmt_out.i_extra = st->i_extra;
815 p_dec->fmt_out.p_extra = malloc( st->i_extra );
816 if( !p_dec->fmt_out.p_extra )
818 p_dec->fmt_out.i_extra = 0;
821 memcpy( p_dec->fmt_out.p_extra, st->extra, st->i_extra );
824 p_sys->b_latm_cfg = true;
827 /* Wait for the configuration */
828 if( !p_sys->b_latm_cfg )
831 /* FIXME do we need to split the subframe into independent packet ? */
832 if( p_sys->latm.i_sub_frames > 1 )
833 msg_Err( p_dec, "latm sub frames not yet supported, please send a sample" );
835 for( i_sub = 0; i_sub < p_sys->latm.i_sub_frames; i_sub++ )
837 int pi_payload[LATM_MAX_PROGRAM][LATM_MAX_LAYER];
838 if( p_sys->latm.b_same_time_framing )
842 for( i_program = 0; i_program < p_sys->latm.i_programs; i_program++ )
845 for( i_layer = 0; i_layer < p_sys->latm.pi_layers[i_program]; i_layer++ )
847 latm_stream_t *st = &p_sys->latm.stream[p_sys->latm.pi_stream[i_program][i_layer]];
848 if( st->i_frame_length_type == 0 )
853 int i_tmp = bs_read( &s, 8 );
858 pi_payload[i_program][i_layer] = i_payload;
860 else if( st->i_frame_length_type == 1 )
862 pi_payload[i_program][i_layer] = st->i_frame_length / 8; /* XXX not correct */
864 else if( ( st->i_frame_length_type == 3 ) ||
865 ( st->i_frame_length_type == 5 ) ||
866 ( st->i_frame_length_type == 7 ) )
868 bs_skip( &s, 2 ); // muxSlotLengthCoded
869 pi_payload[i_program][i_layer] = 0; /* TODO */
873 pi_payload[i_program][i_layer] = 0; /* TODO */
878 for( i_program = 0; i_program < p_sys->latm.i_programs; i_program++ )
882 for( i_layer = 0; i_layer < p_sys->latm.pi_layers[i_program]; i_layer++ )
884 /* XXX we only extract 1 stream */
885 if( i_program != 0 || i_layer != 0 )
888 if( pi_payload[i_program][i_layer] <= 0 )
891 /* FIXME that's slow (and a bit ugly to write in place) */
892 for( i = 0; i < pi_payload[i_program][i_layer]; i++ )
893 p_buffer[i_accumulated++] = bs_read( &s, 8 );
899 const int i_chunks = bs_read( &s, 4 );
904 msg_Err( p_dec, "latm without same time frameing not yet supported, please send a sample" );
906 for( i_chunk = 0; i_chunk < i_chunks; i_chunk++ )
908 const int streamIndex = bs_read( &s, 4 );
909 latm_stream_t *st = &p_sys->latm.stream[streamIndex];
910 const int i_program = st->i_program;
911 const int i_layer = st->i_layer;
913 pi_program[i_chunk] = i_program;
914 pi_layer[i_chunk] = i_layer;
916 if( st->i_frame_length_type == 0 )
921 int i_tmp = bs_read( &s, 8 );
926 pi_payload[i_program][i_layer] = i_payload;
927 bs_skip( &s, 1 ); // auEndFlag
929 else if( st->i_frame_length_type == 1 )
931 pi_payload[i_program][i_layer] = st->i_frame_length / 8; /* XXX not correct */
933 else if( ( st->i_frame_length_type == 3 ) ||
934 ( st->i_frame_length_type == 5 ) ||
935 ( st->i_frame_length_type == 7 ) )
937 bs_read( &s, 2 ); // muxSlotLengthCoded
943 for( i_chunk = 0; i_chunk < i_chunks; i_chunk++ )
945 //const int i_program = pi_program[i_chunk];
946 //const int i_layer = pi_layer[i_chunk];
953 if( p_sys->latm.i_other_data > 0 )
955 /* Other data XXX we just ignore them */
959 return i_accumulated;
962 /****************************************************************************
963 * PacketizeStreamBlock: ADTS/LOAS packetizer
964 ****************************************************************************/
965 static void SetupOutput( decoder_t *p_dec, block_t *p_block );
966 static block_t *PacketizeStreamBlock( decoder_t *p_dec, block_t **pp_block )
968 decoder_sys_t *p_sys = p_dec->p_sys;
969 uint8_t p_header[ADTS_HEADER_SIZE + LOAS_HEADER_SIZE];
970 block_t *p_out_buffer;
973 if( !pp_block || !*pp_block ) return NULL;
975 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
977 if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
979 p_sys->i_state = STATE_NOSYNC;
980 block_BytestreamEmpty( &p_sys->bytestream );
982 date_Set( &p_sys->end_date, 0 );
983 block_Release( *pp_block );
987 if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID )
989 /* We've just started the stream, wait for the first PTS. */
990 block_Release( *pp_block );
994 block_BytestreamPush( &p_sys->bytestream, *pp_block );
998 switch( p_sys->i_state )
1002 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
1005 /* Look for sync word - should be 0xfff(adts) or 0x2b7(loas) */
1006 if( p_header[0] == 0xff && (p_header[1] & 0xf6) == 0xf0 )
1008 if( p_sys->i_type != TYPE_ADTS )
1009 msg_Dbg( p_dec, "detected ADTS format" );
1011 p_sys->i_state = STATE_SYNC;
1012 p_sys->i_type = TYPE_ADTS;
1015 else if( p_header[0] == 0x56 && (p_header[1] & 0xe0) == 0xe0 )
1017 if( p_sys->i_type != TYPE_LOAS )
1018 msg_Dbg( p_dec, "detected LOAS format" );
1020 p_sys->i_state = STATE_SYNC;
1021 p_sys->i_type = TYPE_LOAS;
1024 block_SkipByte( &p_sys->bytestream );
1026 if( p_sys->i_state != STATE_SYNC )
1028 block_BytestreamFlush( &p_sys->bytestream );
1030 /* Need more data */
1035 /* New frame, set the Presentation Time Stamp */
1036 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
1037 if( p_sys->i_pts > VLC_TS_INVALID &&
1038 p_sys->i_pts != date_Get( &p_sys->end_date ) )
1040 date_Set( &p_sys->end_date, p_sys->i_pts );
1042 p_sys->i_state = STATE_HEADER;
1046 if( p_sys->i_type == TYPE_ADTS )
1048 /* Get ADTS frame header (ADTS_HEADER_SIZE bytes) */
1049 if( block_PeekBytes( &p_sys->bytestream, p_header,
1050 ADTS_HEADER_SIZE ) != VLC_SUCCESS )
1052 /* Need more data */
1056 /* Check if frame is valid and get frame info */
1057 p_sys->i_frame_size = ADTSSyncInfo( p_dec, p_header,
1060 &p_sys->i_frame_length,
1061 &p_sys->i_header_size );
1065 assert( p_sys->i_type == TYPE_LOAS );
1066 /* Get LOAS frame header (LOAS_HEADER_SIZE bytes) */
1067 if( block_PeekBytes( &p_sys->bytestream, p_header,
1068 LOAS_HEADER_SIZE ) != VLC_SUCCESS )
1070 /* Need more data */
1074 /* Check if frame is valid and get frame info */
1075 p_sys->i_frame_size = LOASSyncInfo( p_header, &p_sys->i_header_size );
1078 if( p_sys->i_frame_size <= 0 )
1080 msg_Dbg( p_dec, "emulated sync word" );
1081 block_SkipByte( &p_sys->bytestream );
1082 p_sys->i_state = STATE_NOSYNC;
1086 p_sys->i_state = STATE_NEXT_SYNC;
1088 case STATE_NEXT_SYNC:
1089 /* TODO: If p_block == NULL, flush the buffer without checking the
1091 if( p_sys->bytestream.p_block == NULL )
1093 p_sys->i_state = STATE_NOSYNC;
1094 block_BytestreamFlush( &p_sys->bytestream );
1098 /* Check if next expected frame contains the sync word */
1099 if( block_PeekOffsetBytes( &p_sys->bytestream, p_sys->i_frame_size
1100 + p_sys->i_header_size, p_header, 2 )
1103 /* Need more data */
1107 assert( (p_sys->i_type == TYPE_ADTS) || (p_sys->i_type == TYPE_LOAS) );
1108 if( ( ( p_sys->i_type == TYPE_ADTS ) &&
1109 ( p_header[0] != 0xff || (p_header[1] & 0xf6) != 0xf0 ) ) ||
1110 ( ( p_sys->i_type == TYPE_LOAS ) &&
1111 ( p_header[0] != 0x56 || (p_header[1] & 0xe0) != 0xe0 ) ) )
1113 msg_Dbg( p_dec, "emulated sync word "
1114 "(no sync on following frame)" );
1115 p_sys->i_state = STATE_NOSYNC;
1116 block_SkipByte( &p_sys->bytestream );
1120 p_sys->i_state = STATE_SEND_DATA;
1123 case STATE_GET_DATA:
1124 /* Make sure we have enough data.
1125 * (Not useful if we went through NEXT_SYNC) */
1126 if( block_WaitBytes( &p_sys->bytestream, p_sys->i_frame_size +
1127 p_sys->i_header_size) != VLC_SUCCESS )
1129 /* Need more data */
1132 p_sys->i_state = STATE_SEND_DATA;
1134 case STATE_SEND_DATA:
1135 /* When we reach this point we already know we have enough
1136 * data available. */
1138 p_out_buffer = block_New( p_dec, p_sys->i_frame_size );
1141 //p_dec->b_error = true;
1144 p_buf = p_out_buffer->p_buffer;
1146 /* Skip the ADTS/LOAS header */
1147 block_SkipBytes( &p_sys->bytestream, p_sys->i_header_size );
1149 if( p_sys->i_type == TYPE_ADTS )
1151 /* Copy the whole frame into the buffer */
1152 block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
1156 assert( p_sys->i_type == TYPE_LOAS );
1157 /* Copy the whole frame into the buffer and parse/extract it */
1158 block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
1159 p_out_buffer->i_buffer = LOASParse( p_dec, p_buf, p_sys->i_frame_size );
1160 if( p_out_buffer->i_buffer <= 0 )
1162 if( !p_sys->b_latm_cfg )
1163 msg_Warn( p_dec, "waiting for header" );
1165 block_Release( p_out_buffer );
1166 p_out_buffer = NULL;
1167 p_sys->i_state = STATE_NOSYNC;
1171 SetupOutput( p_dec, p_out_buffer );
1172 /* Make sure we don't reuse the same pts twice */
1173 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
1174 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = VLC_TS_INVALID;
1176 /* So p_block doesn't get re-added several times */
1177 *pp_block = block_BytestreamPop( &p_sys->bytestream );
1179 p_sys->i_state = STATE_NOSYNC;
1181 return p_out_buffer;
1188 /*****************************************************************************
1190 *****************************************************************************/
1191 static void SetupOutput( decoder_t *p_dec, block_t *p_block )
1193 decoder_sys_t *p_sys = p_dec->p_sys;
1195 if( p_dec->fmt_out.audio.i_rate != p_sys->i_rate )
1197 msg_Info( p_dec, "AAC channels: %d samplerate: %d",
1198 p_sys->i_channels, p_sys->i_rate );
1200 const mtime_t i_end_date = date_Get( &p_sys->end_date );
1201 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
1202 date_Set( &p_sys->end_date, i_end_date );
1205 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
1206 p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
1207 p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->i_frame_size;
1208 p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
1211 p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
1212 p_dec->fmt_out.audio.i_physical_channels =
1213 p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
1216 p_block->i_pts = p_block->i_dts = date_Get( &p_sys->end_date );
1219 date_Increment( &p_sys->end_date, p_sys->i_frame_length ) - p_block->i_pts;
1222 /*****************************************************************************
1223 * ClosePacketizer: clean up the packetizer
1224 *****************************************************************************/
1225 static void ClosePacketizer( vlc_object_t *p_this )
1227 decoder_t *p_dec = (decoder_t *)p_this;
1228 decoder_sys_t *p_sys = p_dec->p_sys;
1230 block_BytestreamRelease( &p_sys->bytestream );
1232 free( p_dec->p_sys );