diff options
Diffstat (limited to 'src/plugins/directshow/player/directshowiosource.cpp')
-rw-r--r-- | src/plugins/directshow/player/directshowiosource.cpp | 530 |
1 files changed, 0 insertions, 530 deletions
diff --git a/src/plugins/directshow/player/directshowiosource.cpp b/src/plugins/directshow/player/directshowiosource.cpp deleted file mode 100644 index 54c043c17..000000000 --- a/src/plugins/directshow/player/directshowiosource.cpp +++ /dev/null @@ -1,530 +0,0 @@ -/**************************************************************************** -** -** 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 "directshowiosource.h" - -#include "directshowglobal.h" -#include "directshowmediatype.h" -#include "directshowmediatypeenum.h" -#include "directshowpinenum.h" - -#include <QtCore/qcoreapplication.h> -#include <QtCore/qurl.h> - -QT_BEGIN_NAMESPACE - -static const GUID directshow_subtypes[] = -{ - MEDIASUBTYPE_NULL, - MEDIASUBTYPE_Avi, - MEDIASUBTYPE_Asf, - MEDIASUBTYPE_MPEG1Video, - MEDIASUBTYPE_QTMovie, - MEDIASUBTYPE_WAVE, - MEDIASUBTYPE_AIFF, - MEDIASUBTYPE_AU, - MEDIASUBTYPE_DssVideo, - MEDIASUBTYPE_MPEG1Audio, - MEDIASUBTYPE_MPEG1System, - MEDIASUBTYPE_MPEG1VideoCD -}; - -DirectShowIOSource::DirectShowIOSource(DirectShowEventLoop *loop) - : m_loop(loop) -{ - // This filter has only one possible output type, that is, a stream of data - // with no particular subtype. The graph builder will try every demux/decode filters - // to find one able to decode the stream. - // - // The filter works in pull mode, the downstream filter is responsible for requesting - // samples from this one. - // - AM_MEDIA_TYPE type - { - MEDIATYPE_Stream, // majortype - MEDIASUBTYPE_NULL, // subtype - TRUE, // bFixedSizeSamples - FALSE, // bTemporalCompression - 1, // lSampleSize - GUID_NULL, // formattype - nullptr, // pUnk - 0, // cbFormat - nullptr, // pbFormat - }; - - for (const auto &directshowSubtype : directshow_subtypes) { - type.subtype = directshowSubtype; - m_supportedMediaTypes.append(DirectShowMediaType(type)); - } -} - -DirectShowIOSource::~DirectShowIOSource() -{ - Q_ASSERT(m_ref == 0); - - delete m_reader; -} - -void DirectShowIOSource::setDevice(QIODevice *device) -{ - Q_ASSERT(!m_reader); - - m_reader = new DirectShowIOReader(device, this, m_loop); -} - -void DirectShowIOSource::setAllocator(IMemAllocator *allocator) -{ - if (m_allocator == allocator) - return; - - if (m_allocator) - m_allocator->Release(); - - m_allocator = allocator; - - if (m_allocator) - m_allocator->AddRef(); -} - -// IUnknown -HRESULT DirectShowIOSource::QueryInterface(REFIID riid, void **ppvObject) -{ - // 2dd74950-a890-11d1-abe8-00a0c905f375 - static const GUID iid_IAmFilterMiscFlags = { - 0x2dd74950, 0xa890, 0x11d1, {0xab, 0xe8, 0x00, 0xa0, 0xc9, 0x05, 0xf3, 0x75}}; - - if (!ppvObject) - return E_POINTER; - - if (riid == IID_IUnknown || riid == IID_IPersist || riid == IID_IMediaFilter - || riid == IID_IBaseFilter) { - *ppvObject = static_cast<IBaseFilter *>(this); - } else if (riid == iid_IAmFilterMiscFlags) { - *ppvObject = static_cast<IAMFilterMiscFlags *>(this); - } else if (riid == IID_IPin) { - *ppvObject = static_cast<IPin *>(this); - } else if (riid == IID_IAsyncReader) { - m_queriedForAsyncReader = true; - *ppvObject = static_cast<IAsyncReader *>(m_reader); - } else { - *ppvObject = nullptr; - - return E_NOINTERFACE; - } - - AddRef(); - - return S_OK; -} - -ULONG DirectShowIOSource::AddRef() -{ - return InterlockedIncrement(&m_ref); -} - -ULONG DirectShowIOSource::Release() -{ - ULONG ref = InterlockedDecrement(&m_ref); - - if (ref == 0) { - delete this; - } - - return ref; -} - -// IPersist -HRESULT DirectShowIOSource::GetClassID(CLSID *pClassID) -{ - *pClassID = CLSID_NULL; - - return S_OK; -} - -// IMediaFilter -HRESULT DirectShowIOSource::Run(REFERENCE_TIME tStart) -{ - Q_UNUSED(tStart); - QMutexLocker locker(&m_mutex); - - m_state = State_Running; - - return S_OK; -} - -HRESULT DirectShowIOSource::Pause() -{ - QMutexLocker locker(&m_mutex); - - m_state = State_Paused; - - return S_OK; -} - -HRESULT DirectShowIOSource::Stop() -{ - QMutexLocker locker(&m_mutex); - - m_state = State_Stopped; - - return S_OK; -} - -HRESULT DirectShowIOSource::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *pState) -{ - Q_UNUSED(dwMilliSecsTimeout); - - if (!pState) - return E_POINTER; - - QMutexLocker locker(&m_mutex); - *pState = m_state; - return S_OK; -} - -HRESULT DirectShowIOSource::SetSyncSource(IReferenceClock *pClock) -{ - QMutexLocker locker(&m_mutex); - - if (m_clock) - m_clock->Release(); - - m_clock = pClock; - - if (m_clock) - m_clock->AddRef(); - - return S_OK; -} - -HRESULT DirectShowIOSource::GetSyncSource(IReferenceClock **ppClock) -{ - if (!ppClock) - return E_POINTER; - - if (!m_clock) { - *ppClock = nullptr; - return S_FALSE; - } - m_clock->AddRef(); - *ppClock = m_clock; - return S_OK; -} - -// IBaseFilter -HRESULT DirectShowIOSource::EnumPins(IEnumPins **ppEnum) -{ - if (!ppEnum) - return E_POINTER; - - *ppEnum = new DirectShowPinEnum(QList<IPin *>() << this); - return S_OK; -} - -HRESULT DirectShowIOSource::FindPin(LPCWSTR Id, IPin **ppPin) -{ - if (!ppPin || !Id) - return E_POINTER; - - QMutexLocker locker(&m_mutex); - if (m_pinId == QStringView(Id)) { - AddRef(); - *ppPin = this; - return S_OK; - } - *ppPin = nullptr; - return VFW_E_NOT_FOUND; -} - -HRESULT DirectShowIOSource::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) -{ - QMutexLocker locker(&m_mutex); - - m_graph = pGraph; - m_filterName = QString::fromWCharArray(pName); - - return S_OK; -} - -HRESULT DirectShowIOSource::QueryFilterInfo(FILTER_INFO *pInfo) -{ - if (!pInfo) - return E_POINTER; - - QString name = m_filterName; - if (name.length() >= MAX_FILTER_NAME) - name.truncate(MAX_FILTER_NAME - 1); - - int length = name.toWCharArray(pInfo->achName); - pInfo->achName[length] = '\0'; - - if (m_graph) - m_graph->AddRef(); - - pInfo->pGraph = m_graph; - - return S_OK; -} - -HRESULT DirectShowIOSource::QueryVendorInfo(LPWSTR *pVendorInfo) -{ - Q_UNUSED(pVendorInfo); - - return E_NOTIMPL; -} - -// IAMFilterMiscFlags -ULONG DirectShowIOSource::GetMiscFlags() -{ - return AM_FILTER_MISC_FLAGS_IS_SOURCE; -} - -// IPin -HRESULT DirectShowIOSource::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) -{ - if (!pReceivePin) - return E_POINTER; - - QMutexLocker locker(&m_mutex); - - if (m_state != State_Stopped) - return VFW_E_NOT_STOPPED; - - if (m_peerPin) - return VFW_E_ALREADY_CONNECTED; - - // If we get a type from the graph manager, check that we support that - if (pmt && pmt->majortype != MEDIATYPE_Stream) - return VFW_E_TYPE_NOT_ACCEPTED; - - // This filter only works in pull mode, the downstream filter must query for the - // AsyncReader interface during ReceiveConnection(). - // If it doesn't, we can't connect to it. - m_queriedForAsyncReader = false; - HRESULT hr = 0; - // Negotiation of media type - // - Complete'ish type (Stream with subtype specified). - if (pmt && pmt->subtype != MEDIASUBTYPE_NULL /* aka. GUID_NULL */) { - hr = pReceivePin->ReceiveConnection(this, pmt); - // Update the media type for the current connection. - if (SUCCEEDED(hr)) - DirectShowMediaType::copy(&m_connectionMediaType, pmt); - } else if (pmt && pmt->subtype == MEDIATYPE_NULL) { // - Partial type (Stream, but no subtype specified). - DirectShowMediaType::copy(&m_connectionMediaType, pmt); - // Check if the receiving pin accepts any of the streaming subtypes. - for (const DirectShowMediaType &t : qAsConst(m_supportedMediaTypes)) { - m_connectionMediaType->subtype = t->subtype; - hr = pReceivePin->ReceiveConnection(this, &m_connectionMediaType); - if (SUCCEEDED(hr)) - break; - } - } else { // - No media type specified. - // Check if the receiving pin accepts any of the streaming types. - for (const DirectShowMediaType &t : qAsConst(m_supportedMediaTypes)) { - hr = pReceivePin->ReceiveConnection(this, &t); - if (SUCCEEDED(hr)) { - m_connectionMediaType = t; - break; - } - } - } - - if (SUCCEEDED(hr) && m_queriedForAsyncReader) { - m_peerPin = pReceivePin; - m_peerPin->AddRef(); - } else { - pReceivePin->Disconnect(); - if (m_allocator) { - m_allocator->Release(); - m_allocator = nullptr; - } - if (!m_queriedForAsyncReader) - hr = VFW_E_NO_TRANSPORT; - - m_connectionMediaType.clear(); - } - - return hr; -} - -HRESULT DirectShowIOSource::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) -{ - Q_UNUSED(pConnector); - Q_UNUSED(pmt); - // Output pin. - return E_NOTIMPL; -} - -HRESULT DirectShowIOSource::Disconnect() -{ - QMutexLocker locker(&m_mutex); - - if (!m_peerPin) - return S_FALSE; - if (m_state != State_Stopped) - return VFW_E_NOT_STOPPED; - - HRESULT hr = m_peerPin->Disconnect(); - if (!SUCCEEDED(hr)) - return hr; - - if (m_allocator) { - m_allocator->Release(); - m_allocator = nullptr; - } - - m_peerPin->Release(); - m_peerPin = nullptr; - - return S_OK; -} - -HRESULT DirectShowIOSource::ConnectedTo(IPin **ppPin) -{ - if (!ppPin) - return E_POINTER; - - QMutexLocker locker(&m_mutex); - if (!m_peerPin) { - *ppPin = nullptr; - return VFW_E_NOT_CONNECTED; - } - m_peerPin->AddRef(); - *ppPin = m_peerPin; - return S_OK; -} - -HRESULT DirectShowIOSource::ConnectionMediaType(AM_MEDIA_TYPE *pmt) -{ - if (!pmt) - return E_POINTER; - - QMutexLocker locker(&m_mutex); - if (!m_peerPin) { - pmt = nullptr; - return VFW_E_NOT_CONNECTED; - } - DirectShowMediaType::copy(pmt, &m_connectionMediaType); - return S_OK; -} - -HRESULT DirectShowIOSource::QueryPinInfo(PIN_INFO *pInfo) -{ - if (!pInfo) - return E_POINTER; - - AddRef(); - - pInfo->pFilter = this; - pInfo->dir = PINDIR_OUTPUT; - - const int bytes = qMin(MAX_FILTER_NAME, (m_pinId.length() + 1) * 2); - - ::memcpy(pInfo->achName, m_pinId.utf16(), bytes); - - return S_OK; -} - -HRESULT DirectShowIOSource::QueryId(LPWSTR *Id) -{ - if (!Id) - return E_POINTER; - - const int bytes = (m_pinId.length() + 1) * 2; - *Id = static_cast<LPWSTR>(::CoTaskMemAlloc(bytes)); - ::memcpy(*Id, m_pinId.utf16(), bytes); - return S_OK; -} - -HRESULT DirectShowIOSource::QueryAccept(const AM_MEDIA_TYPE *pmt) -{ - if (!pmt) - return E_POINTER; - return pmt->majortype == MEDIATYPE_Stream ? S_OK : S_FALSE; -} - -HRESULT DirectShowIOSource::EnumMediaTypes(IEnumMediaTypes **ppEnum) -{ - if (!ppEnum) - return E_POINTER; - *ppEnum = new DirectShowMediaTypeEnum(m_supportedMediaTypes); - return S_OK; -} - -HRESULT DirectShowIOSource::QueryInternalConnections(IPin **apPin, ULONG *nPin) -{ - Q_UNUSED(apPin); - Q_UNUSED(nPin); - - return E_NOTIMPL; -} - -HRESULT DirectShowIOSource::EndOfStream() -{ - return S_OK; -} - -HRESULT DirectShowIOSource::BeginFlush() -{ - return m_reader->BeginFlush(); -} - -HRESULT DirectShowIOSource::EndFlush() -{ - return m_reader->EndFlush(); -} - -HRESULT DirectShowIOSource::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) -{ - Q_UNUSED(tStart); - Q_UNUSED(tStop); - Q_UNUSED(dRate); - - return S_OK; -} - -HRESULT DirectShowIOSource::QueryDirection(PIN_DIRECTION *pPinDir) -{ - if (!pPinDir) - return E_POINTER; - *pPinDir = PINDIR_OUTPUT; - return S_OK; -} - -QT_END_NAMESPACE |