X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fpacketizer%2Fmpeg4audio.c;h=222678f140924250fefe058220919b79e45dfff9;hb=9d5e75a7a5643a2144dc561fc246a7a3ca7e5fb0;hp=bf0b73aa259a78e05da012b19a225abfcddbfee9;hpb=17bba6bc4fd5244bd8c847c5a8992508698a93cb;p=vlc diff --git a/modules/packetizer/mpeg4audio.c b/modules/packetizer/mpeg4audio.c index bf0b73aa25..222678f140 100644 --- a/modules/packetizer/mpeg4audio.c +++ b/modules/packetizer/mpeg4audio.c @@ -30,17 +30,17 @@ # include "config.h" #endif -#include +#include +#include #include #include #include -#include -#include -#include #include #include "vlc_block_helper.h" +#include + /* AAC Config in ES: * * AudioObjectType 5 bits @@ -63,6 +63,7 @@ typedef struct int i_samplerate; int i_channel; int i_sbr; // 0: no sbr, 1: sbr, -1: unknown + int i_ps; // 0: no ps, 1: ps, -1: unknown struct { @@ -135,7 +136,7 @@ struct decoder_sys_t int i_input_rate; /* LOAS */ - vlc_bool_t b_latm_cfg; + bool b_latm_cfg; latm_mux_t latm; }; @@ -176,13 +177,13 @@ static block_t *PacketizeStreamBlock( decoder_t *, block_t ** ); /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_category( CAT_SOUT ); - set_subcategory( SUBCAT_SOUT_PACKETIZER ); - set_description( _("MPEG4 audio packetizer") ); - set_capability( "packetizer", 50 ); - set_callbacks( OpenPacketizer, ClosePacketizer ); -vlc_module_end(); +vlc_module_begin () + set_category( CAT_SOUT ) + set_subcategory( SUBCAT_SOUT_PACKETIZER ) + set_description( N_("MPEG4 audio packetizer") ) + set_capability( "packetizer", 50 ) + set_callbacks( OpenPacketizer, ClosePacketizer ) +vlc_module_end () /***************************************************************************** * OpenPacketizer: probe the packetizer and return score @@ -192,7 +193,7 @@ static int OpenPacketizer( vlc_object_t *p_this ) decoder_t *p_dec = (decoder_t*)p_this; decoder_sys_t *p_sys; - if( p_dec->fmt_in.i_codec != VLC_FOURCC( 'm', 'p', '4', 'a' ) ) + if( p_dec->fmt_in.i_codec != VLC_CODEC_MP4A ) { return VLC_EGENERIC; } @@ -200,21 +201,17 @@ static int OpenPacketizer( vlc_object_t *p_this ) /* Allocate the memory needed to store the decoder's structure */ if( ( p_dec->p_sys = p_sys = (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL ) - { - msg_Err( p_dec, "out of memory" ); - return VLC_EGENERIC; - } + return VLC_ENOMEM; /* Misc init */ p_sys->i_state = STATE_NOSYNC; aout_DateSet( &p_sys->end_date, 0 ); p_sys->bytestream = block_BytestreamInit(); - p_sys->i_input_rate = INPUT_RATE_DEFAULT; - p_sys->b_latm_cfg = VLC_FALSE; + p_sys->b_latm_cfg = false; /* Set output properties */ p_dec->fmt_out.i_cat = AUDIO_ES; - p_dec->fmt_out.i_codec = VLC_FOURCC('m','p','4','a'); + p_dec->fmt_out.i_codec = VLC_CODEC_MP4A; msg_Dbg( p_dec, "running MPEG4 audio packetizer" ); @@ -294,7 +291,7 @@ static block_t *PacketizeRawBlock( decoder_t *p_dec, block_t **pp_block ) if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) ) { - //aout_DateSet( &p_sys->end_date, 0 ); + aout_DateSet( &p_sys->end_date, 0 ); block_Release( *pp_block ); return NULL; } @@ -317,7 +314,7 @@ static block_t *PacketizeRawBlock( decoder_t *p_dec, block_t **pp_block ) p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date ); p_block->i_length = aout_DateIncrement( &p_sys->end_date, - p_dec->fmt_out.audio.i_frame_length * p_sys->i_input_rate / INPUT_RATE_DEFAULT ) - p_block->i_pts; + p_dec->fmt_out.audio.i_frame_length ) - p_block->i_pts; return p_block; } @@ -325,17 +322,17 @@ static block_t *PacketizeRawBlock( decoder_t *p_dec, block_t **pp_block ) /**************************************************************************** * ADTS helpers ****************************************************************************/ -static int ADTSSyncInfo( decoder_t * p_dec, const byte_t * p_buf, +static int ADTSSyncInfo( decoder_t * p_dec, const uint8_t * p_buf, unsigned int * pi_channels, unsigned int * pi_sample_rate, unsigned int * pi_frame_length, unsigned int * pi_header_size ) { - int i_id, i_profile, i_sample_rate_idx, i_frame_size; - vlc_bool_t b_crc; + int i_profile, i_sample_rate_idx, i_frame_size; + bool b_crc; /* Fixed header between frames */ - i_id = ( (p_buf[1] >> 3) & 0x01) ? 2 : 4; /* MPEG-2 or 4 */ + //int i_id = ( (p_buf[1] >> 3) & 0x01) ? 2 : 4; /* MPEG-2 or 4 */ b_crc = !(p_buf[1] & 0x01); i_profile = p_buf[2] >> 6; i_sample_rate_idx = (p_buf[2] >> 2) & 0x0f; @@ -501,8 +498,8 @@ static int Mpeg4GASpecificConfig( mpeg4_cfg_t *p_cfg, bs_t *s ) static int Mpeg4ReadAudioObjectType( bs_t *s ) { int i_type = bs_read( s, 5 ); - if( i_type == 0x1f ) - i_type += bs_read( s, 6 ); + if( i_type == 31 ) + i_type = 32 + bs_read( s, 6 ); return i_type; } @@ -531,7 +528,7 @@ static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_ "ER AAC LTP", "ER AAC Scalable", "ER TwinVQ", "ER BSAC", "ER AAC LD", "ER CELP", "ER HVXC", "ER HILN", "ER Parametric", "SSC", - "Reserved", "Reserved", "Escape", + "PS", "Reserved", "Escape", "Layer 1", "Layer 2", "Layer 3", "DST", }; @@ -554,12 +551,15 @@ static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_ p_cfg->i_channel = -1; p_cfg->i_sbr = -1; + p_cfg->i_ps = -1; p_cfg->extension.i_object_type = 0; p_cfg->extension.i_samplerate = 0; - if( p_cfg->i_object_type == 5 ) + if( p_cfg->i_object_type == 5 || p_cfg->i_object_type == 29 ) { p_cfg->i_sbr = 1; - p_cfg->extension.i_object_type = p_cfg->i_object_type; + if( p_cfg->i_object_type == 29 ) + p_cfg->i_ps = 1; + p_cfg->extension.i_object_type = 5; p_cfg->extension.i_samplerate = Mpeg4ReadAudioSamplerate( s ); p_cfg->i_object_type = Mpeg4ReadAudioObjectType( s ); @@ -602,6 +602,9 @@ static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_ case 35: // DSTSpecificConfig(); break; + case 36: + // ALSSpecificConfig(); + break; default: // error break; @@ -630,7 +633,7 @@ static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_ break; } - if( p_cfg->extension.i_object_type != 5 && i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 16 && + if( p_cfg->extension.i_object_type != 5 && i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 16 && bs_read( s, 11 ) == 0x2b7 ) { p_cfg->extension.i_object_type = Mpeg4ReadAudioObjectType( s ); @@ -638,7 +641,13 @@ static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_ { p_cfg->i_sbr = bs_read1( s ); if( p_cfg->i_sbr == 1 ) + { p_cfg->extension.i_samplerate = Mpeg4ReadAudioSamplerate( s ); + if( i_max_size > 0 && i_max_size - (bs_pos(s) - i_pos_start) >= 12 && bs_read( s, 11 ) == 0x548 ) + { + p_cfg->i_ps = bs_read1( s ); + } + } } } @@ -647,8 +656,8 @@ static int Mpeg4ReadAudioSpecificInfo( mpeg4_cfg_t *p_cfg, int *pi_extra, uint8_ i_bits = bs_pos(s) - i_pos_start; - *pi_extra = ( i_bits + 7 ) / 8; - for( i = 0; i < __MIN( LATM_MAX_EXTRA_SIZE, *pi_extra ); i++ ) + *pi_extra = __MIN( ( i_bits + 7 ) / 8, LATM_MAX_EXTRA_SIZE ); + for( i = 0; i < *pi_extra; i++ ) { const int i_read = __MIN( 8, i_bits - 8*i ); p_extra[i] = bs_read( &s_sav, i_read ) << (8-i_read); @@ -704,13 +713,13 @@ static int LatmReadStreamMuxConfiguration( latm_mux_t *m, bs_t *s ) for( i_layer = 0; i_layer < m->pi_layers[i_program]; i_layer++ ) { latm_stream_t *st = &m->stream[m->i_streams]; - vlc_bool_t b_previous_cfg; + bool b_previous_cfg; m->pi_stream[i_program][i_layer] = m->i_streams; st->i_program = i_program; st->i_layer = i_layer; - b_previous_cfg = VLC_FALSE; + b_previous_cfg = false; if( i_program != 0 || i_layer != 0 ) b_previous_cfg = bs_read1( s ); @@ -820,14 +829,14 @@ static int LOASParse( decoder_t *p_dec, uint8_t *p_buffer, int i_buffer ) memcpy( p_dec->fmt_out.p_extra, st->extra, st->i_extra ); } - p_sys->b_latm_cfg = VLC_TRUE; + p_sys->b_latm_cfg = true; } } /* Wait for the configuration */ if( !p_sys->b_latm_cfg ) return 0; - /* FIXME do we need to split the subframe into independant packet ? */ + /* FIXME do we need to split the subframe into independent packet ? */ if( p_sys->latm.i_sub_frames > 1 ) msg_Err( p_dec, "latm sub frames not yet supported, please send a sample" ); @@ -976,9 +985,9 @@ static block_t *PacketizeStreamBlock( decoder_t *p_dec, block_t **pp_block ) if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED ) { p_sys->i_state = STATE_NOSYNC; - block_BytestreamFlush( &p_sys->bytestream ); + block_BytestreamEmpty( &p_sys->bytestream ); } - //aout_DateSet( &p_sys->end_date, 0 ); + aout_DateSet( &p_sys->end_date, 0 ); block_Release( *pp_block ); return NULL; } @@ -990,9 +999,6 @@ static block_t *PacketizeStreamBlock( decoder_t *p_dec, block_t **pp_block ) return NULL; } - if( (*pp_block)->i_rate > 0 ) - p_sys->i_input_rate = (*pp_block)->i_rate; - block_BytestreamPush( &p_sys->bytestream, *pp_block ); for( ;; ) @@ -1140,7 +1146,7 @@ static block_t *PacketizeStreamBlock( decoder_t *p_dec, block_t **pp_block ) p_out_buffer = block_New( p_dec, p_sys->i_frame_size ); if( !p_out_buffer ) { - //p_dec->b_error = VLC_TRUE; + //p_dec->b_error = true; return NULL; } p_buf = p_out_buffer->p_buffer; @@ -1216,9 +1222,8 @@ static void SetupOutput( decoder_t *p_dec, block_t *p_block ) p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date ); - p_block->i_length = aout_DateIncrement( &p_sys->end_date, - p_sys->i_frame_length * p_sys->i_input_rate / INPUT_RATE_DEFAULT ) - - p_block->i_pts; + p_block->i_length = + aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length ) - p_block->i_pts; } /*****************************************************************************