/*  This file is part of the KDE project.

Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).

This library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 or 3 of the License.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this library.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef PHONON_QMEMINPUTPIN_H
#define PHONON_QMEMINPUTPIN_H


#include <QtCore/QList>
#include <QtCore/QMutex>
#include "qpin.h"

#include <dshow.h>

QT_BEGIN_NAMESPACE

namespace Phonon
{
    namespace DS9
    {
        class QBaseFilter;

        //this class will be used for our effects
        class QMemInputPin : public QPin, public IMemInputPin
        {
        public:
            QMemInputPin(QBaseFilter *, const QVector<AM_MEDIA_TYPE> &, bool transform, QPin *output);
            ~QMemInputPin();

            //reimplementation from IUnknown
            STDMETHODIMP QueryInterface(REFIID iid, void** out);
            STDMETHODIMP_(ULONG) AddRef();
            STDMETHODIMP_(ULONG) Release();

            //reimplementation from IPin
            STDMETHODIMP ReceiveConnection(IPin *,const AM_MEDIA_TYPE *);
            STDMETHODIMP BeginFlush();
            STDMETHODIMP EndFlush();
            STDMETHODIMP EndOfStream();
            STDMETHODIMP NewSegment(REFERENCE_TIME start, REFERENCE_TIME stop, double rate);

            //reimplementation from IMemAllocator
            STDMETHODIMP GetAllocator(IMemAllocator **);
            STDMETHODIMP NotifyAllocator(IMemAllocator *,BOOL);
            STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *);
            STDMETHODIMP Receive(IMediaSample *);
            STDMETHODIMP ReceiveMultiple(IMediaSample **,long,long *);
            STDMETHODIMP ReceiveCanBlock();

        private:
            IMediaSample *duplicateSampleForOutput(IMediaSample *, IMemAllocator *);
            ALLOCATOR_PROPERTIES getDefaultAllocatorProperties() const;

            bool m_shouldDuplicateSamples;
            const bool m_transform; //defines if the pin is transforming the samples
            QPin* const m_output;
            QMutex m_mutexReceive;
        };
    }
}

QT_END_NAMESPACE

#endif
