Added rate limiter for audio but disable it

Is it really needed??
This commit is contained in:
Martin Pulec
2014-08-14 17:21:56 +02:00
parent 13b3555c0a
commit abb0cd7a20
5 changed files with 55 additions and 16 deletions

View File

@@ -95,6 +95,7 @@ typedef struct
char *data; /* data should be at least 4B aligned */
int data_len; /* size of useful data in buffer */
audio_codec_t codec;
double duration;
} audio_channel;
struct module;
@@ -120,17 +121,18 @@ public:
audio_codec_t get_codec();
const char *get_data(int channel);
size_t get_data_len(int channel);
double get_duration();
int get_channel_count();
int get_sample_count();
int get_sample_rate();
bool has_same_prop_as(audio_frame2 const &frame);
void set_duration(double duration);
private:
int bps; /* bytes per sample */
int sample_rate;
std::vector<std::pair<std::unique_ptr<char []>, size_t> > channels; /* data should be at least 4B aligned */
audio_codec_t codec;
int sample_count; ///< number of samples stored in this buffer
///< assuming that all channels has same count...
double duration;
};
#endif

View File

@@ -253,6 +253,7 @@ audio_frame2 *audio_codec_compress(struct audio_codec_state *s, audio_frame2 *fr
} else {
s->out->reset();
}
s->out->set_duration(out->duration);
} else {
assert(out->bps == s->out->get_bps()
&& out->sample_rate == s->out->get_sample_rate());

View File

@@ -353,6 +353,7 @@ static audio_channel *libavcodec_compress(void *state, audio_channel * channel)
int bps = s->output_channel.bps;
int offset = 0;
s->output_channel.data_len = 0;
s->output_channel.duration = 0.0;
int chunk_size = s->codec_ctx->frame_size * bps;
//while(offset + chunk_size <= s->tmp.data_len) {
while(offset + chunk_size <= s->tmp.data_len) {
@@ -370,6 +371,10 @@ static audio_channel *libavcodec_compress(void *state, audio_channel * channel)
}
if(got_packet) {
s->output_channel.data_len += s->pkt.size;
///@ todo
/// well, this is wrong, denominator should be actually AVStream::time_base. Where do
/// we get this?? Anyway, seems like it equals sample rate.
s->output_channel.duration += s->pkt.duration / (double) s->output_channel.sample_rate;
}
offset += chunk_size;
if(!(s->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))

View File

@@ -72,7 +72,7 @@ using namespace std;
* @brief Creates empty audio_frame2
*/
audio_frame2::audio_frame2() :
bps(0), sample_rate(0), codec(AC_PCM)
bps(0), sample_rate(0), codec(AC_PCM), duration(0.0)
{
}
@@ -100,6 +100,7 @@ void audio_frame2::init(int nr_channels, audio_codec_t c, int b, int sr)
bps = b;
codec = c;
sample_rate = sr;
duration = 0.0;
}
void audio_frame2::append(audio_frame2 const &src)
@@ -171,6 +172,7 @@ void audio_frame2::reset()
channels[i].first = unique_ptr<char []>(new char[0]);
channels[i].second = 0;
}
duration = 0.0;
}
int audio_frame2::get_bps()
@@ -193,6 +195,16 @@ size_t audio_frame2::get_data_len(int channel)
return channels[channel].second;
}
double audio_frame2::get_duration()
{
if (codec == AC_PCM) {
int samples = get_sample_count();
return (double) samples / get_sample_rate();
} else {
return duration;
}
}
int audio_frame2::get_channel_count()
{
return channels.size();
@@ -200,10 +212,6 @@ int audio_frame2::get_channel_count()
int audio_frame2::get_sample_count()
{
if (channels.size() == 0) {
throw logic_error("zero channels!");
}
// for PCM, we can deduce samples count from length of the data
if (codec == AC_PCM) {
return channels[0].second / channels.size() / get_bps();
@@ -224,6 +232,11 @@ bool audio_frame2::has_same_prop_as(audio_frame2 const &frame) {
channels.size() == frame.channels.size();
}
void audio_frame2::set_duration(double new_duration)
{
duration = new_duration;
}
static double get_normalized(const char *in, int bps) {
int64_t sample = 0;
bool negative = false;

View File

@@ -703,8 +703,24 @@ void audio_tx_send(struct tx* tx, struct rtp *rtp_session, audio_frame2 * buffer
int packet_rate = tx->packet_rate;
if (packet_rate == RATE_AUTO) {
/// @todo add automatic packet rate management also for audio. We currently don't
/// know actual audio buffer length (if compressed)
/**
* @todo
* Following code would actually work but seems to be useless in most of cases (eg.
* PCM 2 channels 2 Bps takes 5 std. Eth frames). On the other hand it could cause
* unexpectable problems (I'd write them here but if I'd expect them they wouldn't
* be unexpectable.)
*/
#if 0
double time_for_frame = buffer->get_duration() / buffer->get_channel_count();
if (time_for_frame > 0.0) {
long long req_bitrate = buffer->get_data_len(channel) * 8 / time_for_frame * tx->mult_count;
// adjust computed value to 3
req_bitrate = req_bitrate * 3;
packet_rate = compute_packet_rate(req_bitrate, tx->mtu);
} else {
packet_rate = 0;
}
#endif
packet_rate = 0;
}
@@ -750,12 +766,14 @@ void audio_tx_send(struct tx* tx, struct rtp *rtp_session, audio_frame2 * buffer
mult_index = (mult_index + 1) % tx->mult_count;
}
do {
GET_STOPTIME;
GET_DELTA;
if (delta < 0)
delta += 1000000000L;
} while (packet_rate - delta > 0);
if (pos < buffer->get_data_len(channel)) {
do {
GET_STOPTIME;
GET_DELTA;
if (delta < 0)
delta += 1000000000L;
} while (packet_rate - delta > 0);
}
/* when trippling, we need all streams goes to end */
if(tx->fec_scheme == FEC_MULT) {
@@ -763,7 +781,7 @@ void audio_tx_send(struct tx* tx, struct rtp *rtp_session, audio_frame2 * buffer
}
} while (pos < (unsigned int) buffer->get_data_len(channel));
} while (pos < buffer->get_data_len(channel));
}
tx->buffer ++;