Changes of Revision 51

obs-studio.changes Changed
x
 
1
@@ -1,4 +1,16 @@
2
 -------------------------------------------------------------------
3
+Thu Oct 26 05:22:23 UTC 2017 - jimmy@boombatower.com
4
+
5
+- Update to version 20.1.1:
6
+  * libobs: Add wrapper function to query Windows registry
7
+  * libobs: Log Windows 10 Gaming Features
8
+  * CI: Update Travis script to target OSX 10.10+
9
+  * enc-amf: Version 2.2.4
10
+  * libobs: Update to version 20.1.1
11
+  * rtmp-services: Add Picarto eu-west1 ingress server
12
+  * rtmp-services: Add stream.me streaming platform
13
+
14
+-------------------------------------------------------------------
15
 Wed Oct 18 13:59:23 UTC 2017 - jimmy@boombatower.com
16
 
17
 - Update to version 20.1.0:
18
obs-studio.spec Changed
8
 
1
@@ -1,5 +1,5 @@
2
 Name:           obs-studio
3
-Version:        20.1.0
4
+Version:        20.1.1
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/20.1.0</param>
6
+    <param name="revision">refs/tags/20.1.1</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">7bd06e7f26d6735e86cff4980f7777078d480f7d</param>
6
+    <param name="changesrevision">bf7561934ed098a4cf3c885f5e55febb23cac563</param>
7
   </service>
8
 </servicedata>
9
obs-studio-20.1.0.tar.xz/CI/before-script-osx.sh -> obs-studio-20.1.1.tar.xz/CI/before-script-osx.sh Changed
7
 
1
@@ -3,4 +3,4 @@
2
 
3
 mkdir build
4
 cd build
5
-cmake -DENABLE_SPARKLE_UPDATER=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DDepsPath=/tmp/obsdeps -DVLCPath=$PWD/../../vlc-master -DBUILD_BROWSER=ON -DCEF_ROOT_DIR=$PWD/../../cef_binary_${CEF_BUILD_VERSION}_macosx64 ..
6
+cmake -DENABLE_SPARKLE_UPDATER=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 -DDepsPath=/tmp/obsdeps -DVLCPath=$PWD/../../vlc-master -DBUILD_BROWSER=ON -DCEF_ROOT_DIR=$PWD/../../cef_binary_${CEF_BUILD_VERSION}_macosx64 ..
7
obs-studio-20.1.0.tar.xz/libobs/CMakeLists.txt -> obs-studio-20.1.1.tar.xz/libobs/CMakeLists.txt Changed
9
 
1
@@ -83,6 +83,7 @@
2
        util/platform-windows.c)
3
    set(libobs_PLATFORM_HEADERS
4
        util/threading-windows.h
5
+       util/windows/win-registry.h
6
        util/windows/win-version.h
7
        util/windows/ComPtr.hpp
8
        util/windows/CoTaskMemPtr.hpp
9
obs-studio-20.1.0.tar.xz/libobs/obs-config.h -> obs-studio-20.1.1.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  0
6
+#define LIBOBS_API_PATCH_VER  1
7
 
8
 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \
9
                              ((major << 24) | \
10
obs-studio-20.1.0.tar.xz/libobs/obs-windows.c -> obs-studio-20.1.1.tar.xz/libobs/obs-windows.c Changed
67
 
1
@@ -15,6 +15,7 @@
2
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
3
 ******************************************************************************/
4
 
5
+#include "util/windows/win-registry.h"
6
 #include "util/windows/win-version.h"
7
 #include "util/platform.h"
8
 #include "util/dstr.h"
9
@@ -189,6 +190,49 @@
10
            aeroMessage);
11
 }
12
 
13
+#define WIN10_GAME_BAR_REG_KEY \
14
+       L"Software\\Microsoft\\Windows\\CurrentVersion\\GameDVR"
15
+#define WIN10_GAME_DVR_POLICY_REG_KEY \
16
+       L"SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR"
17
+#define WIN10_GAME_DVR_REG_KEY L"System\\GameConfigStore"
18
+#define WIN10_GAME_MODE_REG_KEY L"Software\\Microsoft\\GameBar"
19
+
20
+static void log_gaming_features(void)
21
+{
22
+   if (win_ver < 0xA00)
23
+       return;
24
+
25
+   struct reg_dword game_bar_enabled;
26
+   struct reg_dword game_dvr_allowed;
27
+   struct reg_dword game_dvr_enabled;
28
+   struct reg_dword game_dvr_bg_recording;
29
+   struct reg_dword game_mode_enabled;
30
+
31
+   get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_BAR_REG_KEY,
32
+           L"AppCaptureEnabled", &game_bar_enabled);
33
+   get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_DVR_POLICY_REG_KEY,
34
+           L"AllowGameDVR", &game_dvr_allowed);
35
+   get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_DVR_REG_KEY,
36
+           L"GameDVR_Enabled", &game_dvr_enabled);
37
+   get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_BAR_REG_KEY,
38
+           L"HistoricalCaptureEnabled", &game_dvr_bg_recording);
39
+   get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_MODE_REG_KEY,
40
+           L"AllowAutoGameMode", &game_mode_enabled);
41
+
42
+   blog(LOG_INFO, "Windows 10 Gaming Features:");
43
+   blog(LOG_INFO, "\tGame Bar: %s",
44
+           (bool)game_bar_enabled.return_value ? "On" : "Off");
45
+   blog(LOG_INFO, "\tGame DVR Allowed: %s",
46
+           (bool)game_dvr_allowed.return_value ? "Yes" : "No");
47
+   blog(LOG_INFO, "\tGame DVR: %s",
48
+           (bool)game_dvr_enabled.return_value ? "On" : "Off");
49
+   blog(LOG_INFO, "\tGame DVR Background Recording: %s",
50
+           (bool)game_dvr_bg_recording.return_value ? "On" :
51
+           "Off");
52
+   blog(LOG_INFO, "\tGame Mode: %s",
53
+           (bool)game_mode_enabled.return_value ? "On" : "Off");
54
+}
55
+
56
 void log_system_info(void)
