Changes of Revision 75

obs-studio.changes Changed
x
 
1
@@ -1,4 +1,26 @@
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
@@ -1,5 +1,5 @@
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
@@ -1,7 +1,7 @@
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
@@ -1,6 +1,6 @@
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
@@ -177,6 +177,11 @@
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
@@ -189,6 +194,7 @@
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
@@ -206,6 +212,15 @@
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
@@ -687,6 +687,9 @@
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
@@ -151,8 +151,8 @@
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
@@ -1140,7 +1140,7 @@
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
@@ -1150,10 +1150,10 @@
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
@@ -1163,7 +1163,7 @@
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
@@ -1208,6 +1208,19 @@
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
@@ -1244,8 +1257,8 @@
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
@@ -3753,8 +3766,8 @@
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
@@ -4609,8 +4622,8 @@
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
@@ -22,7 +22,7 @@
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
@@ -33,6 +33,9 @@
11
 &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
12
 &lt;p style=&quot;-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;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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
@@ -38,6 +38,7 @@
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
@@ -41,6 +41,8 @@
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
@@ -67,6 +69,11 @@
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
@@ -112,6 +119,9 @@
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
@@ -189,6 +199,19 @@
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
@@ -309,6 +332,8 @@
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
@@ -467,6 +492,10 @@
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
@@ -371,6 +371,7 @@
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
@@ -3536,7 +3537,8 @@
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
@@ -25,13 +25,14 @@
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
@@ -14,7 +14,7 @@
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
@@ -116,7 +116,7 @@
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
@@ -41,7 +41,7 @@
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
@@ -2600,12 +2600,13 @@
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
@@ -236,7 +236,7 @@
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
@@ -249,7 +249,7 @@
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
@@ -20,6 +20,7 @@
2
 
3
 #include <string.h>
4
 #include <stdarg.h>
5
+#include <utility>
6
 
7
 #include "bmem.h"
8
 #include "config-file.h"
9
@@ -36,7 +37,7 @@
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
@@ -45,6 +46,14 @@
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
@@ -68,7 +77,7 @@
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
@@ -120,7 +129,7 @@
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
@@ -39,6 +39,7 @@
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
@@ -104,6 +104,22 @@
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
@@ -111,6 +127,19 @@
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
@@ -124,11 +153,58 @@
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
@@ -94,7 +94,7 @@
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
@@ -104,7 +104,7 @@
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
@@ -308,21 +308,31 @@
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
@@ -98,6 +98,8 @@
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
@@ -145,8 +147,6 @@
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
@@ -329,7 +329,7 @@
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
@@ -74,17 +74,10 @@
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
@@ -319,11 +319,15 @@
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