RFR: 8337960: Improve performance of mfwrapper by reusing GStreamer media buffers for decoded video

Kevin Rushforth kcr at openjdk.org
Wed Feb 12 22:01:28 UTC 2025


On Wed, 5 Feb 2025 03:00:17 GMT, Alexander Matveev <almatvee at openjdk.org> wrote:

> - Added new class `CMFGSTBuffer` which can allocate memory internally or provide GStreamer allocated memory to Media Foundation.
> - Added `GstBufferPool` to limit allocation of output buffers used for rendering (memory will not be allocated for each buffer, but instead will be reused from pool). Limits are 3 min buffers and 6 max buffers. During testing 3 buffers was enough.
> - Changed `CoInitializeEx` to `COINIT_MULTITHREADED` as per Media Foundation requirements.
> - Added error handling for `ProcessOutput` in case of https://bugs.openjdk.org/browse/JDK-8329227. With error handling `MediaPlayer` fails nicely instead of silent hang.

The code looks reasonable. I left a few minor questions / comments. I'll reapprove if you make any changes.

All my testing looks good (I only tested on Windows, since this is in Windows-only code).

modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfgstbuffer.cpp line 215:

> 213:         return E_INVALIDARG;
> 214: 
> 215:     // If we have GStreamer get buffer cllback set, then call it to get

Minor typo: `cllback` --> `callback`

modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfgstbuffer.cpp line 242:

> 240:     }
> 241:     // Lock can be called multiple times, so if we have GStreamer buffer
> 242:     // allocated just return it.

Is it actually possible that Lock can be called multiple times? If it is, then I see that you don't keep track of the number of calls to Lock, so is it correct to assume that the caller does not match Lock / Unlock calls, but rather calls Unlock only once regardless of the number of calls to Lock?

modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfgstbuffer.h line 69:

> 67:     HRESULT AllocateOrGetBuffer(BYTE **ppbBuffer);
> 68: 
> 69: private:

Minor: isn't this redundant?

modules/javafx.media/src/main/native/gstreamer/plugins/mfwrapper/mfwrapper.cpp line 911:

> 909: 
> 910: // Gets max length of configured media buffer we using for final rendering from
> 911: // decoder ot color convert.

Minor: "ot" --> "of" ?

-------------

Marked as reviewed by kcr (Lead).

PR Review: https://git.openjdk.org/jfx/pull/1695#pullrequestreview-2613223582
PR Review Comment: https://git.openjdk.org/jfx/pull/1695#discussion_r1953422605
PR Review Comment: https://git.openjdk.org/jfx/pull/1695#discussion_r1953457463
PR Review Comment: https://git.openjdk.org/jfx/pull/1695#discussion_r1953409208
PR Review Comment: https://git.openjdk.org/jfx/pull/1695#discussion_r1953447469


More information about the openjfx-dev mailing list