57
 {
58
    struct win_version_info ver;
59
@@ -202,6 +246,7 @@
60
    log_windows_version();
61
    log_admin_status();
62
    log_aero();
63
+   log_gaming_features();
64
 }
65
 
66
 
67
obs-studio-20.1.0.tar.xz/libobs/util/platform-windows.c -> obs-studio-20.1.1.tar.xz/libobs/util/platform-windows.c Changed
38
 
1
@@ -26,6 +26,7 @@
2
 #include "platform.h"
3
 #include "darray.h"
4
 #include "dstr.h"
5
+#include "windows/win-registry.h"
6
 #include "windows/win-version.h"
7
 
8
 #include "../../deps/w32-pthreads/pthread.h"
9
@@ -800,6 +801,28 @@
10
 #endif
11
 }
12
 
13
+void get_reg_dword(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name,
14
+       struct reg_dword *info)
15
+{
16
+   struct reg_dword reg = {0};
17
+   HKEY key;
18
+   LSTATUS status;
19
+
20
+   status = RegOpenKeyEx(hkey, sub_key, 0, KEY_READ, &key);
21
+
22
+   if (status != ERROR_SUCCESS)
23
+       return;
24
+
25
+   reg.size = sizeof(reg.return_value);
26
+
27
+   reg.status = RegQueryValueExW(key, value_name, NULL, NULL,
28
+           (LPBYTE)&reg.return_value, &reg.size);
29
+
30
+   RegCloseKey(key);
31
+
32
+   *info = reg;
33
+}
34
+
35
 #define WINVER_REG_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
36
 
37
 void get_win_ver(struct win_version_info *info)
38
obs-studio-20.1.1.tar.xz/libobs/util/windows/win-registry.h Added
40
 
1
@@ -0,0 +1,38 @@
2
+/*
3
+ * Copyright (c) 2015 Hugh Bailey <obs.jim@gmail.com>
4
+ * Copyright (c) 2017 Ryan Foster <RytoEX@gmail.com>
5
+ *
6
+ * Permission to use, copy, modify, and distribute this software for any
7
+ * purpose with or without fee is hereby granted, provided that the above
8
+ * copyright notice and this permission notice appear in all copies.
9
+ *
10
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
+ */
18
+
19
+#pragma once
20
+
21
+#include <windows.h>
22
+#include "../c99defs.h"
23
+
24
+#ifdef __cplusplus
25
+extern "C" {
26
+#endif
27
+
28
+struct reg_dword {
29
+   LSTATUS status;
30
+   DWORD   size;
31
+   DWORD   return_value;
32
+};
33
+
34
+EXPORT void get_reg_dword(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name,
35
+       struct reg_dword *info);
36
+
37
+#ifdef __cplusplus
38
+}
39
+#endif
40
obs-studio-20.1.0.tar.xz/plugins/enc-amf/#Resources/PATCH_NOTES.md -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/#Resources/PATCH_NOTES.md Changed
24
 
1
@@ -1,4 +1,4 @@
2
-# 2.2.2 - Pre-Pass, VBAQ and more fixes! (Hotfix 2)
3
+# 2.2.4 - Pre-Pass, VBAQ and more fixes! (Hotfix 4)
4
 With the newly released Driver 17.7.2, AMD fixed many reported issues and added some much wanted features:
5
 
6
 - Pre-Pass and VBAQ are finally working,
7
@@ -10,8 +10,16 @@
8
 
9
 Hotfix 1: Fixed VBAQ and Pre-Pass being used with Constant QP, causing significant corruption issues and changed some default values for H265.
10
 Hotfix 2: Fixed an at-exit crash caused by an AMF trace function.
11
+Hotfix 3: Fixed an issue with Constant QP that caused it to incorrectly use Minimum/Maximum QP.
12
+Hotfix 4: Updated internal property list to match Fall Creators Update AMD Driver.
13
 
14
 ## Changelog
15
+### 2.2.4
16
+* Removed LowLatency, CommonLowLatency and QPC*Offset properties.
17
+
18
+### 2.2.3
19
+* Fixed Minimum/Maximum QP incorrectly being applied to Constant QP.
20
+
21
 ### 2.2.2
22
 * Fixed an at-exit crash caused by calling amf::AMFTrace::TraceEnableAsync(true).
23
 
