/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_DEVICE_INFO_WINDOWS_H_
#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_DEVICE_INFO_WINDOWS_H_

#include "../video_capture_impl.h"
#include "../device_info_impl.h"

#include <Dshow.h>
#include "map_wrapper.h"

// forward declarations
namespace webrtc
{
namespace videocapturemodule
{
struct VideoCaptureCapabilityWindows: public VideoCaptureCapability
{
    WebRtc_UWord32 directShowCapabilityIndex;
    bool supportFrameRateControl;
    VideoCaptureCapabilityWindows()
    {
        directShowCapabilityIndex = 0;
        supportFrameRateControl = false;
    }

};
class DeviceInfoWindows: public DeviceInfoImpl
{
public:
    DeviceInfoWindows(const WebRtc_Word32 id);
    virtual ~DeviceInfoWindows();

    WebRtc_Word32 Init();
    virtual WebRtc_UWord32 NumberOfDevices();

    /*
     * Returns the available capture devices.
     */
    virtual WebRtc_Word32
        GetDeviceName(WebRtc_UWord32 deviceNumber,
                      WebRtc_UWord8* deviceNameUTF8,
                      WebRtc_UWord32 deviceNameLength,
                      WebRtc_UWord8* deviceUniqueIdUTF8,
                      WebRtc_UWord32 deviceUniqueIdUTF8Length,
                      WebRtc_UWord8* productUniqueIdUTF8,
                      WebRtc_UWord32 productUniqueIdUTF8Length);

    /* 
     * Display OS /capture device specific settings dialog
     */
    virtual WebRtc_Word32
        DisplayCaptureSettingsDialogBox(
                                        const WebRtc_UWord8* deviceUniqueIdUTF8,
                                        const WebRtc_UWord8* dialogTitleUTF8,
                                        void* parentWindow,
                                        WebRtc_UWord32 positionX,
                                        WebRtc_UWord32 positionY);

    // Windows specific

    /* Gets a capture device filter
     The user of this API is responsible for releasing the filter when it not needed.
     */
    IBaseFilter * GetDeviceFilter(const WebRtc_UWord8* deviceUniqueIdUTF8,
                                  WebRtc_UWord8* productUniqueIdUTF8 = NULL,
                                  WebRtc_UWord32 productUniqueIdUTF8Length = 0);

    WebRtc_Word32
        GetWindowsCapability(const WebRtc_Word32 capabilityIndex,
                             VideoCaptureCapabilityWindows& windowsCapability);

    static void GetProductId(const WebRtc_UWord8* devicePath,
                             WebRtc_UWord8* productUniqueIdUTF8,
                             WebRtc_UWord32 productUniqueIdUTF8Length);
protected:

    WebRtc_Word32 GetDeviceInfo(WebRtc_UWord32 deviceNumber,
                                WebRtc_UWord8* deviceNameUTF8,
                                WebRtc_UWord32 deviceNameLength,
                                WebRtc_UWord8* deviceUniqueIdUTF8,
                                WebRtc_UWord32 deviceUniqueIdUTF8Length,
                                WebRtc_UWord8* productUniqueIdUTF8,
                                WebRtc_UWord32 productUniqueIdUTF8Length);

    virtual WebRtc_Word32
        CreateCapabilityMap(const WebRtc_UWord8* deviceUniqueIdUTF8);

private:
    ICreateDevEnum* _dsDevEnum;
    IEnumMoniker* _dsMonikerDevEnum;
    bool _CoUninitializeIsRequired;

};
} // namespace videocapturemodule
} // namespace webrtc
#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_DEVICE_INFO_WINDOWS_H_
