qtmobility/plugins/multimedia/directshow/player/videosurfacefilter.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 11 06b8e2af4411
equal deleted inserted replaced
1:2b40d63a9c3d 4:90517678cc4f
    79 {
    79 {
    80     Q_ASSERT(m_ref == 1);
    80     Q_ASSERT(m_ref == 1);
    81 }
    81 }
    82 
    82 
    83 HRESULT VideoSurfaceFilter::QueryInterface(REFIID riid, void **ppvObject)
    83 HRESULT VideoSurfaceFilter::QueryInterface(REFIID riid, void **ppvObject)
    84 {
    84 {    
       
    85     // 2dd74950-a890-11d1-abe8-00a0c905f375
       
    86     static const GUID iid_IAmFilterMiscFlags = {
       
    87         0x2dd74950, 0xa890, 0x11d1, {0xab, 0xe8, 0x00, 0xa0, 0xc9, 0x05, 0xf3, 0x75} };
       
    88 
    85     if (!ppvObject) {
    89     if (!ppvObject) {
    86         return E_POINTER;
    90         return E_POINTER;
    87     } else if (riid == IID_IUnknown
    91     } else if (riid == IID_IUnknown
    88             || riid == IID_IPersist
    92             || riid == IID_IPersist
    89             || riid == IID_IMediaFilter
    93             || riid == IID_IMediaFilter
    90             || riid == IID_IBaseFilter) {
    94             || riid == IID_IBaseFilter) {
    91         *ppvObject = static_cast<IBaseFilter *>(this);
    95         *ppvObject = static_cast<IBaseFilter *>(this);
    92     } else if (riid == IID_IAMFilterMiscFlags) {
    96     } else if (riid == iid_IAmFilterMiscFlags) {
    93         *ppvObject = static_cast<IAMFilterMiscFlags *>(this);
    97         *ppvObject = static_cast<IAMFilterMiscFlags *>(this);
    94     } else if (riid == IID_IPin) {
    98     } else if (riid == IID_IPin) {
    95         *ppvObject = static_cast<IPin *>(this);
    99         *ppvObject = static_cast<IPin *>(this);
    96     } else if (riid == IID_IMemInputPin) {
   100     } else if (riid == IID_IMemInputPin) {
    97         *ppvObject = static_cast<IMemInputPin *>(&m_sampleScheduler);
   101         *ppvObject = static_cast<IMemInputPin *>(&m_sampleScheduler);
   441 HRESULT VideoSurfaceFilter::EndOfStream()
   445 HRESULT VideoSurfaceFilter::EndOfStream()
   442 {
   446 {
   443     QMutexLocker locker(&m_mutex);
   447     QMutexLocker locker(&m_mutex);
   444 
   448 
   445     if (!m_sampleScheduler.scheduleEndOfStream()) {
   449     if (!m_sampleScheduler.scheduleEndOfStream()) {
   446         if (IMediaEventSink *sink = com_cast<IMediaEventSink>(m_graph)) {
   450         if (IMediaEventSink *sink = com_cast<IMediaEventSink>(m_graph, IID_IMediaEventSink)) {
   447             sink->Notify(
   451             sink->Notify(
   448                     EC_COMPLETE,
   452                     EC_COMPLETE,
   449                     S_OK,
   453                     S_OK,
   450                     reinterpret_cast<LONG_PTR>(static_cast<IBaseFilter *>(this)));
   454                     reinterpret_cast<LONG_PTR>(static_cast<IBaseFilter *>(this)));
   451             sink->Release();
   455             sink->Release();
   564 }
   568 }
   565 
   569 
   566 void VideoSurfaceFilter::supportedFormatsChanged()
   570 void VideoSurfaceFilter::supportedFormatsChanged()
   567 {
   571 {
   568     QMutexLocker locker(&m_mutex);
   572     QMutexLocker locker(&m_mutex);
       
   573 
       
   574     // MEDIASUBTYPE_None;
       
   575     static const GUID none = {
       
   576         0xe436eb8e, 0x524f, 0x11ce, {0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70} };
   569 
   577 
   570     QList<QVideoFrame::PixelFormat> formats = m_surface->supportedPixelFormats();
   578     QList<QVideoFrame::PixelFormat> formats = m_surface->supportedPixelFormats();
   571 
   579 
   572     QVector<AM_MEDIA_TYPE> mediaTypes;
   580     QVector<AM_MEDIA_TYPE> mediaTypes;
   573     mediaTypes.reserve(formats.count());
   581     mediaTypes.reserve(formats.count());
   583     type.pbFormat = 0;
   591     type.pbFormat = 0;
   584 
   592 
   585     foreach (QVideoFrame::PixelFormat format, formats) {
   593     foreach (QVideoFrame::PixelFormat format, formats) {
   586         type.subtype = DirectShowMediaType::convertPixelFormat(format);
   594         type.subtype = DirectShowMediaType::convertPixelFormat(format);
   587 
   595 
   588         if (type.subtype != MEDIASUBTYPE_None)
   596         if (type.subtype != none)
   589             mediaTypes.append(type);
   597             mediaTypes.append(type);
   590     }
   598     }
   591 
   599 
   592     setMediaTypes(mediaTypes);
   600     setMediaTypes(mediaTypes);
   593 }
   601 }
   605                 m_surfaceFormat.pixelFormat()));
   613                 m_surfaceFormat.pixelFormat()));
   606 
   614 
   607         sample->Release();
   615         sample->Release();
   608 
   616 
   609         if (eos) {
   617         if (eos) {
   610             if (IMediaEventSink *sink = com_cast<IMediaEventSink>(m_graph)) {
   618             if (IMediaEventSink *sink = com_cast<IMediaEventSink>(m_graph, IID_IMediaEventSink)) {
   611                 sink->Notify(
   619                 sink->Notify(
   612                         EC_COMPLETE,
   620                         EC_COMPLETE,
   613                         S_OK,
   621                         S_OK,
   614                         reinterpret_cast<LONG_PTR>(static_cast<IBaseFilter *>(this)));
   622                         reinterpret_cast<LONG_PTR>(static_cast<IBaseFilter *>(this)));
   615                 sink->Release();
   623                 sink->Release();