24
obs-studio-20.1.0.tar.xz/plugins/enc-amf/CMakeLists.txt -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/CMakeLists.txt Changed
10
 
1
@@ -23,7 +23,7 @@
2
 ################################################################################
3
 SET(enc-amf_VERSION_MAJOR 2)
4
 SET(enc-amf_VERSION_MINOR 2)
5
-SET(enc-amf_VERSION_PATCH 2)
6
+SET(enc-amf_VERSION_PATCH 4)
7
 configure_file(
8
    "${PROJECT_SOURCE_DIR}/#Resources/package.in.bat"
9
    "${PROJECT_SOURCE_DIR}/#Resources/package.bat"
10
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Include/amf-encoder-h264.h -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Include/amf-encoder-h264.h Changed
45
 
1
@@ -101,9 +101,11 @@
2
            virtual void SetFillerDataEnabled(bool v) override;
3
            virtual bool IsFillerDataEnabled() override;
4
 
5
+           virtual std::pair<uint8_t, uint8_t> CapsQPMinimum();
6
            void SetQPMinimum(uint8_t v);
7
            uint8_t GetQPMinimum();
8
 
9
+           virtual std::pair<uint8_t, uint8_t> CapsQPMaximum();
10
            void SetQPMaximum(uint8_t v);
11
            uint8_t GetQPMaximum();
12
 
13
@@ -115,12 +117,15 @@
14
            virtual void SetPeakBitrate(uint64_t v) override;
15
            virtual uint64_t GetPeakBitrate() override;
16
 
17
+           virtual std::pair<uint8_t, uint8_t> CapsIFrameQP();
18
            virtual void SetIFrameQP(uint8_t v) override;
19
            virtual uint8_t GetIFrameQP() override;
20
 
21
+           virtual std::pair<uint8_t, uint8_t> CapsPFrameQP();
22
            virtual void SetPFrameQP(uint8_t v) override;
23
            virtual uint8_t GetPFrameQP() override;
24
 
25
+           virtual std::pair<uint8_t, uint8_t> CapsBFrameQP();
26
            virtual void SetBFrameQP(uint8_t v);
27
            virtual uint8_t GetBFrameQP();
28
 
29
@@ -195,11 +200,11 @@
30
            uint32_t GetMaximumSliceSize();
31
 
32
            // Properties - Experimental
33
-           virtual void SetLowLatencyInternal(bool v) override;
34
-           virtual bool GetLowLatencyInternal() override;
35
+           //virtual void SetLowLatencyInternal(bool v) override;
36
+           //virtual bool GetLowLatencyInternal() override;
37
 
38
-           virtual void SetCommonLowLatencyInternal(bool v) override;
39
-           virtual bool GetCommonLowLatencyInternal() override;
40
+           //virtual void SetCommonLowLatencyInternal(bool v) override;
41
+           //virtual bool GetCommonLowLatencyInternal() override;
42
 
43
            // Internal
44
            virtual void LogProperties() override;
45
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Include/amf-encoder-h265.h -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Include/amf-encoder-h265.h Changed
63
 
1
@@ -156,15 +156,19 @@
2
            virtual void SetFillerDataEnabled(bool v) override;
3
            virtual bool IsFillerDataEnabled() override;
4
 
5
+           virtual std::pair<uint8_t, uint8_t> CapsIFrameQPMinimum();
6
            void SetIFrameQPMinimum(uint8_t v);
7
            uint8_t GetIFrameQPMinimum();
8
 
9
+           virtual std::pair<uint8_t, uint8_t> CapsIFrameQPMaximum();
10
            void SetIFrameQPMaximum(uint8_t v);
11
            uint8_t GetIFrameQPMaximum();
12
 
13
+           virtual std::pair<uint8_t, uint8_t> CapsPFrameQPMinimum();
14
            void SetPFrameQPMinimum(uint8_t v);
15
            uint8_t GetPFrameQPMinimum();
16
 
17
+           virtual std::pair<uint8_t, uint8_t> CapsPFrameQPMaximum();
18
            void SetPFrameQPMaximum(uint8_t v);
19
            uint8_t GetPFrameQPMaximum();
20
 
21
@@ -176,9 +180,11 @@
22
            virtual void SetPeakBitrate(uint64_t v) override;
23
            virtual uint64_t GetPeakBitrate() override;
24
 
25
+           virtual std::pair<uint8_t, uint8_t> CapsIFrameQP() override;
26
            virtual void SetIFrameQP(uint8_t v) override;
27
            virtual uint8_t GetIFrameQP() override;
28
 
29
+           virtual std::pair<uint8_t, uint8_t> CapsPFrameQP() override;
30
            virtual void SetPFrameQP(uint8_t v) override;
31
            virtual uint8_t GetPFrameQP() override;
32
 
33
@@ -198,21 +204,21 @@
34
            virtual uint32_t GetSliceControlSize() override;
35
 
36
            // Experimental
37
-           void SetQPCBOffset(uint8_t v);
38
-           uint8_t GetQPCBOffset();
39
+           //void SetQPCBOffset(uint8_t v);
40
+           //uint8_t GetQPCBOffset();
41
 
42
-           void SetQPCROffset(uint8_t v);
43
-           uint8_t GetQPCROffset();
44
+           //void SetQPCROffset(uint8_t v);
45
+           //uint8_t GetQPCROffset();
46
 
47
            std::pair<uint32_t, uint32_t> CapsInputQueueSize();
48
            void SetInputQueueSize(uint32_t v);
49
            uint32_t GetInputQueueSize();
50
 
51
-           virtual void SetLowLatencyInternal(bool v) override;
52
-           virtual bool GetLowLatencyInternal() override;
53
+           //virtual void SetLowLatencyInternal(bool v) override;
54
+           //virtual bool GetLowLatencyInternal() override;
55
 
56
-           virtual void SetCommonLowLatencyInternal(bool v) override;
57
-           virtual bool GetCommonLowLatencyInternal() override;
58
+           //virtual void SetCommonLowLatencyInternal(bool v) override;
59
+           //virtual bool GetCommonLowLatencyInternal() override;
60
 
61
            // Internal
62
            virtual void LogProperties() override;
63
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Include/amf-encoder.h -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Include/amf-encoder.h Changed
29
 
1
@@ -303,9 +303,11 @@
2
            virtual void SetPeakBitrate(uint64_t v) = 0;
3
            virtual uint64_t GetPeakBitrate() = 0;
4
 
5
+           virtual std::pair<uint8_t, uint8_t> CapsIFrameQP() = 0;
6
            virtual void SetIFrameQP(uint8_t v) = 0;
7
            virtual uint8_t GetIFrameQP() = 0;
8
 
9
+           virtual std::pair<uint8_t, uint8_t> CapsPFrameQP() = 0;
10
            virtual void SetPFrameQP(uint8_t v) = 0;
11
            virtual uint8_t GetPFrameQP() = 0;
12
 
13
@@ -364,11 +366,11 @@
14
            #pragma endregion Slicing
15
 
16
            #pragma region Internal
17
-           virtual void SetLowLatencyInternal(bool v) = 0;
18
-           virtual bool GetLowLatencyInternal() = 0;
19
+           //virtual void SetLowLatencyInternal(bool v) = 0;
20
+           //virtual bool GetLowLatencyInternal() = 0;
21
 
22
-           virtual void SetCommonLowLatencyInternal(bool v) = 0;
23
-           virtual bool GetCommonLowLatencyInternal() = 0;
24
+           //virtual void SetCommonLowLatencyInternal(bool v) = 0;
25
+           //virtual bool GetCommonLowLatencyInternal() = 0;
26
            #pragma endregion Internal
27
            #pragma endregion Settings
28
 
29
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Source/amf-encoder-h264.cpp -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Source/amf-encoder-h264.cpp Changed
201
 
1
@@ -658,6 +658,20 @@
2
    return e;
3
 }
