blob: 19348db0f916688e6290a1b8429d6e2df0d986b0 [file]
#pragma once
#include <list>
namespace WebmMfVp8DecLib
{
class WebmMfVp8Dec : public IMFTransform,
//public IVP8PostProcessing, //TODO
//public IMFQualityAdvise,
public IMFQualityAdvise2,
public IMFRateControl,
public IMFRateSupport,
public IMFGetService,
public CLockable
{
friend HRESULT CreateDecoder(
IClassFactory*,
IUnknown*,
const IID&,
void**);
WebmMfVp8Dec(const WebmMfVp8Dec&);
WebmMfVp8Dec& operator=(const WebmMfVp8Dec&);
public:
//IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(const IID&, void**);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
//IMFTransform
HRESULT STDMETHODCALLTYPE GetStreamLimits(
DWORD* pdwInputMinimum,
DWORD* pdwInputMaximum,
DWORD* pdwOutputMinimum,
DWORD* pdwOutputMaximum);
HRESULT STDMETHODCALLTYPE GetStreamCount(
DWORD* pcInputStreams,
DWORD* pcOutputStreams);
HRESULT STDMETHODCALLTYPE GetStreamIDs(
DWORD dwInputIDArraySize,
DWORD* pdwInputIDs,
DWORD dwOutputIDArraySize,
DWORD* pdwOutputIDs);
HRESULT STDMETHODCALLTYPE GetInputStreamInfo(
DWORD dwInputStreamID,
MFT_INPUT_STREAM_INFO* pStreamInfo);
HRESULT STDMETHODCALLTYPE GetOutputStreamInfo(
DWORD dwOutputStreamID,
MFT_OUTPUT_STREAM_INFO* pStreamInfo);
HRESULT STDMETHODCALLTYPE GetAttributes(IMFAttributes**);
HRESULT STDMETHODCALLTYPE GetInputStreamAttributes(
DWORD dwInputStreamID,
IMFAttributes**);
HRESULT STDMETHODCALLTYPE GetOutputStreamAttributes(
DWORD dwOutputStreamID,
IMFAttributes**);
HRESULT STDMETHODCALLTYPE DeleteInputStream(DWORD dwStreamID);
HRESULT STDMETHODCALLTYPE AddInputStreams(
DWORD cStreams,
DWORD* adwStreamIDs);
HRESULT STDMETHODCALLTYPE GetInputAvailableType(
DWORD dwInputStreamID,
DWORD dwTypeIndex,
IMFMediaType**);
HRESULT STDMETHODCALLTYPE GetOutputAvailableType(
DWORD dwOutputStreamID,
DWORD dwTypeIndex,
IMFMediaType**);
HRESULT STDMETHODCALLTYPE SetInputType(
DWORD dwInputStreamID,
IMFMediaType*,
DWORD dwFlags);
HRESULT STDMETHODCALLTYPE SetOutputType(
DWORD dwOutputStreamID,
IMFMediaType*,
DWORD dwFlags);
HRESULT STDMETHODCALLTYPE GetInputCurrentType(
DWORD dwInputStreamID,
IMFMediaType**);
HRESULT STDMETHODCALLTYPE GetOutputCurrentType(
DWORD dwOutputStreamID,
IMFMediaType**);
HRESULT STDMETHODCALLTYPE GetInputStatus(
DWORD dwInputStreamID,
DWORD* pdwFlags);
HRESULT STDMETHODCALLTYPE GetOutputStatus(
DWORD* pdwFlags);
HRESULT STDMETHODCALLTYPE SetOutputBounds(
LONGLONG hnsLowerBound,
LONGLONG hnsUpperBound);
HRESULT STDMETHODCALLTYPE ProcessEvent(
DWORD dwInputStreamID,
IMFMediaEvent*);
HRESULT STDMETHODCALLTYPE ProcessMessage(
MFT_MESSAGE_TYPE,
ULONG_PTR);
HRESULT STDMETHODCALLTYPE ProcessInput(
DWORD dwInputStreamID,
IMFSample*,
DWORD dwFlags);
HRESULT STDMETHODCALLTYPE ProcessOutput(
DWORD dwFlags,
DWORD cOutputBufferCount,
MFT_OUTPUT_DATA_BUFFER* pOutputSamples,
DWORD* pdwStatus);
//IMFQualityAdvise
HRESULT STDMETHODCALLTYPE SetDropMode(MF_QUALITY_DROP_MODE);
HRESULT STDMETHODCALLTYPE SetQualityLevel(MF_QUALITY_LEVEL);
HRESULT STDMETHODCALLTYPE GetDropMode(MF_QUALITY_DROP_MODE*);
HRESULT STDMETHODCALLTYPE GetQualityLevel(MF_QUALITY_LEVEL*);
HRESULT STDMETHODCALLTYPE DropTime(LONGLONG);
//IMFQualityAdvise2
HRESULT STDMETHODCALLTYPE NotifyQualityEvent(IMFMediaEvent*, DWORD*);
//IMFRateControl
HRESULT STDMETHODCALLTYPE SetRate(BOOL, float);
HRESULT STDMETHODCALLTYPE GetRate(BOOL*, float*);
//IMFRateSupport
HRESULT STDMETHODCALLTYPE GetSlowestRate(MFRATE_DIRECTION, BOOL, float*);
HRESULT STDMETHODCALLTYPE GetFastestRate(MFRATE_DIRECTION, BOOL, float*);
HRESULT STDMETHODCALLTYPE IsRateSupported(BOOL, float, float*);
//IMFGetService
HRESULT STDMETHODCALLTYPE GetService(REFGUID, REFIID, LPVOID*);
private:
explicit WebmMfVp8Dec(IClassFactory*);
virtual ~WebmMfVp8Dec();
IClassFactory* const m_pClassFactory;
LONG m_cRef;
struct FrameSize { UINT32 width; UINT32 height; };
struct FrameRate
{
UINT32 m_numerator;
UINT32 m_denominator;
void Init();
bool Match(const FrameRate& rhs) const;
HRESULT AssignFrom(IMFMediaType*);
HRESULT CopyTo(IMFMediaType*) const;
HRESULT CopyTo(float&) const;
};
//FrameRate m_frame_rate;
float m_frame_rate;
IMFMediaType* m_pInputMediaType;
IMFMediaType* m_pOutputMediaType;
struct SampleInfo
{
IMFSample* pSample;
DWORD dwBuffer;
HRESULT DecodeAll(vpx_codec_ctx_t&);
HRESULT DecodeOne(vpx_codec_ctx_t&, LONGLONG&, LONGLONG&);
};
typedef std::list<SampleInfo> samples_t;
samples_t m_samples;
vpx_codec_ctx_t m_ctx;
float m_rate; //trick-play mode
BOOL m_bThin;
MF_QUALITY_DROP_MODE m_drop_mode;
int m_drop_budget;
int m_drop_late;
void ReplenishDropBudget();
//struct LagInfo
//{
// LONGLONG lag;
//};
LONGLONG m_lag_sum; //sum of lag values in list
int m_lag_count;
//typedef std::list<LagInfo> lag_info_list_t;
//lag_info_list_t m_lag_info_list;
//float m_lag_reftime;
int m_lag_frames;
DWORD GetOutputBufferSize(FrameSize&) const;
HRESULT Decode(IMFSample*);
HRESULT GetFrame(BYTE*, ULONG, const GUID&);
void Flush();
};
} //end namespace WebmMfVp8DecLib