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

流媒体/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 $1,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 RtcpTransmitter_cxx_Version =
  51.     "$Id: RtcpTransmitter.cxx,v 1.11 2001/03/23 02:20:23 wjin Exp $";
  52. #include <iostream>
  53. #include <stdlib.h>
  54. #include <stdio.h>
  55. #include <assert.h>
  56. #include <time.h>
  57. #include <sys/types.h>
  58. #include "vtypes.h"
  59. #include <unistd.h>
  60. #include <string.h>
  61. // networking
  62. #include <sys/types.h>
  63. #include <sys/socket.h>
  64. #include <netinet/in.h>
  65. #include "cpLog.h"
  66. #include "vsock.hxx"
  67. #include "rtpTypes.h"
  68. #include "rtpTools.hxx"
  69. #include "NtpTime.hxx"
  70. #include "Rtp.hxx"
  71. #include "Rtcp.hxx"
  72. /* ----------------------------------------------------------------- */
  73. /* --- RtcpTransmitter Constructor --------------------------------- */
  74. /* ----------------------------------------------------------------- */
  75. RtcpTransmitter::RtcpTransmitter (const char* remoteHost,
  76.                                   int remoteMinPort,
  77.                                   int remoteMaxPort,
  78.                                   RtcpReceiver* receiver)
  79. {
  80.     NetworkAddress netAddress;
  81.     if ( remoteHost )
  82.     {
  83.         netAddress.setPort(remoteMinPort);
  84.         netAddress.setHostName(remoteHost);
  85.     }
  86.     if (receiver)
  87.     {
  88.         myStack = receiver->getUdpStack();
  89.         myStack->setDestination(&netAddress);
  90.         remoteAddr = netAddress;
  91.         //        myStack->connectPorts();
  92.         freeStack = false;
  93.     }
  94.     else
  95.     {
  96.         myStack = new UdpStack(&netAddress, remoteMinPort, remoteMaxPort,
  97.                                sendonly) ;
  98.         remoteAddr = netAddress;
  99.         //        myStack->connectPorts();
  100.         freeStack = true;
  101.     }
  102.     constructRtcpTransmitter ();
  103. }
  104. RtcpTransmitter::RtcpTransmitter (const char* remoteHost,
  105.                                   int remotePort,
  106.                                   RtcpReceiver* receiver)
  107. {
  108.     NetworkAddress netAddress;
  109.     if ( remoteHost )
  110.     {
  111.         netAddress.setHostName(remoteHost);
  112.         netAddress.setPort(remotePort);
  113.     }
  114.     if (receiver)
  115.     {
  116.         myStack = receiver->getUdpStack();
  117.         myStack->setDestination(&netAddress);
  118.         remoteAddr = netAddress;
  119.         //        myStack->connectPorts();
  120.         freeStack = false;
  121.     }
  122.     else
  123.     {
  124.         myStack = new UdpStack(&netAddress, remotePort, remotePort,
  125.                                sendonly) ;
  126.         remoteAddr = netAddress;
  127.         //        myStack->connectPorts();
  128.         freeStack = true;
  129.     }
  130.     constructRtcpTransmitter ();
  131. }
  132. void RtcpTransmitter::constructRtcpTransmitter ()
  133. {
  134.     tran = NULL;
  135.     recv = NULL;
  136.     rtcpRecv = NULL;
  137.     SDESInfo = NULL;
  138.     // prepare for rtcp timing intervals
  139.     nextInterval = getNtpTime();
  140.     updateInterval();
  141. }
  142. RtcpTransmitter::~RtcpTransmitter ()
  143. {
  144.     if (freeStack)
  145.     {
  146.         delete myStack;
  147.         myStack = 0;
  148.     }
  149.     if ((tran) && (SDESInfo))
  150.     {
  151.         delete SDESInfo;
  152.         SDESInfo = NULL;
  153.     }
  154.     tran = NULL;
  155.     recv = NULL;
  156.     rtcpRecv = NULL;
  157. }
  158. void
  159. RtcpTransmitter::setRemoteAddr (const NetworkAddress& theAddr)
  160. {
  161.     remoteAddr = theAddr;
  162. }
  163. /* --- send packet functions --------------------------------------- */
  164. int RtcpTransmitter::transmit (RtcpPacket* p)
  165. {
  166.     //    NetworkAddress* toAddress = myStack->getDestinationHost();
  167.     // transmit packet
  168.     //int result = sendto (socketFD, p->getPacketData(), p->getTotalUsage(),
  169.     //             0, (struct sockaddr*) &rxAddress, sizeof(rxAddress));
  170.     //    myStack->transmit (p->getPacketData(), p->getTotalUsage());
  171.     myStack->transmitTo ((char*)p->getPacketData(),
  172.                          p->getTotalUsage(),
  173.                          &remoteAddr);
  174.     /*
  175.         if (toAddress)
  176.         {
  177.             delete toAddress;
  178.             toAddress = NULL;
  179.         }
  180.     */
  181.     // exit with sucess
  182.     return 0;
  183. }
  184. void RtcpTransmitter::updateInterval ()
  185. {
  186.     // RTCP_INTERVAL random offset between (.5 to 1.5)
  187.     int delayMs = RTCP_INTERVAL * (500 + rand() / (RAND_MAX / 1000)) / 1000;
  188.     nextInterval = nextInterval + delayMs;
  189. }
  190. int RtcpTransmitter::checkInterval ()
  191. {
  192.     if (getNtpTime() > nextInterval)
  193.     {
  194.         // prepare for next interval
  195.         updateInterval();
  196.         return 1;
  197.     }
  198.     // time not up yet
  199.     return 0;
  200. }
  201. /* --- SR/RR RTCP report packets------------------------------------ */
  202. int RtcpTransmitter::addSR (RtcpPacket* p, int npadSize)
  203. {
  204.     // header
  205.     RtcpHeader* header = reinterpret_cast < RtcpHeader* > (p->freeData());
  206.     int usage = p->allocData (sizeof(RtcpHeader));
  207.     header->version = RTP_VERSION;
  208.     header->padding = (npadSize > 0) ? 1 : 0;
  209.     header->count = 0;
  210.     header->type = (tran) ? rtcpTypeSR : rtcpTypeRR;
  211.     NtpTime nowNtp = getNtpTime();
  212.     // sender information
  213.     if (tran)
  214.     {
  215.         //cpLog (LOG_DEBUG_STACK, "RTCP: Making Sender Info");
  216.         RtcpSender* senderInfo = reinterpret_cast < RtcpSender* > (p->freeData());
  217.         usage += p->allocData (sizeof(RtcpSender));
  218.         int diffNtp = 0;
  219.         if (nowNtp > tran->seedNtpTime)
  220.             diffNtp = nowNtp - tran->seedNtpTime;
  221.         else
  222.             if (tran->seedNtpTime > nowNtp)
  223.                 diffNtp = tran->seedNtpTime - nowNtp;
  224.         RtpTime diffRtp = (diffNtp * tran->networkFormat_clockRate) / 1000;
  225.         senderInfo->ssrc = htonl(tran->ssrc);
  226.         senderInfo->ntpTimeSec = htonl(nowNtp.getSeconds());
  227.         senderInfo->ntpTimeFrac = htonl(nowNtp.getFractional());
  228.         senderInfo->rtpTime = htonl(tran->seedRtpTime + diffRtp);
  229.         senderInfo->packetCount = htonl(tran->packetSent);
  230.         senderInfo->octetCount = htonl(tran->payloadSent);
  231.     }
  232.     else
  233.     {
  234.         RtcpChunk* chunk = reinterpret_cast < RtcpChunk* > (p->freeData());
  235.         usage += p->allocData (sizeof(RtpSrc));
  236.         chunk->ssrc = 0 ;  /* if recv only, give src 0 for receiver for now */
  237.     }
  238.     // report blocks
  239.     if ((rtcpRecv) && (rtcpRecv->getTranInfoCount() > 0))
  240.     {
  241.         //cpLog (LOG_DEBUG_STACK, "RTCP: Making Report Block");
  242.         RtpTranInfo* tranInfo = NULL;
  243.         RtpReceiver* recvInfoSpec = NULL;
  244.         RtcpReport* reportBlock = NULL;
  245.         for (int i = 0; i < rtcpRecv->getTranInfoCount(); i++)
  246.         {
  247.             tranInfo = rtcpRecv->getTranInfoList(i);
  248.             recvInfoSpec = tranInfo->recv;
  249.             // only receieved RTCP packets from transmitter
  250.             if (recvInfoSpec == NULL)
  251.                 continue;
  252.             // don't report on probation transmitters
  253.             if (recvInfoSpec->probation < 0)
  254.                 continue;
  255.             //cpLog (LOG_DEBUG_STACK, "RTCP:  Report block for src %d",
  256.             //       recvInfoSpec->ssrc);
  257.             reportBlock = reinterpret_cast < RtcpReport* > (p->freeData());
  258.             usage += p->allocData (sizeof(RtcpReport));
  259.             reportBlock->ssrc = htonl(recvInfoSpec->ssrc);
  260.             reportBlock->fracLost = calcLostFrac(tranInfo);
  261.             u_int32_t lost = (calcLostCount(tranInfo)) & 0xffffff;
  262.             reportBlock->cumLost[2] = lost & 0xff;
  263.             reportBlock->cumLost[1] = (lost & 0xff00) >> 8;
  264.             reportBlock->cumLost[0] = (lost & 0xff0000) >> 16;
  265.             reportBlock->recvCycles = htons(recvInfoSpec->recvCycles);
  266.             reportBlock->lastSeqRecv = htons(recvInfoSpec->prevSeqRecv);
  267.             // fracational
  268.             // reportBlock->jitter = htonl((u_int32_t)recvInfoSpec->jitter);
  269.             // interger
  270.             //            if (recvInfoSpec->jitter > 0)
  271.             reportBlock->jitter = htonl(recvInfoSpec->jitter >> 4);
  272.             reportBlock->lastSRTimeStamp = htonl(tranInfo->lastSRTimestamp);
  273.             // reportBlock->lastSRDelay in the unit of 1/65536 of sec ??
  274.             // currently it is in ms
  275.             if (tranInfo->lastSRTimestamp == 0)
  276.                 reportBlock->lastSRDelay = 0;
  277.             else
  278.             {
  279.                 NtpTime thenNtp = tranInfo->recvLastSRTimestamp;
  280.                 //                NtpTime thenNtp ((tranInfo->lastSRTimestamp >> 16) |
  281.                 //                                 (nowNtp.getSeconds() & 0xffff0000),
  282.                 //                                 tranInfo->lastSRTimestamp << 16);
  283.                 reportBlock->lastSRDelay = 0;
  284.                 if (nowNtp > thenNtp)
  285.                     reportBlock->lastSRDelay = htonl(nowNtp - thenNtp);
  286.                 else
  287.                     reportBlock->lastSRDelay = 0;
  288.             }
  289.             // next known transmitter
  290.             header->count++;
  291.         }
  292.     }
  293.     // profile-specific extensions
  294.     // future: not implemented
  295.     // padding
  296.     if (npadSize > 0)
  297.     {
  298.         // future: not implemented
  299.         assert (0);
  300.     }
  301.     // overall packet must ends on 32-bit count
  302.     assert (usage % 4 == 0);
  303.     header->length = htons((usage / 4) - 1);
  304.     //cpLog (LOG_DEBUG_STACK, "RTCP:  SR/RR packet used %d bytes/ %d words",
  305.     //       usage, usage/4);
  306.     return usage;
  307. }
  308. u_int32_t RtcpTransmitter::calcLostFrac (RtpTranInfo* s)
  309. {
  310.     /* from A.3 of RFC 1889 - RTP/RTCP Standards */
  311.     RtpReceiver* r = s->recv;
  312.     u_int32_t expected = ((r->recvCycles + r->prevSeqRecv) - r->seedSeq + 1);
  313.     u_int32_t expected_interval, received_interval, lost_interval;
  314.     expected_interval = expected - s->expectedPrior;
  315.     s->expectedPrior = expected;
  316.     received_interval = r->packetReceived - s->receivedPrior;
  317.     s->receivedPrior = r->packetReceived;
  318.     lost_interval = expected_interval - received_interval;
  319.     u_int32_t fraction;
  320.     if (expected_interval == 0 || lost_interval <= 0) fraction = 0;
  321.     else fraction = (lost_interval << 8) / expected_interval;
  322.     return fraction;
  323. }
  324. u_int32_t RtcpTransmitter::calcLostCount (RtpTranInfo* s)
  325. {
  326.     /* from A.3 of RFC 1889 - RTP/RTCP Standards */
  327.     RtpReceiver* r = s->recv;
  328.     u_int32_t expected = ((r->recvCycles + r->prevSeqRecv) - r->seedSeq + 1);
  329.     return expected - r->packetReceived;
  330. }
  331. /* --- SDES RTCP packet -------------------------------------------- */
  332. int RtcpTransmitter::addSDES (RtcpPacket* p, RtcpSDESType item, int npadSize)
  333. {
  334.     if (!tran) return -1;
  335.     RtcpSDESType list[2];
  336.     list[0] = item;
  337.     list[1] = rtcpSdesEnd;
  338.     return addSDES (p, list, npadSize);
  339. }
  340. int RtcpTransmitter::addSDES (RtcpPacket* p, int npadSize)
  341. {
  342.     if (!tran) return -1;
  343.     RtcpSDESType list[8];
  344.     int i = 0;
  345.     if (strlen(getSdesCname()) > 0) list[i++] = rtcpSdesCname;
  346.     if (strlen(getSdesName()) > 0) list[i++] = rtcpSdesName;
  347.     if (strlen(getSdesEmail()) > 0) list[i++] = rtcpSdesEmail;
  348.     if (strlen(getSdesPhone()) > 0) list[i++] = rtcpSdesPhone;
  349.     if (strlen(getSdesLoc ()) > 0) list[i++] = rtcpSdesLoc ;
  350.     if (strlen(getSdesTool ()) > 0) list[i++] = rtcpSdesTool ;
  351.     if (strlen(getSdesNote ()) > 0) list[i++] = rtcpSdesNote ;
  352.     list[i] = rtcpSdesEnd;
  353.     return addSDES (p, list, npadSize);
  354. }
  355. int RtcpTransmitter::addSDES (RtcpPacket* p, RtcpSDESType* SDESlist,
  356.                               int npadSize)
  357. {
  358.     if (!tran) return -1;
  359.     // header
  360.     //cpLog (LOG_DEBUG_STACK, "RTCP: Making SDES packet");
  361.     RtcpHeader* header = reinterpret_cast < RtcpHeader* > (p->freeData());
  362.     int usage = p->allocData (sizeof(RtcpHeader));
  363.     header->version = RTP_VERSION;
  364.     header->padding = (npadSize > 0) ? 1 : 0;
  365.     header->count = 1;
  366.     header->type = rtcpTypeSDES;
  367.     // only sends the sender's SDE
  368.     // SDES chunk
  369.     RtcpChunk* chunk = reinterpret_cast < RtcpChunk* > (p->freeData());
  370.     usage += p->allocData (sizeof(RtpSrc));
  371.     /*
  372.     cout << "sizeof(RtcpChunk) =" << sizeof(RtcpChunk) << endl; // ?? should be 7
  373.     */
  374.     chunk->ssrc = htonl(tran->ssrc);
  375.     // SDES items
  376.     RtcpSDESItem* item = NULL;
  377.     for (int i = 0; SDESlist[i] != rtcpSdesEnd; i++)
  378.     {
  379.         //cpLog (LOG_DEBUG_STACK, "RTCP:  Adding SDES %d", SDESlist[i]);
  380.         item = reinterpret_cast < RtcpSDESItem* > (p->freeData());
  381.         usage += p->allocData (sizeof(RtcpSDESItem) - 1);
  382.         int len = 0;
  383.         switch (SDESlist[i])
  384.         {
  385.             case rtcpSdesCname:
  386.             strcpy(&(item->startOfText), getSdesCname());
  387.             len = strlen(getSdesCname());
  388.             //cpLog (LOG_DEBUG_STACK, "RTCP:  SDES Item Length: %d", len);
  389.             //cpLog (LOG_DEBUG_STACK, "RTCP:  SDES Item Value: %s", getSdesCname());
  390.             break;
  391.             case rtcpSdesName:
  392.             strcpy(&(item->startOfText), getSdesName());
  393.             len = strlen(getSdesName());
  394.             break;
  395.             case rtcpSdesEmail:
  396.             strcpy(&(item->startOfText), getSdesEmail());
  397.             len = strlen(getSdesEmail());
  398.             break;
  399.             case rtcpSdesPhone:
  400.             strcpy(&(item->startOfText), getSdesPhone());
  401.             len = strlen(getSdesPhone());
  402.             break;
  403.             case rtcpSdesLoc:
  404.             strcpy(&(item->startOfText), getSdesLoc());
  405.             len = strlen(getSdesLoc());
  406.             break;
  407.             case rtcpSdesTool:
  408.             strcpy(&(item->startOfText), getSdesTool());
  409.             len = strlen(getSdesTool());
  410.             break;
  411.             case rtcpSdesNote:
  412.             strcpy(&(item->startOfText), getSdesNote());
  413.             len = strlen(getSdesNote());
  414.             break;
  415.             case rtcpSdesPriv:
  416.             // future: not implemented
  417.             assert (0);
  418.             break;
  419.             default:
  420.             cpLog (LOG_ERR, "RtcpTransmitter:  SDES type unknown");
  421.             assert (0);
  422.             break;
  423.         }
  424.         item->type = SDESlist[i];
  425.         // strlen removes the null that was copied
  426.         item->length = len;
  427.         usage += p->allocData (item->length);
  428.     }
  429.     // ending SDES item
  430.     item = reinterpret_cast < RtcpSDESItem* > (p->freeData());
  431.     usage += p->allocData (sizeof(RtcpSDESItem) - 1);
  432.     item->type = rtcpSdesEnd;
  433.     item->length = 0;
  434.     // padding
  435.     if (npadSize > 0)
  436.     {
  437.         // future: not implemented
  438.         assert (0);
  439.     }
  440.     // end packet on 32-bit count
  441.     if (usage % 4 != 0)
  442.     {
  443.         //cpLog (LOG_DEBUG_STACK, "RTCP:  SDES padded by: %d", 4-usage%4);
  444.         usage += p->allocData (4 - usage % 4);
  445.     }
  446.     header->length = htons((usage / 4) - 1);
  447.     //cpLog (LOG_DEBUG_STACK, "RTCP:  SDES packet used %d bytes/ %d words", usage, usage/4);
  448.     return usage;
  449. }
  450. /* --- BYE RTCP packet --------------------------------------------- */
  451. int RtcpTransmitter::addBYE (RtcpPacket* p, char* reason, int npadSize)
  452. {
  453.     if (!tran) return -1;
  454.     RtpSrc list[1];
  455.     list[0] = tran->getSSRC();
  456.     return addBYE (p, list, 1, reason, npadSize);
  457. }
  458. int RtcpTransmitter::addBYE (RtcpPacket* p, RtpSrc* list, int count,
  459.                              char* reason, int npadSize)
  460. {
  461.     assert (count > 0);
  462.     // header
  463.     //cpLog (LOG_DEBUG_STACK, "RTCP: Making BYE packet");
  464.     RtcpHeader* header = reinterpret_cast < RtcpHeader* > (p->freeData());
  465.     int usage = p->allocData (sizeof(RtcpHeader));
  466.     header->version = RTP_VERSION;
  467.     header->padding = (npadSize > 0) ? 1 : 0;
  468.     header->count = count;
  469.     header->type = rtcpTypeBYE;
  470.     // transmitter leaving
  471.     RtpSrc* s = NULL;
  472.     for (int i = 0; i < count; i++)
  473.     {
  474.         s = reinterpret_cast < RtpSrc* > (p->freeData());
  475.         usage += p->allocData (sizeof(RtpSrc));
  476.         *s = htonl(list[i]);
  477.         //cpLog (LOG_DEBUG_STACK, "RTCP:  SRC: %d", list[i]);
  478.     }
  479.     // reason - optional
  480.     if (reason)
  481.     {
  482.         RtcpBye* byeReason = reinterpret_cast < RtcpBye* > (p->freeData());
  483.         usage += p->allocData (sizeof(RtcpBye) - 1);
  484.         byeReason->length = strlen(reason);
  485.         strncpy (&(byeReason->startOfText), reason, byeReason->length);
  486.         usage += p->allocData (byeReason->length);
  487.         //cpLog (LOG_DEBUG_STACK, "RTCP:  Reason: %s", reason);
  488.     }
  489.     // padding
  490.     if (npadSize > 0)
  491.     {
  492.         // future: not implemented
  493.         assert (0);
  494.     }
  495.     // end packet on 32-bit count
  496.     if (usage % 4 != 0)
  497.     {
  498.         //cpLog (LOG_DEBUG_STACK, "RTCP:  BYE padded by: %d", 4-usage%4);
  499.         usage += p->allocData (4 - usage % 4);
  500.     }
  501.     header->length = htons((usage / 4) - 1);
  502.     //cpLog (LOG_DEBUG_STACK, "RTCP:  BYE packet used %d bytes/ %d words",
  503.     //       usage, usage/4);
  504.     return usage;
  505. }
  506. /* --- APP RTCP packet --------------------------------------------- */
  507. int RtcpTransmitter::addAPP (RtcpPacket* packet, int npadSize)
  508. {
  509.     // future: not implemented
  510.     assert (0);
  511.     return -1;
  512. }
  513. /* --- SDES Information -------------------------------------------- */
  514. void RtcpTransmitter::setSdesCname ()
  515. {
  516.     char user[64] = "unknown_user";
  517.     char hn[64] = "uknown_host";
  518.     char cnameres [64 + 20 + 64];
  519. #if 0
  520.     uid_t uid = getuid();
  521.     struct passwd *pw = getpwuid(uid);
  522.     if (pw != NULL)
  523.     {
  524.         strncpy(user, pw->pw_name, sizeof(user));
  525.         user[63] = (char)0;
  526.     }
  527. #endif  // 0
  528.     gethostname (hn, sizeof(hn));
  529.     sprintf (cnameres, "%s.%d@%s", user, getpid(), hn);
  530.     assert (strlen(cnameres) < 255);
  531.     strcpy (SDESInfo->cname, cnameres);
  532. }
  533. void RtcpTransmitter::setSdesName (char* text)
  534. {
  535.     assert (strlen(text) < 255);
  536.     strcpy (SDESInfo->name, text);
  537. }
  538. void RtcpTransmitter::setSdesEmail (char* text)
  539. {
  540.     assert (strlen(text) < 255);
  541.     strcpy (SDESInfo->email, text);
  542. }
  543. void RtcpTransmitter::setSdesPhone (char* text)
  544. {
  545.     assert (strlen(text) < 256);
  546.     strcpy (SDESInfo->phone, text);
  547. }
  548. void RtcpTransmitter::setSdesLoc (char* text)
  549. {
  550.     assert (strlen(text) < 255);
  551.     strcpy (SDESInfo->loc, text);
  552. }
  553. void RtcpTransmitter::setSdesTool (char* text)
  554. {
  555.     assert (strlen(text) < 255);
  556.     strcpy (SDESInfo->tool, text);
  557. }
  558. void RtcpTransmitter::setSdesNote (char* text)
  559. {
  560.     assert (strlen(text) < 255);
  561.     strcpy (SDESInfo->note, text);
  562. }
  563. char* RtcpTransmitter::getSdesCname ()
  564. {
  565.     return SDESInfo->cname;
  566. }
  567. char* RtcpTransmitter::getSdesName ()
  568. {
  569.     return SDESInfo->name;
  570. }
  571. char* RtcpTransmitter::getSdesEmail ()
  572. {
  573.     return SDESInfo->email;
  574. }
  575. char* RtcpTransmitter::getSdesPhone ()
  576. {
  577.     return SDESInfo->phone;
  578. }
  579. char* RtcpTransmitter::getSdesLoc ()
  580. {
  581.     return SDESInfo->loc;
  582. }
  583. char* RtcpTransmitter::getSdesTool ()
  584. {
  585.     return SDESInfo->tool;
  586. }
  587. char* RtcpTransmitter::getSdesNote ()
  588. {
  589.     return SDESInfo->note;
  590. }
  591. /* --- misc functions ---------------------------------------------- */
  592. void RtcpTransmitter::setRTPtran (RtpTransmitter* s)
  593. {
  594.     if (SDESInfo == NULL)
  595.         SDESInfo = new SDESdata;
  596.     tran = s;
  597. }
  598. void RtcpTransmitter::setRTPrecv (RtpReceiver* s)
  599. {
  600.     recv = s;
  601. }
  602. void RtcpTransmitter::setRTCPrecv (RtcpReceiver* s)
  603. {
  604.     rtcpRecv = s;
  605. }
  606. int RtcpTransmitter::getPort ()
  607. {
  608.     return myStack->getTxPort();
  609. };
  610. int RtcpTransmitter::getSocketFD ()
  611. {
  612.     return myStack->getSocketFD();
  613. };