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; }
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())) { }
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(); }