OBS Project Progress Report, September 2019
Welcome to another edition of the OBS Project Progress Report. This time we’re going to go over all the big news and updates that have happened leading up to version 24.
Let’s start with the big announcement:
We’re excited to announce that Twitch is officially sponsoring the OBS Project! Twitch and OBS have always worked close together, and now we’re making it official.
You know it’s kind of crazy how a life can have such twists and turns that you would never expect. Before I made the project, I was bored, without a job, and felt like my life was at one of its lowest points. Then I decided to make this project with all the knowledge I had taught myself writing game engines over the years, learning as I went, working hard on my first ever open source program, meeting wonderful people, working together, building a community. Because of that single decision, I’m now able to support myself with it; life can turn around when you least expect it. A bit of luck, a lot of hard work, and a wonderful community can dramatically change a person’s life. I am incredibly grateful for everything: being supported by so many wonderful users, working together with so many talented developers, and being sponsored by many generous companies and organizations. It’s been life-changing.
Now, time for the OBS news report!
Why can’t browsers just be used for browsing
Web browsers are the most bloated things on the face of the planet. Every time I want to update Chromium for the browser source or the browser panels, multiple things break. This is mostly because Chromium is constantly updating, changing, evolving, and being refactored over time. Unfortunately, the authors of Chromium itself cannot really prioritize off-screen surface use; they have to prioritize their intended usage as actual web browsers. What this means is that those of us who use Chromium in a different way must constantly adapt to their changes, which is very painful.
Also, get this: we had scattered reports of unusual behavior with video devices when we released 24. One person had a camera that was working one way before 24, then when he updated to 24, it stopped working the same way. So I initially thought we must have done something wrong, and I went through the whole process of bisecting the repository with him to find out what we could have possibly broken in the code. After a while, I was baffled because we couldn’t figure out where in the code it was breaking. I checked every possible change with no effect; then I noticed something really weird: when I switched from Chromium 3770 back to 3440, his device started working properly again, with the exact same OBS code! I double and triple checked, and sure enough, just simply updating Chromium for him caused his device to stop working the same way. Likely, Chromium is the catalyst and not the cause, if Chromium is doing more device initialization, resources probably became more limited for him, triggering the issue. Fortunately, I didn’t hear more reports of that severity.
Oh, and the Chromium versions past 3770 will no longer have any of the features that we require, such as hardware accelerated off-screen surface support, the ability to signal when to render frames, or browser source audio rerouting support. So.. we won’t be able to update until those features are available once again. I’m just not happy.
And, last but not least, we may have to change to 3729 to fix another infrequent issue some are having with media files when hardware acceleration is disabled. We probably still need another hotfix just to fix that.
What a nightmare. Someone, please help. Well technically we have people helping, but I just.. don’t want to use browsers. I hate browsers.
We did at least fix seemingly countless bugs related to browser panels this release, and we added audio rerouting, so that’s nice.. I guess. However, as painful as browsers may be they’re versatile and useful, and web experts are a dime a dozen. But I also hate browsers. It’s a complex relationship.
As usual, it’s important to mention that we are immensely grateful to the authors and maintainers of the Chromium Embedded Framework project (CEF), which is what allows us to use Chromium this way, and makes our browser sources possible. They have provided us with so many of the important tools and features we use; it’s an incredible project.
Browser source audio can now go through OBS
The audio of browser sources was always independent of OBS, played by the Chromium Embedded Framework library. Now with version 24, the audio can be controlled by OBS with the “Control audio via OBS” option in the browser source’s properties. When that’s enabled, you can control the volume of each individual browser source in the mixer, apply audio filters, or make it only output its audio to the stream and not your speakers.
I had actually initially released 24 with this on by default, but that was a mistake: it changed the way audio played back for many users, and sometimes people had different devices set up for monitoring, causing much confusion. Additionally, some users had bad configurations for audio monitoring, and the audio just didn’t play back. So I decided to change it in the 24.0.1 so that it’s off by default instead, making it have the same behavior it had pre-24 unless you explicitly enable it. Annoyingly, we did not encounter these issues while testing release candidates with thousands of users; we only started getting these reports after release.
Browser source audio rerouting was the last project that Osiris worked on. He will be missed by us all.
Custom dockable browser panels
In 24, we added the ability to create custom browser panels; basically this means you can now bring up any website you’d like as a dockable panel in OBS. You can access this feature via the View -> Docks submenu.
While developing this, it also exposed some interesting bugs, so I’m happy to say that we patched various browser-related bugs that we wouldn’t have found otherwise had we not written this. Bugs, freezes, and crashes that might have been happening under rare circumstances otherwise.
Hey, one of my long, long awaited promises has finally been fulfilled. It was quite painful, but it’s finally here, and it’s pretty nice. I wanted it to be as close to perfect as possible; it involved stopping both video/audio data to the encoders down to the exact video frame and the exact audio sample, so it wasn’t trivial. To do this I basically had to splice the audio data together on the pause and unpause points. It will try to match the exact timing of the pause/unpause press as closely as possible.
Note that this feature will not work if you share a video encoder between streaming and recording, just simply because streams needs to keep transmitting data. So for that reason, they have to use separate encoders, so if you use “same as stream” for your recording encoder settings, then you’ll need to change that.
Needless to say, this will help make editing a bit easier for our users who like to use OBS for recording. I hope you all find it useful.
Updated all dependencies on Windows
We don’t update our dependencies often on Windows because it can always be a bit risky to stability (as Chromium has proven). With version 24, all dependencies OBS utilizes such as FFmpeg and x264 have been updated. This means more optimizations and improvements all around for encoding/decoding via software.
Managing the project is a lot of work
As maintainer of the project, it’s becoming increasingly difficult for me to write features myself and merge features written from others at the same time; I myself have become a bottleneck to outside contribution due to how busy I am. We have a few pull requests pending right now that are countless thousands of lines and will take significant time to review. One is 7000 lines. It’s getting to be a bit ridiculous.
Often what happens is I have to stop merging pull requests in order to focus on my own code, which means that the pull requests begin to pile up. When 24 started, we only had a handful of pull requests, and while making 24, we probably received about 150 pull requests; upward of 100 were merged, and 60 now remain waiting to be reviewed. The amount of contribution we are receiving is growing rapidly, but giving contributions the attention they need can be a lot of work, so naturally we need to adapt to the circumstances.
Normally when we get pull requests, it’s when a contributor is intending to add something they themselves want to the project. It’s not necessarily something we planned to put in, but often something someone else wants for their own personal reasons. Such pull requests are usually small/simple because most people aren’t really experienced enough to add something very complicated. If a programmer is highly experienced, chances are they aren’t contributing much to an open source project. So, with our newfound funding and sponsorship, one of the things we might experiment with are bounties; making it possible to earn money working on the project to get features we need from people with the required expertise. We’ll give more details in the future depending on how we want to approach that, if we decide to approach that. We’ll see.
Either way I really need to work less on my own code, and work more on managing the project and helping other people code for the project. That’s one of the most important goals for any open source maintainer, and it’s about time that we transitioned to that.
One of the biggest weaknesses with the program that I really want to see worked on is work on laptop usability, or at least better communication with the user about laptop issues, and how to fix them. Laptops almost always ship with two video adapters: one for power saving, one for performance; this allows laptops to save power in lower priority situations so it doesn’t drain the battery. However, this also causes issues with capturing, because often what happens is that the image that we want to capture is on another GPU, which results in a black screen. And we can’t just copy it to RAM first because that’s a major performance impact, especially for a laptop. At the very least, we need to inform users how to fix it within the program itself and use workarounds, because often it’s just fixed by the user changing their laptop video adapter settings.
Another thing I would love to see worked on is an in-game overlay at some point. A significant percentage of users are on a single monitor, whether it be a laptop or a desktop with one monitor. We can’t ask users to just buy multiple monitors in order to be able to see what shows on OBS. One of the ways of solving that is with an optional overlay. However, I’ve always disliked overlays passionately because they have an impact one way or another. That and they’re probably the most difficult things to write. I’m not sure if we’ll ever get a “proper” overlay, but it’d be nice to have at some point for single-display users.
Don’t even get me started on macOS and Linux related stuff I want to see worked on. I’ve talked about that in previous blogs and we’re still working on them. They always have to take reduced priority because not as many people use them. I’m not happy about that but when the vast majority of your users are on Windows, it’s just the way things are.
I want to see a better status bar, better hotkeys pane, better studio mode, better output settings, better plugin management for third-party plugins, native websockets support, undo/redo, multi-stream output, in-game overlay; I could keep going on forever. It’s tough because there are so many things we need to work on that it’s ridiculous. There are so many features, improvements, tweaks that we want to make to the program that the list seems endless at this point. We plan on eventually tackling every single one as we’re able.
Also: Vulkan capture is coming soon!
Major contributors for 24.0
Other than myself, jpark37 probably made the most contributions this patch, making countless minor optimizations and improvements, particularly beneficial to those running on weaker systems.
pkv helped on dynamic bitrate, browser source audio output to OBS, and various other browser issues. pkv spent quite a bit of time hunting down various browser and audio issues, and made our CEF builds.
Ilya also spent quite a bit of time working on fixing browser issues introduced by the new CEF version, which is not an easy thing to do. A number of issues solved thanks to his help.
cg2121 always busy as usual, adding the feature to automatically stop recordings when disk space is low, adding the script with ability to pause when a specific scene is active, adding the enable preview button, and various other minor improvements. Always incredibly patient and generous with his time.
Dillon is always busy writing his own improvements; he wrote the box selection feature for this patch, and has more in store for patches to come.
And although those are the major code contributors for this patch, there are many more people who helped in what way they could. A significant portion of contribution has been due to many strangers generously sparing a little bit of their time for their own minor improvements, tweaks, and bug fixes. There are also our wonderful translators on Crowdin; without them, we would not be able to distribute the program in so many languages. Our support volunteers who generously spare their time helping users solve problems/issues. We are incredibly grateful to everyone who has helped the project in what ways they could, with what little time they could. This community is absolutely amazing.
Thanks to you, we’re not stopping any time soon
As usual, thank you all so much for using OBS. The future looks bright, and we are very grateful for all the support. This program is a lot of work, but it’s been the best thing that’s ever happened to me. We’re not stopping any time soon, so stay tuned for more.