Nikolay Sivov : evr/presenter: Add a helpe for input processing.

Alexandre Julliard julliard at winehq.org
Tue Nov 10 15:30:24 CST 2020


Module: wine
Branch: master
Commit: e4ec280ec7d56875d2097c8094608dbf7bdcb697
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e4ec280ec7d56875d2097c8094608dbf7bdcb697

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Nov 10 13:07:19 2020 +0300

evr/presenter: Add a helpe for input processing.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/evr/presenter.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index 2102882e084..8be3dd91aa7 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -40,6 +40,11 @@ enum presenter_state
     PRESENTER_STATE_PAUSED,
 };
 
+enum presenter_flags
+{
+    PRESENTER_MIXER_HAS_INPUT = 0x1,
+};
+
 enum streaming_thread_message
 {
     EVRM_STOP = WM_USER,
@@ -82,6 +87,7 @@ struct video_presenter
     SIZE native_ratio;
     unsigned int ar_mode;
     unsigned int state;
+    unsigned int flags;
     CRITICAL_SECTION cs;
 };
 
@@ -311,6 +317,50 @@ static HRESULT video_presenter_end_streaming(struct video_presenter *presenter)
     return S_OK;
 }
 
+static HRESULT video_presenter_process_input(struct video_presenter *presenter)
+{
+    MFT_OUTPUT_DATA_BUFFER buffer;
+    HRESULT hr = S_OK;
+    IMFSample *sample;
+    DWORD status;
+
+    if (!presenter->media_type)
+        return S_OK;
+
+    while (hr == S_OK)
+    {
+        if (!(presenter->flags & PRESENTER_MIXER_HAS_INPUT))
+            break;
+
+        if (FAILED(hr = IMFVideoSampleAllocator_AllocateSample(presenter->allocator, &sample)))
+        {
+            WARN("Failed to allocate a sample, hr %#x.\n", hr);
+            break;
+        }
+
+        memset(&buffer, 0, sizeof(buffer));
+        buffer.pSample = sample;
+
+        if (FAILED(hr = IMFTransform_ProcessOutput(presenter->mixer, 0, 1, &buffer, &status)))
+        {
+            /* FIXME: failure path probably needs to handle some errors specifically */
+            presenter->flags &= ~PRESENTER_MIXER_HAS_INPUT;
+            IMFSample_Release(sample);
+            break;
+        }
+        else
+        {
+            if (buffer.pEvents)
+                IMFCollection_Release(buffer.pEvents);
+
+            /* FIXME: for now drop output sample back to the pool */
+            IMFSample_Release(sample);
+        }
+    }
+
+    return S_OK;
+}
+
 static HRESULT WINAPI video_presenter_inner_QueryInterface(IUnknown *iface, REFIID riid, void **obj)
 {
     struct video_presenter *presenter = impl_from_IUnknown(iface);
@@ -511,6 +561,10 @@ static HRESULT WINAPI video_presenter_ProcessMessage(IMFVideoPresenter *iface, M
         case MFVP_MESSAGE_ENDSTREAMING:
             hr = video_presenter_end_streaming(presenter);
             break;
+        case MFVP_MESSAGE_PROCESSINPUTNOTIFY:
+            presenter->flags |= PRESENTER_MIXER_HAS_INPUT;
+            hr = video_presenter_process_input(presenter);
+            break;
         default:
             FIXME("Unsupported message %u.\n", message);
             hr = E_NOTIMPL;




More information about the wine-cvs mailing list