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

流媒体/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-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #ifndef __MEDIA_SOURCE_H__
  23. #define __MEDIA_SOURCE_H__
  24. #include "media_node.h"
  25. #include "media_sink.h"
  26. #include "video_util_resize.h"
  27. // forward declarations
  28. class CAudioEncoder;
  29. class CVideoEncoder;
  30. // virtual parent class for audio and/or video sources
  31. // contains all the common media processing code
  32. class CMediaSource : public CMediaNode {
  33. public:
  34. CMediaSource();
  35. ~CMediaSource();
  36. bool AddSink(CMediaSink* pSink);
  37. void RemoveSink(CMediaSink* pSink);
  38. void RemoveAllSinks(void);
  39. void StartVideo(void) {
  40. m_myMsgQueue.send_message(MSG_SOURCE_START_VIDEO,
  41. NULL, 0, m_myMsgQueueSemaphore);
  42. }
  43. void StartAudio(void) {
  44. m_myMsgQueue.send_message(MSG_SOURCE_START_AUDIO,
  45. NULL, 0, m_myMsgQueueSemaphore);
  46. }
  47. void GenerateKeyFrame(void) {
  48. m_myMsgQueue.send_message(MSG_SOURCE_KEY_FRAME,
  49. NULL, 0, m_myMsgQueueSemaphore);
  50. }
  51. virtual bool IsDone() = NULL;
  52. virtual Duration GetElapsedDuration();
  53. virtual float GetProgress() = NULL;
  54. virtual u_int32_t GetNumEncodedVideoFrames() {
  55. return m_videoDstFrameNumber;
  56. }
  57. virtual u_int32_t GetNumEncodedAudioFrames() {
  58. return m_audioDstFrameNumber;
  59. }
  60. void SetVideoSource(CMediaSource* source) {
  61. m_videoSource = source;
  62. }
  63. void AddEncodingDrift(Duration drift) {
  64. // currently there is no thread contention
  65. // for this function, so we omit a mutex
  66. m_otherTotalDrift += drift;
  67. }
  68. protected:
  69. // Video & Audio support
  70. virtual void ProcessMedia();
  71. virtual void ProcessVideo() {
  72. };
  73. virtual void ProcessAudio() {
  74. };
  75. virtual bool IsEndOfVideo() { 
  76. return true;
  77. }
  78. virtual bool IsEndOfAudio() {
  79. return true;
  80. }
  81. void PaceSource();
  82. void ForwardFrame(CMediaFrame* pFrame);
  83. void DoStopSource();
  84. // Video
  85. bool InitVideo(
  86. MediaType srcType,
  87. bool realTime = true);
  88. void SetVideoSrcSize(
  89. u_int16_t srcWidth,
  90. u_int16_t srcHeight,
  91. u_int16_t srcStride,
  92. bool matchAspectRatios = false);
  93. void SetVideoSrcStride(
  94. u_int16_t srcStride);
  95. void ProcessVideoYUVFrame(
  96. u_int8_t* pY,
  97. u_int8_t* pU,
  98. u_int8_t* pV,
  99. u_int16_t yStride,
  100. u_int16_t uvStride,
  101. Timestamp frameTimestamp);
  102. void DoGenerateKeyFrame() {
  103. m_videoWantKeyFrame = true;
  104. }
  105. void DestroyVideoResizer();
  106. void DoStopVideo();
  107. // Audio
  108. bool InitAudio(
  109. bool realTime);
  110. bool SetAudioSrc(
  111. MediaType srcType,
  112. u_int8_t srcChannels,
  113. u_int32_t srcSampleRate);
  114. void ProcessAudioFrame(
  115. u_int8_t* frameData,
  116. u_int32_t frameDataLength,
  117. Timestamp frameTimestamp,
  118. bool resync);
  119. void ResampleAudio(
  120. u_int8_t* frameData,
  121. u_int32_t frameDataLength);
  122. void ForwardEncodedAudioFrames(
  123. Timestamp baseTimestamp,
  124. u_int32_t* pNumSamples,
  125. u_int32_t* pNumFrames);
  126. void DoStopAudio();
  127. // audio utility routines
  128. Duration SrcSamplesToTicks(u_int32_t numSamples) {
  129. return (numSamples * TimestampTicks) / m_audioSrcSampleRate;
  130. }
  131. Duration DstSamplesToTicks(u_int32_t numSamples) {
  132. return (numSamples * TimestampTicks) / m_audioDstSampleRate;
  133. }
  134. u_int32_t SrcTicksToSamples(Duration duration) {
  135. return (duration * m_audioSrcSampleRate) / TimestampTicks;
  136. }
  137. u_int32_t DstTicksToSamples(Duration duration) {
  138. return (duration * m_audioDstSampleRate) / TimestampTicks;
  139. }
  140. u_int32_t SrcSamplesToBytes(u_int32_t numSamples) {
  141. return (numSamples * m_audioSrcChannels * sizeof(u_int16_t));
  142. }
  143. u_int32_t DstSamplesToBytes(u_int32_t numSamples) {
  144. return (numSamples * m_audioDstChannels * sizeof(u_int16_t));
  145. }
  146. u_int32_t SrcBytesToSamples(u_int32_t numBytes) {
  147. return (numBytes / (m_audioSrcChannels * sizeof(u_int16_t)));
  148. }
  149. u_int32_t DstBytesToSamples(u_int32_t numBytes) {
  150. return (numBytes / (m_audioDstChannels * sizeof(u_int16_t)));
  151. }
  152. protected:
  153. static const int MSG_SOURCE = 2048;
  154. static const int MSG_SOURCE_START_VIDEO = MSG_SOURCE + 1;
  155. static const int MSG_SOURCE_START_AUDIO = MSG_SOURCE + 2;
  156. static const int MSG_SOURCE_KEY_FRAME = MSG_SOURCE + 3;
  157. // sink info
  158. static const u_int16_t MAX_SINKS = 8;
  159. CMediaSink* m_sinks[MAX_SINKS];
  160. SDL_mutex* m_pSinksMutex;
  161. // generic media info
  162. bool m_source;
  163. bool m_sourceVideo;
  164. bool m_sourceAudio;
  165. bool m_sourceRealTime;
  166. bool m_sinkRealTime;
  167. Timestamp m_startTimestamp;
  168. Duration m_maxAheadDuration;
  169. // video source info
  170. CMediaSource* m_videoSource; 
  171. MediaType m_videoSrcType;
  172. u_int32_t m_videoSrcFrameNumber;
  173. u_int16_t m_videoSrcWidth;
  174. u_int16_t m_videoSrcHeight;
  175. u_int16_t m_videoSrcAdjustedHeight;
  176. float m_videoSrcAspectRatio;
  177. u_int32_t m_videoSrcYUVSize;
  178. u_int32_t m_videoSrcYSize;
  179. u_int16_t m_videoSrcYStride;
  180. u_int32_t m_videoSrcUVSize;
  181. u_int16_t m_videoSrcUVStride;
  182. u_int32_t m_videoSrcYCrop;
  183. u_int32_t m_videoSrcUVCrop;
  184. // video destination info
  185. MediaType m_videoDstType;
  186. float m_videoDstFrameRate;
  187. Duration m_videoDstFrameDuration;
  188. u_int32_t m_videoDstFrameNumber;
  189. u_int16_t m_videoDstWidth;
  190. u_int16_t m_videoDstHeight;
  191. float m_videoDstAspectRatio;
  192. u_int32_t m_videoDstYUVSize;
  193. u_int32_t m_videoDstYSize;
  194. u_int32_t m_videoDstUVSize;
  195. // video resizing info
  196. bool m_videoMatchAspectRatios;
  197. image_t* m_videoSrcYImage;
  198. image_t* m_videoDstYImage;
  199. scaler_t* m_videoYResizer;
  200. image_t* m_videoSrcUVImage;
  201. image_t* m_videoDstUVImage;
  202. scaler_t* m_videoUVResizer;
  203. // video encoding info
  204. CVideoEncoder* m_videoEncoder;
  205. bool m_videoWantKeyFrame;
  206. // video timing info
  207. u_int32_t m_videoSkippedFrames;
  208. Duration m_videoEncodingDrift;
  209. Duration m_videoEncodingMaxDrift;
  210. Duration m_videoSrcElapsedDuration;
  211. Duration m_videoDstElapsedDuration;
  212. Duration m_otherTotalDrift;
  213. Duration m_otherLastTotalDrift;
  214. // video previous frame info
  215. u_int8_t* m_videoDstPrevImage;
  216. u_int8_t* m_videoDstPrevReconstructImage;
  217. u_int8_t* m_videoDstPrevFrame;
  218. u_int32_t m_videoDstPrevFrameLength;
  219. // audio source info 
  220. MediaType m_audioSrcType;
  221. u_int8_t m_audioSrcChannels;
  222. u_int32_t m_audioSrcSampleRate;
  223. u_int16_t m_audioSrcSamplesPerFrame;
  224. u_int64_t m_audioSrcSampleNumber;
  225. u_int32_t m_audioSrcFrameNumber;
  226. // audio resampling info
  227. int16_t* m_audioResampleInputBuffer;
  228. u_int32_t m_audioResampleInputNumber;
  229. bool m_audioResampleUseLinear;
  230. // audio destination info
  231. MediaType m_audioDstType;
  232. u_int8_t m_audioDstChannels;
  233. u_int32_t m_audioDstSampleRate;
  234. u_int16_t m_audioDstSamplesPerFrame;
  235. u_int64_t m_audioDstSampleNumber;
  236. u_int32_t m_audioDstFrameNumber;
  237. u_int64_t m_audioDstRawSampleNumber;
  238. u_int32_t m_audioDstRawFrameNumber;
  239. // audio encoding info
  240. u_int8_t* m_audioPreEncodingBuffer;
  241. u_int32_t m_audioPreEncodingBufferLength;
  242. u_int32_t m_audioPreEncodingBufferMaxLength;
  243. CAudioEncoder* m_audioEncoder;
  244. // audio timing info
  245. Duration m_audioSrcElapsedDuration;
  246. Duration m_audioDstElapsedDuration;
  247. };
  248. #endif /* __MEDIA_SOURCE_H__ */