4
 
5
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsQPMinimum() {
6
+   AMFTRACECALL;
7
+
8
+   const amf::AMFPropertyInfo* var;
9
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_MIN_QP, &var);
10
+   if (res != AMF_OK) {
11
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
12
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
13
+       throw std::exception(errMsg.c_str());
14
+   }
15
+
16
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
17
+}
18
+
19
 void Plugin::AMD::EncoderH264::SetQPMinimum(uint8_t v) {
20
    AMFTRACECALL;
21
 
22
@@ -683,6 +697,20 @@
23
    return (uint8_t)e;
24
 }
25
 
26
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsQPMaximum() {
27
+   AMFTRACECALL;
28
+
29
+   const amf::AMFPropertyInfo* var;
30
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_MAX_QP, &var);
31
+   if (res != AMF_OK) {
32
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
33
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
34
+       throw std::exception(errMsg.c_str());
35
+   }
36
+
37
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
38
+}
39
+
40
 void Plugin::AMD::EncoderH264::SetQPMaximum(uint8_t v) {
41
    AMFTRACECALL;
42
 
43
@@ -786,6 +814,20 @@
44
    return e;
45
 }
46
 
47
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsIFrameQP() {
48
+   AMFTRACECALL;
49
+
50
+   const amf::AMFPropertyInfo* var;
51
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QP_I, &var);
52
+   if (res != AMF_OK) {
53
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
54
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
55
+       throw std::exception(errMsg.c_str());
56
+   }
57
+
58
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
59
+}
60
+
61
 void Plugin::AMD::EncoderH264::SetIFrameQP(uint8_t v) {
62
    AMFTRACECALL;
63
 
64
@@ -811,6 +853,20 @@
65
    return (uint8_t)e;
66
 }
67
 
68
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsPFrameQP() {
69
+   AMFTRACECALL;
70
+
71
+   const amf::AMFPropertyInfo* var;
72
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QP_P, &var);
73
+   if (res != AMF_OK) {
74
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
75
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
76
+       throw std::exception(errMsg.c_str());
77
+   }
78
+
79
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
80
+}
81
+
82
 void Plugin::AMD::EncoderH264::SetPFrameQP(uint8_t v) {
83
    AMFTRACECALL;
84
 
85
@@ -836,6 +892,20 @@
86
    return (uint8_t)e;
87
 }
88
 
