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

流媒体/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. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #ifndef __RTPHINT_INCLUDED__
  22. #define __RTPHINT_INCLUDED__
  23. // forward declarations
  24. class MP4RtpHintTrack;
  25. class MP4RtpHint;
  26. class MP4RtpPacket;
  27. class MP4RtpData : public MP4Container {
  28. public:
  29. MP4RtpData(MP4RtpPacket* pPacket);
  30. MP4RtpPacket* GetPacket() {
  31. return m_pPacket;
  32. }
  33. virtual u_int16_t GetDataSize() = NULL;
  34. virtual void GetData(u_int8_t* pDest) = NULL;
  35. MP4Track* FindTrackFromRefIndex(u_int8_t refIndex);
  36. virtual void WriteEmbeddedData(MP4File* pFile, u_int64_t startPos) {
  37. // default is no-op
  38. }
  39. protected:
  40. MP4RtpPacket* m_pPacket;
  41. };
  42. MP4ARRAY_DECL(MP4RtpData, MP4RtpData*)
  43. class MP4RtpNullData : public MP4RtpData {
  44. public:
  45. MP4RtpNullData(MP4RtpPacket* pPacket);
  46. u_int16_t GetDataSize() {
  47. return 0;
  48. }
  49. void GetData(u_int8_t* pDest) {
  50. // no-op
  51. }
  52. };
  53. class MP4RtpImmediateData : public MP4RtpData {
  54. public:
  55. MP4RtpImmediateData(MP4RtpPacket* pPacket);
  56. void Set(const u_int8_t* pBytes, u_int8_t numBytes);
  57. u_int16_t GetDataSize();
  58. void GetData(u_int8_t* pDest);
  59. };
  60. class MP4RtpSampleData : public MP4RtpData {
  61. public:
  62. MP4RtpSampleData(MP4RtpPacket* pPacket);
  63. void SetEmbeddedImmediate(
  64. MP4SampleId sampleId, 
  65. u_int8_t* pData, u_int16_t dataLength);
  66. void SetReferenceSample(
  67. MP4SampleId refSampleId, u_int32_t refSampleOffset, 
  68. u_int16_t sampleLength);
  69. void SetEmbeddedSample(
  70. MP4SampleId sampleId, MP4Track* pRefTrack, 
  71. MP4SampleId refSampleId, u_int32_t refSampleOffset, 
  72. u_int16_t sampleLength);
  73. u_int16_t GetDataSize();
  74. void GetData(u_int8_t* pDest);
  75. void WriteEmbeddedData(MP4File* pFile, u_int64_t startPos);
  76. protected:
  77. u_int8_t* m_pRefData;
  78. MP4Track* m_pRefTrack;
  79. MP4SampleId m_refSampleId;
  80. u_int32_t m_refSampleOffset;
  81. };
  82. class MP4RtpSampleDescriptionData : public MP4RtpData {
  83. public:
  84. MP4RtpSampleDescriptionData(MP4RtpPacket* pPacket);
  85. void Set(u_int32_t sampleDescrIndex,
  86. u_int32_t offset, u_int16_t length);
  87. u_int16_t GetDataSize();
  88. void GetData(u_int8_t* pDest);
  89. };
  90. class MP4RtpPacket : public MP4Container {
  91. public:
  92. MP4RtpPacket(MP4RtpHint* pHint);
  93. ~MP4RtpPacket();
  94. void AddExtraProperties();
  95. MP4RtpHint* GetHint() {
  96. return m_pHint;
  97. }
  98. void Set(u_int8_t payloadNumber, u_int32_t packetId, bool setMbit);
  99. int32_t GetTransmitOffset();
  100. bool GetPBit();
  101. bool GetXBit();
  102. bool GetMBit();
  103. u_int8_t GetPayload();
  104. u_int16_t GetSequenceNumber();
  105. void SetTransmitOffset(int32_t transmitOffset);
  106. bool IsBFrame();
  107. void SetBFrame(bool isBFrame);
  108. void SetTimestampOffset(u_int32_t timestampOffset);
  109. void AddData(MP4RtpData* pData);
  110. u_int32_t GetDataSize();
  111. void GetData(u_int8_t* pDest);
  112. void Read(MP4File* pFile);
  113. void ReadExtra(MP4File* pFile);
  114. void Write(MP4File* pFile);
  115. void WriteEmbeddedData(MP4File* pFile, u_int64_t startPos);
  116. void Dump(FILE* pFile, u_int8_t indent, bool dumpImplicits);
  117. protected:
  118. MP4RtpHint* m_pHint;
  119. MP4RtpDataArray m_rtpData;
  120. };
  121. MP4ARRAY_DECL(MP4RtpPacket, MP4RtpPacket*)
  122. class MP4RtpHint : public MP4Container {
  123. public:
  124. MP4RtpHint(MP4RtpHintTrack* pTrack);
  125. ~MP4RtpHint();
  126. MP4RtpHintTrack* GetTrack() {
  127. return m_pTrack;
  128. }
  129. u_int16_t GetNumberOfPackets() {
  130. return m_rtpPackets.Size();
  131. }
  132. bool IsBFrame() {
  133. return m_isBFrame;
  134. }
  135. void SetBFrame(bool isBFrame) {
  136. m_isBFrame = isBFrame;
  137. }
  138. u_int32_t GetTimestampOffset() {
  139. return m_timestampOffset;
  140. }
  141. void SetTimestampOffset(u_int32_t timestampOffset) {
  142. m_timestampOffset = timestampOffset;
  143. }
  144. MP4RtpPacket* AddPacket();
  145. MP4RtpPacket* GetPacket(u_int16_t index) {
  146. return m_rtpPackets[index];
  147. }
  148. MP4RtpPacket* GetCurrentPacket() {
  149. if (m_rtpPackets.Size() == 0) {
  150. return NULL;
  151. }
  152. return m_rtpPackets[m_rtpPackets.Size() - 1];
  153. }
  154. void Read(MP4File* pFile);
  155. void Write(MP4File* pFile);
  156. void Dump(FILE* pFile, u_int8_t indent, bool dumpImplicits);
  157. protected:
  158. MP4RtpHintTrack* m_pTrack;
  159. MP4RtpPacketArray m_rtpPackets;
  160. // values when adding packets to a hint (write mode)
  161. bool  m_isBFrame;
  162. u_int32_t  m_timestampOffset;
  163. };
  164. class MP4RtpHintTrack : public MP4Track {
  165. public:
  166. MP4RtpHintTrack(MP4File* pFile, MP4Atom* pTrakAtom);
  167. ~MP4RtpHintTrack();
  168. void InitRefTrack();
  169. void InitPayload();
  170. void InitRtpStart();
  171. void InitStats();
  172. MP4Track* GetRefTrack() {
  173. InitRefTrack();
  174. return m_pRefTrack;
  175. }
  176. void GetPayload(
  177. char** ppPayloadName = NULL,
  178. u_int8_t* pPayloadNumber = NULL,
  179. u_int16_t* pMaxPayloadSize = NULL);
  180. void SetPayload(
  181. const char* payloadName,
  182. u_int8_t payloadNumber,
  183. u_int16_t maxPayloadSize);
  184. void ReadHint(
  185. MP4SampleId hintSampleId,
  186. u_int16_t* pNumPackets = NULL);
  187. u_int16_t GetHintNumberOfPackets();
  188. bool GetPacketBFrame(u_int16_t packetIndex);
  189. u_int16_t GetPacketTransmitOffset(u_int16_t packetIndex);
  190. void ReadPacket(
  191. u_int16_t packetIndex,
  192. u_int8_t** ppBytes, 
  193. u_int32_t* pNumBytes,
  194. u_int32_t ssrc,
  195. bool includeHeader = true,
  196. bool includePayload = true);
  197. MP4Timestamp GetRtpTimestampStart();
  198. void SetRtpTimestampStart(MP4Timestamp start);
  199. void AddHint(bool isBFrame, u_int32_t timestampOffset);
  200. void AddPacket(bool setMbit, int32_t transmitOffset = 0);
  201. void AddImmediateData(const u_int8_t* pBytes, u_int32_t numBytes);
  202. void AddSampleData(MP4SampleId sampleId,
  203.  u_int32_t dataOffset, u_int32_t dataLength);
  204. void AddESConfigurationPacket();
  205. void WriteHint(MP4Duration duration, bool isSyncSample);
  206. void FinishWrite();
  207. protected:
  208. MP4Track* m_pRefTrack;
  209. MP4StringProperty* m_pRtpMapProperty;
  210. MP4Integer32Property* m_pPayloadNumberProperty;
  211. MP4Integer32Property* m_pMaxPacketSizeProperty;
  212. MP4Integer32Property* m_pSnroProperty;
  213. MP4Integer32Property* m_pTsroProperty;
  214. u_int32_t m_rtpSequenceStart;
  215. u_int32_t m_rtpTimestampStart;
  216. // reading
  217. MP4RtpHint* m_pReadHint;
  218. u_int8_t* m_pReadHintSample;
  219. u_int32_t m_readHintSampleSize;
  220. MP4Timestamp m_readHintTimestamp;
  221. // writing
  222. MP4RtpHint* m_pWriteHint;
  223. MP4SampleId m_writeHintId;
  224. u_int32_t m_writePacketId;
  225. // statistics
  226. // in trak.udta.hinf
  227. MP4Integer64Property* m_pTrpy;
  228. MP4Integer64Property* m_pNump;
  229. MP4Integer64Property* m_pTpyl;
  230. MP4Integer32Property* m_pMaxr;
  231. MP4Integer64Property* m_pDmed;
  232. MP4Integer64Property* m_pDimm;
  233. MP4Integer32Property* m_pPmax;
  234. MP4Integer32Property* m_pDmax;
  235. // in trak.mdia.minf.hmhd
  236. MP4Integer16Property* m_pMaxPdu;
  237. MP4Integer16Property* m_pAvgPdu;
  238. MP4Integer32Property* m_pMaxBitRate;
  239. MP4Integer32Property* m_pAvgBitRate;
  240. MP4Timestamp m_thisSec;
  241. u_int32_t m_bytesThisSec;
  242. u_int32_t m_bytesThisHint;
  243. u_int32_t m_bytesThisPacket;
  244. };
  245. #endif /* __RTPHINT_INCLUDED__ */