// 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_CAPTURE_VIDEO_WIN_FILTER_BASE_WIN_H_
#define MEDIA_CAPTURE_VIDEO_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 <stddef.h>
#include <wrl/client.h>

#include "base/macros.h"
#include "base/memory/ref_counted.h"

namespace media {

class FilterBase : public IBaseFilter, public base::RefCounted<FilterBase> {
 public:
  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) override;
  STDMETHOD_(ULONG, AddRef)() override;
  STDMETHOD_(ULONG, Release)() override;

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

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

  STDMETHOD(QueryFilterInfo)(FILTER_INFO* info) override;

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

  STDMETHOD(QueryVendorInfo)(LPWSTR* vendor_info) override;

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

  STDMETHOD(Pause)() override;

  STDMETHOD(Run)(REFERENCE_TIME start) override;

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

  STDMETHOD(SetSyncSource)(IReferenceClock* clock) override;

  STDMETHOD(GetSyncSource)(IReferenceClock** clock) override;

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

 protected:
  friend class base::RefCounted<FilterBase>;
  virtual ~FilterBase();

 private:
  FILTER_STATE state_;
  Microsoft::WRL::ComPtr<IFilterGraph> owning_graph_;

  DISALLOW_COPY_AND_ASSIGN(FilterBase);
};

}  // namespace media

#endif  // MEDIA_CAPTURE_VIDEO_WIN_FILTER_BASE_WIN_H_