89
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsBFrameQP() {
90
+   AMFTRACECALL;
91
+
92
+   const amf::AMFPropertyInfo* var;
93
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QP_B, &var);
94
+   if (res != AMF_OK) {
95
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
96
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
97
+       throw std::exception(errMsg.c_str());
98
+   }
99
+
100
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
101
+}
102
+
103
 void Plugin::AMD::EncoderH264::SetBFrameQP(uint8_t v) {
104
    AMFTRACECALL;
105
 
106
@@ -1445,54 +1515,54 @@
107
 }
108
 
109
 // Properties - Experimental
110
-void Plugin::AMD::EncoderH264::SetLowLatencyInternal(bool v) {
111
-   AMFTRACECALL;
112
-
113
-   AMF_RESULT res = m_AMFEncoder->SetProperty(L"LowLatencyInternal", v);
114
-   if (res != AMF_OK) {
115
-       QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)",
116
-           m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res);
117
-       throw std::exception(errMsg.c_str());
118
-   }
119
-}
120
-
121
-bool Plugin::AMD::EncoderH264::GetLowLatencyInternal() {
122
-   AMFTRACECALL;
123
-
124
-   bool e;
125
-
126
-   AMF_RESULT res = m_AMFEncoder->GetProperty(L"LowLatencyInternal", &e);
127
-   if (res != AMF_OK) {
128
-       QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
129
-           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
130
-       throw std::exception(errMsg.c_str());
131
-   }
132
-   return e;
133
-}
134
-
135
-void Plugin::AMD::EncoderH264::SetCommonLowLatencyInternal(bool v) {
136
-   AMFTRACECALL;
137
-
138
-   AMF_RESULT res = m_AMFEncoder->SetProperty(L"CommonLowLatencyInternal", v);
139
-   if (res != AMF_OK) {
140
-       QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)",
141
-           m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res);
142
-       throw std::exception(errMsg.c_str());
143
-   }
144
-}
145
-
146
-bool Plugin::AMD::EncoderH264::GetCommonLowLatencyInternal() {
147
-   AMFTRACECALL;
148
-
149
-   bool e;
150
-   AMF_RESULT res = m_AMFEncoder->GetProperty(L"CommonLowLatencyInternal", &e);
151
-   if (res != AMF_OK) {
152
-       QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
153
-           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
154
-       throw std::exception(errMsg.c_str());
155
-   }
156
-   return e;
157
-}
158
+//void Plugin::AMD::EncoderH264::SetLowLatencyInternal(bool v) {
159
+// AMFTRACECALL;
160
+//
161
+// AMF_RESULT res = m_AMFEncoder->SetProperty(L"LowLatencyInternal", v);
162
+// if (res != AMF_OK) {
163
+//     QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)",
164
+//         m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res);
165
+//     throw std::exception(errMsg.c_str());
166
+// }
167
+//}
168
+//
169
+//bool Plugin::AMD::EncoderH264::GetLowLatencyInternal() {
170
+// AMFTRACECALL;
171
+//
172
+// bool e;
173
+//
174
+// AMF_RESULT res = m_AMFEncoder->GetProperty(L"LowLatencyInternal", &e);
175
+// if (res != AMF_OK) {
176
+//     QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
177
+//         m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
178
+//     throw std::exception(errMsg.c_str());
179
+// }
180
+// return e;
181
+//}
182
+//
183
+//void Plugin::AMD::EncoderH264::SetCommonLowLatencyInternal(bool v) {
184
+// AMFTRACECALL;
185
+//
186
+// AMF_RESULT res = m_AMFEncoder->SetProperty(L"CommonLowLatencyInternal", v);
187
+// if (res != AMF_OK) {
188
+//     QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)",
189
+//         m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res);
190
+//     throw std::exception(errMsg.c_str());
191
+// }
192
+//}
193
+//
194
+//bool Plugin::AMD::EncoderH264::GetCommonLowLatencyInternal() {
195
+// AMFTRACECALL;
196
+//
197
+// bool e;
198
+// AMF_RESULT res = m_AMFEncoder->GetProperty(L"CommonLowLatencyInternal", &e);
199
+// if (res != AMF_OK) {
200
+//     QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
201
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Source/amf-encoder-h265.cpp -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Source/amf-encoder-h265.cpp Changed
201
 
1
@@ -1026,6 +1026,20 @@
2
    return e;
3
 }
4
 
5
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsIFrameQPMinimum() {
6
+   AMFTRACECALL;
7
+
8
+   const amf::AMFPropertyInfo* var;
9
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MIN_QP_I, &var);
10
+   if (res != AMF_OK) {
11
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
12
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
13
+       throw std::exception(errMsg.c_str());
14
+   }
15
+
16
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
17
+}
18
+
19
 void Plugin::AMD::EncoderH265::SetIFrameQPMinimum(uint8_t v) {
20
    AMFTRACECALL;
21
 
22
@@ -1051,6 +1065,20 @@
23
    return (uint8_t)e;
24
 }
25
 
26
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsIFrameQPMaximum() {
27
+   AMFTRACECALL;
28
+
29
+   const amf::AMFPropertyInfo* var;
30
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MAX_QP_I, &var);
31
+   if (res != AMF_OK) {
32
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
33
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
34
+       throw std::exception(errMsg.c_str());
35
+   }
36
+
37
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
38
+}
39
+
40
 void Plugin::AMD::EncoderH265::SetIFrameQPMaximum(uint8_t v) {
41
    AMFTRACECALL;
42
 
43
@@ -1076,6 +1104,20 @@
44
    return (uint8_t)e;
45
 }
