/**************************************************************************** ** ** 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