1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
110f224ffecd2f1190744b5bc5c97f4ce373ba0adetommi@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_SINK_FILTER_DS_H_
120f224ffecd2f1190744b5bc5c97f4ce373ba0adetommi@webrtc.org#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_SINK_FILTER_DS_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <Streams.h> // Include base DS filter header files
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1687c29b570711208c5f74bf9eaffbea549de866c7pbos@webrtc.org#include "webrtc/modules/video_capture/include/video_capture_defines.h"
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace videocapturemodule
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//forward declaration
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CaptureSinkFilter;
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/**
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *	input pin for camera input
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CaptureInputPin: public CBaseInputPin
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
32f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org    int32_t _moduleId;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCaptureCapability _requestedCapability;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCaptureCapability _resultingCapability;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    HANDLE _threadHandle;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
38f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org    CaptureInputPin(int32_t moduleId,
39f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                    IN TCHAR* szName,
40f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                    IN CaptureSinkFilter* pFilter,
41f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                    IN CCritSec * pLock,
42f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                    OUT HRESULT * pHr,
43f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                    IN LPCWSTR pszName);
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~CaptureInputPin();
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    HRESULT GetMediaType (IN int iPos, OUT CMediaType * pmt);
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    HRESULT CheckMediaType (IN const CMediaType * pmt);
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    STDMETHODIMP Receive (IN IMediaSample *);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    HRESULT SetMatchingMediaType(const VideoCaptureCapability& capability);
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CaptureSinkFilter: public CBaseFilter
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
56f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org    CaptureSinkFilter(IN TCHAR * tszName,
57f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                      IN LPUNKNOWN punk,
58f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                      OUT HRESULT * phr,
59f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                      VideoCaptureExternal& captureObserver,
60f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org                      int32_t moduleId);
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~CaptureSinkFilter();
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  --------------------------------------------------------------------
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  class methods
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
66f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org    void ProcessCapturedFrame(unsigned char* pBuffer, int32_t length,
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              const VideoCaptureCapability& frameInfo);
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  explicit receiver lock aquisition and release
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void LockReceive()  { m_crtRecv.Lock();}
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void UnlockReceive() {m_crtRecv.Unlock();}
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  explicit filter lock aquisition and release
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void LockFilter() {m_crtFilter.Lock();}
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void UnlockFilter() { m_crtFilter.Unlock(); }
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetFilterGraph(IGraphBuilder* graph); // Used if EVR
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  --------------------------------------------------------------------
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  COM interfaces
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgDECLARE_IUNKNOWN    ;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    STDMETHODIMP SetMatchingMediaType(const VideoCaptureCapability& capability);
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  --------------------------------------------------------------------
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  CBaseFilter methods
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int GetPinCount ();
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CBasePin * GetPin ( IN int Index);
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    STDMETHODIMP Pause ();
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    STDMETHODIMP Stop ();
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    STDMETHODIMP GetClassID ( OUT CLSID * pCLSID);
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  --------------------------------------------------------------------
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  class factory calls this
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static CUnknown * CreateInstance (IN LPUNKNOWN punk, OUT HRESULT * phr);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CCritSec m_crtFilter; //  filter lock
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CCritSec m_crtRecv;  //  receiver lock; always acquire before filter lock
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CaptureInputPin * m_pInput;
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCaptureExternal& _captureObserver;
96f7e44d647cd0f893a185dfbe043cb313cab29fd0pbos@webrtc.org    int32_t _moduleId;
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
983b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace videocapturemodule
993b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
1000f224ffecd2f1190744b5bc5c97f4ce373ba0adetommi@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_SINK_FILTER_DS_H_
101