/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "evrhelpers.h"

#ifndef D3DFMT_YV12
#define D3DFMT_YV12 (D3DFORMAT)MAKEFOURCC ('Y', 'V', '1', '2')
#endif
#ifndef D3DFMT_NV12
#define D3DFMT_NV12 (D3DFORMAT)MAKEFOURCC ('N', 'V', '1', '2')
#endif

QT_BEGIN_NAMESPACE

HRESULT qt_evr_getFourCC(IMFMediaType *type, DWORD *fourCC)
{
    if (!fourCC)
        return E_POINTER;

    HRESULT hr = S_OK;
    GUID guidSubType = GUID_NULL;

    if (SUCCEEDED(hr))
        hr = type->GetGUID(MF_MT_SUBTYPE, &guidSubType);

    if (SUCCEEDED(hr))
        *fourCC = guidSubType.Data1;

    return hr;
}

bool qt_evr_areMediaTypesEqual(IMFMediaType *type1, IMFMediaType *type2)
{
    if (!type1 && !type2)
        return true;
    if (!type1 || !type2)
        return false;

    DWORD dwFlags = 0;
    HRESULT hr = type1->IsEqual(type2, &dwFlags);

    return (hr == S_OK);
}

HRESULT qt_evr_validateVideoArea(const MFVideoArea& area, UINT32 width, UINT32 height)
{
    float fOffsetX = qt_evr_MFOffsetToFloat(area.OffsetX);
    float fOffsetY = qt_evr_MFOffsetToFloat(area.OffsetY);

    if ( ((LONG)fOffsetX + area.Area.cx > (LONG)width) ||
         ((LONG)fOffsetY + area.Area.cy > (LONG)height) ) {
        return MF_E_INVALIDMEDIATYPE;
    }
    return S_OK;
}

bool qt_evr_isSampleTimePassed(IMFClock *clock, IMFSample *sample)
{
    if (!sample || !clock)
        return false;

    HRESULT hr = S_OK;
    MFTIME hnsTimeNow = 0;
    MFTIME hnsSystemTime = 0;
    MFTIME hnsSampleStart = 0;
    MFTIME hnsSampleDuration = 0;

    hr = clock->GetCorrelatedTime(0, &hnsTimeNow, &hnsSystemTime);

    if (SUCCEEDED(hr))
        hr = sample->GetSampleTime(&hnsSampleStart);

    if (SUCCEEDED(hr))
        hr = sample->GetSampleDuration(&hnsSampleDuration);

    if (SUCCEEDED(hr)) {
        if (hnsSampleStart + hnsSampleDuration < hnsTimeNow)
            return true;
    }

    return false;
}

QVideoFrame::PixelFormat qt_evr_pixelFormatFromD3DFormat(DWORD format)
{
    switch (format) {
    case D3DFMT_R8G8B8:
        return QVideoFrame::Format_RGB24;
    case D3DFMT_A8R8G8B8:
        return QVideoFrame::Format_ARGB32;
    case D3DFMT_X8R8G8B8:
        return QVideoFrame::Format_RGB32;
    case D3DFMT_R5G6B5:
        return QVideoFrame::Format_RGB565;
    case D3DFMT_X1R5G5B5:
        return QVideoFrame::Format_RGB555;
    case D3DFMT_A8:
        return QVideoFrame::Format_Y8;
    case D3DFMT_A8B8G8R8:
        return QVideoFrame::Format_BGRA32;
    case D3DFMT_X8B8G8R8:
        return QVideoFrame::Format_BGR32;
    case D3DFMT_UYVY:
        return QVideoFrame::Format_UYVY;
    case D3DFMT_YUY2:
        return QVideoFrame::Format_YUYV;
    case D3DFMT_NV12:
        return QVideoFrame::Format_NV12;
    case D3DFMT_YV12:
        return QVideoFrame::Format_YV12;
    case D3DFMT_UNKNOWN:
    default:
        return QVideoFrame::Format_Invalid;
    }
}

D3DFORMAT qt_evr_D3DFormatFromPixelFormat(QVideoFrame::PixelFormat format)
{
    switch (format) {
    case QVideoFrame::Format_RGB24:
        return D3DFMT_R8G8B8;
    case QVideoFrame::Format_ARGB32:
        return D3DFMT_A8R8G8B8;
    case QVideoFrame::Format_RGB32:
        return D3DFMT_X8R8G8B8;
    case QVideoFrame::Format_RGB565:
        return D3DFMT_R5G6B5;
    case QVideoFrame::Format_RGB555:
        return D3DFMT_X1R5G5B5;
    case QVideoFrame::Format_Y8:
        return D3DFMT_A8;
    case QVideoFrame::Format_BGRA32:
        return D3DFMT_A8B8G8R8;
    case QVideoFrame::Format_BGR32:
        return D3DFMT_X8B8G8R8;
    case QVideoFrame::Format_UYVY:
        return D3DFMT_UYVY;
    case QVideoFrame::Format_YUYV:
        return D3DFMT_YUY2;
    case QVideoFrame::Format_NV12:
        return D3DFMT_NV12;
    case QVideoFrame::Format_YV12:
        return D3DFMT_YV12;
    case QVideoFrame::Format_Invalid:
    default:
        return D3DFMT_UNKNOWN;
    }
}

QT_END_NAMESPACE
