Module: sems Branch: master Commit: ba1d8aa8dfe762b09c4df08ecf5410db85dd7abd URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=ba1d8aa8dfe762b09c4df08ecf5410db85dd7abd
Author: Václav Kubart <[email protected]> Committer: Václav Kubart <[email protected]> Date: Wed Apr 25 12:00:07 2012 +0200 transcoder: statistics about input codec usage --- core/AmB2BMedia.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++--- core/AmB2BMedia.h | 8 ++++- core/AmRtpStream.cpp | 4 +- core/AmRtpStream.h | 3 +- 4 files changed, 84 insertions(+), 9 deletions(-) diff --git a/core/AmB2BMedia.cpp b/core/AmB2BMedia.cpp index 31a7212..6a3774b 100644 --- a/core/AmB2BMedia.cpp +++ b/core/AmB2BMedia.cpp @@ -35,6 +35,29 @@ void B2BMediaStatistics::decCodecWriteUsage(const string &codec_name) mutex.unlock(); } +void B2BMediaStatistics::incCodecReadUsage(const string &codec_name) +{ + if (codec_name.empty()) return; + + mutex.lock(); + map<string, int>::iterator i = codec_read_usage.find(codec_name); + if (i != codec_read_usage.end()) i->second++; + else codec_read_usage[codec_name] = 1; + mutex.unlock(); +} + +void B2BMediaStatistics::decCodecReadUsage(const string &codec_name) +{ + if (codec_name.empty()) return; + + mutex.lock(); + map<string, int>::iterator i = codec_read_usage.find(codec_name); + if (i != codec_read_usage.end()) { + if (i->second > 0) i->second--; + } + mutex.unlock(); +} + B2BMediaStatistics *B2BMediaStatistics::instance() { return &b2b_stats; @@ -67,6 +90,17 @@ void B2BMediaStatistics::getReport(const AmArg &args, AmArg &ret) write_usage.push(avp); } ret["write"] = write_usage; + + AmArg read_usage; + for (map<string, int>::iterator i = codec_read_usage.begin(); + i != codec_read_usage.end(); ++i) + { + AmArg avp; + avp["codec"] = i->first; + avp["count"] = i->second; + read_usage.push(avp); + } + ret["read"] = read_usage; } ////////////////////////////////////////////////////////////////////////////////// @@ -205,9 +239,14 @@ void AudioStreamData::resetStats() outgoing_payload = UNDEFINED_PAYLOAD; outgoing_payload_name.clear(); } + if (incoming_payload != UNDEFINED_PAYLOAD) { + b2b_stats.decCodecReadUsage(incoming_payload_name); + incoming_payload = UNDEFINED_PAYLOAD; + incoming_payload_name.clear(); + } } -void AudioStreamData::updateStats() +void AudioStreamData::updateSendStats() { if (!initialized) { resetStats(); @@ -224,7 +263,7 @@ void AudioStreamData::updateStats() if (payload != UNDEFINED_PAYLOAD) { // remember payload name (in lowercase to simulate case insensitivity) - outgoing_payload_name = stream->getPayloadName(); + outgoing_payload_name = stream->getPayloadName(payload); transform(outgoing_payload_name.begin(), outgoing_payload_name.end(), outgoing_payload_name.begin(), ::tolower); b2b_stats.incCodecWriteUsage(outgoing_payload_name); @@ -234,6 +273,33 @@ void AudioStreamData::updateStats() } } +void AudioStreamData::updateRecvStats(AmRtpStream *s) +{ + if (!initialized) { + resetStats(); + return; + } + + int payload = s->getLastPayload(); + if (payload != incoming_payload) { + // payload used to send has changed + + // decrement usage of previous payload if set + if (incoming_payload != UNDEFINED_PAYLOAD) + b2b_stats.decCodecReadUsage(incoming_payload_name); + + if (payload != UNDEFINED_PAYLOAD) { + // remember payload name (in lowercase to simulate case insensitivity) + incoming_payload_name = stream->getPayloadName(payload); + transform(incoming_payload_name.begin(), incoming_payload_name.end(), + incoming_payload_name.begin(), ::tolower); + b2b_stats.incCodecReadUsage(incoming_payload_name); + } + else incoming_payload_name.clear(); + incoming_payload = payload; + } +} + int AudioStreamData::writeStream(unsigned long long ts, unsigned char *buffer, AudioStreamData &src) { if (!initialized) return 0; @@ -249,14 +315,16 @@ int AudioStreamData::writeStream(unsigned long long ts, unsigned char *buffer, A AmRtpAudio *src_stream = src.getStream(); if (src_stream->checkInterval(ts)) { got = src_stream->get(ts, buffer, sample_rate, f_size); - if ((got > 0) && dtmf_queue) - dtmf_queue->putDtmfAudio(buffer, got, ts); + if (got > 0) { + updateRecvStats(src_stream); + if (dtmf_queue) dtmf_queue->putDtmfAudio(buffer, got, ts); + } } } if (got < 0) return -1; if (got > 0) { // we have data to be sent - updateStats(); + updateSendStats(); return stream->put(ts, buffer, sample_rate, got); } } diff --git a/core/AmB2BMedia.h b/core/AmB2BMedia.h index 2fe93da..6306b6e 100644 --- a/core/AmB2BMedia.h +++ b/core/AmB2BMedia.h @@ -15,6 +15,7 @@ class B2BMediaStatistics { private: std::map<string, int> codec_write_usage; + std::map<string, int> codec_read_usage; AmMutex mutex; public: @@ -24,6 +25,8 @@ class B2BMediaStatistics static B2BMediaStatistics *instance(); void incCodecWriteUsage(const string &codec_name); void decCodecWriteUsage(const string &codec_name); + void incCodecReadUsage(const string &codec_name); + void decCodecReadUsage(const string &codec_name); }; /** \brief Storage for several data items required to be held with one RTP @@ -60,8 +63,11 @@ class AudioStreamData { // for performance monitoring int outgoing_payload; + int incoming_payload; string outgoing_payload_name; - void updateStats(); + string incoming_payload_name; + void updateSendStats(); + void updateRecvStats(AmRtpStream *s); void resetStats(); public: diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp index 78a9568..32564a5 100644 --- a/core/AmRtpStream.cpp +++ b/core/AmRtpStream.cpp @@ -966,12 +966,12 @@ void AmRtpStream::setRtpRelayTransparentSSRC(bool transparent) { relay_transparent_ssrc = transparent; } -string AmRtpStream::getPayloadName() +string AmRtpStream::getPayloadName(int payload_type) { for(PayloadCollection::iterator it = payloads.begin(); it != payloads.end(); ++it){ - if (it->pt == payload) return it->name; + if (it->pt == payload_type) return it->name; } return string(""); diff --git a/core/AmRtpStream.h b/core/AmRtpStream.h index 187f009..5278c01 100644 --- a/core/AmRtpStream.h +++ b/core/AmRtpStream.h @@ -369,7 +369,8 @@ public: int getSdpMediaIndex() { return sdp_media_index; } void forceSdpMediaIndex(int idx) { sdp_media_index = idx; offer_answer_used = false; } int getPayloadType() { return payload; } - string getPayloadName(); + int getLastPayload() { return last_payload; } + string getPayloadName(int payload_type); /** * send a DTMF as RTP payload (RFC4733) _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
