Changes of Revision 75
obs-studio.changes
Changed
x
1
2
-------------------------------------------------------------------
3
+Mon Mar 23 16:10:08 UTC 2020 - jimmy@boombatower.com
4
+
5
+- Update to version 25.0.2:
6
+ * linux-v4l2: readonly controls cause infinite loop
7
+ * libobs: Update version to 25.0.2 (linux hotfix)
8
+ * UI: Set correct window title for fullscreen projector
9
+ * CI: Update Linux CI from Ubuntu 16.04 to 18.04
10
+ * UI: Make links in updater clickable
11
+ * obs-filters: Fix LUT file extension filter on Linux
12
+ * win-wasapi: Fix leaking IPropertyStore
13
+ * win-wasapi: Fix crash on certain devices
14
+ * obs-qsv11: Fix target usage values
15
+ * UI: Fix crash on settings update
16
+ * libobs: Add move assignment operator for BPtr
17
+ * libobs: Fix missing assignment operator return
18
+ * libobs: Fix size mismatch warning
19
+ * libobs: Handle noexcept warnings
20
+ * UI: Make Importer destructor virtual
21
+ * UI: Add setting for Mixer add-on choice
22
+ * linux-capture: Use RandR monitors for screen information
23
+
24
+-------------------------------------------------------------------
25
Thu Mar 19 19:26:37 UTC 2020 - jimmy@boombatower.com
26
27
- Update to version 25.0.1:
28
obs-studio.spec
Changed
8
1
2
Name: obs-studio
3
-Version: 25.0.1
4
+Version: 25.0.2
5
Release: 0
6
Summary: A recording/broadcasting program
7
Group: Productivity/Multimedia/Video/Editors and Convertors
8
_service
Changed
10
1
2
<services>
3
<service name="tar_scm" mode="disabled">
4
<param name="versionformat">@PARENT_TAG@</param>
5
- <param name="revision">refs/tags/25.0.1</param>
6
+ <param name="revision">refs/tags/25.0.2</param>
7
<param name="url">git://github.com/jp9000/obs-studio.git</param>
8
<param name="scm">git</param>
9
<param name="changesgenerate">enable</param>
10
_servicedata
Changed
9
1
2
<servicedata>
3
<service name="tar_scm">
4
<param name="url">git://github.com/jp9000/obs-studio.git</param>
5
- <param name="changesrevision">b19ea6fe3516a7a8bdf44f50bb95a36f4681330d</param>
6
+ <param name="changesrevision">a0e8adbc42df198f95c3778335e4a883e0c2fd09</param>
7
</service>
8
</servicedata>
9
obs-studio-25.0.1.tar.xz/UI/auth-mixer.cpp -> obs-studio-25.0.2.tar.xz/UI/auth-mixer.cpp
Changed
37
1
2
return OAuthStreamKey::LoadInternal();
3
}
4
5
+static const char *elixr_script = "\
6
+var elixr = document.createElement('script');\
7
+elixr.setAttribute('src','https://api.mixrelixr.com/scripts/elixr-emotes-embedded-chat.bundle.js');\
8
+document.head.appendChild(elixr);";
9
+
10
void MixerAuth::LoadUI()
11
{
12
if (!cef)
13
14
OBSBasic::InitBrowserPanelSafeBlock();
15
OBSBasic *main = OBSBasic::Get();
16
17
+ std::string script = "";
18
std::string url;
19
url += "https://mixer.com/embed/chat/";
20
url += id;
21
22
QCefWidget *browser = cef->create_widget(nullptr, url, panel_cookies);
23
chat->SetWidget(browser);
24
25
+ const int mxAddonChoice =
26
+ config_get_int(main->Config(), service(), "AddonChoice");
27
+ if (mxAddonChoice) {
28
+ if (mxAddonChoice & 0x1)
29
+ script += elixr_script;
30
+ }
31
+
32
+ browser->setStartupScript(script);
33
+
34
main->addDockWidget(Qt::RightDockWidgetArea, chat.data());
35
chatMenu.reset(main->AddDockWidget(chat.data()));
36
37
obs-studio-25.0.1.tar.xz/UI/data/locale/en-US.ini -> obs-studio-25.0.2.tar.xz/UI/data/locale/en-US.ini
Changed
11
1
2
Basic.Settings.Stream.TTVAddon.BTTV="BetterTTV"
3
Basic.Settings.Stream.TTVAddon.FFZ="FrankerFaceZ"
4
Basic.Settings.Stream.TTVAddon.Both="BetterTTV and FrankerFaceZ"
5
+Basic.Settings.Stream.MixerAddon="Mixer Chat Add-Ons"
6
+Basic.Settings.Stream.MixerAddon.None="None"
7
+Basic.Settings.Stream.MixerAddon.MEE="MixrElixr Emotes"
8
Basic.Settings.Stream.MissingSettingAlert="Missing Stream Setup"
9
Basic.Settings.Stream.StreamSettingsWarning="Open Settings"
10
Basic.Settings.Stream.MissingUrlAndApiKey="URL and Stream Key are missing.\n\nOpen settings to enter the URL and Stream Key in the 'stream' tab."
11
obs-studio-25.0.1.tar.xz/UI/forms/OBSBasicSettings.ui -> obs-studio-25.0.2.tar.xz/UI/forms/OBSBasicSettings.ui
Changed
96
1
2
<rect>
3
<x>0</x>
4
<y>0</y>
5
- <width>806</width>
6
- <height>1254</height>
7
+ <width>803</width>
8
+ <height>1026</height>
9
</rect>
10
</property>
11
<layout class="QVBoxLayout" name="verticalLayout_19">
12
13
</property>
14
</widget>
15
</item>
16
- <item row="8" column="0">
17
+ <item row="9" column="0">
18
<widget class="QLabel" name="authUsernameLabel">
19
<property name="text">
20
<string>Basic.Settings.Stream.Custom.Username</string>
21
22
</property>
23
</widget>
24
</item>
25
- <item row="8" column="1">
26
+ <item row="9" column="1">
27
<widget class="QLineEdit" name="authUsername"/>
28
</item>
29
- <item row="9" column="0">
30
+ <item row="10" column="0">
31
<widget class="QLabel" name="authPwLabel">
32
<property name="text">
33
<string>Basic.Settings.Stream.Custom.Password</string>
34
35
</property>
36
</widget>
37
</item>
38
- <item row="9" column="1">
39
+ <item row="10" column="1">
40
<widget class="QWidget" name="authPwWidget" native="true">
41
<layout class="QHBoxLayout" name="horizontalLayout_25">
42
<property name="leftMargin">
43
44
</property>
45
</widget>
46
</item>
47
+ <item row="8" column="0">
48
+ <widget class="QLabel" name="mixerAddonLabel">
49
+ <property name="text">
50
+ <string>Basic.Settings.Stream.MixerAddon</string>
51
+ </property>
52
+ <property name="buddy">
53
+ <cstring>mixerAddonDropdown</cstring>
54
+ </property>
55
+ </widget>
56
+ </item>
57
+ <item row="8" column="1">
58
+ <widget class="QComboBox" name="mixerAddonDropdown"/>
59
+ </item>
60
</layout>
61
</widget>
62
</widget>
63
64
<rect>
65
<x>0</x>
66
<y>0</y>
67
- <width>813</width>
68
- <height>761</height>
69
+ <width>603</width>
70
+ <height>631</height>
71
</rect>
72
</property>
73
<layout class="QVBoxLayout" name="verticalLayout_21">
74
75
<rect>
76
<x>0</x>
77
<y>0</y>
78
- <width>767</width>
79
- <height>582</height>
80
+ <width>555</width>
81
+ <height>469</height>
82
</rect>
83
</property>
84
<layout class="QVBoxLayout" name="verticalLayout_50">
85
86
<rect>
87
<x>0</x>
88
<y>0</y>
89
- <width>791</width>
90
- <height>970</height>
91
+ <width>596</width>
92
+ <height>781</height>
93
</rect>
94
</property>
95
<layout class="QVBoxLayout" name="verticalLayout_23">
96
obs-studio-25.0.1.tar.xz/UI/forms/OBSUpdate.ui -> obs-studio-25.0.2.tar.xz/UI/forms/OBSUpdate.ui
Changed
20
1
2
</widget>
3
</item>
4
<item>
5
- <widget class="QTextEdit" name="text">
6
+ <widget class="QTextBrowser" name="text">
7
<property name="readOnly">
8
<bool>true</bool>
9
</property>
10
11
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
12
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string>
13
</property>
14
+ <property name="openExternalLinks">
15
+ <bool>true</bool>
16
+ </property>
17
</widget>
18
</item>
19
<item>
20
obs-studio-25.0.1.tar.xz/UI/importers/importers.hpp -> obs-studio-25.0.2.tar.xz/UI/importers/importers.hpp
Changed
9
1
2
3
class Importer {
4
public:
5
+ virtual ~Importer() {}
6
virtual std::string Prog() { return "Null"; };
7
virtual int ImportScenes(const std::string &path, std::string &name,
8
json11::Json &res) = 0;
9
obs-studio-25.0.1.tar.xz/UI/window-basic-settings-stream.cpp -> obs-studio-25.0.2.tar.xz/UI/window-basic-settings-stream.cpp
Changed
72
1
2
ui->bandwidthTestEnable->setVisible(false);
3
ui->twitchAddonDropdown->setVisible(false);
4
ui->twitchAddonLabel->setVisible(false);
5
+ ui->mixerAddonDropdown->setVisible(false);
6
+ ui->mixerAddonLabel->setVisible(false);
7
8
int vertSpacing = ui->topStreamLayout->verticalSpacing();
9
10
11
ui->twitchAddonDropdown->addItem(
12
QTStr("Basic.Settings.Stream.TTVAddon.Both"));
13
14
+ ui->mixerAddonDropdown->addItem(
15
+ QTStr("Basic.Settings.Stream.MixerAddon.None"));
16
+ ui->mixerAddonDropdown->addItem(
17
+ QTStr("Basic.Settings.Stream.MixerAddon.MEE"));
18
+
19
connect(ui->service, SIGNAL(currentIndexChanged(int)), this,
20
SLOT(UpdateServerList()));
21
connect(ui->service, SIGNAL(currentIndexChanged(int)), this,
22
23
24
idx = config_get_int(main->Config(), "Twitch", "AddonChoice");
25
ui->twitchAddonDropdown->setCurrentIndex(idx);
26
+
27
+ idx = config_get_int(main->Config(), "Mixer", "AddonChoice");
28
+ ui->mixerAddonDropdown->setCurrentIndex(idx);
29
}
30
31
UpdateServerList();
32
33
if (choiceExists && currentChoice != newChoice)
34
forceAuthReload = true;
35
}
36
+ if (!!auth && strcmp(auth->service(), "Mixer") == 0) {
37
+ bool choiceExists = config_has_user_value(
38
+ main->Config(), "Mixer", "AddonChoice");
39
+ int currentChoice =
40
+ config_get_int(main->Config(), "Mixer", "AddonChoice");
41
+ int newChoice = ui->mixerAddonDropdown->currentIndex();
42
+
43
+ config_set_int(main->Config(), "Mixer", "AddonChoice",
44
+ newChoice);
45
+
46
+ if (choiceExists && currentChoice != newChoice)
47
+ forceAuthReload = true;
48
+ }
49
50
obs_data_set_string(settings, "key", QT_TO_UTF8(ui->key->text()));
51
52
53
ui->bandwidthTestEnable->setVisible(false);
54
ui->twitchAddonDropdown->setVisible(false);
55
ui->twitchAddonLabel->setVisible(false);
56
+ ui->mixerAddonDropdown->setVisible(false);
57
+ ui->mixerAddonLabel->setVisible(false);
58
59
#ifdef BROWSER_AVAILABLE
60
if (cef) {
61
62
ui->twitchAddonLabel->setVisible(true);
63
ui->twitchAddonDropdown->setVisible(true);
64
}
65
+ if (strcmp(a->service(), "Mixer") == 0) {
66
+ ui->mixerAddonLabel->setVisible(true);
67
+ ui->mixerAddonDropdown->setVisible(true);
68
+ }
69
}
70
71
ui->streamStackWidget->setCurrentIndex((int)Section::StreamKey);
72
obs-studio-25.0.1.tar.xz/UI/window-basic-settings.cpp -> obs-studio-25.0.2.tar.xz/UI/window-basic-settings.cpp
Changed
19
1
2
HookWidget(ui->key, EDIT_CHANGED, STREAM1_CHANGED);
3
HookWidget(ui->bandwidthTestEnable, CHECK_CHANGED, STREAM1_CHANGED);
4
HookWidget(ui->twitchAddonDropdown, COMBO_CHANGED, STREAM1_CHANGED);
5
+ HookWidget(ui->mixerAddonDropdown, COMBO_CHANGED, STREAM1_CHANGED);
6
HookWidget(ui->useAuth, CHECK_CHANGED, STREAM1_CHANGED);
7
HookWidget(ui->authUsername, EDIT_CHANGED, STREAM1_CHANGED);
8
HookWidget(ui->authPw, EDIT_CHANGED, STREAM1_CHANGED);
9
10
bool audioRestart = (ui->channelSetup->currentIndex() != channelIndex ||
11
ui->sampleRate->currentIndex() != sampleRateIndex);
12
bool browserHWAccelChanged =
13
- (ui->browserHWAccel->isChecked() != prevBrowserAccel);
14
+ (ui->browserHWAccel &&
15
+ ui->browserHWAccel->isChecked() != prevBrowserAccel);
16
17
if (langChanged || audioRestart || browserHWAccelChanged)
18
restart = true;
19
obs-studio-25.0.1.tar.xz/UI/window-projector.cpp -> obs-studio-25.0.2.tar.xz/UI/window-projector.cpp
Changed
17
1
2
type = type_;
3
4
setWindowIcon(QIcon::fromTheme("obs", QIcon(":/res/images/obs.png")));
5
- UpdateProjectorTitle(QT_UTF8(obs_source_get_name(source)));
6
7
if (monitor == -1)
8
resize(480, 270);
9
else
10
SetMonitor(monitor);
11
12
+ UpdateProjectorTitle(QT_UTF8(obs_source_get_name(source)));
13
+
14
QAction *action = new QAction(this);
15
action->setShortcut(Qt::Key_Escape);
16
addAction(action);
17
obs-studio-25.0.1.tar.xz/azure-pipelines.yml -> obs-studio-25.0.2.tar.xz/azure-pipelines.yml
Changed
19
1
2
jobs:
3
- job: Prebuild
4
pool:
5
- vmImage: 'ubuntu-16.04'
6
+ vmImage: 'ubuntu-18.04'
7
steps:
8
- bash: |
9
if curl -s "https://api.github.com/repos/$BUILD_REPOSITORY_ID/issues/$SYSTEM_PULLREQUEST_PULLREQUESTNUMBER/labels" | grep '"name": "Seeking Testers"'
10
11
variables:
12
prHasCILabel: $[ dependencies.Prebuild.outputs['checkPrLabel.prHasCILabel'] ]
13
pool:
14
- vmImage: 'ubuntu-16.04'
15
+ vmImage: 'ubuntu-18.04'
16
steps:
17
- script: git submodule update --init --recursive
18
displayName: 'Checkout Submodules'
19
obs-studio-25.0.1.tar.xz/libobs/obs-config.h -> obs-studio-25.0.2.tar.xz/libobs/obs-config.h
Changed
10
1
2
*
3
* Reset to zero each major or minor version
4
*/
5
-#define LIBOBS_API_PATCH_VER 1
6
+#define LIBOBS_API_PATCH_VER 2
7
8
#define MAKE_SEMANTIC_VERSION(major, minor, patch) \
9
((major << 24) | (minor << 16) | patch)
10
obs-studio-25.0.1.tar.xz/libobs/obs-source.c -> obs-studio-25.0.2.tar.xz/libobs/obs-source.c
Changed
18
1
2
const struct obs_source_frame *src,
3
uint32_t plane, uint32_t lines)
4
{
5
- if (dst->linesize[plane] != src->linesize[plane])
6
+ if (dst->linesize[plane] != src->linesize[plane]) {
7
for (uint32_t y = 0; y < lines; y++)
8
copy_frame_data_line(dst, src, plane, y);
9
- else
10
+ } else {
11
memcpy(dst->data[plane], src->data[plane],
12
- dst->linesize[plane] * lines);
13
+ (size_t)dst->linesize[plane] * (size_t)lines);
14
+ }
15
}
16
17
static void copy_frame_data(struct obs_source_frame *dst,
18
obs-studio-25.0.1.tar.xz/libobs/obs.hpp -> obs-studio-25.0.2.tar.xz/libobs/obs.hpp
Changed
19
1
2
}
3
4
OBSSignal(const OBSSignal &) = delete;
5
- OBSSignal(OBSSignal &&other)
6
+ OBSSignal(OBSSignal &&other) noexcept
7
: handler(other.handler),
8
signal(other.signal),
9
callback(other.callback),
10
11
}
12
13
OBSSignal &operator=(const OBSSignal &) = delete;
14
- OBSSignal &operator=(OBSSignal &&other)
15
+ OBSSignal &operator=(OBSSignal &&other) noexcept
16
{
17
Disconnect();
18
19
obs-studio-25.0.1.tar.xz/libobs/util/util.hpp -> obs-studio-25.0.2.tar.xz/libobs/util/util.hpp
Changed
51
1
2
3
#include <string.h>
4
#include <stdarg.h>
5
+#include <utility>
6
7
#include "bmem.h"
8
#include "config-file.h"
9
10
11
public:
12
inline BPtr(T *p = nullptr) : ptr(p) {}
13
- inline BPtr(BPtr &&other) : ptr(other.ptr) { other.ptr = nullptr; }
14
+ inline BPtr(BPtr &&other) { *this = std::move(other); }
15
inline ~BPtr() { bfree(ptr); }
16
17
inline T *operator=(T *p)
18
19
ptr = p;
20
return p;
21
}
22
+
23
+ inline BPtr &operator=(BPtr &&other)
24
+ {
25
+ ptr = other.ptr;
26
+ other.ptr = nullptr;
27
+ return *this;
28
+ }
29
+
30
inline operator T *() { return ptr; }
31
inline T **operator&()
32
{
33
34
35
public:
36
inline ConfigFile() : config(NULL) {}
37
- inline ConfigFile(ConfigFile &&other) : config(other.config)
38
+ inline ConfigFile(ConfigFile &&other) noexcept : config(other.config)
39
{
40
other.config = nullptr;
41
}
42
43
44
public:
45
inline TextLookup(lookup_t *lookup = nullptr) : lookup(lookup) {}
46
- inline TextLookup(TextLookup &&other) : lookup(other.lookup)
47
+ inline TextLookup(TextLookup &&other) noexcept : lookup(other.lookup)
48
{
49
other.lookup = nullptr;
50
}
51
obs-studio-25.0.1.tar.xz/libobs/util/windows/CoTaskMemPtr.hpp -> obs-studio-25.0.2.tar.xz/libobs/util/windows/CoTaskMemPtr.hpp
Changed
9
1
2
{
3
Clear();
4
ptr = val;
5
+ return *this;
6
}
7
8
inline T **operator&()
9
obs-studio-25.0.1.tar.xz/plugins/linux-capture/xhelpers.c -> obs-studio-25.0.2.tar.xz/plugins/linux-capture/xhelpers.c
Changed
104
1
2
return true;
3
}
4
5
+static bool randr_has_monitors(xcb_connection_t *xcb)
6
+{
7
+ xcb_randr_query_version_cookie_t ver_c;
8
+ xcb_randr_query_version_reply_t *ver_r;
9
+
10
+ ver_c = xcb_randr_query_version(xcb, XCB_RANDR_MAJOR_VERSION,
11
+ XCB_RANDR_MINOR_VERSION);
12
+ ver_r = xcb_randr_query_version_reply(xcb, ver_c, 0);
13
+ if (!ver_r)
14
+ return 0;
15
+
16
+ bool ret = ver_r->major_version > 1 || ver_r->minor_version >= 5;
17
+ free(ver_r);
18
+ return ret;
19
+}
20
+
21
int randr_screen_count(xcb_connection_t *xcb)
22
{
23
if (!xcb)
24
25
xcb_screen_t *screen;
26
screen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data;
27
28
+ if (randr_has_monitors(xcb)) {
29
+ xcb_randr_get_monitors_cookie_t mon_c;
30
+ xcb_randr_get_monitors_reply_t *mon_r;
31
+
32
+ mon_c = xcb_randr_get_monitors(xcb, screen->root, true);
33
+ mon_r = xcb_randr_get_monitors_reply(xcb, mon_c, 0);
34
+ if (!mon_r)
35
+ return 0;
36
+
37
+ int count = xcb_randr_get_monitors_monitors_length(mon_r);
38
+ free(mon_r);
39
+ return count;
40
+ }
41
xcb_randr_get_screen_resources_cookie_t res_c;
42
xcb_randr_get_screen_resources_reply_t *res_r;
43
44
45
46
int randr_screen_geo(xcb_connection_t *xcb, int_fast32_t screen,
47
int_fast32_t *x, int_fast32_t *y, int_fast32_t *w,
48
- int_fast32_t *h, xcb_screen_t **rscreen)
49
+ int_fast32_t *h, xcb_screen_t **rscreen, char **name)
50
{
51
xcb_screen_t *xscreen;
52
xscreen = xcb_setup_roots_iterator(xcb_get_setup(xcb)).data;
53
54
+ if (randr_has_monitors(xcb)) {
55
+ xcb_randr_get_monitors_cookie_t mon_c;
56
+ xcb_randr_get_monitors_reply_t *mon_r;
57
+
58
+ mon_c = xcb_randr_get_monitors(xcb, xscreen->root, true);
59
+ mon_r = xcb_randr_get_monitors_reply(xcb, mon_c, 0);
60
+ if (!mon_r)
61
+ return 0;
62
+
63
+ int monitors = xcb_randr_get_monitors_monitors_length(mon_r);
64
+ if (screen < 0 || screen >= monitors) {
65
+ free(mon_r);
66
+ goto fail;
67
+ }
68
+
69
+ xcb_randr_monitor_info_iterator_t mon_i;
70
+ mon_i = xcb_randr_get_monitors_monitors_iterator(mon_r);
71
+
72
+ int s;
73
+ for (s = 0; s < screen; s++)
74
+ xcb_randr_monitor_info_next(&mon_i);
75
+
76
+ xcb_randr_monitor_info_t *mon = mon_i.data;
77
+
78
+ *x = mon->x;
79
+ *y = mon->y;
80
+ *w = mon->width;
81
+ *h = mon->height;
82
+ if (rscreen)
83
+ *rscreen = xscreen;
84
+
85
+ if (mon->name && name) {
86
+ xcb_get_atom_name_cookie_t atom_c;
87
+ xcb_get_atom_name_reply_t *atom_r;
88
+
89
+ atom_c = xcb_get_atom_name(xcb, mon->name);
90
+ atom_r = xcb_get_atom_name_reply(xcb, atom_c, 0);
91
+ if (atom_r) {
92
+ *name = strndup(
93
+ xcb_get_atom_name_name(atom_r),
94
+ xcb_get_atom_name_name_length(atom_r));
95
+ free(atom_r);
96
+ }
97
+ }
98
+ free(mon_r);
99
+ return 0;
100
+ }
101
xcb_randr_get_screen_resources_cookie_t res_c;
102
xcb_randr_get_screen_resources_reply_t *res_r;
103
104
obs-studio-25.0.1.tar.xz/plugins/linux-capture/xhelpers.h -> obs-studio-25.0.2.tar.xz/plugins/linux-capture/xhelpers.h
Changed
10
1
2
*/
3
int randr_screen_geo(xcb_connection_t *xcb, int_fast32_t screen,
4
int_fast32_t *x, int_fast32_t *y, int_fast32_t *w,
5
- int_fast32_t *h, xcb_screen_t **rscreen);
6
+ int_fast32_t *h, xcb_screen_t **rscreen, char **name);
7
8
/**
9
* Get screen geometry for a X11 screen
10
obs-studio-25.0.1.tar.xz/plugins/linux-capture/xshm-input.c -> obs-studio-25.0.2.tar.xz/plugins/linux-capture/xshm-input.c
Changed
47
1
2
if (data->use_randr) {
3
if (randr_screen_geo(data->xcb, data->screen_id, &data->x_org,
4
&data->y_org, &data->width, &data->height,
5
- &data->xcb_screen) < 0) {
6
+ &data->xcb_screen, NULL) < 0) {
7
return -1;
8
}
9
} else if (data->use_xinerama) {
10
11
: xcb_setup_roots_length(xcb_get_setup(xcb));
12
13
for (int_fast32_t i = 0; i < count; ++i) {
14
+ char *name;
15
+ char name_tmp[12];
16
int_fast32_t x, y, w, h;
17
x = y = w = h = 0;
18
19
+ name = NULL;
20
if (randr)
21
- randr_screen_geo(xcb, i, &x, &y, &w, &h, NULL);
22
+ randr_screen_geo(xcb, i, &x, &y, &w, &h, NULL, &name);
23
else if (xinerama)
24
xinerama_screen_geo(xcb, i, &x, &y, &w, &h);
25
else
26
x11_screen_geo(xcb, i, &w, &h);
27
28
+ if (name == NULL) {
29
+ sprintf(name_tmp, "%" PRIuFAST32, i);
30
+ name = name_tmp;
31
+ }
32
+
33
dstr_printf(&screen_info,
34
- "Screen %" PRIuFAST32 " (%" PRIuFAST32
35
- "x%" PRIuFAST32 " @ %" PRIuFAST32 ",%" PRIuFAST32
36
- ")",
37
- i, w, h, x, y);
38
+ "Screen %s (%" PRIuFAST32 "x%" PRIuFAST32
39
+ " @ %" PRIuFAST32 ",%" PRIuFAST32 ")",
40
+ name, w, h, x, y);
41
+
42
+ if (name != name_tmp)
43
+ free(name);
44
45
if (h > 0 && w > 0)
46
obs_property_list_add_int(screens, screen_info.array,
47
obs-studio-25.0.1.tar.xz/plugins/linux-v4l2/v4l2-controls.c -> obs-studio-25.0.2.tar.xz/plugins/linux-v4l2/v4l2-controls.c
Changed
19
1
2
memset(&qctrl, 0, sizeof(qctrl));
3
qctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
4
while (0 == v4l2_ioctl(dev, VIDIOC_QUERYCTRL, &qctrl)) {
5
+ qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
6
+
7
if (qctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
8
blog(LOG_INFO, "found control %s but it is disabled",
9
qctrl.name);
10
11
(char *)qctrl.name, qctrl.default_value);
12
break;
13
}
14
-
15
- qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
16
}
17
18
return 0;
19
obs-studio-25.0.1.tar.xz/plugins/obs-filters/color-grade-filter.c -> obs-studio-25.0.2.tar.xz/plugins/obs-filters/color-grade-filter.c
Changed
10
1
2
obs_properties_t *props = obs_properties_create();
3
struct dstr filter_str = {0};
4
5
- dstr_cat(&filter_str, "(*.cube;*.png)");
6
+ dstr_cat(&filter_str, "(*.cube *.png)");
7
8
if (s && s->file && *s->file) {
9
dstr_copy(&path, s->file);
10
obs-studio-25.0.1.tar.xz/plugins/obs-qsv11/QSV_Encoder.h -> obs-studio-25.0.2.tar.xz/plugins/obs-qsv11/QSV_Encoder.h
Changed
23
1
2
{"AVBR", false}, {"ICQ", true}, {"LA_ICQ", true}, {"LA_CBR", true},
3
{"LA_VBR", true}, {0, false}};
4
static const char *const qsv_profile_names[] = {"high", "main", "baseline", 0};
5
-static const char *const qsv_usage_names[] = {"quality",
6
- "balanced",
7
- "speed",
8
- "veryslow",
9
- "slower",
10
- "slow",
11
- "medium",
12
- "fast",
13
- "faster"
14
- "veryfast",
15
- 0};
16
+static const char *const qsv_usage_names[] = {"quality", "balanced", "speed",
17
+ "veryslow", "slower", "slow",
18
+ "medium", "fast", "faster",
19
+ "veryfast", 0};
20
21
typedef struct qsv_t qsv_t;
22
23
obs-studio-25.0.1.tar.xz/plugins/win-wasapi/win-wasapi.cpp -> obs-studio-25.0.2.tar.xz/plugins/win-wasapi/win-wasapi.cpp
Changed
21
1
2
resSample =
3
store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
4
if (!FAILED(resSample)) {
5
- deviceFormatProperties =
6
- (PWAVEFORMATEX)prop.blob.pBlobData;
7
- device_sample = std::to_string(
8
- deviceFormatProperties->nSamplesPerSec);
9
+ if (prop.vt != VT_EMPTY && prop.blob.pBlobData) {
10
+ deviceFormatProperties =
11
+ (PWAVEFORMATEX)prop.blob.pBlobData;
12
+ device_sample = std::to_string(
13
+ deviceFormatProperties->nSamplesPerSec);
14
+ }
15
}
16
+
17
+ store->Release();
18
}
19
20
InitClient();
21