RtspSessionStats.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF 281421,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const RtspSessionrStats_cxx_Version =
  51.     "$Id: RtspSessionStats.cxx,v 1.11 2001/06/05 01:19:44 kle Exp $";
  52. #include "RtspSessionStats.hxx"
  53. #include "RtspConfiguration.hxx"
  54. #include "RtpFileTypes.hxx"
  55. #include <stdio.h>
  56. #include <string>
  57. #include "cpLog.h"
  58. RtspSessionStats::RtspSessionStats()
  59.     : myCodecUsed(-1)
  60. {
  61. }
  62. int 
  63. RtspSessionStats::totalRecRequests()
  64. {
  65.     return myRecordDataList.size();
  66. }
  67. int 
  68. RtspSessionStats::totalPktsRecvd()
  69. {
  70.     int result = 0;
  71.     for (RecordDataList::iterator itr = myRecordDataList.begin();
  72.              itr != myRecordDataList.end(); itr++ )
  73.     {
  74.         result += (*itr).myPktsRecvd;
  75.     }
  76.     return result;
  77. }
  78. int 
  79. RtspSessionStats::totalBytesRecvd()
  80. {
  81.     int result = 0;
  82.     for (RecordDataList::iterator itr = myRecordDataList.begin();
  83.              itr != myRecordDataList.end(); itr++ )
  84.     {
  85.         result += (*itr).myBytesRecvd;
  86.     }
  87.     return result;
  88. }
  89. float
  90. RtspSessionStats::totalRecPSW()
  91. {
  92.     float result = 0.0;
  93.     for (RecordDataList::iterator itr = myRecordDataList.begin();
  94.              itr != myRecordDataList.end(); itr++ )
  95.     {
  96.         result += ((*itr).myPreStreamWaitRecvd).length() * 1.0 /
  97.                    ( TickCount::ticksPerSec * 1.0 );
  98.     }
  99.     return result;
  100. }
  101. float
  102. RtspSessionStats::averageRecPSW()
  103. {
  104.     return (totalRecRequests() == 0) ? 
  105.            0 : ( totalRecPSW() / ( totalRecRequests() * 1.0) );
  106. }
  107. float
  108. RtspSessionStats::totalRecThroughput()
  109. {
  110.     float result = 0.0;
  111.     for (RecordDataList::iterator itr = myRecordDataList.begin();
  112.              itr != myRecordDataList.end(); itr++ )
  113.     {
  114.         if ( ((*itr).myStreamWaitRecvd).length() > 0 )
  115.         {
  116.             result += ((*itr).myBytesRecvd * 1.0) /
  117.                       ( (((*itr).myStreamWaitRecvd).length() * 1.0) /
  118.                         ( TickCount::ticksPerSec * 1.0) );
  119.         }
  120.     }
  121.     return result;
  122. }
  123. float
  124. RtspSessionStats::averageRecThroughput()
  125. {
  126.     return (totalRecRequests() == 0) ?
  127.            0.0 : ( totalRecThroughput() / ( totalRecRequests() * 1.0) );
  128. }
  129. float
  130. RtspSessionStats::totalRecRoughThroughput()
  131. {
  132.     float result = 0.0;
  133.     for (RecordDataList::iterator itr = myRecordDataList.begin();
  134.              itr != myRecordDataList.end(); itr++ )
  135.     {
  136.        if ( (((*itr).myStreamWaitRecvd).length() > 0) ||
  137.             (((*itr).myPreStreamWaitRecvd).length() > 0) )
  138.        {
  139.             result += ((*itr).myBytesRecvd * 1.0) /
  140.                       ( ( ((*itr).myStreamWaitRecvd).length() +
  141.                           ((*itr).myPreStreamWaitRecvd).length() ) * 1.0 /
  142.                         ( TickCount::ticksPerSec * 1.0 ) ) ;
  143.        }
  144.     }
  145.     return result;
  146. }
  147. float
  148. RtspSessionStats::averageRecRoughThroughput()
  149. {
  150.     return (totalRecRequests() == 0) ?
  151.            0.0 : ( totalRecRoughThroughput() / (totalRecRequests() * 1.0) );
  152. }
  153. int 
  154. RtspSessionStats::totalPlyRequests()
  155. {
  156.     return myPlayDataList.size();
  157. }
  158. int 
  159. RtspSessionStats::totalPktsSent()
  160. {
  161.     int result = 0;
  162.     for (PlayDataList::iterator itr = myPlayDataList.begin();
  163.              itr != myPlayDataList.end(); itr++ )
  164.     {
  165.         result += (*itr).myPktsSent;
  166.     }
  167.     return result;
  168. }
  169. int 
  170. RtspSessionStats::totalBytesSent()
  171. {
  172.     int result = 0;
  173.     for (PlayDataList::iterator itr = myPlayDataList.begin();
  174.              itr != myPlayDataList.end(); itr++ )
  175.     {
  176.         result += (*itr).myBytesSent;
  177.     }
  178.     return result;
  179. }
  180. float
  181. RtspSessionStats::totalPlyThroughput()
  182. {
  183.     float result = 0.0;
  184.     for (PlayDataList::iterator itr = myPlayDataList.begin();
  185.              itr != myPlayDataList.end(); itr++ )
  186.     {
  187.         if ( ((*itr).myStreamWaitSent).length() > 0)
  188.         {
  189.             result += ((*itr).myBytesSent * 1.0) /
  190.                       ((((*itr).myStreamWaitSent).length() * 1.0) /
  191.                        (TickCount::ticksPerSec * 1.0));
  192.         }
  193.     }
  194.     return result;
  195. }
  196. float
  197. RtspSessionStats::averagePlyThroughput()
  198. {
  199.     return (totalPlyRequests() == 0) ?
  200.            0.0 : ( totalPlyThroughput() / (totalPlyRequests() * 1.0) );
  201. }
  202. void
  203. RtspSessionStats::report(const char* sessionId)
  204. {
  205.     FILE* f;
  206.     string filename = RtspConfiguration::instance().statisticsLogFile;
  207.     f = fopen(filename.c_str(), "a");
  208.     if (!f)
  209.     {
  210.         cpLog( LOG_ERR, "Fail to open rtsp statistic log file to write" );
  211.         return ;
  212.     }
  213.     RtspConfiguration::instance().logFileMutex.lock();
  214.     fprintf(f, "n---Per Session Data---n");
  215.     fprintf(f, "SessionId: %sn", sessionId);
  216.     if (totalRecRequests() > 0)
  217.     {
  218.         fprintf(f, "TotRecReq: %dn", totalRecRequests());
  219.         fprintf(f, "TotPktRcv: %dn", totalPktsRecvd());
  220.         fprintf(f, "TotBytRcv: %dn", totalBytesRecvd());
  221.         fprintf(f, "AvgRecPSW: %.6f secn", averageRecPSW());
  222.         fprintf(f, "AvgRecTh : %.6fn", averageRecThroughput());
  223.         fprintf(f, "AvgRecRTh: %.6fn", averageRecRoughThroughput());
  224.     }
  225.     if (totalPlyRequests() > 0)
  226.     {
  227.         fprintf(f, "TotPlyReq: %dn", totalPlyRequests());
  228.         fprintf(f, "TotPktSnt: %dn", totalPktsSent());
  229.         fprintf(f, "TotBytSnt: %dn", totalBytesSent());
  230.         fprintf(f, "AvgPlyTh : %.6fn", averagePlyThroughput());
  231.     }
  232.     if (myCodecUsed < myNumberOfCodecs)
  233.        fprintf(f, "CodecUsed: %sn", rtpFileTypeInfo[myCodecUsed].name.c_str());
  234.     fflush(f);
  235.     fclose(f);
  236.     RtspConfiguration::instance().logFileMutex.unlock();
  237. }
  238. /* Local Variables: */
  239. /* c-file-style: "stroustrup" */
  240. /* indent-tabs-mode: nil */
  241. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  242. /* c-basic-offset: 4 */
  243. /* End: */