46
 
47
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsPFrameQPMinimum() {
48
+   AMFTRACECALL;
49
+
50
+   const amf::AMFPropertyInfo* var;
51
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MIN_QP_P, &var);
52
+   if (res != AMF_OK) {
53
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
54
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
55
+       throw std::exception(errMsg.c_str());
56
+   }
57
+
58
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
59
+}
60
+
61
 void Plugin::AMD::EncoderH265::SetPFrameQPMinimum(uint8_t v) {
62
    AMFTRACECALL;
63
 
64
@@ -1101,6 +1143,20 @@
65
    return (uint8_t)e;
66
 }
67
 
68
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsPFrameQPMaximum() {
69
+   AMFTRACECALL;
70
+
71
+   const amf::AMFPropertyInfo* var;
72
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MAX_QP_P, &var);
73
+   if (res != AMF_OK) {
74
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
75
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
76
+       throw std::exception(errMsg.c_str());
77
+   }
78
+
79
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
80
+}
81
+
82
 void Plugin::AMD::EncoderH265::SetPFrameQPMaximum(uint8_t v) {
83
    AMFTRACECALL;
84
 
85
@@ -1204,6 +1260,20 @@
86
    return e;
87
 }
88
 
89
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsIFrameQP() {
90
+   AMFTRACECALL;
91
+
92
+   const amf::AMFPropertyInfo* var;
93
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_QP_I, &var);
94
+   if (res != AMF_OK) {
95
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
96
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
97
+       throw std::exception(errMsg.c_str());
98
+   }
99
+
100
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
101
+}
102
+
103
 void Plugin::AMD::EncoderH265::SetIFrameQP(uint8_t v) {
104
    AMFTRACECALL;
105
 
106
@@ -1229,6 +1299,20 @@
107
    return (uint8_t)e;
108
 }
109
 
110
+std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsPFrameQP() {
111
+   AMFTRACECALL;
112
+
113
+   const amf::AMFPropertyInfo* var;
114
+   AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_QP_P, &var);
115
+   if (res != AMF_OK) {
116
+       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
117
+           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
118
+       throw std::exception(errMsg.c_str());
119
+   }
120
+
121
+   return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value);
122
+}
123
+
124
 void Plugin::AMD::EncoderH265::SetPFrameQP(uint8_t v) {
125
    AMFTRACECALL;
126
 
127
@@ -1382,53 +1466,53 @@
128
 }
129
 
130
 // Experimental
131
-void Plugin::AMD::EncoderH265::SetQPCBOffset(uint8_t v) {
132
-   AMFTRACECALL;
133
-
134
-   AMF_RESULT res = m_AMFEncoder->SetProperty(L"QPCBOFFSET", v);
135
-   if (res != AMF_OK) {
136
-       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set mode to %ld, error %ls (code %d)",
137
-           m_UniqueId, v, m_AMF->GetTrace()->GetResultText(res), res);
138
-       throw std::exception(errMsg.c_str());
139
-   }
140
-}
141
-
142
-uint8_t Plugin::AMD::EncoderH265::GetQPCBOffset() {
143
-   AMFTRACECALL;
144
-
145
-   int64_t e;
146
-   AMF_RESULT res = m_AMFEncoder->GetProperty(L"QPCBOFFSET", &e);
147
-   if (res != AMF_OK) {
148
-       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
149
-           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
150
-       throw std::exception(errMsg.c_str());
151
-   }
152
-   return (uint8_t)e;
153
-}
154
-
155
-void Plugin::AMD::EncoderH265::SetQPCROffset(uint8_t v) {
156
-   AMFTRACECALL;
157
-
158
-   AMF_RESULT res = m_AMFEncoder->SetProperty(L"QPCROFFSET", v);
159
-   if (res != AMF_OK) {
160
-       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set mode to %ld, error %ls (code %d)",
161
-           m_UniqueId, v, m_AMF->GetTrace()->GetResultText(res), res);
162
-       throw std::exception(errMsg.c_str());
163
-   }
164
-}
165
-
166
-uint8_t Plugin::AMD::EncoderH265::GetQPCROffset() {
167
-   AMFTRACECALL;
168
-
169
-   int64_t e;
170
-   AMF_RESULT res = m_AMFEncoder->GetProperty(L"QPCROFFSET", &e);
171
-   if (res != AMF_OK) {
172
-       QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
173
-           m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
174
-       throw std::exception(errMsg.c_str());
175
-   }
176
-   return (uint8_t)e;
177
-}
178
+//void Plugin::AMD::EncoderH265::SetQPCBOffset(uint8_t v) {
179
+// AMFTRACECALL;
180
+//
181
+// AMF_RESULT res = m_AMFEncoder->SetProperty(L"QPCBOFFSET", v);
182
+// if (res != AMF_OK) {
183
+//     QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set mode to %ld, error %ls (code %d)",
184
+//         m_UniqueId, v, m_AMF->GetTrace()->GetResultText(res), res);
185
+//     throw std::exception(errMsg.c_str());
186
+// }
187
+//}
188
+//
189
+//uint8_t Plugin::AMD::EncoderH265::GetQPCBOffset() {
190
+// AMFTRACECALL;
191
+//
192
+// int64_t e;
193
+// AMF_RESULT res = m_AMFEncoder->GetProperty(L"QPCBOFFSET", &e);
194
+// if (res != AMF_OK) {
195
+//     QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
196
+//         m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
197
+//     throw std::exception(errMsg.c_str());
198
+// }
199
+// return (uint8_t)e;
200
+//}
201
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Source/enc-h264.cpp -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Source/enc-h264.cpp Changed
75
 
