X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fvorbis.c;h=98df78f9bbcf7ea80164c4aa2ec6e00d46b42882;hb=b6716b49964b5f3b08fe685eaafea1241c7f1787;hp=3333b05a4ad41854edab0fa5a6dc9315ec2bd528;hpb=535be4f675ab04cb117aec179d91e273b9a156ad;p=vlc diff --git a/modules/codec/vorbis.c b/modules/codec/vorbis.c index 3333b05a4a..98df78f9bb 100644 --- a/modules/codec/vorbis.c +++ b/modules/codec/vorbis.c @@ -136,15 +136,20 @@ static block_t *Encode ( encoder_t *, aout_buffer_t * ); #define ENC_MINBR_LONGTEXT N_( \ "Allows you to specify a minimum bitrate in kbps. " \ "Useful for encoding for a fixed-size channel." ) +#define ENC_CBR_TEXT N_("CBR encoding") +#define ENC_CBR_LONGTEXT N_( \ + "Allows you to force a constant bitrate encoding (CBR)." ) vlc_module_begin(); - + set_shortname( _("Vorbis")); set_description( _("Vorbis audio decoder") ); #ifdef MODULE_NAME_IS_tremor set_capability( "decoder", 90 ); #else set_capability( "decoder", 100 ); #endif + set_category( CAT_INPUT ); + set_subcategory( SUBCAT_INPUT_ACODEC ); set_callbacks( OpenDecoder, CloseDecoder ); add_submodule(); @@ -157,21 +162,25 @@ vlc_module_begin(); add_submodule(); set_description( _("Vorbis audio encoder") ); set_capability( "encoder", 100 ); - set_callbacks( OpenEncoder, CloseEncoder ); +#if defined(HAVE_VORBIS_VORBISENC_H) + set_callbacks( OpenEncoder, CloseEncoder ); +#endif - add_integer( ENC_CFG_PREFIX "quality", 0, NULL, ENC_QUALITY_TEXT, + add_integer( ENC_CFG_PREFIX "quality", 3, NULL, ENC_QUALITY_TEXT, ENC_QUALITY_LONGTEXT, VLC_FALSE ); add_integer( ENC_CFG_PREFIX "max-bitrate", 0, NULL, ENC_MAXBR_TEXT, ENC_MAXBR_LONGTEXT, VLC_FALSE ); add_integer( ENC_CFG_PREFIX "min-bitrate", 0, NULL, ENC_MINBR_TEXT, ENC_MINBR_LONGTEXT, VLC_FALSE ); + add_bool( ENC_CFG_PREFIX "cbr", 0, NULL, ENC_CBR_TEXT, + ENC_CBR_LONGTEXT, VLC_FALSE ); #endif vlc_module_end(); #ifndef MODULE_NAME_IS_tremor static const char *ppsz_enc_options[] = { - "quality", "max-bitrate", "min-bitrate", NULL + "quality", "max-bitrate", "min-bitrate", "cbr", NULL }; #endif @@ -198,6 +207,7 @@ static int OpenDecoder( vlc_object_t *p_this ) /* Misc init */ aout_DateSet( &p_sys->end_date, 0 ); + p_sys->i_last_block_size = 0; p_sys->b_packetizer = VLC_FALSE; p_sys->i_headers = 0; @@ -283,7 +293,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) p_dec->fmt_in.p_extra = realloc( p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra + oggpacket.bytes + 2 ); - p_extra = p_dec->fmt_in.p_extra + p_dec->fmt_in.i_extra; + p_extra = (uint8_t *)p_dec->fmt_in.p_extra + p_dec->fmt_in.i_extra; *(p_extra++) = oggpacket.bytes >> 8; *(p_extra++) = oggpacket.bytes & 0xFF; @@ -476,7 +486,11 @@ static aout_buffer_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket ) #endif if( p_oggpacket->bytes && +#ifdef MODULE_NAME_IS_tremor + vorbis_synthesis( &p_sys->vb, p_oggpacket, 1 ) == 0 ) +#else vorbis_synthesis( &p_sys->vb, p_oggpacket ) == 0 ) +#endif vorbis_synthesis_blockin( &p_sys->vd, &p_sys->vb ); /* **pp_pcm is a multichannel float vector. In stereo, for @@ -571,7 +585,19 @@ static void ParseVorbisComments( decoder_t *p_dec ) psz_value++; input_Control( p_input, INPUT_ADD_INFO, _("Vorbis comment"), psz_name, psz_value ); + /* HACK, we should use meta */ + if( strstr( psz_name, "artist" ) ) + { + input_Control( p_input, INPUT_ADD_INFO, _("Meta-information"), + _("Artist"), psz_value ); + } + else if( strstr( psz_name, "title" ) ) + { + p_input->input.p_item->psz_name = strdup( psz_value ); + } } + /* FIXME */ + var_SetInteger( p_input, "item-change", p_input->input.p_item->i_id ); free( psz_comment ); i++; } @@ -580,24 +606,27 @@ static void ParseVorbisComments( decoder_t *p_dec ) /***************************************************************************** * Interleave: helper function to interleave channels *****************************************************************************/ -static void Interleave( #ifdef MODULE_NAME_IS_tremor - int32_t *p_out, const int32_t **pp_in, +static void Interleave( int32_t *p_out, const int32_t **pp_in, + int i_nb_channels, int i_samples ) +{ + int i, j; + + for ( j = 0; j < i_samples; j++ ) + for ( i = 0; i < i_nb_channels; i++ ) + p_out[j * i_nb_channels + i] = pp_in[i][j] * (FIXED32_ONE >> 24); +} #else - float *p_out, const float **pp_in, -#endif +static void Interleave( float *p_out, const float **pp_in, int i_nb_channels, int i_samples ) { int i, j; for ( j = 0; j < i_samples; j++ ) - { for ( i = 0; i < i_nb_channels; i++ ) - { p_out[j * i_nb_channels + i] = pp_in[i][j]; - } - } } +#endif /***************************************************************************** * CloseDecoder: vorbis decoder destruction @@ -674,7 +703,7 @@ static int OpenEncoder( vlc_object_t *p_this ) p_enc->p_sys = p_sys; p_enc->pf_encode_audio = Encode; - p_enc->fmt_in.i_codec = AUDIO_FMT_S16_NE; + p_enc->fmt_in.i_codec = VLC_FOURCC('f','l','3','2'); p_enc->fmt_out.i_codec = VLC_FOURCC('v','o','r','b'); sout_CfgParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); @@ -683,6 +712,8 @@ static int OpenEncoder( vlc_object_t *p_this ) i_quality = val.i_int; if( i_quality > 10 ) i_quality = 10; if( i_quality < 0 ) i_quality = 0; + var_Get( p_enc, ENC_CFG_PREFIX "cbr", &val ); + if( val.b_bool ) i_quality = 0; var_Get( p_enc, ENC_CFG_PREFIX "max-bitrate", &val ); i_max_bitrate = val.i_int; var_Get( p_enc, ENC_CFG_PREFIX "min-bitrate", &val ); @@ -797,8 +828,8 @@ static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf ) { for( j = 0 ; j < p_aout_buf->i_nb_samples ; j++ ) { - buffer[i][j]= ((float)( ((int16_t *)p_aout_buf->p_buffer ) - [j * p_sys->i_channels + i ] )) / 32768.f; + buffer[i][j]= ((float *)p_aout_buf->p_buffer) + [j * p_sys->i_channels + i ]; } }