X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fvorbis.c;h=7cc2ec9a2cf1826dd43009d87c0b76e23656f242;hb=8e79d2426c2a07c922f8506286153e1c830f36da;hp=c7e2b82eec3237b4db3c85a3da22b48f5d2b4200;hpb=f20299c236a7ff33dbe7beb2f90996efea4682d3;p=vlc diff --git a/modules/codec/vorbis.c b/modules/codec/vorbis.c index c7e2b82eec..7cc2ec9a2c 100644 --- a/modules/codec/vorbis.c +++ b/modules/codec/vorbis.c @@ -1,7 +1,7 @@ /***************************************************************************** * vorbis.c: vorbis decoder/encoder/packetizer module using of libvorbis. ***************************************************************************** - * Copyright (C) 2001-2012 the VideoLAN team + * Copyright (C) 2001-2012 VLC authors and VideoLAN * Copyright (C) 2007 Société des arts technologiques * Copyright (C) 2007 Savoir-faire Linux * @@ -9,19 +9,19 @@ * * Authors: Gildas Bazin * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -88,7 +88,7 @@ struct decoder_sys_t /* ** Channel reordering */ - int pi_chan_table[AOUT_CHAN_MAX]; + uint8_t pi_chan_table[AOUT_CHAN_MAX]; }; static const int pi_channels_maps[9] = @@ -119,18 +119,18 @@ static const int pi_channels_maps[9] = static const uint32_t pi_8channels_in[] = { AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT, AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, - AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,AOUT_CHAN_LFE,0 }; + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,AOUT_CHAN_LFE, 0 }; /* recommended vorbis channel order for 7 channels */ static const uint32_t pi_7channels_in[] = { AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT, AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, - AOUT_CHAN_REARCENTER,AOUT_CHAN_LFE,0 }; + AOUT_CHAN_REARCENTER, AOUT_CHAN_LFE, 0 }; /* recommended vorbis channel order for 6 channels */ static const uint32_t pi_6channels_in[] = { AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT, - AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,AOUT_CHAN_LFE,0 }; + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_LFE, 0 }; /* recommended vorbis channel order for 4 channels */ static const uint32_t pi_4channels_in[] = @@ -151,17 +151,17 @@ static block_t *DecodeBlock ( decoder_t *, block_t ** ); static int ProcessHeaders( decoder_t * ); static void *ProcessPacket ( decoder_t *, ogg_packet *, block_t ** ); -static aout_buffer_t *DecodePacket ( decoder_t *, ogg_packet * ); +static block_t *DecodePacket( decoder_t *, ogg_packet * ); static block_t *SendPacket( decoder_t *, ogg_packet *, block_t * ); static void ParseVorbisComments( decoder_t * ); -static void ConfigureChannelOrder(int *, int, uint32_t, bool ); +static void ConfigureChannelOrder(uint8_t *, int, uint32_t, bool ); #ifdef HAVE_VORBIS_ENCODER static int OpenEncoder ( vlc_object_t * ); static void CloseEncoder ( vlc_object_t * ); -static block_t *Encode ( encoder_t *, aout_buffer_t * ); +static block_t *Encode ( encoder_t *, block_t * ); #endif /***************************************************************************** @@ -253,7 +253,7 @@ static int OpenDecoder( vlc_object_t *p_this ) /* Set output properties */ p_dec->fmt_out.i_cat = AUDIO_ES; #ifdef MODULE_NAME_IS_tremor - p_dec->fmt_out.i_codec = VLC_CODEC_FI32; + p_dec->fmt_out.i_codec = VLC_CODEC_S32N; #else p_dec->fmt_out.i_codec = VLC_CODEC_FL32; #endif @@ -460,7 +460,7 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket, } else { - aout_buffer_t *p_aout_buffer = DecodePacket( p_dec, p_oggpacket ); + block_t *p_aout_buffer = DecodePacket( p_dec, p_oggpacket ); if( p_block ) block_Release( p_block ); return p_aout_buffer; @@ -471,21 +471,21 @@ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket, * Interleave: helper function to interleave channels *****************************************************************************/ static void Interleave( INTERLEAVE_TYPE *p_out, const INTERLEAVE_TYPE **pp_in, - int i_nb_channels, int i_samples, int *pi_chan_table) + int i_nb_channels, int i_samples, uint8_t *pi_chan_table) { for( int j = 0; j < i_samples; j++ ) for( int i = 0; i < i_nb_channels; i++ ) - p_out[j * i_nb_channels + pi_chan_table[i]] = pp_in[i][j] #ifdef MODULE_NAME_IS_tremor - * (FIXED32_ONE >> 24) + p_out[j * i_nb_channels + pi_chan_table[i]] = pp_in[i][j] << 8; +#else + p_out[j * i_nb_channels + pi_chan_table[i]] = pp_in[i][j]; #endif - ; } /***************************************************************************** * DecodePacket: decodes a Vorbis packet. *****************************************************************************/ -static aout_buffer_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket ) +static block_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket ) { decoder_sys_t *p_sys = p_dec->p_sys; int i_samples; @@ -504,7 +504,7 @@ static aout_buffer_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket ) if( ( i_samples = vorbis_synthesis_pcmout( &p_sys->vd, &pp_pcm ) ) > 0 ) { - aout_buffer_t *p_aout_buffer; + block_t *p_aout_buffer; p_aout_buffer = decoder_NewAudioBuffer( p_dec, i_samples ); @@ -513,7 +513,8 @@ static aout_buffer_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket ) /* Interleave the samples */ Interleave( (INTERLEAVE_TYPE*)p_aout_buffer->p_buffer, - (const INTERLEAVE_TYPE**)pp_pcm, p_sys->vi.channels, i_samples, p_sys->pi_chan_table); + (const INTERLEAVE_TYPE**)pp_pcm, p_sys->vi.channels, i_samples, + p_sys->pi_chan_table); /* Tell libvorbis how many samples we actually consumed */ vorbis_synthesis_read( &p_sys->vd, i_samples ); @@ -577,7 +578,7 @@ static void ParseVorbisComments( decoder_t *p_dec ) break; if( !strcasecmp( psz_name, "REPLAYGAIN_TRACK_GAIN" ) || - !strcasecmp( psz_name, "RG_RADIO" ) ) + !strcasecmp( psz_name, "RG_RADIO" ) ) { audio_replay_gain_t *r = &p_dec->fmt_out.audio_replay_gain; @@ -626,7 +627,8 @@ static void ParseVorbisComments( decoder_t *p_dec ) /***************************************************************************** * *****************************************************************************/ -static void ConfigureChannelOrder(int *pi_chan_table, int i_channels, uint32_t i_channel_mask, bool b_decode) +static void ConfigureChannelOrder(uint8_t *pi_chan_table, int i_channels, + uint32_t i_channel_mask, bool b_decode) { const uint32_t *pi_channels_in; switch( i_channels ) @@ -660,14 +662,10 @@ static void ConfigureChannelOrder(int *pi_chan_table, int i_channels, uint32_t i if( b_decode ) aout_CheckChannelReorder( pi_channels_in, NULL, - i_channel_mask, - i_channels, - pi_chan_table ); + i_channel_mask, pi_chan_table ); else aout_CheckChannelReorder( NULL, pi_channels_in, - i_channel_mask, - i_channels, - pi_chan_table ); + i_channel_mask, pi_chan_table ); } /***************************************************************************** @@ -714,7 +712,7 @@ struct encoder_sys_t /* ** Channel reordering */ - int pi_chan_table[AOUT_CHAN_MAX]; + uint8_t pi_chan_table[AOUT_CHAN_MAX]; }; @@ -841,13 +839,16 @@ static int OpenEncoder( vlc_object_t *p_this ) **************************************************************************** * This function spits out ogg packets. ****************************************************************************/ -static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf ) +static block_t *Encode( encoder_t *p_enc, block_t *p_aout_buf ) { encoder_sys_t *p_sys = p_enc->p_sys; ogg_packet oggpacket; block_t *p_block, *p_chain = NULL; float **buffer; + /* FIXME: flush buffers in here */ + if( unlikely( !p_aout_buf ) ) return NULL; + mtime_t i_pts = p_aout_buf->i_pts - (mtime_t)1000000 * (mtime_t)p_sys->i_samples_delay / (mtime_t)p_enc->fmt_in.audio.i_rate; @@ -878,7 +879,7 @@ static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf ) while( vorbis_bitrate_flushpacket( &p_sys->vd, &oggpacket ) ) { int i_block_size; - p_block = block_New( p_enc, oggpacket.bytes ); + p_block = block_Alloc( oggpacket.bytes ); memcpy( p_block->p_buffer, oggpacket.packet, oggpacket.bytes ); i_block_size = vorbis_packet_blocksize( &p_sys->vi, &oggpacket );