1
@@ -1286,10 +1286,10 @@
2
    }
3
    ColorSpace colorSpace = ColorSpace::BT601;
4
    switch (voi->colorspace) {
5
+       case VIDEO_CS_DEFAULT:
6
        case VIDEO_CS_601:
7
            colorSpace = ColorSpace::BT601;
8
            break;
9
-       case VIDEO_CS_DEFAULT:
10
        case VIDEO_CS_709:
11
            colorSpace = ColorSpace::BT709;
12
            break;
13
@@ -1395,42 +1395,35 @@
14
    // Rate Control
15
    RateControlMethod rcm = static_cast<RateControlMethod>(obs_data_get_int(data, P_RATECONTROLMETHOD));
16
    m_VideoEncoder->SetRateControlMethod(rcm);
17
-   m_VideoEncoder->SetQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MINIMUM)));
18
-   m_VideoEncoder->SetQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MAXIMUM)));
19
-   switch (rcm) {
20
-       case RateControlMethod::PeakConstrainedVariableBitrate:
21
-       case RateControlMethod::LatencyConstrainedVariableBitrate:
22
-           m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000));
23
-           m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
24
-           break;
25
-       case RateControlMethod::ConstantBitrate:
26
-           m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
27
-           m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
28
-           break;
29
-       case RateControlMethod::ConstantQP:
30
-           m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME)));
31
-           m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME)));
32
+   if (rcm == RateControlMethod::ConstantQP) {
33
+       m_VideoEncoder->SetQPMinimum(0);
34
+       m_VideoEncoder->SetQPMaximum(51);
35
+       m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME)));
36
+       m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME)));
37
+       if (m_VideoEncoder->CapsBFramePattern() > 0) {
38
            try {
39
                m_VideoEncoder->SetBFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_BFRAME)));
40
            } catch (...) {
41
            }
42
-           break;
43
+       }
44
+       m_VideoEncoder->SetPrePassMode(PrePassMode::Disabled);
45
+       m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(false);
46
+   } else {
47
+       m_VideoEncoder->SetQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MINIMUM)));
48
+       m_VideoEncoder->SetQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MAXIMUM)));
49
+       m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
50
+       m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000));
51
+       m_VideoEncoder->SetPrePassMode(static_cast<PrePassMode>(obs_data_get_int(data, P_PREPASSMODE)));
52
+       m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(!!obs_data_get_int(data, P_VBAQ));
53
    }
54
-   m_VideoEncoder->SetFrameSkippingEnabled(!!obs_data_get_int(data, P_FRAMESKIPPING));
55
-   m_VideoEncoder->SetEnforceHRDEnabled(!!obs_data_get_int(data, P_ENFORCEHRD));
56
    if (rcm == RateControlMethod::ConstantBitrate) {
57
+       m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
58
        m_VideoEncoder->SetFillerDataEnabled(!!obs_data_get_int(data, P_FILLERDATA));
59
    } else {
60
        m_VideoEncoder->SetFillerDataEnabled(false);
61
    }
62
-   if (rcm != RateControlMethod::ConstantQP) {
63
-       m_VideoEncoder->SetPrePassMode(static_cast<PrePassMode>(obs_data_get_int(data, P_PREPASSMODE)));
64
-       m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(!!obs_data_get_int(data, P_VBAQ));
65
-   } else {
66
-       m_VideoEncoder->SetPrePassMode(PrePassMode::Disabled);
67
-       m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(false);
68
-   }
69
-
70
+   m_VideoEncoder->SetFrameSkippingEnabled(!!obs_data_get_int(data, P_FRAMESKIPPING));
71
+   m_VideoEncoder->SetEnforceHRDEnabled(!!obs_data_get_int(data, P_ENFORCEHRD));
72
    m_VideoEncoder->SetVBVBufferInitialFullness((float)obs_data_get_double(data, P_VBVBUFFER_INITIALFULLNESS) / 100.0f);
73
    if (obs_data_get_int(data, P_VBVBUFFER) == 0) {
74
        m_VideoEncoder->SetVBVBufferStrictness(obs_data_get_double(data, P_VBVBUFFER_STRICTNESS) / 100.0);
75
obs-studio-20.1.0.tar.xz/plugins/enc-amf/Source/enc-h265.cpp -> obs-studio-20.1.1.tar.xz/plugins/enc-amf/Source/enc-h265.cpp Changed
58
 
1
@@ -860,10 +860,10 @@
2
    }
3
    ColorSpace colorSpace = ColorSpace::BT601;
