media_packet_ptr lame_encoder_impl_internal::encode(const audio_data * _AudioData)
{
    static const size_t mp3TimeBase = 14112000; // Least common multiple of 44100 and 32000
    const int predSamplesInLame = lame_get_mf_samples_to_encode( m_Lame.get() );
    // from lame:
    // The required mp3buf_size can be computed from num_samples,
    // samplerate and encoding rate, but here is a worst case estimate:
    // mp3buf_size in bytes = 1.25*num_samples + 7200
   
    const size_t samplesCount = (_AudioData) ?  _AudioData->get_samples_count() : 0;
    const size_t bufSize = static_cast<size_t>( 1.25 * samplesCount ) + 7200 ;
    uint8_t * buffer = m_Buffer.get_buffer( bufSize );
    int lameRet = 0;
    
    if (_AudioData)
    {
        const size_t channelsCount = _AudioData->get_channels_count();
        if (channelsCount == 1)
        {
            lameRet = lame_encode_buffer( 
                m_Lame.get(),
                (short*)_AudioData->get_raw_data(),
                (short*)_AudioData->get_raw_data(),
                _AudioData->get_samples_count(),
                buffer,
                bufSize);
        }
        else
        {
            lameRet = lame_encode_buffer_interleaved( 
                m_Lame.get(),
                (short*)_AudioData->get_raw_data(),
                _AudioData->get_samples_count(),
                buffer,
                bufSize);
        }
    }
    else
    {
        lameRet = lame_encode_flush(m_Lame.get(), buffer, bufSize) ;
    }

    const int samplesEncoded = predSamplesInLame +  samplesCount - lame_get_mf_samples_to_encode( m_Lame.get() );
    m_TotalSamplesEncoded += samplesEncoded;

    common_media_packet2_ptr mediaPacket = common_media_packet2_ptr( new common_media_packet2() );
    mediaPacket->setter()->set_data(buffer, lameRet, bufferAllocNew);
    mediaPacket->setter()->set_media_type(DT_AVMEDIA_TYPE_AUDIO);
    mediaPacket->setter()->set_time_base(dt_rational_t(1, mp3TimeBase));
    mediaPacket->setter()->set_duration( samplesEncoded * (mp3TimeBase / get_input_sample_rate()) );

    const dt_ts_t ts = m_TotalSamplesEncoded * (mp3TimeBase / get_input_sample_rate());
    mediaPacket->setter()->set_pts( ts );
    mediaPacket->setter()->set_dts( ts );

    return mediaPacket;
}
Ejemplo n.º 2
0
ff_media_packet::ff_media_packet(AVPacketPtr _AVPacket, dt_media_type_t _MediaType): media_packet(new ff_media_packet_impl(_AVPacket, _MediaType, dt_rational_t()))
{
}
Ejemplo n.º 3
0
ff_media_packet::ff_media_packet(AVPacketPtr _AVPacket): media_packet(new ff_media_packet_impl(_AVPacket, DT_AVMEDIA_TYPE_UNKNOWN, dt_rational_t()))
{
}
 virtual dt_rational_t       get_frame_rate() const    {        return dt_rational_t();    }
 virtual dt_rational_t       get_time_base() const    {        return dt_rational_t();    }