Package: gstreamer1.0-plugins-base Version: 1.14.4-2 Severity: normal Tags: patch fixed-upstream Forwarded: https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/887
The latest version of Proton (Valve's branch of Wine, used to run Windows games under Steam) runs in a Debian 10-based container (Steam Runtime 2 'soldier'), instead of the Ubuntu 12.04-based LD_LIBRARY_PATH library bundle (Steam Runtime 1 'scout') that was used in previous releases. During the move from Steam Runtime 1 to 2, Proton developers noticed a performance regression in their GStreamer-based video decoding, which they were able to track down to the theoradec plugin. This plugin uses libtheora, which has an optional feature called "telemetry" that records statistics. It can be enabled or disabled at build-time; if enabled at build-time, it is disabled by default at runtime. Activating it at runtime involves setting some options, and incurs a significant performance cost to convert each decoded frame from YUV to RGB for use by Cairo (30-40ms per frame for 1920x1080 video). Note that despite its name, as far as I'm aware "telemetry" does not send the statistics anywhere, it just captures them - so it isn't a privacy problem, and is really just "-metry", with no "tele-" involved :-) In Debian, the telemetry feature is enabled in libtheora at build-time. GStreamer's theoradec plugin attempts to set the telemetry options to user-specified values. However, in released versions of libtheora, setting the telemetry options to any value - even 0 - is documented to have the side-effect of enabling the telemetry feature and triggering the performance regression. This can be fixed in three ways: 1. Disable telemetry at compile-time in libtheora. We did this in the Steam Runtime as a temporary solution, but it's a feature regression for libtheora, and the libtheora maintainers in Debian presumably don't want that, so let's discard this option. 2. In GStreamer, if the telemetry options are set to 0, don't propagate that into libtheora so that the expensive YUV -> RGB conversion is not done, even with current releases of libtheora. This is <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/887> and is what this bug represents. It has been merged upstream and was backported to 1.18.x (for 1.18.1, I think) in <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/892>. 3. In libtheora, if the telemetry options are all explicitly set to 0 (for example by current versions of GStreamer), behave as though they had not been set at all, and therefore don't enable the expensive YUV -> RGB conversion. This is <https://gitlab.xiph.org/xiph/theora/-/issues/2312> and <https://gitlab.xiph.org/xiph/theora/-/merge_requests/4>, and I'll open a separate libtheora bug to represent this. It has been merged upstream for v1.2.0, but there hasn't been an upstream release since 1.2.0 alpha 1 (which doesn't have this change) in 2010, so it seems unlikely that there will be a release with this change any time soon. Following the principle that bad interactions between two components are most robust if fixed on *both* sides, solutions 2 and 3 have both been accepted upstream, and I suggest that they should also happen in Debian. The Steam Runtime maintainers will probably be doing a backport of this into 1.14.x, so I'll try to send a patch later. Thanks, smcv