// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Implement a simple base class for DirectShow filters. It may only be used in
// a single threaded apartment.

#ifndef MEDIA_VIDEO_CAPTURE_WIN_FILTER_BASE_WIN_H_
#define MEDIA_VIDEO_CAPTURE_WIN_FILTER_BASE_WIN_H_

// Avoid including strsafe.h via dshow as it will cause build warnings.
#define NO_DSHOW_STRSAFE
#include <dshow.h>

#include "base/memory/ref_counted.h"
#include "base/win/scoped_comptr.h"

namespace media {

class FilterBase
    : public IBaseFilter,
      public base::RefCounted<FilterBase> {
 public:
  FilterBase();
  virtual ~FilterBase();

  // Number of pins connected to this filter.
  virtual size_t NoOfPins() = 0;
  // Returns the IPin interface pin no index.
  virtual IPin* GetPin(int index) = 0;

  // Inherited from IUnknown.
  STDMETHOD(QueryInterface)(REFIID id, void** object_ptr);
  STDMETHOD_(ULONG, AddRef)();
  STDMETHOD_(ULONG, Release)();

  // Inherited from IBaseFilter.
  STDMETHOD(EnumPins)(IEnumPins** enum_pins);

  STDMETHOD(FindPin)(LPCWSTR id, IPin** pin);

  STDMETHOD(QueryFilterInfo)(FILTER_INFO* info);

  STDMETHOD(JoinFilterGraph)(IFilterGraph* graph, LPCWSTR name);

  STDMETHOD(QueryVendorInfo)(LPWSTR* vendor_info);

  // Inherited from IMediaFilter.
  STDMETHOD(Stop)();

  STDMETHOD(Pause)();

  STDMETHOD(Run)(REFERENCE_TIME start);

  STDMETHOD(GetState)(DWORD msec_timeout, FILTER_STATE* state);

  STDMETHOD(SetSyncSource)(IReferenceClock* clock);

  STDMETHOD(GetSyncSource)(IReferenceClock** clock);

  // Inherited from IPersistent.
  STDMETHOD(GetClassID)(CLSID* class_id) = 0;

 private:
  FILTER_STATE state_;
  base::win::ScopedComPtr<IFilterGraph> owning_graph_;

  DISALLOW_COPY_AND_ASSIGN(FilterBase);
};

}  // namespace media

#endif  // MEDIA_VIDEO_CAPTURE_WIN_FILTER_BASE_WIN_H_
