blob: c0f6ed6699970c38f3e41f4791594386ab470c24 [file] [log] [blame]
// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license and patent
// grant that can be found in the LICENSE file in the root of the source
// tree. All contributing project authors may be found in the AUTHORS
// file in the root of the source tree.
#pragma once
#include <strmif.h>
#include <string>
#include "webmmuxinpinvideo.hpp"
#include "webmmuxinpinaudio.hpp"
#include "webmmuxoutpin.hpp"
#include "webmmuxcontext.hpp"
#include "clockable.hpp"
namespace WebmMux
{
class Filter : public IBaseFilter,
public IMediaSeeking,
public IAMFilterMiscFlags,
public CLockable
{
friend HRESULT CreateInstance(
IClassFactory*,
IUnknown*,
const IID&,
void**);
Filter(IClassFactory*, IUnknown*);
virtual ~Filter();
Filter(const Filter&);
Filter& operator=(const Filter&);
public:
//IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(const IID&, void**);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
//IBaseFilter
HRESULT STDMETHODCALLTYPE GetClassID(CLSID*);
HRESULT STDMETHODCALLTYPE Stop();
HRESULT STDMETHODCALLTYPE Pause();
HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME);
HRESULT STDMETHODCALLTYPE GetState(DWORD, FILTER_STATE*);
HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock*);
HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock**);
HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins**);
HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR, IPin**);
HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO*);
HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph*, LPCWSTR);
HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR*);
//IMediaSeeking interface:
HRESULT STDMETHODCALLTYPE GetCapabilities(DWORD*);
HRESULT STDMETHODCALLTYPE CheckCapabilities(DWORD*);
HRESULT STDMETHODCALLTYPE IsFormatSupported(const GUID*);
HRESULT STDMETHODCALLTYPE QueryPreferredFormat(GUID*);
HRESULT STDMETHODCALLTYPE GetTimeFormat(GUID*);
HRESULT STDMETHODCALLTYPE IsUsingTimeFormat(const GUID*);
HRESULT STDMETHODCALLTYPE SetTimeFormat(const GUID*);
HRESULT STDMETHODCALLTYPE GetDuration(LONGLONG*);
HRESULT STDMETHODCALLTYPE GetStopPosition(LONGLONG*);
HRESULT STDMETHODCALLTYPE GetCurrentPosition(LONGLONG*);
HRESULT STDMETHODCALLTYPE ConvertTimeFormat(
LONGLONG*,
const GUID*,
LONGLONG,
const GUID*);
HRESULT STDMETHODCALLTYPE SetPositions(
LONGLONG*,
DWORD,
LONGLONG*,
DWORD);
HRESULT STDMETHODCALLTYPE GetPositions(
LONGLONG*,
LONGLONG*);
HRESULT STDMETHODCALLTYPE GetAvailable(
LONGLONG*,
LONGLONG*);
HRESULT STDMETHODCALLTYPE SetRate(double);
HRESULT STDMETHODCALLTYPE GetRate(double*);
HRESULT STDMETHODCALLTYPE GetPreroll(LONGLONG*);
ULONG STDMETHODCALLTYPE GetMiscFlags();
private:
class nondelegating_t : public IUnknown
{
public:
Filter* const m_pFilter;
LONG m_cRef;
nondelegating_t(Filter*);
virtual ~nondelegating_t();
HRESULT STDMETHODCALLTYPE QueryInterface(const IID&, void**);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
private:
nondelegating_t(const nondelegating_t&);
nondelegating_t& operator=(const nondelegating_t&);
};
IClassFactory* const m_pClassFactory;
nondelegating_t m_nondelegating;
IUnknown* const m_pOuter; //decl must follow m_nondelegating
REFERENCE_TIME m_start;
IReferenceClock* m_clock;
FILTER_INFO m_info;
public:
FILTER_STATE m_state;
InpinVideo m_inpin_video;
InpinAudio m_inpin_audio;
Outpin m_outpin;
Context m_ctx;
HRESULT OnEndOfStream();
};
} //end WebmMux