rtp_transmitter.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #ifndef __RTP_TRANSMITTER_H__
  23. #define __RTP_TRANSMITTER_H__
  24. #include <rtp/rtp.h>
  25. #include "media_sink.h"
  26. class CRtpTransmitter : public CMediaSink {
  27. public:
  28. CRtpTransmitter() {
  29. m_rtcpBandwidth = 100.0;
  30. m_audioDestAddress = NULL;
  31. m_audioRtpSession = NULL;
  32. m_audioPayloadNumber = 97;
  33. m_videoDestAddress = NULL;
  34. m_videoRtpSession = NULL;
  35. m_videoPayloadNumber = 96;
  36. m_videoTimeScale = 90000;
  37. }
  38. static void SeedRandom(void) {
  39. static bool once = false;
  40. if (!once) {
  41. srandom(time(NULL));
  42. once = true;
  43. }
  44. }
  45. static u_int32_t GetRandomMcastAddress(void) {
  46. SeedRandom();
  47. // pick a random number in the multicast range
  48. u_int32_t mcast = ((random() & 0x0FFFFFFF) | 0xE0000000);
  49. // screen out undesirable values
  50. // introduces small biases in the results
  51. // stay away from 224.0.0.x
  52. if ((mcast & 0x0FFFFF00) == 0) {
  53. mcast |= 0x00000100; // move to 224.0.1
  54. // stay out of SSM range 232.x.x.x
  55. // user should explictly select this if they want SSM
  56. if ((mcast & 0xFF000000) == 232) {
  57. mcast |= 0x01000000; // move to 233
  58. }
  59. // stay away from .0 .1 and .255
  60. if ((mcast & 0xFF) == 0 || (mcast & 0xFF) == 1 
  61.   || (mcast & 0xFF) == 255) {
  62. mcast = (mcast & 0xFFFFFFF0) | 0x4; // move to .4 or .244
  63. }
  64. return htonl(mcast);
  65. }
  66. static u_int16_t GetRandomPortBlock(void) {
  67. SeedRandom();
  68. // Get random block of 4 port numbers above 20000
  69. return (u_int16_t)(20000 + ((random() >> 18) << 2));
  70. }
  71. protected:
  72. int ThreadMain(void);
  73. void DoStartTransmit(void);
  74. void DoStopTransmit(void);
  75. void DoSendFrame(CMediaFrame* pFrame);
  76. void SendAudioFrame(CMediaFrame* pFrame);
  77. void SendAudioJumboFrame(CMediaFrame* pFrame);
  78. void SendQueuedAudioFrames(void);
  79. void SendMpeg4VideoWith3016(CMediaFrame* pFrame);
  80. u_int32_t AudioTimestampToRtp(Timestamp t) {
  81. return (u_int32_t)(((t - m_startTimestamp) 
  82. * m_audioTimeScale) / TimestampTicks)
  83. + m_audioRtpTimestampOffset;
  84. }
  85. u_int32_t VideoTimestampToRtp(Timestamp t) {
  86. return (u_int32_t)(((t - m_startTimestamp) 
  87. * m_videoTimeScale) / TimestampTicks)
  88. + m_videoRtpTimestampOffset;
  89. }
  90. static const u_int32_t SECS_BETWEEN_1900_1970 = 2208988800U;
  91. u_int64_t TimestampToNtp(Timestamp t) {
  92. // low order ntp 32 bits is 2 ^ 32 -1 ticks per sec
  93. register u_int32_t usecs = t % TimestampTicks;
  94. return (((t / TimestampTicks) + SECS_BETWEEN_1900_1970) << 32)
  95. | ((usecs << 12) + (usecs << 8) - ((usecs * 3650) >> 6));
  96. }
  97. static void RtpCallback(struct rtp *session, rtp_event *e) {
  98. // Currently we ignore RTCP packets
  99. // Just do our required housekeeping
  100. if (e && e->type == RX_RTP) {
  101. free(e->data);
  102. }
  103. }
  104. protected:
  105. Timestamp m_startTimestamp;
  106. float m_rtcpBandwidth;
  107. char* m_videoDestAddress;
  108. struct rtp* m_videoRtpSession;
  109. u_int8_t m_videoPayloadNumber;
  110. u_int32_t m_videoTimeScale;
  111. u_int32_t m_videoRtpTimestampOffset;
  112. u_int16_t m_videoSrcPort;
  113. MediaType m_audioFrameType;
  114. char* m_audioDestAddress;
  115. struct rtp* m_audioRtpSession;
  116. u_int8_t m_audioPayloadNumber;
  117. u_int32_t m_audioTimeScale;
  118. u_int32_t m_audioRtpTimestampOffset;
  119. u_int16_t m_audioSrcPort;
  120. u_int8_t m_audioPayloadBytesPerPacket;
  121. u_int8_t m_audioPayloadBytesPerFrame;
  122. // this value chosen to keep queuing latency reasonable
  123. // i.e. on the order of 100's of ms
  124. static const u_int8_t audioQueueMaxCount = 8;
  125. CMediaFrame* m_audioQueue[audioQueueMaxCount];
  126. u_int8_t m_audioQueueCount;
  127. u_int16_t m_audioQueueSize;
  128. };
  129. #endif /* __RTP_TRANSMITTER_H__ */