summaryrefslogtreecommitdiffstats
path: root/src/plugins/multimedia/windows/evr/evrhelpers.cpp
blob: bf4347c698079acb7b05c42aeaa6bd9739236f57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "evrhelpers_p.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;
}

QVideoFrameFormat::PixelFormat qt_evr_pixelFormatFromD3DFormat(DWORD format)
{
    switch (format) {
    case D3DFMT_A8R8G8B8:
        return QVideoFrameFormat::Format_BGRA8888;
    case D3DFMT_X8R8G8B8:
        return QVideoFrameFormat::Format_BGRX8888;
    case D3DFMT_A8:
        return QVideoFrameFormat::Format_Y8;
    case D3DFMT_A8B8G8R8:
        return QVideoFrameFormat::Format_RGBA8888;
    case D3DFMT_X8B8G8R8:
        return QVideoFrameFormat::Format_RGBX8888;
    case D3DFMT_UYVY:
        return QVideoFrameFormat::Format_UYVY;
    case D3DFMT_YUY2:
        return QVideoFrameFormat::Format_YUYV;
    case D3DFMT_NV12:
        return QVideoFrameFormat::Format_NV12;
    case D3DFMT_YV12:
        return QVideoFrameFormat::Format_YV12;
    case D3DFMT_UNKNOWN:
    default:
        return QVideoFrameFormat::Format_Invalid;
    }
}

D3DFORMAT qt_evr_D3DFormatFromPixelFormat(QVideoFrameFormat::PixelFormat format)
{
    switch (format) {
    case QVideoFrameFormat::Format_ARGB8888:
        return D3DFMT_A8B8G8R8;
    case QVideoFrameFormat::Format_BGRA8888:
        return D3DFMT_A8R8G8B8;
    case QVideoFrameFormat::Format_BGRX8888:
        return D3DFMT_X8R8G8B8;
    case QVideoFrameFormat::Format_Y8:
        return D3DFMT_A8;
    case QVideoFrameFormat::Format_RGBA8888:
        return D3DFMT_A8B8G8R8;
    case QVideoFrameFormat::Format_RGBX8888:
        return D3DFMT_X8B8G8R8;
    case QVideoFrameFormat::Format_UYVY:
        return D3DFMT_UYVY;
    case QVideoFrameFormat::Format_YUYV:
        return D3DFMT_YUY2;
    case QVideoFrameFormat::Format_NV12:
        return D3DFMT_NV12;
    case QVideoFrameFormat::Format_YV12:
        return D3DFMT_YV12;
    case QVideoFrameFormat::Format_Invalid:
    default:
        return D3DFMT_UNKNOWN;
    }
}

QT_END_NAMESPACE