www.pudn.com > MyPlayerbylqh.rar > MediaClasses.h


/************************************************************************************** 
 *                                                                                    * 
 *                                                                                    * 
 **************************************************************************************/ 
 
#ifndef _MEDIA_CLASSES_H 
#define _MEDIA_CLASSES_H 
 
#include  
 
/* 
 * 基本类型  
 */ 
 
#include "MediaBuffer.h" 
#include "Error.h" 
 
/*  
 * 媒体类型 
 */ 
 
typedef enum { 
 
		MEDIA_TYPE_INPUT, 
		MEDIA_TYPE_DECAPS, 
		MEDIA_TYPE_VIDEO_DECODER, 
		MEDIA_TYPE_AUDIO_DECODER, 
		MEDIA_TYPE_VIDEO_BUFFER, 
		MEDIA_TYPE_VIDEO_RENDERER, 
		MEDIA_TYPE_AUDIO_RENDERER, 
		MEDIA_TYPE_SUBTITLER, 
 
} media_type_t; 
 
/*   
 *性能类型 
 */ 
 
#define MEDIA_CAPS_CAN_CONFIGURE 0x00000001 
#define MEDIA_CAPS_BUFFERIZE     0x00000002 
 
/* 
 * 输入媒体类型 
 */ 
 
/* 
 * 文件格式 
 */ 
 
typedef enum { 
 
		INPUT_OPEN_ASCII,	 
		INPUT_OPEN_BINARY 
 
} media_input_mode_t; 
 
/*  
 * 搜索 
 */ 
 
typedef enum { 
 
		INPUT_SEEK_SET, 
		INPUT_SEEK_CUR, 
		INPUT_SEEK_END 
 
} media_input_seek_t; 
 
/*  
 * 视频格式 
 */ 
 
typedef enum { 
	 
		VIDEO_MODE_NONE, 
		VIDEO_MODE_RGB8, 
		VIDEO_MODE_RGB16, 
		VIDEO_MODE_RGB24, 
		VIDEO_MODE_RGB32, 
		VIDEO_MODE_YUV9, 
		VIDEO_MODE_YUV12, 
		VIDEO_MODE_YUY2, 
		VIDEO_MODE_UYVY, 
 
} media_video_mode_t; 
 
/* 
 * 用于描述播放器的不同媒体节点,缓冲器,流的虚拟类 
 */ 
 
class MediaItem { 
 
private: 
 
	media_type_t  type; 
	char         *name; 
 
 
public: 
 
	/* 
	 * 获取基本信息的方法 
	 */ 
 
	virtual media_type_t  GetType() = 0; 
	virtual char         *GetName() = 0; 
 
	/* 
	 * 连接媒体项 
	 */ 
 
	virtual MP_RESULT     Connect(MediaItem *item) = 0; 
	virtual MP_RESULT     ReleaseConnections()     = 0; 
 
	/* 
	 * 获得CAPS和配置项的方法 
	 */ 
 
	virtual DWORD         GetCaps()                                 = 0; 
	virtual MP_RESULT     Configure(HINSTANCE hInstance, HWND hwnd) = 0; 
}; 
 
/* 
 * MediaItemInput: 
 * --------------- 
 *  ——输入媒体项 
 *  
 * 
 */ 
 
class MediaItemInput : public MediaItem { 
 
public: 
 
	virtual MP_RESULT    Open(char *url, media_input_mode_t mode)  = 0; 
 
	virtual long         GetSize()                                 = 0; 
	virtual long         GetBufferSize()                           = 0; 
	virtual long         GetBufferPosition()                       = 0; 
	virtual long         GetBufferingSize()                        = 0; 
 
	virtual unsigned int Read(MediaBuffer *mb, unsigned int size)  = 0; 
	virtual unsigned int Seek(int size, media_input_seek_t method) = 0; 
	virtual unsigned int GetLine(MediaBuffer *mb)                  = 0; 
	 
