MediaClasses.h
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:10k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /**************************************************************************************
  2.  *                                                                                    *
  3.  *                                                                                    *
  4.  **************************************************************************************/
  5. #ifndef _MEDIA_CLASSES_H
  6. #define _MEDIA_CLASSES_H
  7. #include <windows.h>
  8. /*
  9.  * 基本类型 
  10.  */
  11. #include "MediaBuffer.h"
  12. #include "Error.h"
  13. /* 
  14.  * 媒体类型
  15.  */
  16. typedef enum {
  17. MEDIA_TYPE_INPUT,
  18. MEDIA_TYPE_DECAPS,
  19. MEDIA_TYPE_VIDEO_DECODER,
  20. MEDIA_TYPE_AUDIO_DECODER,
  21. MEDIA_TYPE_VIDEO_BUFFER,
  22. MEDIA_TYPE_VIDEO_RENDERER,
  23. MEDIA_TYPE_AUDIO_RENDERER,
  24. MEDIA_TYPE_SUBTITLER,
  25. } media_type_t;
  26. /*  
  27.  *性能类型
  28.  */
  29. #define MEDIA_CAPS_CAN_CONFIGURE 0x00000001
  30. #define MEDIA_CAPS_BUFFERIZE     0x00000002
  31. /*
  32.  * 输入媒体类型
  33.  */
  34. /*
  35.  * 文件格式
  36.  */
  37. typedef enum {
  38. INPUT_OPEN_ASCII,
  39. INPUT_OPEN_BINARY
  40. } media_input_mode_t;
  41. /* 
  42.  * 搜索
  43.  */
  44. typedef enum {
  45. INPUT_SEEK_SET,
  46. INPUT_SEEK_CUR,
  47. INPUT_SEEK_END
  48. } media_input_seek_t;
  49. /* 
  50.  * 视频格式
  51.  */
  52. typedef enum {
  53. VIDEO_MODE_NONE,
  54. VIDEO_MODE_RGB8,
  55. VIDEO_MODE_RGB16,
  56. VIDEO_MODE_RGB24,
  57. VIDEO_MODE_RGB32,
  58. VIDEO_MODE_YUV9,
  59. VIDEO_MODE_YUV12,
  60. VIDEO_MODE_YUY2,
  61. VIDEO_MODE_UYVY,
  62. } media_video_mode_t;
  63. /*
  64.  * 用于描述播放器的不同媒体节点,缓冲器,流的虚拟类
  65.  */
  66. class MediaItem {
  67. private:
  68. media_type_t  type;
  69. char         *name;
  70. public:
  71. /*
  72.  * 获取基本信息的方法
  73.  */
  74. virtual media_type_t  GetType() = 0;
  75. virtual char         *GetName() = 0;
  76. /*
  77.  * 连接媒体项
  78.  */
  79. virtual MP_RESULT     Connect(MediaItem *item) = 0;
  80. virtual MP_RESULT     ReleaseConnections()     = 0;
  81. /*
  82.  * 获得CAPS和配置项的方法
  83.  */
  84. virtual DWORD         GetCaps()                                 = 0;
  85. virtual MP_RESULT     Configure(HINSTANCE hInstance, HWND hwnd) = 0;
  86. };
  87. /*
  88.  * MediaItemInput:
  89.  * ---------------
  90.  *  ——输入媒体项
  91.  * 
  92.  *
  93.  */
  94. class MediaItemInput : public MediaItem {
  95. public:
  96. virtual MP_RESULT    Open(char *url, media_input_mode_t mode)  = 0;
  97. virtual long         GetSize()                                 = 0;
  98. virtual long         GetBufferSize()                           = 0;
  99. virtual long         GetBufferPosition()                       = 0;
  100. virtual long         GetBufferingSize()                        = 0;
  101. virtual unsigned int Read(MediaBuffer *mb, unsigned int size)  = 0;
  102. virtual unsigned int Seek(int size, media_input_seek_t method) = 0;
  103. virtual unsigned int GetLine(MediaBuffer *mb)                  = 0;
  104. virtual BOOL         EndOfFile()                               = 0;
  105. virtual MP_RESULT    Close()                                   = 0;
  106. };
  107. /*
  108.  * MediaItemDecaps:
  109.  * ----------------
  110.  *
  111.  *  ——Decaps流
  112.  *
  113.  */
  114. class MediaItemDecaps : public MediaItem {
  115. public:
  116. virtual unsigned int      GetNumberOfVideoStreams()                                                 = 0;
  117. virtual unsigned int      GetNumberOfAudioStreams()                                                 = 0;
  118. virtual unsigned int      GetVideoWidth(unsigned int StreamId)                                      = 0;
  119. virtual unsigned int      GetVideoHeight(unsigned int StreamId)                                     = 0;
  120. virtual double            GetVideoFrameRate(unsigned int StreamId)                                  = 0;
  121. virtual char             *GetVideoCompression(unsigned int StreamId)                                = 0;
  122. virtual BITMAPINFOHEADER *GetVideoHeader(unsigned int StreamId)                                     = 0;
  123. virtual unsigned long     GetCurrentVideoFrame(unsigned int StreamId)                               = 0;
  124. virtual unsigned long     GetTotalVideoFrames(unsigned int StreamId)                                = 0;
  125. virtual unsigned long     GetTotalVideoTime(unsigned int StreamId)                                  = 0;
  126. virtual unsigned int      GetAudioBits(unsigned int StreamId)                                       = 0;
  127. virtual unsigned int      GetAudioChannels(unsigned int StreamId)                                   = 0;
  128. virtual unsigned int      GetAudioFrequency(unsigned int StreamId)                                  = 0;
  129. virtual WAVEFORMATEX     *GetAudioFormat(unsigned int StreamId)                                     = 0;
  130. virtual unsigned int      GetNextVideoFrameSize(unsigned int StreamId)                              = 0;
  131. virtual unsigned int      ReadVideoFrame(unsigned int StreamId, MediaBuffer *mb)                    = 0;
  132. virtual unsigned int      ReadAudioData(unsigned int StreamId, char *buffer, unsigned int bytes)    = 0;
  133. virtual MP_RESULT         UpdateForSize()                                                           = 0;
  134. virtual MP_RESULT   SeekAudio(unsigned int StreamId, long bytes)                              = 0;
  135. virtual MP_RESULT         SeekVideo(unsigned int StreamId, long frame)                              = 0;
  136. virtual MP_RESULT         ReSeekAudio(unsigned int StreamId)                                        = 0;
  137. virtual MP_RESULT         Seek(unsigned int videoStreamId, unsigned int audioStreamId, int percent) = 0;
  138. virtual MP_RESULT         Rewind(unsigned int videoStreamId, unsigned int audioStreamId)            = 0;
  139. virtual MP_RESULT         SeekNextKeyFrame(unsigned int StreamId)                                   = 0;
  140. virtual MP_RESULT         SeekPreviousKeyFrame(unsigned int StreamId)                               = 0;
  141. };
  142. /*
  143.  * MediaItemVideoDecoder:
  144.  * --------------------
  145.  *
  146.  *  ——从流中解码视频
  147.  *
  148.  *
  149.  */
  150. class MediaItemVideoDecoder : public MediaItem {
  151. public:
  152. virtual unsigned int       GetFrameSize()                        = 0;
  153. virtual media_video_mode_t GetVideoMode()                        = 0;
  154. virtual BOOL               GetInvertFlag()                       = 0;
  155. virtual MP_RESULT          SetVideoMode(media_video_mode_t mode) = 0;
  156. virtual MP_RESULT          SetQuality(DWORD quality)             = 0;
  157. virtual DWORD              GetQuality()                          = 0;
  158. virtual MP_RESULT          Decompress(MediaBuffer *mb_out, unsigned int stride)       = 0;
  159. virtual MP_RESULT          Drop(MediaBuffer *mb_out, unsigned int stride)             = 0;
  160. };
  161. /*
  162.  * MediaItemVideoBuffer:
  163.  * --------------------
  164.  *
  165.  *  ——缓冲解码的图像
  166.  *
  167.  */
  168. class MediaItemVideoBuffer : public MediaItem {
  169. public:
  170. virtual MP_RESULT    StartBuffering(unsigned int stride) = 0;
  171. virtual MP_RESULT    StopBuffering()  = 0;
  172. virtual MediaBuffer *GetOneFrame()    = 0;
  173. virtual MediaBuffer *GetLastFrame()   = 0;
  174. virtual MP_RESULT    DropOneFrame()   = 0;
  175. };
  176. /*
  177.  * MediaItemVideoRenderer:
  178.  * ----------------------- 
  179.  *
  180.  *  ——补偿在屏幕上的视频
  181.  *
  182.  */
  183. class MediaItemVideoRenderer : public MediaItem {
  184. public:
  185. virtual MP_RESULT Init(HWND hwnd, unsigned int width, unsigned int height)                                = 0;
  186. virtual MP_RESULT InitFullscreen(HWND hwnd, unsigned int width, unsigned int height)                      = 0;
  187. virtual media_video_mode_t GetVideoMode()                                                                 = 0;
  188. virtual RECT              *GetFullscreenRects()                                                           = 0; 
  189.   
  190. virtual MP_RESULT Draw(MediaBuffer *buffer, RECT *rect, int frameNumber, int invertFlag)                  = 0;
  191. virtual MP_RESULT DrawFullscreen(MediaBuffer *buffer, int frameNumber, int invertFlag, int desktopMode)   = 0;
  192. virtual MP_RESULT Stop()                                                                                  = 0;
  193. virtual MP_RESULT Close()                                                                                 = 0;
  194. };
  195. /*
  196.  * 
  197.  * 
  198.  * 字幕变换的类型
  199.  */
  200. typedef struct _subtitles_t {
  201. char *subtitlesText[4];
  202. DWORD nbSubtitles;
  203. } subtitles_t;
  204. /* 
  205.  * MediaItemSubtitler
  206.  * ------------------
  207.  *
  208.  *  ——读字幕
  209.  *
  210.  */
  211. class MediaItemSubtitler : public MediaItem {
  212. public:
  213. virtual MP_RESULT    Open(char *lpFilename)                  = 0;
  214. virtual subtitles_t *GetSubtitles(DWORD frameNumber)         = 0;
  215. virtual MP_RESULT    Close()                                 = 0;
  216. };
  217. /*
  218.  * MediaItemAudioDecoder:
  219.  * ----------------------
  220.  *
  221.  *  ——将音频解码到缓冲器
  222.  *
  223.  */
  224.  
  225. class MediaItemAudioDecoder : public MediaItem {
  226. public:
  227. virtual WAVEFORMATEX *GetAudioFormat()                                   = 0;
  228. virtual MP_RESULT     EmptyAudioBuffer()                                 = 0;
  229. virtual unsigned int  Decompress(void *buffer, unsigned int size) = 0;
  230. };
  231. /*
  232.  * MediaItemAudioRenderer:
  233.  * -----------------------
  234.  *
  235.  *  ——补偿系统声卡音频(Renderer audio to system soundcard)
  236.  *
  237.  */
  238. /* 
  239.  * 音频回调
  240.  */
  241. typedef unsigned int (*MediaAudioCallback)(void *lpData, void *buffer, unsigned int size);
  242. class MediaItemAudioRenderer : public MediaItem {
  243. public:
  244. virtual MP_RESULT     Open(HWND hwnd, WAVEFORMATEX *inFormat)                = 0;
  245. virtual MP_RESULT     SetCallback(void *lpData, MediaAudioCallback callback) = 0;
  246. virtual MP_RESULT     SetVolume(unsigned int volume)                         = 0;
  247. virtual unsigned long GetAudioTime()                                         = 0;
  248. virtual MP_RESULT     Bufferize()                                            = 0;
  249. virtual MP_RESULT     Start()                                                = 0;
  250. virtual MP_RESULT     Pause()                                                = 0;
  251. virtual MP_RESULT     Stop()                                                 = 0;
  252. virtual MP_RESULT     Close()                                                = 0;
  253. };
  254. #endif