00001 #pragma once
00002
00014 #include "WinTools.h"
00015
00016 #include <dmo.h>
00017 #include <stack>
00018 #include <queue>
00019
00020
00021
00022 #pragma comment(lib, "dmoguids.lib")
00023
00024
00025 namespace jbxwl {
00026
00027
00028 class CWinMediaBuffer : public IMediaBuffer
00029 {
00030 public:
00031 CWinMediaBuffer(DWORD len=0);
00032 virtual ~CWinMediaBuffer(void) { free();}
00033
00034 void init(DWORD len);
00035 void free(void);
00036 void clear(void) { m_pBuffer->vldsz = 0;}
00037
00038 Buffer* getBuffer(void) { return m_pBuffer;}
00039
00040 public:
00042
00043
00044 STDMETHODIMP_(ULONG) AddRef() { return 2;}
00045 STDMETHODIMP_(ULONG) Release() { return 1;}
00046
00047 STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
00048 {
00049 if (riid==IID_IUnknown) {
00050 AddRef();
00051 *ppv = (IUnknown*)this;
00052 return NOERROR;
00053 }
00054 else if (riid==IID_IMediaBuffer) {
00055 AddRef();
00056 *ppv = (IMediaBuffer*)this;
00057 return NOERROR;
00058 }
00059 else return E_NOINTERFACE;
00060 }
00061
00062 public:
00064
00065
00066 STDMETHODIMP SetLength(DWORD length) { m_pBuffer->vldsz = (int)length; return NOERROR;}
00067 STDMETHODIMP GetMaxLength(DWORD* pMaxLength) { *pMaxLength = (DWORD)m_pBuffer->bufsz; return NOERROR;}
00068
00069 STDMETHODIMP GetBufferAndLength(BYTE** ppData, DWORD* pLength)
00070 {
00071 if (ppData!=NULL) *ppData = (BYTE*)m_pBuffer->buf;
00072 if (pLength!=NULL) *pLength = (DWORD)m_pBuffer->vldsz;
00073 return NOERROR;
00074 }
00075
00076 protected:
00077
00078 Buffer* m_pBuffer;
00079
00080 };
00081
00082
00083
00084 typedef std::stack<CWinMediaBuffer*> MediaBufferStack;
00085 typedef std::queue<CWinMediaBuffer*> MediaBufferQueue;
00086
00087
00088 }