	virtual BOOL         EndOfFile()                               = 0; 
	virtual MP_RESULT    Close()                                   = 0; 
}; 
 
/* 
 * MediaItemDecaps: 
 * ---------------- 
 * 
 *  ——Decaps流 
 * 
 */ 
 
class MediaItemDecaps : public MediaItem { 
 
public: 
 
	virtual unsigned int      GetNumberOfVideoStreams()                                                 = 0; 
	virtual unsigned int      GetNumberOfAudioStreams()                                                 = 0; 
 
	virtual unsigned int      GetVideoWidth(unsigned int StreamId)                                      = 0; 
	virtual unsigned int      GetVideoHeight(unsigned int StreamId)                                     = 0; 
	virtual double            GetVideoFrameRate(unsigned int StreamId)                                  = 0; 
	virtual char             *GetVideoCompression(unsigned int StreamId)                                = 0; 
	virtual BITMAPINFOHEADER *GetVideoHeader(unsigned int StreamId)                                     = 0; 
 
	virtual unsigned long     GetCurrentVideoFrame(unsigned int StreamId)                               = 0; 
	virtual unsigned long     GetTotalVideoFrames(unsigned int StreamId)                                = 0; 
	virtual unsigned long     GetTotalVideoTime(unsigned int StreamId)                                  = 0; 
	 
	virtual unsigned int      GetAudioBits(unsigned int StreamId)                                       = 0; 
	virtual unsigned int      GetAudioChannels(unsigned int StreamId)                                   = 0; 
	virtual unsigned int      GetAudioFrequency(unsigned int StreamId)                                  = 0; 
	virtual WAVEFORMATEX     *GetAudioFormat(unsigned int StreamId)                                     = 0; 
 
	virtual unsigned int      GetNextVideoFrameSize(unsigned int StreamId)                              = 0; 
	virtual unsigned int      ReadVideoFrame(unsigned int StreamId, MediaBuffer *mb)                    = 0; 
 
	virtual unsigned int      ReadAudioData(unsigned int StreamId, char *buffer, unsigned int bytes)    = 0; 
	virtual MP_RESULT         UpdateForSize()                                                           = 0; 
 
	virtual MP_RESULT		  SeekAudio(unsigned int StreamId, long bytes)                              = 0; 
	virtual MP_RESULT         SeekVideo(unsigned int StreamId, long frame)                              = 0; 
	virtual MP_RESULT         ReSeekAudio(unsigned int StreamId)                                        = 0; 
 
	virtual MP_RESULT         Seek(unsigned int videoStreamId, unsigned int audioStreamId, int percent) = 0; 
	virtual MP_RESULT         Rewind(unsigned int videoStreamId, unsigned int audioStreamId)            = 0; 
 
	virtual MP_RESULT         SeekNextKeyFrame(unsigned int StreamId)                                   = 0; 
	virtual MP_RESULT         SeekPreviousKeyFrame(unsigned int StreamId)                               = 0; 
}; 
 
/* 
 * MediaItemVideoDecoder: 
 * -------------------- 
 * 
 *  ——从流中解码视频 
 * 
 * 
 */ 
 
class MediaItemVideoDecoder : public MediaItem { 
 
public: 
 
	virtual unsigned int       GetFrameSize()                        = 0; 
 
	virtual media_video_mode_t GetVideoMode()                        = 0; 
	virtual BOOL               GetInvertFlag()                       = 0; 
	virtual MP_RESULT          SetVideoMode(media_video_mode_t mode) = 0; 
 
	virtual MP_RESULT          SetQuality(DWORD quality)             = 0; 
	virtual DWORD              GetQuality()                          = 0; 
 
	virtual MP_RESULT          Decompress(MediaBuffer *mb_out, unsigned int stride)       = 0; 
	virtual MP_RESULT          Drop(MediaBuffer *mb_out, unsigned int stride)             = 0; 
}; 
 
/* 
 * MediaItemVideoBuffer: 
 * -------------------- 
 * 
 *  ——缓冲解码的图像 
 * 
 */ 
 
