Projects
Multimedia
obs-studio
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 51
View file
obs-studio.changes
Changed
@@ -1,4 +1,16 @@ ------------------------------------------------------------------- +Thu Oct 26 05:22:23 UTC 2017 - jimmy@boombatower.com + +- Update to version 20.1.1: + * libobs: Add wrapper function to query Windows registry + * libobs: Log Windows 10 Gaming Features + * CI: Update Travis script to target OSX 10.10+ + * enc-amf: Version 2.2.4 + * libobs: Update to version 20.1.1 + * rtmp-services: Add Picarto eu-west1 ingress server + * rtmp-services: Add stream.me streaming platform + +------------------------------------------------------------------- Wed Oct 18 13:59:23 UTC 2017 - jimmy@boombatower.com - Update to version 20.1.0:
View file
obs-studio.spec
Changed
@@ -1,5 +1,5 @@ Name: obs-studio -Version: 20.1.0 +Version: 20.1.1 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors
View file
_service
Changed
@@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="disabled"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">refs/tags/20.1.0</param> + <param name="revision">refs/tags/20.1.1</param> <param name="url">git://github.com/jp9000/obs-studio.git</param> <param name="scm">git</param> <param name="changesgenerate">enable</param>
View file
_servicedata
Changed
@@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">git://github.com/jp9000/obs-studio.git</param> - <param name="changesrevision">7bd06e7f26d6735e86cff4980f7777078d480f7d</param> + <param name="changesrevision">bf7561934ed098a4cf3c885f5e55febb23cac563</param> </service> </servicedata>
View file
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
@@ -3,4 +3,4 @@ mkdir build cd build -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 .. +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 ..
View file
obs-studio-20.1.0.tar.xz/libobs/CMakeLists.txt -> obs-studio-20.1.1.tar.xz/libobs/CMakeLists.txt
Changed
@@ -83,6 +83,7 @@ util/platform-windows.c) set(libobs_PLATFORM_HEADERS util/threading-windows.h + util/windows/win-registry.h util/windows/win-version.h util/windows/ComPtr.hpp util/windows/CoTaskMemPtr.hpp
View file
obs-studio-20.1.0.tar.xz/libobs/obs-config.h -> obs-studio-20.1.1.tar.xz/libobs/obs-config.h
Changed
@@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 0 +#define LIBOBS_API_PATCH_VER 1 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \ ((major << 24) | \
View file
obs-studio-20.1.0.tar.xz/libobs/obs-windows.c -> obs-studio-20.1.1.tar.xz/libobs/obs-windows.c
Changed
@@ -15,6 +15,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ +#include "util/windows/win-registry.h" #include "util/windows/win-version.h" #include "util/platform.h" #include "util/dstr.h" @@ -189,6 +190,49 @@ aeroMessage); } +#define WIN10_GAME_BAR_REG_KEY \ + L"Software\\Microsoft\\Windows\\CurrentVersion\\GameDVR" +#define WIN10_GAME_DVR_POLICY_REG_KEY \ + L"SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR" +#define WIN10_GAME_DVR_REG_KEY L"System\\GameConfigStore" +#define WIN10_GAME_MODE_REG_KEY L"Software\\Microsoft\\GameBar" + +static void log_gaming_features(void) +{ + if (win_ver < 0xA00) + return; + + struct reg_dword game_bar_enabled; + struct reg_dword game_dvr_allowed; + struct reg_dword game_dvr_enabled; + struct reg_dword game_dvr_bg_recording; + struct reg_dword game_mode_enabled; + + get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_BAR_REG_KEY, + L"AppCaptureEnabled", &game_bar_enabled); + get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_DVR_POLICY_REG_KEY, + L"AllowGameDVR", &game_dvr_allowed); + get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_DVR_REG_KEY, + L"GameDVR_Enabled", &game_dvr_enabled); + get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_BAR_REG_KEY, + L"HistoricalCaptureEnabled", &game_dvr_bg_recording); + get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_MODE_REG_KEY, + L"AllowAutoGameMode", &game_mode_enabled); + + blog(LOG_INFO, "Windows 10 Gaming Features:"); + blog(LOG_INFO, "\tGame Bar: %s", + (bool)game_bar_enabled.return_value ? "On" : "Off"); + blog(LOG_INFO, "\tGame DVR Allowed: %s", + (bool)game_dvr_allowed.return_value ? "Yes" : "No"); + blog(LOG_INFO, "\tGame DVR: %s", + (bool)game_dvr_enabled.return_value ? "On" : "Off"); + blog(LOG_INFO, "\tGame DVR Background Recording: %s", + (bool)game_dvr_bg_recording.return_value ? "On" : + "Off"); + blog(LOG_INFO, "\tGame Mode: %s", + (bool)game_mode_enabled.return_value ? "On" : "Off"); +} + void log_system_info(void) { struct win_version_info ver; @@ -202,6 +246,7 @@ log_windows_version(); log_admin_status(); log_aero(); + log_gaming_features(); }
View file
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
@@ -26,6 +26,7 @@ #include "platform.h" #include "darray.h" #include "dstr.h" +#include "windows/win-registry.h" #include "windows/win-version.h" #include "../../deps/w32-pthreads/pthread.h" @@ -800,6 +801,28 @@ #endif } +void get_reg_dword(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name, + struct reg_dword *info) +{ + struct reg_dword reg = {0}; + HKEY key; + LSTATUS status; + + status = RegOpenKeyEx(hkey, sub_key, 0, KEY_READ, &key); + + if (status != ERROR_SUCCESS) + return; + + reg.size = sizeof(reg.return_value); + + reg.status = RegQueryValueExW(key, value_name, NULL, NULL, + (LPBYTE)®.return_value, ®.size); + + RegCloseKey(key); + + *info = reg; +} + #define WINVER_REG_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" void get_win_ver(struct win_version_info *info)
View file
obs-studio-20.1.1.tar.xz/libobs/util/windows/win-registry.h
Added
@@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 Hugh Bailey <obs.jim@gmail.com> + * Copyright (c) 2017 Ryan Foster <RytoEX@gmail.com> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#pragma once + +#include <windows.h> +#include "../c99defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct reg_dword { + LSTATUS status; + DWORD size; + DWORD return_value; +}; + +EXPORT void get_reg_dword(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name, + struct reg_dword *info); + +#ifdef __cplusplus +} +#endif
View file
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
@@ -1,4 +1,4 @@ -# 2.2.2 - Pre-Pass, VBAQ and more fixes! (Hotfix 2) +# 2.2.4 - Pre-Pass, VBAQ and more fixes! (Hotfix 4) With the newly released Driver 17.7.2, AMD fixed many reported issues and added some much wanted features: - Pre-Pass and VBAQ are finally working, @@ -10,8 +10,16 @@ Hotfix 1: Fixed VBAQ and Pre-Pass being used with Constant QP, causing significant corruption issues and changed some default values for H265. Hotfix 2: Fixed an at-exit crash caused by an AMF trace function. +Hotfix 3: Fixed an issue with Constant QP that caused it to incorrectly use Minimum/Maximum QP. +Hotfix 4: Updated internal property list to match Fall Creators Update AMD Driver. ## Changelog +### 2.2.4 +* Removed LowLatency, CommonLowLatency and QPC*Offset properties. + +### 2.2.3 +* Fixed Minimum/Maximum QP incorrectly being applied to Constant QP. + ### 2.2.2 * Fixed an at-exit crash caused by calling amf::AMFTrace::TraceEnableAsync(true).
View file
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
@@ -23,7 +23,7 @@ ################################################################################ SET(enc-amf_VERSION_MAJOR 2) SET(enc-amf_VERSION_MINOR 2) -SET(enc-amf_VERSION_PATCH 2) +SET(enc-amf_VERSION_PATCH 4) configure_file( "${PROJECT_SOURCE_DIR}/#Resources/package.in.bat" "${PROJECT_SOURCE_DIR}/#Resources/package.bat"
View file
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
@@ -101,9 +101,11 @@ virtual void SetFillerDataEnabled(bool v) override; virtual bool IsFillerDataEnabled() override; + virtual std::pair<uint8_t, uint8_t> CapsQPMinimum(); void SetQPMinimum(uint8_t v); uint8_t GetQPMinimum(); + virtual std::pair<uint8_t, uint8_t> CapsQPMaximum(); void SetQPMaximum(uint8_t v); uint8_t GetQPMaximum(); @@ -115,12 +117,15 @@ virtual void SetPeakBitrate(uint64_t v) override; virtual uint64_t GetPeakBitrate() override; + virtual std::pair<uint8_t, uint8_t> CapsIFrameQP(); virtual void SetIFrameQP(uint8_t v) override; virtual uint8_t GetIFrameQP() override; + virtual std::pair<uint8_t, uint8_t> CapsPFrameQP(); virtual void SetPFrameQP(uint8_t v) override; virtual uint8_t GetPFrameQP() override; + virtual std::pair<uint8_t, uint8_t> CapsBFrameQP(); virtual void SetBFrameQP(uint8_t v); virtual uint8_t GetBFrameQP(); @@ -195,11 +200,11 @@ uint32_t GetMaximumSliceSize(); // Properties - Experimental - virtual void SetLowLatencyInternal(bool v) override; - virtual bool GetLowLatencyInternal() override; + //virtual void SetLowLatencyInternal(bool v) override; + //virtual bool GetLowLatencyInternal() override; - virtual void SetCommonLowLatencyInternal(bool v) override; - virtual bool GetCommonLowLatencyInternal() override; + //virtual void SetCommonLowLatencyInternal(bool v) override; + //virtual bool GetCommonLowLatencyInternal() override; // Internal virtual void LogProperties() override;
View file
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
@@ -156,15 +156,19 @@ virtual void SetFillerDataEnabled(bool v) override; virtual bool IsFillerDataEnabled() override; + virtual std::pair<uint8_t, uint8_t> CapsIFrameQPMinimum(); void SetIFrameQPMinimum(uint8_t v); uint8_t GetIFrameQPMinimum(); + virtual std::pair<uint8_t, uint8_t> CapsIFrameQPMaximum(); void SetIFrameQPMaximum(uint8_t v); uint8_t GetIFrameQPMaximum(); + virtual std::pair<uint8_t, uint8_t> CapsPFrameQPMinimum(); void SetPFrameQPMinimum(uint8_t v); uint8_t GetPFrameQPMinimum(); + virtual std::pair<uint8_t, uint8_t> CapsPFrameQPMaximum(); void SetPFrameQPMaximum(uint8_t v); uint8_t GetPFrameQPMaximum(); @@ -176,9 +180,11 @@ virtual void SetPeakBitrate(uint64_t v) override; virtual uint64_t GetPeakBitrate() override; + virtual std::pair<uint8_t, uint8_t> CapsIFrameQP() override; virtual void SetIFrameQP(uint8_t v) override; virtual uint8_t GetIFrameQP() override; + virtual std::pair<uint8_t, uint8_t> CapsPFrameQP() override; virtual void SetPFrameQP(uint8_t v) override; virtual uint8_t GetPFrameQP() override; @@ -198,21 +204,21 @@ virtual uint32_t GetSliceControlSize() override; // Experimental - void SetQPCBOffset(uint8_t v); - uint8_t GetQPCBOffset(); + //void SetQPCBOffset(uint8_t v); + //uint8_t GetQPCBOffset(); - void SetQPCROffset(uint8_t v); - uint8_t GetQPCROffset(); + //void SetQPCROffset(uint8_t v); + //uint8_t GetQPCROffset(); std::pair<uint32_t, uint32_t> CapsInputQueueSize(); void SetInputQueueSize(uint32_t v); uint32_t GetInputQueueSize(); - virtual void SetLowLatencyInternal(bool v) override; - virtual bool GetLowLatencyInternal() override; + //virtual void SetLowLatencyInternal(bool v) override; + //virtual bool GetLowLatencyInternal() override; - virtual void SetCommonLowLatencyInternal(bool v) override; - virtual bool GetCommonLowLatencyInternal() override; + //virtual void SetCommonLowLatencyInternal(bool v) override; + //virtual bool GetCommonLowLatencyInternal() override; // Internal virtual void LogProperties() override;
View file
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
@@ -303,9 +303,11 @@ virtual void SetPeakBitrate(uint64_t v) = 0; virtual uint64_t GetPeakBitrate() = 0; + virtual std::pair<uint8_t, uint8_t> CapsIFrameQP() = 0; virtual void SetIFrameQP(uint8_t v) = 0; virtual uint8_t GetIFrameQP() = 0; + virtual std::pair<uint8_t, uint8_t> CapsPFrameQP() = 0; virtual void SetPFrameQP(uint8_t v) = 0; virtual uint8_t GetPFrameQP() = 0; @@ -364,11 +366,11 @@ #pragma endregion Slicing #pragma region Internal - virtual void SetLowLatencyInternal(bool v) = 0; - virtual bool GetLowLatencyInternal() = 0; + //virtual void SetLowLatencyInternal(bool v) = 0; + //virtual bool GetLowLatencyInternal() = 0; - virtual void SetCommonLowLatencyInternal(bool v) = 0; - virtual bool GetCommonLowLatencyInternal() = 0; + //virtual void SetCommonLowLatencyInternal(bool v) = 0; + //virtual bool GetCommonLowLatencyInternal() = 0; #pragma endregion Internal #pragma endregion Settings
View file
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
@@ -658,6 +658,20 @@ return e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsQPMinimum() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_MIN_QP, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH264::SetQPMinimum(uint8_t v) { AMFTRACECALL; @@ -683,6 +697,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsQPMaximum() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_MAX_QP, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH264::SetQPMaximum(uint8_t v) { AMFTRACECALL; @@ -786,6 +814,20 @@ return e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsIFrameQP() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QP_I, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH264::SetIFrameQP(uint8_t v) { AMFTRACECALL; @@ -811,6 +853,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsPFrameQP() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QP_P, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH264::SetPFrameQP(uint8_t v) { AMFTRACECALL; @@ -836,6 +892,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH264::CapsBFrameQP() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QP_B, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH264::SetBFrameQP(uint8_t v) { AMFTRACECALL; @@ -1445,54 +1515,54 @@ } // Properties - Experimental -void Plugin::AMD::EncoderH264::SetLowLatencyInternal(bool v) { - AMFTRACECALL; - - AMF_RESULT res = m_AMFEncoder->SetProperty(L"LowLatencyInternal", v); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)", - m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } -} - -bool Plugin::AMD::EncoderH264::GetLowLatencyInternal() { - AMFTRACECALL; - - bool e; - - AMF_RESULT res = m_AMFEncoder->GetProperty(L"LowLatencyInternal", &e); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)", - m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } - return e; -} - -void Plugin::AMD::EncoderH264::SetCommonLowLatencyInternal(bool v) { - AMFTRACECALL; - - AMF_RESULT res = m_AMFEncoder->SetProperty(L"CommonLowLatencyInternal", v); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)", - m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } -} - -bool Plugin::AMD::EncoderH264::GetCommonLowLatencyInternal() { - AMFTRACECALL; - - bool e; - AMF_RESULT res = m_AMFEncoder->GetProperty(L"CommonLowLatencyInternal", &e); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)", - m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } - return e; -} +//void Plugin::AMD::EncoderH264::SetLowLatencyInternal(bool v) { +// AMFTRACECALL; +// +// AMF_RESULT res = m_AMFEncoder->SetProperty(L"LowLatencyInternal", v); +// if (res != AMF_OK) { +// QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)", +// m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res); +// throw std::exception(errMsg.c_str()); +// } +//} +// +//bool Plugin::AMD::EncoderH264::GetLowLatencyInternal() { +// AMFTRACECALL; +// +// bool e; +// +// AMF_RESULT res = m_AMFEncoder->GetProperty(L"LowLatencyInternal", &e); +// if (res != AMF_OK) { +// QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)", +// m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); +// throw std::exception(errMsg.c_str()); +// } +// return e; +//} +// +//void Plugin::AMD::EncoderH264::SetCommonLowLatencyInternal(bool v) { +// AMFTRACECALL; +// +// AMF_RESULT res = m_AMFEncoder->SetProperty(L"CommonLowLatencyInternal", v); +// if (res != AMF_OK) { +// QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set mode to %s, error %ls (code %d)", +// m_UniqueId, v ? "Enabled" : "Disabled", m_AMF->GetTrace()->GetResultText(res), res); +// throw std::exception(errMsg.c_str()); +// } +//} +// +//bool Plugin::AMD::EncoderH264::GetCommonLowLatencyInternal() { +// AMFTRACECALL; +// +// bool e; +// AMF_RESULT res = m_AMFEncoder->GetProperty(L"CommonLowLatencyInternal", &e); +// if (res != AMF_OK) { +// QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
View file
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
@@ -1026,6 +1026,20 @@ return e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsIFrameQPMinimum() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MIN_QP_I, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH265::SetIFrameQPMinimum(uint8_t v) { AMFTRACECALL; @@ -1051,6 +1065,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsIFrameQPMaximum() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MAX_QP_I, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH265::SetIFrameQPMaximum(uint8_t v) { AMFTRACECALL; @@ -1076,6 +1104,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsPFrameQPMinimum() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MIN_QP_P, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH265::SetPFrameQPMinimum(uint8_t v) { AMFTRACECALL; @@ -1101,6 +1143,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsPFrameQPMaximum() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_MAX_QP_P, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH265::SetPFrameQPMaximum(uint8_t v) { AMFTRACECALL; @@ -1204,6 +1260,20 @@ return e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsIFrameQP() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_QP_I, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH265::SetIFrameQP(uint8_t v) { AMFTRACECALL; @@ -1229,6 +1299,20 @@ return (uint8_t)e; } +std::pair<uint8_t, uint8_t> Plugin::AMD::EncoderH265::CapsPFrameQP() { + AMFTRACECALL; + + const amf::AMFPropertyInfo* var; + AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_QP_P, &var); + if (res != AMF_OK) { + QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)", + m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); + throw std::exception(errMsg.c_str()); + } + + return std::make_pair((uint8_t)var->minValue.int64Value, (uint8_t)var->maxValue.int64Value); +} + void Plugin::AMD::EncoderH265::SetPFrameQP(uint8_t v) { AMFTRACECALL; @@ -1382,53 +1466,53 @@ } // Experimental -void Plugin::AMD::EncoderH265::SetQPCBOffset(uint8_t v) { - AMFTRACECALL; - - AMF_RESULT res = m_AMFEncoder->SetProperty(L"QPCBOFFSET", v); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set mode to %ld, error %ls (code %d)", - m_UniqueId, v, m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } -} - -uint8_t Plugin::AMD::EncoderH265::GetQPCBOffset() { - AMFTRACECALL; - - int64_t e; - AMF_RESULT res = m_AMFEncoder->GetProperty(L"QPCBOFFSET", &e); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)", - m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } - return (uint8_t)e; -} - -void Plugin::AMD::EncoderH265::SetQPCROffset(uint8_t v) { - AMFTRACECALL; - - AMF_RESULT res = m_AMFEncoder->SetProperty(L"QPCROFFSET", v); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set mode to %ld, error %ls (code %d)", - m_UniqueId, v, m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } -} - -uint8_t Plugin::AMD::EncoderH265::GetQPCROffset() { - AMFTRACECALL; - - int64_t e; - AMF_RESULT res = m_AMFEncoder->GetProperty(L"QPCROFFSET", &e); - if (res != AMF_OK) { - QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)", - m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); - throw std::exception(errMsg.c_str()); - } - return (uint8_t)e; -} +//void Plugin::AMD::EncoderH265::SetQPCBOffset(uint8_t v) { +// AMFTRACECALL; +// +// AMF_RESULT res = m_AMFEncoder->SetProperty(L"QPCBOFFSET", v); +// if (res != AMF_OK) { +// QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set mode to %ld, error %ls (code %d)", +// m_UniqueId, v, m_AMF->GetTrace()->GetResultText(res), res); +// throw std::exception(errMsg.c_str()); +// } +//} +// +//uint8_t Plugin::AMD::EncoderH265::GetQPCBOffset() { +// AMFTRACECALL; +// +// int64_t e; +// AMF_RESULT res = m_AMFEncoder->GetProperty(L"QPCBOFFSET", &e); +// if (res != AMF_OK) { +// QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)", +// m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res); +// throw std::exception(errMsg.c_str()); +// } +// return (uint8_t)e; +//}
View file
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
@@ -1286,10 +1286,10 @@ } ColorSpace colorSpace = ColorSpace::BT601; switch (voi->colorspace) { + case VIDEO_CS_DEFAULT: case VIDEO_CS_601: colorSpace = ColorSpace::BT601; break; - case VIDEO_CS_DEFAULT: case VIDEO_CS_709: colorSpace = ColorSpace::BT709; break; @@ -1395,42 +1395,35 @@ // Rate Control RateControlMethod rcm = static_cast<RateControlMethod>(obs_data_get_int(data, P_RATECONTROLMETHOD)); m_VideoEncoder->SetRateControlMethod(rcm); - m_VideoEncoder->SetQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MINIMUM))); - m_VideoEncoder->SetQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MAXIMUM))); - switch (rcm) { - case RateControlMethod::PeakConstrainedVariableBitrate: - case RateControlMethod::LatencyConstrainedVariableBitrate: - m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000)); - m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); - break; - case RateControlMethod::ConstantBitrate: - m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); - m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); - break; - case RateControlMethod::ConstantQP: - m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME))); - m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME))); + if (rcm == RateControlMethod::ConstantQP) { + m_VideoEncoder->SetQPMinimum(0); + m_VideoEncoder->SetQPMaximum(51); + m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME))); + m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME))); + if (m_VideoEncoder->CapsBFramePattern() > 0) { try { m_VideoEncoder->SetBFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_BFRAME))); } catch (...) { } - break; + } + m_VideoEncoder->SetPrePassMode(PrePassMode::Disabled); + m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(false); + } else { + m_VideoEncoder->SetQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MINIMUM))); + m_VideoEncoder->SetQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_MAXIMUM))); + m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); + m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000)); + m_VideoEncoder->SetPrePassMode(static_cast<PrePassMode>(obs_data_get_int(data, P_PREPASSMODE))); + m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(!!obs_data_get_int(data, P_VBAQ)); } - m_VideoEncoder->SetFrameSkippingEnabled(!!obs_data_get_int(data, P_FRAMESKIPPING)); - m_VideoEncoder->SetEnforceHRDEnabled(!!obs_data_get_int(data, P_ENFORCEHRD)); if (rcm == RateControlMethod::ConstantBitrate) { + m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); m_VideoEncoder->SetFillerDataEnabled(!!obs_data_get_int(data, P_FILLERDATA)); } else { m_VideoEncoder->SetFillerDataEnabled(false); } - if (rcm != RateControlMethod::ConstantQP) { - m_VideoEncoder->SetPrePassMode(static_cast<PrePassMode>(obs_data_get_int(data, P_PREPASSMODE))); - m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(!!obs_data_get_int(data, P_VBAQ)); - } else { - m_VideoEncoder->SetPrePassMode(PrePassMode::Disabled); - m_VideoEncoder->SetVarianceBasedAdaptiveQuantizationEnabled(false); - } - + m_VideoEncoder->SetFrameSkippingEnabled(!!obs_data_get_int(data, P_FRAMESKIPPING)); + m_VideoEncoder->SetEnforceHRDEnabled(!!obs_data_get_int(data, P_ENFORCEHRD)); m_VideoEncoder->SetVBVBufferInitialFullness((float)obs_data_get_double(data, P_VBVBUFFER_INITIALFULLNESS) / 100.0f); if (obs_data_get_int(data, P_VBVBUFFER) == 0) { m_VideoEncoder->SetVBVBufferStrictness(obs_data_get_double(data, P_VBVBUFFER_STRICTNESS) / 100.0);
View file
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
@@ -860,10 +860,10 @@ } ColorSpace colorSpace = ColorSpace::BT601; switch (voi->colorspace) { + case VIDEO_CS_DEFAULT: case VIDEO_CS_601: colorSpace = ColorSpace::BT601; break; - case VIDEO_CS_DEFAULT: case VIDEO_CS_709: colorSpace = ColorSpace::BT709; break; @@ -1082,26 +1082,25 @@ uint32_t obsFPSden = voi->fps_den; // Rate Control - m_VideoEncoder->SetIFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MINIMUM))); - m_VideoEncoder->SetIFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MAXIMUM))); - m_VideoEncoder->SetPFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MINIMUM))); - m_VideoEncoder->SetPFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MAXIMUM))); - switch (m_VideoEncoder->GetRateControlMethod()) { - case RateControlMethod::PeakConstrainedVariableBitrate: - case RateControlMethod::LatencyConstrainedVariableBitrate: - m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000)); - m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); - break; - case RateControlMethod::ConstantBitrate: - m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); - m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); - break; - case RateControlMethod::ConstantQP: - m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME))); - m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME))); - break; + RateControlMethod rcm = m_VideoEncoder->GetRateControlMethod(); + if (rcm == RateControlMethod::ConstantQP) { + m_VideoEncoder->SetIFrameQPMinimum(m_VideoEncoder->CapsIFrameQPMinimum().first); + m_VideoEncoder->SetIFrameQPMaximum(m_VideoEncoder->CapsIFrameQPMaximum().second); + m_VideoEncoder->SetPFrameQPMinimum(m_VideoEncoder->CapsPFrameQPMinimum().first); + m_VideoEncoder->SetPFrameQPMaximum(m_VideoEncoder->CapsPFrameQPMaximum().second); + m_VideoEncoder->SetIFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME))); + m_VideoEncoder->SetPFrameQP(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME))); + m_VideoEncoder->SetFillerDataEnabled(false); + } else { + m_VideoEncoder->SetIFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MINIMUM))); + m_VideoEncoder->SetIFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_IFRAME_MAXIMUM))); + m_VideoEncoder->SetPFrameQPMinimum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MINIMUM))); + m_VideoEncoder->SetPFrameQPMaximum(static_cast<uint8_t>(obs_data_get_int(data, P_QP_PFRAME_MAXIMUM))); + m_VideoEncoder->SetTargetBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); + m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_PEAK) * 1000)); } - if (m_VideoEncoder->GetRateControlMethod() == RateControlMethod::ConstantBitrate) { + if (rcm == RateControlMethod::ConstantBitrate) { + m_VideoEncoder->SetPeakBitrate(static_cast<uint32_t>(obs_data_get_int(data, P_BITRATE_TARGET) * 1000)); m_VideoEncoder->SetFillerDataEnabled(!!obs_data_get_int(data, P_FILLERDATA)); } else { m_VideoEncoder->SetFillerDataEnabled(false);
View file
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
@@ -1,10 +1,10 @@ { "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 73, + "version": 74, "files": [ { "name": "services.json", - "version": 73 + "version": 74 } ] }
View file
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
@@ -885,8 +885,12 @@ "name": "Picarto", "servers": [ { - "name": "USA/Canada", - "url": "rtmp://live.us.picarto.tv/golive" + "name": "US East", + "url": "rtmp://live.us-east1.picarto.tv/golive" + }, + { + "name": "EU West", + "url": "rtmp://live.eu-west1.picarto.tv/golive" } ], "recommended": { @@ -1068,6 +1072,38 @@ "max video bitrate": 6000, "max audio bitrate": 160 } + }, + { + "name": "Stream.me", + "common": false, + "servers": [ + { + "name": "US, Central", + "url": "rtmp://uc-origin.stream.me/origin" + }, + { + "name": "US, East", + "url": "rtmp://ue-origin.stream.me/origin" + }, + { + "name": "US, West", + "url": "rtmp://uw-origin.stream.me/origin" + }, + { + "name": "Europe, West", + "url": "rtmp://ew-origin.stream.me/origin" + }, + { + "name": "Asia, East", + "url": "rtmp://ae-origin.stream.me/origin" + } + ], + "recommended": { + "keyint": 2, + "profile": "main", + "max video bitrate": 20000, + "max audio bitrate": 192 + } } ] }
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.