4
    switch (voi->colorspace) {
5
+       case VIDEO_CS_DEFAULT:
6
        case VIDEO_CS_601:
7
            colorSpace = ColorSpace::BT601;
8
            break;
9
-       case VIDEO_CS_DEFAULT:
10
        case VIDEO_CS_709:
11
            colorSpace = ColorSpace::BT709;
12
            break;
13
@@ -1082,26 +1082,25 @@
14
    uint32_t obsFPSden = voi->fps_den;
15
 
16
    // Rate Control
17
-   m_VideoEncoder->SetIFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MINIMUM)));
18
-   m_VideoEncoder->SetIFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MAXIMUM)));
19
-   m_VideoEncoder->SetPFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MINIMUM)));
20
-   m_VideoEncoder->SetPFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MAXIMUM)));
21
-   switch (m_VideoEncoder->GetRateControlMethod()) {
22
-       case RateControlMethod::PeakConstrainedVariableBitrate:
23
-       case RateControlMethod::LatencyConstrainedVariableBitrate:
24
-           m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000));
25
-           m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
26
-           break;
27
-       case RateControlMethod::ConstantBitrate:
28
-           m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
29
-           m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
30
-           break;
31
-       case RateControlMethod::ConstantQP:
32
-           m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME)));
33
-           m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME)));
34
-           break;
35
+   RateControlMethod rcm = m_VideoEncoder->GetRateControlMethod();
36
+   if (rcm == RateControlMethod::ConstantQP) {
37
+       m_VideoEncoder->SetIFrameQPMinimum(m_VideoEncoder->CapsIFrameQPMinimum().first);
38
+       m_VideoEncoder->SetIFrameQPMaximum(m_VideoEncoder->CapsIFrameQPMaximum().second);
39
+       m_VideoEncoder->SetPFrameQPMinimum(m_VideoEncoder->CapsPFrameQPMinimum().first);
40
+       m_VideoEncoder->SetPFrameQPMaximum(m_VideoEncoder->CapsPFrameQPMaximum().second);
41
+       m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME)));
42
+       m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME)));
43
+       m_VideoEncoder->SetFillerDataEnabled(false);
44
+   } else {
45
+       m_VideoEncoder->SetIFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MINIMUM)));
46
+       m_VideoEncoder->SetIFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MAXIMUM)));
47
+       m_VideoEncoder->SetPFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MINIMUM)));
48
+       m_VideoEncoder->SetPFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MAXIMUM)));
49
+       m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
50
+       m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000));
51
    }
52
-   if (m_VideoEncoder->GetRateControlMethod() == RateControlMethod::ConstantBitrate) {
53
+   if (rcm == RateControlMethod::ConstantBitrate) {
54
+       m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000));
55
        m_VideoEncoder->SetFillerDataEnabled(!!obs_data_get_int(data, P_FILLERDATA));
56
    } else {
57
        m_VideoEncoder->SetFillerDataEnabled(false);
58
obs-studio-20.1.0.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-20.1.1.tar.xz/plugins/rtmp-services/data/package.json Changed
14
 
1
@@ -1,10 +1,10 @@
2
 {
3
    "url": "https://obsproject.com/obs2_update/rtmp-services",
4
-   "version": 73,
5
+   "version": 74,
6
    "files": [
7
        {
8
            "name": "services.json",
9
-           "version": 73
10
+           "version": 74
11
        }
12
    ]
13
 }
14
obs-studio-20.1.0.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-20.1.1.tar.xz/plugins/rtmp-services/data/services.json Changed
55
 
1
@@ -885,8 +885,12 @@
2
             "name": "Picarto",
3
             "servers": [
4
                 {
5
-                    "name": "USA/Canada",
6
-                    "url": "rtmp://live.us.picarto.tv/golive"
7
+                    "name": "US East",
8
+                    "url": "rtmp://live.us-east1.picarto.tv/golive"
9
+                },
10
+                {
11
+                    "name": "EU West",
12
+                    "url": "rtmp://live.eu-west1.picarto.tv/golive"
13
                 }
14
             ],
15
             "recommended": {
16
@@ -1068,6 +1072,38 @@
17
                 "max video bitrate": 6000,
18
                 "max audio bitrate": 160
19
             }
20
+        },
21
+        {
22
+            "name": "Stream.me",
23
+            "common": false,
24
+            "servers": [
25
+                {
26
+                    "name": "US, Central",
27
+                    "url": "rtmp://uc-origin.stream.me/origin"
28
+                },
29
+                {
30
+                    "name": "US, East",
31
+                    "url": "rtmp://ue-origin.stream.me/origin"
32
+                },
33
+                {
34
+                    "name": "US, West",
35
+                    "url": "rtmp://uw-origin.stream.me/origin"
36
+                },
37
+                {
38
+                    "name": "Europe, West",
39
+                    "url": "rtmp://ew-origin.stream.me/origin"
40
+                },
41
+                {
42
+                    "name": "Asia, East",
43
+                    "url": "rtmp://ae-origin.stream.me/origin"
44
+                }
45
+            ],
46
+            "recommended": {
47
+                "keyint": 2,
48
+                "profile": "main",
49
+                "max video bitrate": 20000,
50
+                "max audio bitrate": 192
51
+            }
52
         }
53
     ]
54
 }
55