class MediaItemVideoBuffer : public MediaItem { 
 
public: 
 
	virtual MP_RESULT    StartBuffering(unsigned int stride) = 0; 
	virtual MP_RESULT    StopBuffering()  = 0; 
 
	virtual MediaBuffer *GetOneFrame()    = 0; 
	virtual MediaBuffer *GetLastFrame()   = 0; 
	virtual MP_RESULT    DropOneFrame()   = 0; 
}; 
 
/* 
 * MediaItemVideoRenderer: 
 * -----------------------  
 * 
 *  ——补偿在屏幕上的视频 
 * 
 */ 
 
class MediaItemVideoRenderer : public MediaItem { 
 
public: 
 
	virtual MP_RESULT Init(HWND hwnd, unsigned int width, unsigned int height)                                = 0; 
	virtual MP_RESULT InitFullscreen(HWND hwnd, unsigned int width, unsigned int height)                      = 0; 
 
	virtual media_video_mode_t GetVideoMode()                                                                 = 0; 
	virtual RECT              *GetFullscreenRects()                                                           = 0;  
   
	virtual MP_RESULT Draw(MediaBuffer *buffer, RECT *rect, int frameNumber, int invertFlag)                  = 0; 
	virtual MP_RESULT DrawFullscreen(MediaBuffer *buffer, int frameNumber, int invertFlag, int desktopMode)   = 0; 
 
	virtual MP_RESULT Stop()                                                                                  = 0; 
 
	virtual MP_RESULT Close()                                                                                 = 0; 
}; 
 
/* 
 *  
 *  
 * 字幕变换的类型 
 */ 
 
typedef struct _subtitles_t { 
 
	char *subtitlesText[4]; 
	DWORD nbSubtitles; 
 
} subtitles_t; 
 
/*  
 * MediaItemSubtitler 
 * ------------------ 
 * 
 *  ——读字幕 
 * 
 */ 
 
class MediaItemSubtitler : public MediaItem { 
 
public: 
 
	virtual MP_RESULT    Open(char *lpFilename)                  = 0; 
	virtual subtitles_t *GetSubtitles(DWORD frameNumber)         = 0; 
	virtual MP_RESULT    Close()                                 = 0; 
}; 
 
/* 
 * MediaItemAudioDecoder: 
 * ---------------------- 
 * 
 *  ——将音频解码到缓冲器 
 * 
 */ 
  
class MediaItemAudioDecoder : public MediaItem { 
 
public: 
 
	virtual WAVEFORMATEX *GetAudioFormat()                                   = 0; 
	virtual MP_RESULT     EmptyAudioBuffer()                                 = 0; 
 
	virtual unsigned int  Decompress(void *buffer, unsigned int size) = 0; 
 
}; 
 
/* 
 * MediaItemAudioRenderer: 
 * ----------------------- 
 * 
 *  ——补偿系统声卡音频(Renderer audio to system soundcard) 
 * 
 */ 
 
/*  
 * 音频回调 
 */ 
 
typedef unsigned int (*MediaAudioCallback)(void *lpData, void *buffer, unsigned int size); 
 
 
class MediaItemAudioRenderer : public MediaItem { 
 
public: 
 
	virtual MP_RESULT     Open(HWND hwnd, WAVEFORMATEX *inFormat)                = 0; 
 
	virtual MP_RESULT     SetCallback(void *lpData, MediaAudioCallback callback) = 0; 
	virtual MP_RESULT     SetVolume(unsigned int volume)                         = 0; 
 
	virtual unsigned long GetAudioTime()                                         = 0; 
	virtual MP_RESULT     Bufferize()                                            = 0; 
 
	virtual MP_RESULT     Start()                                                = 0; 
	virtual MP_RESULT     Pause()                                                = 0; 
	virtual MP_RESULT     Stop()                                                 = 0; 
 
	virtual MP_RESULT     Close()                                                = 0; 
}; 
 
 
#endif