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

Reply via email to