示例#1
0
int mpae_init_toolame(audio_encoder_t *encoder)
{
	int mode;
	mpae_toolame_ctx *ctx = NULL;

	if(encoder->params.channels == 1)
	{
		mp_msg(MSGT_MENCODER, MSGL_INFO, "ae_toolame, 1 audio channel, forcing mono mode\n");
		mode = MPG_MD_MONO;
	}
	else if(encoder->params.channels == 2)
	{
		if(! strcasecmp(param_mode, "dual"))
			mode = MPG_MD_DUAL_CHANNEL;
		else if(! strcasecmp(param_mode, "jstereo"))
			mode = MPG_MD_JOINT_STEREO;
		else if(! strcasecmp(param_mode, "stereo"))
			mode = MPG_MD_STEREO;
		else
		{
			mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, unknown mode %s, exiting\n", param_mode);
		}
	}
	else
		mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, Toolame can't encode > 2 channels, exiting\n");

	ctx = calloc(1, sizeof(mpae_toolame_ctx));
	if(ctx == NULL)
	{
		mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, couldn't alloc a %d bytes context, exiting\n", sizeof(mpae_toolame_ctx));
		return 0;
	}

	ctx->toolame_ctx = toolame_init();
	if(ctx->toolame_ctx == NULL)
	{
		mp_msg(MSGT_MENCODER, MSGL_ERR, "ae_toolame, couldn't initial parameters from libtoolame, exiting\n");
		free(ctx);
		return 0;
	}
	ctx->vbr = 0;
	ctx->channels = encoder->params.channels;
	ctx->srate = encoder->params.sample_rate;

	if(toolame_setMode(ctx->toolame_ctx, mode) != 0)
		return 0;

	if(toolame_setPsymodel(ctx->toolame_ctx, param_psy) != 0)
		return 0;

	if(toolame_setSampleFreq(ctx->toolame_ctx, encoder->params.sample_rate) != 0)
		return 0;

	if(toolame_setBitrate(ctx->toolame_ctx, param_bitrate) != 0)
		return 0;

	if(param_errprot)
		if(toolame_setErrorProtection(ctx->toolame_ctx, TRUE) != 0)
			return 0;

	if(param_vbr != 0)
	{
		if(toolame_setVBR(ctx->toolame_ctx, TRUE) != 0)
			return 0;
		if(toolame_setVBRLevel(ctx->toolame_ctx, param_vbr) != 0)
			return 0;
		if(toolame_setPadding(ctx->toolame_ctx, FALSE) != 0)
			return 0;
		if(param_maxvbr)
		{
			if(toolame_setVBRUpperBitrate(ctx->toolame_ctx, param_maxvbr) != 0)
				return 0;
		}
		ctx->vbr = 1;
	}

	if(toolame_setVerbosity(ctx->toolame_ctx, param_debug) != 0)
		return 0;

	if(toolame_init_params(ctx->toolame_ctx) != 0)
		return 0;

	ctx->bitrate = param_bitrate;
	encoder->params.bitrate = ctx->bitrate;
	encoder->params.samples_per_frame = 1152;
	encoder->priv = ctx;
	encoder->decode_buffer_size = 1152 * 2 * encoder->params.channels;

	encoder->bind = bind_toolame;
	encoder->get_frame_size = get_frame_size;
	encoder->encode = encode_toolame;
	encoder->close = close_toolame;

	return 1;
}
示例#2
0
文件: toolame.c 项目: sdelmas/SDesk
/*****************************************************************************
 * OpenEncoder: probe the encoder and return score
 *****************************************************************************/
static int OpenEncoder( vlc_object_t *p_this )
{
    encoder_t *p_enc = (encoder_t *)p_this;
    encoder_sys_t *p_sys;
    vlc_value_t val;

    if( p_enc->fmt_out.i_codec != VLC_FOURCC('m','p','g','a') &&
            p_enc->fmt_out.i_codec != VLC_FOURCC('m','p','2','a') &&
            p_enc->fmt_out.i_codec != VLC_FOURCC('m','p','2',' ') &&
            !p_enc->b_force )
    {
        return VLC_EGENERIC;
    }

    if( p_enc->fmt_in.audio.i_channels > 2 )
    {
        msg_Err( p_enc, "doesn't support > 2 channels" );
        return VLC_EGENERIC;
    }

    /* Allocate the memory needed to store the decoder's structure */
    if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
    {
        msg_Err( p_enc, "out of memory" );
        return VLC_EGENERIC;
    }
    p_enc->p_sys = p_sys;

    p_enc->pf_encode_audio = Encode;
    p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
    p_enc->fmt_out.i_codec = VLC_FOURCC('m','p','g','a');

    sout_CfgParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );

    p_sys->p_toolame = toolame_init();

    /* Set options */
    toolame_setSampleFreq( p_sys->p_toolame, p_enc->fmt_out.audio.i_rate );

    var_Get( p_enc, ENC_CFG_PREFIX "vbr", &val );
    if ( val.b_bool )
    {
        FLOAT i_quality;
        var_Get( p_enc, ENC_CFG_PREFIX "quality", &val );
        i_quality = val.i_int;
        if ( i_quality > 50.0 ) i_quality = 50.0;
        if ( i_quality < 0.0 ) i_quality = 0.0;
        toolame_setVBR( p_sys->p_toolame, 1 );
        toolame_setVBRLevel( p_sys->p_toolame, i_quality );
    }
    else
    {
        toolame_setBitrate( p_sys->p_toolame, p_enc->fmt_out.i_bitrate / 1000 );
    }

    if ( p_enc->fmt_in.audio.i_channels == 1 )
    {
        toolame_setMode( p_sys->p_toolame, MPG_MD_MONO );
    }
    else
    {
        var_Get( p_enc, ENC_CFG_PREFIX "mode", &val );
        switch ( val.i_int )
        {
        case 1:
            toolame_setMode( p_sys->p_toolame, MPG_MD_DUAL_CHANNEL );
            break;
        case 2:
            toolame_setMode( p_sys->p_toolame, MPG_MD_JOINT_STEREO );
            break;
        case 0:
        default:
            toolame_setMode( p_sys->p_toolame, MPG_MD_STEREO );
            break;
        }
    }

    if ( toolame_init_params( p_sys->p_toolame ) )
    {
        msg_Err( p_enc, "toolame initialization failed" );
        return -VLC_EGENERIC;
    }

    p_sys->i_nb_samples = 0;
    aout_DateInit( &p_sys->pts, p_enc->fmt_out.audio.i_rate );

    return VLC_SUCCESS;
}