static block_t *Encode( encoder_t *p_enc, aout_buffer_t *p_aout_buf ) { encoder_sys_t *p_sys = p_enc->p_sys; int16_t *p_buffer = (int16_t *)p_aout_buf->p_buffer; int i_nb_samples = p_aout_buf->i_nb_samples; block_t *p_chain = NULL; mtime_t i_computed_pts = p_aout_buf->start_date - (mtime_t)1000000 * (mtime_t)p_sys->i_nb_samples / (mtime_t)p_enc->fmt_in.audio.i_rate; if ( aout_DateGet( &p_sys->pts ) - i_computed_pts > 10000 || aout_DateGet( &p_sys->pts ) - i_computed_pts < -10000 ) { msg_Dbg( p_enc, "resetting audio date" ); aout_DateSet( &p_sys->pts, i_computed_pts ); } while ( p_sys->i_nb_samples + i_nb_samples >= MPEG_FRAME_SIZE ) { int i_used; block_t *p_block; Uninterleave( p_enc, p_buffer, MPEG_FRAME_SIZE - p_sys->i_nb_samples ); i_nb_samples -= MPEG_FRAME_SIZE - p_sys->i_nb_samples; p_buffer += (MPEG_FRAME_SIZE - p_sys->i_nb_samples) * 2; toolame_encode_buffer( p_sys->p_toolame, p_sys->p_left, p_sys->p_right, MPEG_FRAME_SIZE, p_sys->p_out_buffer, MAX_CODED_FRAME_SIZE, &i_used ); p_sys->i_nb_samples = 0; p_block = block_New( p_enc, i_used ); p_enc->p_vlc->pf_memcpy( p_block->p_buffer, p_sys->p_out_buffer, i_used ); p_block->i_length = (mtime_t)1000000 * (mtime_t)MPEG_FRAME_SIZE / (mtime_t)p_enc->fmt_in.audio.i_rate; p_block->i_dts = p_block->i_pts = aout_DateGet( &p_sys->pts ); aout_DateIncrement( &p_sys->pts, MPEG_FRAME_SIZE ); block_ChainAppend( &p_chain, p_block ); } if ( i_nb_samples ) { Uninterleave( p_enc, p_buffer, i_nb_samples ); p_sys->i_nb_samples += i_nb_samples; } return p_chain; }
static int encode_toolame(audio_encoder_t *encoder, uint8_t *dest, void *src, int len, int max_size) { mpae_toolame_ctx *ctx = (mpae_toolame_ctx *)encoder->priv; int ret_size = 0, r2, i, nsamples; int16_t *buffer; nsamples = len / (2*encoder->params.channels); buffer = (uint16_t *) src; for(i = 0; i < nsamples; i++) { ctx->left_pcm[i] = buffer[ctx->channels * i]; ctx->right_pcm[i] = buffer[(ctx->channels * i) + (ctx->channels - 1)]; } toolame_encode_buffer(ctx->toolame_ctx, ctx->left_pcm, ctx->right_pcm, nsamples, dest, max_size, &ret_size); r2 = mp_decode_mp3_header(dest); mp_msg(MSGT_MENCODER, MSGL_DBG2, "\nSIZE: %d, max: %d, r2: %d\n", ret_size, max_size, r2); if(r2 > 0) ret_size = r2; return ret_size; }