Overview
Request 5249 (accepted)
- Update to version 26.0.1:
* coreaudio-encoder: Fix path on windows
* coreaudio-encoder: Refactor windows import
* rtmp-services: Update AfreecaTV
* Revert "UI: Delete existing fullscreen projector"
* win-capture: Update hook version
* win-dshow: Fix decoupled audio with EVGA/magewell
* libobs-winrt: Use native cursor draw for WGC
* win-capture: Violate Vulkan spec for compatibility
* obs-ffmpeg: Add error detection to ffmpeg-mux
* obs-ffmpeg: Signal a remote disconnect for network streams from ffmpeg-mux
* Revert "mac-capture: show actual windows in Window Capture sources"
* UI: Greatly improve main window repaint performance
* win-capture: Fix mask handling on some color cursors
* CI: Fix swig dependency on FreeBSD
* cmake: Fix finding libfdk header path
* UI: Fix tab order for controls dock
* CI: Use tag number only for macOS plist when triggered by version tag
* rtmp-services: Remove weabook.live
* UI: Skip ChromeOS test on FreeBSD
* rtmp-services: Set actual integer value of bframes in services
* UI: Implement exit on CTRL + Q for linux
* UI: Disable QT's implicit colourspace conversion on macOS
* UI: Move "Add [transition]" to bottom of combo
* UI/updater: Fix cmd prompts popping up registering vcam
* UI/updater: Fix race condition
- Created by boombatower over 4 years ago
- In state accepted
-
Package maintainers:
boombatower,
darix, and
frispete
obs-studio.changes
Changed
-------------------------------------------------------------------
+Mon Oct 05 15:46:17 UTC 2020 - jimmy@boombatower.com
+
+- Update to version 26.0.1:
+ * coreaudio-encoder: Fix path on windows
+ * coreaudio-encoder: Refactor windows import
+ * rtmp-services: Update AfreecaTV
+ * Revert "UI: Delete existing fullscreen projector"
+ * win-capture: Update hook version
+ * win-dshow: Fix decoupled audio with EVGA/magewell
+ * libobs-winrt: Use native cursor draw for WGC
+ * win-capture: Violate Vulkan spec for compatibility
+ * obs-ffmpeg: Add error detection to ffmpeg-mux
+ * obs-ffmpeg: Signal a remote disconnect for network streams from ffmpeg-mux
+ * Revert "mac-capture: show actual windows in Window Capture sources"
+ * UI: Greatly improve main window repaint performance
+ * win-capture: Fix mask handling on some color cursors
+ * CI: Fix swig dependency on FreeBSD
+ * cmake: Fix finding libfdk header path
+ * UI: Fix tab order for controls dock
+ * CI: Use tag number only for macOS plist when triggered by version tag
+ * rtmp-services: Remove weabook.live
+ * UI: Skip ChromeOS test on FreeBSD
+ * rtmp-services: Set actual integer value of bframes in services
+ * UI: Implement exit on CTRL + Q for linux
+ * UI: Disable QT's implicit colourspace conversion on macOS
+ * UI: Move "Add [transition]" to bottom of combo
+ * UI/updater: Fix cmd prompts popping up registering vcam
+ * UI/updater: Fix race condition
+
+-------------------------------------------------------------------
Mon Sep 28 16:27:40 UTC 2020 - jimmy@boombatower.com
- Update to version 26.0.0:
obs-studio.spec
Changed
Name: obs-studio
-Version: 26.0.0
+Version: 26.0.1
Release: 0
Summary: A recording/broadcasting program
Group: Productivity/Multimedia/Video/Editors and Convertors
_service
Changed
<services>
<service name="tar_scm" mode="disabled">
<param name="versionformat">@PARENT_TAG@</param>
- <param name="revision">refs/tags/26.0.0</param>
+ <param name="revision">refs/tags/26.0.1</param>
<param name="url">git://github.com/jp9000/obs-studio.git</param>
<param name="scm">git</param>
<param name="changesgenerate">enable</param>
_servicedata
Changed
<servicedata>
<service name="tar_scm">
<param name="url">git://github.com/jp9000/obs-studio.git</param>
- <param name="changesrevision">e24aaa0b5847f0d61a74b46d52e472be02a5688a</param>
+ <param name="changesrevision">11602bc93341e8643878810d65d6a414c60b1ac7</param>
</service>
</servicedata>
obs-studio-26.0.0.tar.xz/.cirrus.yml -> obs-studio-26.0.1.tar.xz/.cirrus.yml
Changed
task:
install_script:
- pkg install -y
- v4l_compat swig30 ffmpeg curl dbus fdk-aac fontconfig
+ v4l_compat swig ffmpeg curl dbus fdk-aac fontconfig
freetype2 jackit jansson luajit mbedtls pulseaudio speexdsp
libsysinfo libudev-devd libv4l libx264 cmake ninja
mesa-libs lua52 pkgconf
obs-studio-26.0.0.tar.xz/.github/workflows/main.yml -> obs-studio-26.0.1.tar.xz/.github/workflows/main.yml
Changed
cp ../CI/scripts/macos/app/OBSPublicDSAKey.pem ./OBS.app/Contents/Resources
- plutil -insert CFBundleVersion -string ${{ env.OBS_GIT_TAG }}-${{ env.OBS_GIT_HASH }} ./OBS.app/Contents/Info.plist
- plutil -insert CFBundleShortVersionString -string ${{ env.OBS_GIT_TAG }}-${{ env.OBS_GIT_HASH }} ./OBS.app/Contents/Info.plist
+ if [ "${GITHUB_REF:0:10}" = "refs/tags/" ]; then
+ plutil -insert CFBundleVersion -string ${{ env.OBS_GIT_TAG }} ./OBS.app/Contents/Info.plist
+ plutil -insert CFBundleShortVersionString -string ${{ env.OBS_GIT_TAG }} ./OBS.app/Contents/Info.plist
+ else
+ plutil -insert CFBundleVersion -string ${{ env.OBS_GIT_TAG }}-${{ env.OBS_GIT_HASH }} ./OBS.app/Contents/Info.plist
+ plutil -insert CFBundleShortVersionString -string ${{ env.OBS_GIT_TAG }}-${{ env.OBS_GIT_HASH }} ./OBS.app/Contents/Info.plist
+ fi
+
plutil -insert OBSFeedsURL -string https://obsproject.com/osx_update/feeds.xml ./OBS.app/Contents/Info.plist
plutil -insert SUFeedURL -string https://obsproject.com/osx_update/stable/updates.xml ./OBS.app/Contents/Info.plist
plutil -insert SUPublicDSAKeyFile -string OBSPublicDSAKey.pem ./OBS.app/Contents/Info.plist
obs-studio-26.0.0.tar.xz/UI/obs-app.cpp -> obs-studio-26.0.1.tar.xz/UI/obs-app.cpp
Changed
run:
#endif
-#if !defined(_WIN32) && !defined(__APPLE__)
+#if !defined(_WIN32) && !defined(__APPLE__) && !defined(__FreeBSD__)
// Mounted by termina during chromeOS linux container startup
// https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master/project-termina/chromeos-base/termina-lxd-scripts/files/lxd_setup.sh
os_dir_t *crosDir = os_opendir("/opt/google/cros-containers");
obs-studio-26.0.0.tar.xz/UI/platform-osx.mm -> obs-studio-26.0.1.tar.xz/UI/platform-osx.mm
Changed
return (window->windowFlags() & Qt::WindowStaysOnTopHint) != 0;
}
+void disableColorSpaceConversion(QWidget *window)
+{
+ NSView *view =
+ (__bridge NSView *)reinterpret_cast<void *>(window->winId());
+ view.window.colorSpace = NSColorSpace.sRGBColorSpace;
+}
+
void SetAlwaysOnTop(QWidget *window, bool enable)
{
Qt::WindowFlags flags = window->windowFlags();
obs-studio-26.0.0.tar.xz/UI/platform.hpp -> obs-studio-26.0.1.tar.xz/UI/platform.hpp
Changed
void EnableOSXVSync(bool enable);
void EnableOSXDockIcon(bool enable);
void InstallNSApplicationSubclass();
+void disableColorSpaceConversion(QWidget *window);
#endif
obs-studio-26.0.0.tar.xz/UI/volume-control.cpp -> obs-studio-26.0.1.tar.xz/UI/volume-control.cpp
Changed
bool vertical)
: QWidget(parent), obs_volmeter(obs_volmeter), vertical(vertical)
{
+ setAttribute(Qt::WA_OpaquePaintEvent, true);
+
// Use a font that can be rendered small.
tickFont = QFont("Arial");
tickFont.setPixelSize(7);
// Actual painting of the widget starts here.
QPainter painter(this);
+
+ // Paint window background color (as widget is opaque)
+ QColor background = palette().color(QPalette::ColorRole::Window);
+ painter.fillRect(rect, background);
+
if (vertical) {
// Invert the Y axis to ease the math
painter.translate(0, height);
obs-studio-26.0.0.tar.xz/UI/win-update/updater/hash.cpp -> obs-studio-26.0.1.tar.xz/UI/win-update/updater/hash.cpp
Changed
bool CalculateFileHash(const wchar_t *path, BYTE *hash)
{
- static BYTE hashBuffer[1048576];
+ static __declspec(thread) vector<BYTE> hashBuffer;
blake2b_state blake2;
if (blake2b_init(&blake2, BLAKE2_HASH_LENGTH) != 0)
return false;
+ hashBuffer.resize(1048576);
+
WinHandle handle = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ,
nullptr, OPEN_EXISTING, 0, nullptr);
if (handle == INVALID_HANDLE_VALUE)
for (;;) {
DWORD read = 0;
- if (!ReadFile(handle, hashBuffer, sizeof(hashBuffer), &read,
+ if (!ReadFile(handle, &hashBuffer[0], hashBuffer.size(), &read,
nullptr))
return false;
if (!read)
break;
- if (blake2b_update(&blake2, hashBuffer, read) != 0)
+ if (blake2b_update(&blake2, &hashBuffer[0], read) != 0)
return false;
}
obs-studio-26.0.0.tar.xz/UI/win-update/updater/updater.cpp -> obs-studio-26.0.1.tar.xz/UI/win-update/updater/updater.cpp
Changed
/* ------------------------------------- *
* Install virtual camera */
+ auto runcommand = [](wchar_t *cmd) {
+ STARTUPINFO si = {};
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+
+ PROCESS_INFORMATION pi;
+ bool success = !!CreateProcessW(nullptr, cmd, nullptr, nullptr,
+ false, CREATE_NEW_CONSOLE,
+ nullptr, nullptr, &si, &pi);
+ if (success) {
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+ }
+ };
+
if (!bIsPortable) {
wchar_t regsvr[MAX_PATH];
wchar_t src[MAX_PATH];
StringCbCat(src, sizeof(src),
L"\\data\\obs-plugins\\win-dshow\\");
- StringCbCopy(tmp, sizeof(tmp), L"\"\"");
+ StringCbCopy(tmp, sizeof(tmp), L"\"");
StringCbCat(tmp, sizeof(tmp), regsvr);
StringCbCat(tmp, sizeof(tmp), L"\" /s \"");
StringCbCat(tmp, sizeof(tmp), src);
StringCbCat(tmp, sizeof(tmp), L"obs-virtualcam-module");
StringCbCopy(tmp2, sizeof(tmp2), tmp);
- StringCbCat(tmp2, sizeof(tmp2), L"32.dll\"\"");
- _wsystem(tmp2);
+ StringCbCat(tmp2, sizeof(tmp2), L"32.dll\"");
+ runcommand(tmp2);
if (is_64bit_windows()) {
StringCbCopy(tmp2, sizeof(tmp2), tmp);
- StringCbCat(tmp2, sizeof(tmp2), L"64.dll\"\"");
- _wsystem(tmp2);
+ StringCbCat(tmp2, sizeof(tmp2), L"64.dll\"");
+ runcommand(tmp2);
}
}
obs-studio-26.0.0.tar.xz/UI/window-basic-main-transitions.cpp -> obs-studio-26.0.1.tar.xz/UI/window-basic-main-transitions.cpp
Changed
void OBSBasic::InitDefaultTransitions()
{
+ struct AddTransitionVal {
+ QString id;
+ QString name;
+ };
+
ui->transitions->blockSignals(true);
std::vector<OBSSource> transitions;
+ std::vector<AddTransitionVal> addables;
size_t idx = 0;
const char *id;
obs_source_release(tr);
} else {
- QString addString = QTStr("Add") +
- QStringLiteral(": ") +
- QT_UTF8(name);
- ui->transitions->addItem(
- addString,
- QVariant::fromValue(QString(QT_UTF8(id))));
+ AddTransitionVal val;
+ val.name = QTStr("Add") + QStringLiteral(": ") +
+ QT_UTF8(name);
+ val.id = QT_UTF8(id);
+ addables.push_back(val);
}
}
- if (ui->transitions->count())
- ui->transitions->insertSeparator(ui->transitions->count());
-
for (OBSSource &tr : transitions) {
ui->transitions->addItem(QT_UTF8(obs_source_get_name(tr)),
QVariant::fromValue(OBSSource(tr)));
}
+
+ if (addables.size())
+ ui->transitions->insertSeparator(ui->transitions->count());
+
+ for (AddTransitionVal &val : addables) {
+ ui->transitions->addItem(val.name, QVariant::fromValue(val.id));
+ }
+
ui->transitions->blockSignals(false);
}
obs-studio-26.0.0.tar.xz/UI/window-basic-main.cpp -> obs-studio-26.0.1.tar.xz/UI/window-basic-main.cpp
Changed
renameSource->setShortcut({Qt::Key_F2});
#endif
+#ifdef __linux__
+ ui->actionE_xit->setShortcut(Qt::CTRL + Qt::Key_Q);
+#endif
+
auto addNudge = [this](const QKeySequence &seq, const char *s) {
QAction *nudge = new QAction(ui->preview);
nudge->setShortcut(seq);
vcamButton->setProperty("themeID", "vcamButton");
ui->buttonsVLayout->insertWidget(2, vcamButton);
+ setTabOrder(ui->recordButton, vcamButton);
+ setTabOrder(vcamButton, ui->modeSwitch);
}
void OBSBasic::ResetOutputs()
replayBufferButton->setProperty("themeID",
"replayBufferButton");
ui->buttonsVLayout->insertLayout(2, replayLayout);
+ setTabOrder(ui->recordButton, replayBufferButton);
+ setTabOrder(replayBufferButton,
+ ui->buttonsVLayout->itemAt(3)->widget());
}
if (sysTrayReplayBuffer)
SystemTray(true);
#endif
+#ifdef __APPLE__
+ disableColorSpaceConversion(this);
+#endif
+
bool has_last_version = config_has_user_value(App()->GlobalConfig(),
"General", "LastVersion");
bool first_run =
if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1)
return nullptr;
- if (monitor > -1) {
- for (size_t i = 0; i < projectors.size(); i++) {
- if (projectors[i]->GetMonitor() == monitor) {
- DeleteProjector(projectors[i]);
- break;
- }
- }
- }
-
OBSProjector *projector =
new OBSProjector(nullptr, source, monitor, type);
connect(replay.data(), &QAbstractButton::clicked, this,
&OBSBasic::ReplayBufferSave);
replayLayout->addWidget(replay.data());
+ setTabOrder(replayLayout->itemAt(0)->widget(),
+ replayLayout->itemAt(1)->widget());
+ setTabOrder(replayLayout->itemAt(1)->widget(),
+ ui->buttonsVLayout->itemAt(3)->widget());
}
#define MBYTE (1024ULL * 1024ULL)
obs-studio-26.0.0.tar.xz/cmake/Modules/FindLibfdk.cmake -> obs-studio-26.0.1.tar.xz/cmake/Modules/FindLibfdk.cmake
Changed
${DepsPath}
${_LIBFDK_INCLUDE_DIRS}
PATHS
- /usr/include /usr/local/include /opt/local/include /sw/include)
+ /usr/include /usr/local/include /opt/local/include /sw/include
+ PATH_SUFFIXES
+ include)
find_library(Libfdk_LIB
NAMES ${_LIBFDK_LIBRARIES} fdk-aac libfdk-aac
obs-studio-26.0.0.tar.xz/libobs-winrt/winrt-capture.cpp -> obs-studio-26.0.1.tar.xz/libobs-winrt/winrt-capture.cpp
Changed
BOOL active;
struct winrt_capture *next;
- void draw_cursor()
- {
- CURSORINFO ci{};
- ci.cbSize = sizeof(CURSORINFO);
- if (!GetCursorInfo(&ci))
- return;
-
- if (!(ci.flags & CURSOR_SHOWING))
- return;
-
- HICON icon = CopyIcon(ci.hCursor);
- if (!icon)
- return;
-
- ICONINFO ii;
- if (GetIconInfo(icon, &ii)) {
- POINT win_pos{};
- if (window) {
- if (client_area) {
- ClientToScreen(window, &win_pos);
- } else {
- RECT window_rect;
- if (DwmGetWindowAttribute(
- window,
- DWMWA_EXTENDED_FRAME_BOUNDS,
- &window_rect,
- sizeof(window_rect)) ==
- S_OK) {
- win_pos.x = window_rect.left;
- win_pos.y = window_rect.top;
- }
- }
- }
-
- POINT pos;
- pos.x = ci.ptScreenPos.x - (int)ii.xHotspot - win_pos.x;
- pos.y = ci.ptScreenPos.y - (int)ii.yHotspot - win_pos.y;
-
- HDC hdc = (HDC)gs_texture_get_dc(texture);
-
- DrawIconEx(hdc, pos.x, pos.y, icon, 0, 0, 0, NULL,
- DI_NORMAL);
-
- gs_texture_release_dc(texture);
-
- DeleteObject(ii.hbmColor);
- DeleteObject(ii.hbmMask);
- }
-
- DestroyIcon(icon);
- }
-
void on_closed(
winrt::Windows::Graphics::Capture::GraphicsCaptureItem const &,
winrt::Windows::Foundation::IInspectable const &)
frame_surface.get());
}
- if (capture_cursor && cursor_visible) {
- draw_cursor();
- }
-
texture_written = true;
}
const winrt::Windows::Graphics::Capture::GraphicsCaptureSession session =
frame_pool.CreateCaptureSession(item);
- /* disable cursor capture if possible since ours performs better */
if (winrt_capture_cursor_toggle_supported())
- session.IsCursorCaptureEnabled(false);
+ session.IsCursorCaptureEnabled(capture->capture_cursor &&
+ capture->cursor_visible);
capture->item = item;
capture->device = device;
const BOOL cursor_toggle_supported =
winrt_capture_cursor_toggle_supported();
if (cursor_toggle_supported)
- session.IsCursorCaptureEnabled(false);
+ session.IsCursorCaptureEnabled(cursor);
struct winrt_capture *capture = new winrt_capture{};
capture->window = window;
capture->client_area = client_area;
capture->capture_cursor = cursor && cursor_toggle_supported;
+ capture->cursor_visible = cursor;
capture->item = item;
capture->device = device;
d3d_device->GetImmediateContext(&capture->context);
extern "C" EXPORT void winrt_capture_show_cursor(struct winrt_capture *capture,
BOOL visible)
{
- capture->cursor_visible = visible;
+ if (capture->capture_cursor) {
+ if (capture->cursor_visible != visible) {
+ capture->session.IsCursorCaptureEnabled(visible);
+ capture->cursor_visible = visible;
+ }
+ }
}
extern "C" EXPORT void winrt_capture_render(struct winrt_capture *capture,
obs-studio-26.0.0.tar.xz/plugins/coreaudio-encoder/windows-imports.h -> obs-studio-26.0.1.tar.xz/plugins/coreaudio-encoder/windows-imports.h
Changed
static void release_lib(void)
{
-#define RELEASE_LIB(x) \
- if (x) { \
- FreeLibrary(x); \
- x = NULL; \
+ if (audio_toolbox) {
+ FreeLibrary(audio_toolbox);
+ audio_toolbox = NULL;
}
-
- RELEASE_LIB(audio_toolbox);
-#undef RELEASE_LIB
}
-static bool load_lib(void)
+static bool load_from_shell_path(REFKNOWNFOLDERID rfid, const wchar_t *subpath)
{
- PWSTR common_path;
- if (SHGetKnownFolderPath(FOLDERID_ProgramFilesCommon, 0, NULL,
- &common_path) != S_OK) {
- CA_LOG(LOG_WARNING, "Could not retrieve common files path");
+ wchar_t *sh_path;
+ if (SHGetKnownFolderPath(rfid, 0, NULL, &sh_path) != S_OK) {
+ CA_LOG(LOG_WARNING, "Could not retrieve shell path");
return false;
}
- struct dstr path = {0};
- dstr_printf(&path, "%S\\Apple\\Apple Application Support", common_path);
- CoTaskMemFree(common_path);
+ wchar_t path[MAX_PATH];
+ _snwprintf(path, MAX_PATH, L"%s\\%s\\%s", sh_path, subpath,
+ L"CoreAudioToolbox.dll");
+ CoTaskMemFree(sh_path);
- wchar_t *w_path = dstr_to_wcs(&path);
- dstr_free(&path);
+ audio_toolbox = LoadLibraryW(path);
+ return !!audio_toolbox;
+}
+
+static bool load_lib(void)
+{
+ /* -------------------------------------------- */
+ /* attempt to load from path */
- SetDllDirectory(w_path);
- bfree(w_path);
+ audio_toolbox = LoadLibraryW(L"CoreAudioToolbox.dll");
+ if (!!audio_toolbox)
+ return true;
-#define LOAD_LIB(x, n) \
- x = LoadLibrary(TEXT(n)); \
- if (!x) \
- CA_LOG(LOG_DEBUG, "Failed loading library '" n "'");
+ /* -------------------------------------------- */
+ /* attempt to load from known install locations */
- LOAD_LIB(audio_toolbox, "CoreAudioToolbox.dll");
-#undef LOAD_LIB
+ struct path_list_t {
+ REFKNOWNFOLDERID rfid;
+ const wchar_t *subpath;
+ };
- SetDllDirectory(NULL);
+ path_list_t path_list[] = {
+ {FOLDERID_ProgramFilesCommon,
+ L"Apple\\Apple Application Support"},
+ {FOLDERID_ProgramFiles, L"iTunes"},
+ };
- if (audio_toolbox)
- return true;
+ for (auto &val : path_list) {
+ if (load_from_shell_path(val.rfid, val.subpath)) {
+ return true;
+ }
+ }
- release_lib();
return false;
}
obs-studio-26.0.0.tar.xz/plugins/mac-capture/window-utils.h -> obs-studio-26.0.1.tar.xz/plugins/mac-capture/window-utils.h
Changed
NSArray *enumerate_cocoa_windows(void);
-NSArray *filter_nonzero_kcgwindowlayer_sources(NSArray *windows_arr);
-
bool find_window(cocoa_window_t cw, obs_data_t *settings, bool force);
void init_window(cocoa_window_t cw, obs_data_t *settings);
obs-studio-26.0.0.tar.xz/plugins/mac-capture/window-utils.m -> obs-studio-26.0.1.tar.xz/plugins/mac-capture/window-utils.m
Changed
return [o1[WINDOW_NUMBER] compare:o2[WINDOW_NUMBER]];
};
-NSArray *filter_nonzero_kcgwindowlayer_sources(NSArray *windows_arr)
-{
- NSPredicate *pred =
- [NSPredicate predicateWithFormat:@"(kCGWindowLayer == 0)"];
- NSArray *new_windows_arr =
- [windows_arr filteredArrayUsingPredicate:pred];
-
- return new_windows_arr;
-}
-
NSArray *enumerate_windows(void)
{
NSArray *arr = (NSArray *)CGWindowListCopyWindowInfo(
kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
- NSArray *filtered_arr = filter_nonzero_kcgwindowlayer_sources(arr);
[arr autorelease];
- return [filtered_arr sortedArrayUsingComparator:win_info_cmp];
+ return [arr sortedArrayUsingComparator:win_info_cmp];
}
#define WAIT_TIME_MS 500
obs-studio-26.0.0.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c -> obs-studio-26.0.1.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
Changed
*codec = avcodec_find_encoder(desc->id);
if (!*codec) {
- fprintf(stderr, "Couldn't create encoder");
+ fprintf(stderr, "Couldn't create encoder\n");
return false;
}
ret = avio_open(&ffm->output->pb, ffm->params.file,
AVIO_FLAG_WRITE);
if (ret < 0) {
- fprintf(stderr, "Couldn't open '%s', %s",
+ fprintf(stderr, "Couldn't open '%s', %s\n",
ffm->params.file, av_err2str(ret));
return FFM_ERROR;
}
AVDictionary *dict = NULL;
if ((ret = av_dict_parse_string(&dict, ffm->params.muxer_settings, "=",
" ", 0))) {
- fprintf(stderr, "Failed to parse muxer settings: %s\n%s",
+ fprintf(stderr, "Failed to parse muxer settings: %s\n%s\n",
av_err2str(ret), ffm->params.muxer_settings);
av_dict_free(&dict);
ret = avformat_write_header(ffm->output, &dict);
if (ret < 0) {
- fprintf(stderr, "Error opening '%s': %s", ffm->params.file,
+ fprintf(stderr, "Error opening '%s': %s\n", ffm->params.file,
av_err2str(ret));
av_dict_free(&dict);
if (info->keyframe)
packet.flags = AV_PKT_FLAG_KEY;
- return av_interleaved_write_frame(ffm->output, &packet) >= 0;
+ int ret = av_interleaved_write_frame(ffm->output, &packet);
+
+ if (ret < 0) {
+ fprintf(stderr, "av_interleaved_write_frame failed: %s\n",
+ av_err2str(ret));
+ }
+
+ return ret >= 0;
}
/* ------------------------------------------------------------------------- */
resize_buf_resize(&rb, info.size);
if (safe_read(rb.buf, info.size) == info.size) {
- ffmpeg_mux_packet(&ffm, rb.buf, &info);
+ fail = !ffmpeg_mux_packet(&ffm, rb.buf, &info);
} else {
fail = true;
}
obs-studio-26.0.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-mux.c -> obs-studio-26.0.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-mux.c
Changed
code = OBS_OUTPUT_UNSUPPORTED;
break;
default:
- code = OBS_OUTPUT_ERROR;
+ if (stream->is_network) {
+ code = OBS_OUTPUT_DISCONNECTED;
+ } else {
+ code = OBS_OUTPUT_ENCODE_ERROR;
+ }
}
obs_output_signal_stop(stream->output, code);
obs-studio-26.0.0.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-26.0.1.tar.xz/plugins/rtmp-services/data/package.json
Changed
{
"url": "https://obsproject.com/obs2_update/rtmp-services",
- "version": 147,
+ "version": 148,
"files": [
{
"name": "services.json",
- "version": 147
+ "version": 148
}
]
}
obs-studio-26.0.0.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-26.0.1.tar.xz/plugins/rtmp-services/data/services.json
Changed
"url": "rtmp://rtmp-wsu.afreecatv.com/app"
},
{
+ "name": "Europe : UK",
+ "url": "rtmp://rtmp-uk.afreecatv.com/app"
+ },
+ {
"name": "Asia : Singapore",
"url": "rtmp://rtmp-sgp.afreecatv.com/app"
}
}
},
{
- "name": "weabook.live",
- "servers": [
- {
- "name": "N.Virgina, US",
- "url": "rtmp://us-api.weabook.live/live"
- },
- {
- "name": "Singapore, SG",
- "url": "rtmp://sg-api.weabook.live/live"
- },
- {
- "name": "Tokyo, JP",
- "url": "rtmp://jp-api.weabook.live/live"
- },
- {
- "name": "Premium Streaming",
- "url": "rtmp://premium.rtmp.weabook.live/live"
- }
- ],
- "recommended": {
- "keyint": 2,
- "max audio bitrate": 256,
- "max video bitrate": 20480
- }
- },
- {
"name": "Taryana - Apachat | تاریانا - آپاچت",
"servers": [
{
obs-studio-26.0.0.tar.xz/plugins/rtmp-services/rtmp-common.c -> obs-studio-26.0.1.tar.xz/plugins/rtmp-services/rtmp-common.c
Changed
}
item = json_object_get(recommended, "bframes");
- if (json_is_integer(item))
- obs_data_set_int(settings, "bf", 0);
+ if (json_is_integer(item)) {
+ int bframes = json_integer_value(item);
+ obs_data_set_int(settings, "bf", bframes);
+ }
item = json_object_get(recommended, "x264opts");
if (json_is_string(item)) {
obs-studio-26.0.0.tar.xz/plugins/win-capture/cursor-capture.c -> obs-studio-26.0.1.tar.xz/plugins/win-capture/cursor-capture.c
Changed
{
if (GetObject(hbmp, sizeof(*bmp), bmp) != 0) {
uint8_t *output;
- unsigned int size =
- (bmp->bmHeight * bmp->bmWidth * bmp->bmBitsPixel) / 8;
+ unsigned int size = bmp->bmHeight * bmp->bmWidthBytes;
output = bmalloc(size);
GetBitmapBits(hbmp, size, output);
return false;
}
-static inline void apply_mask(uint8_t *color, uint8_t *mask, long num_pixels)
+static inline void apply_mask(uint8_t *color, uint8_t *mask, BITMAP *bmp_mask)
{
- for (long i = 0; i < num_pixels; i++)
- color[i * 4 + 3] = bit_to_alpha(mask, i, false);
+ long mask_pix_offs;
+
+ for (long y = 0; y < bmp_mask->bmHeight; y++) {
+ for (long x = 0; x < bmp_mask->bmWidth; x++) {
+ mask_pix_offs = y * (bmp_mask->bmWidthBytes * 8) + x;
+ color[(y * bmp_mask->bmWidth + x) * 4 + 3] =
+ bit_to_alpha(mask, mask_pix_offs, false);
+ }
+ }
}
static inline uint8_t *copy_from_color(ICONINFO *ii, uint32_t *width,
long pixels = bmp_color.bmHeight * bmp_color.bmWidth;
if (!bitmap_has_alpha(color, pixels))
- apply_mask(color, mask, pixels);
+ apply_mask(color, mask, &bmp_mask);
bfree(mask);
}
obs-studio-26.0.0.tar.xz/plugins/win-capture/graphics-hook-ver.h -> obs-studio-26.0.1.tar.xz/plugins/win-capture/graphics-hook-ver.h
Changed
#define HOOK_VER_MAJOR 1
#define HOOK_VER_MINOR 2
-#define HOOK_VER_PATCH 1
+#define HOOK_VER_PATCH 2
#define STRINGIFY(s) #s
#define MAKE_VERSION_NAME(major, minor, patch) \
obs-studio-26.0.0.tar.xz/plugins/win-capture/graphics-hook/vulkan-capture.c -> obs-studio-26.0.1.tar.xz/plugins/win-capture/graphics-hook/vulkan-capture.c
Changed
destroy_surface(inst, surf, ac);
}
-#define GETPROCADDR(func) \
- if (!strcmp(name, "vk" #func)) \
+#define GETPROCADDR(func) \
+ if (!strcmp(pName, "vk" #func)) \
return (PFN_vkVoidFunction)&OBS_##func;
-#define GETPROCADDR_IF_SUPPORTED(func) \
- if (!strcmp(name, "vk" #func)) \
+#define GETPROCADDR_IF_SUPPORTED(func) \
+ if (!strcmp(pName, "vk" #func)) \
return funcs->func ? (PFN_vkVoidFunction)&OBS_##func : NULL;
-static PFN_vkVoidFunction VKAPI_CALL OBS_GetDeviceProcAddr(VkDevice dev,
- const char *name)
+static PFN_vkVoidFunction VKAPI_CALL OBS_GetDeviceProcAddr(VkDevice device,
+ const char *pName)
{
- struct vk_data *data = get_device_data(dev);
+ struct vk_data *data = get_device_data(device);
struct vk_device_funcs *funcs = &data->funcs;
- debug_procaddr("vkGetDeviceProcAddr(%p, \"%s\")", dev, name);
+ debug_procaddr("vkGetDeviceProcAddr(%p, \"%s\")", device, pName);
GETPROCADDR(GetDeviceProcAddr);
GETPROCADDR(DestroyDevice);
if (funcs->GetDeviceProcAddr == NULL)
return NULL;
- return funcs->GetDeviceProcAddr(dev, name);
+ return funcs->GetDeviceProcAddr(device, pName);
}
-static PFN_vkVoidFunction VKAPI_CALL OBS_GetInstanceProcAddr(VkInstance inst,
- const char *name)
+/* bad layers require spec violation */
+#define RETURN_FP_FOR_NULL_INSTANCE 1
+
+static PFN_vkVoidFunction VKAPI_CALL
+OBS_GetInstanceProcAddr(VkInstance instance, const char *pName)
{
- debug_procaddr("vkGetInstanceProcAddr(%p, \"%s\")", inst, name);
+ debug_procaddr("vkGetInstanceProcAddr(%p, \"%s\")", instance, pName);
/* instance chain functions we intercept */
GETPROCADDR(GetInstanceProcAddr);
GETPROCADDR(CreateInstance);
- if (inst == NULL)
+#if RETURN_FP_FOR_NULL_INSTANCE
+ /* other instance chain functions we intercept */
+ GETPROCADDR(DestroyInstance);
+ GETPROCADDR(CreateWin32SurfaceKHR);
+ GETPROCADDR(DestroySurfaceKHR);
+
+ /* device chain functions we intercept */
+ GETPROCADDR(GetDeviceProcAddr);
+ GETPROCADDR(CreateDevice);
+ GETPROCADDR(DestroyDevice);
+
+ if (instance == NULL)
+ return NULL;
+
+ struct vk_inst_funcs *const funcs = get_inst_funcs(instance);
+#else
+ if (instance == NULL)
return NULL;
- struct vk_inst_funcs *funcs = get_inst_funcs(inst);
+ struct vk_inst_funcs *const funcs = get_inst_funcs(instance);
- /* instance chain functions we intercept */
+ /* other instance chain functions we intercept */
GETPROCADDR(DestroyInstance);
GETPROCADDR_IF_SUPPORTED(CreateWin32SurfaceKHR);
GETPROCADDR_IF_SUPPORTED(DestroySurfaceKHR);
GETPROCADDR(GetDeviceProcAddr);
GETPROCADDR(CreateDevice);
GETPROCADDR(DestroyDevice);
- if (funcs->GetInstanceProcAddr == NULL)
- return NULL;
- return funcs->GetInstanceProcAddr(inst, name);
+#endif
+
+ const PFN_vkGetInstanceProcAddr gipa = funcs->GetInstanceProcAddr;
+ return gipa ? gipa(instance, pName) : NULL;
}
#undef GETPROCADDR
obs-studio-26.0.0.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-base.cpp -> obs-studio-26.0.1.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-base.cpp
Changed
return wcscmp(audParentDevInstPath, vidParentDevInstPath) == 0;
}
-static bool IsElgatoDevice(const wchar_t *vidDevInstPath)
+#define VEN_ID_SIZE 4
+
+static inline bool MatchingStartToken(const wstring &path,
+ const wstring &start_token)
+{
+ return path.find(start_token) == 0 &&
+ path.size() >= start_token.size() + VEN_ID_SIZE;
+}
+
+static bool IsUncoupledDevice(const wchar_t *vidDevInstPath)
{
/* Sanity checks */
if (!vidDevInstPath)
/* USB */
wstring usbToken = L"USB\\VID_";
- wstring usbVidElgato = L"0FD9";
-
- if (path.find(usbToken) == 0) {
- if (path.size() >= usbToken.size() + usbVidElgato.size()) {
-
- /* Get USB vendor ID */
- wstring vid = path.substr(usbToken.size(),
- usbVidElgato.size());
- if (vid == usbVidElgato)
+ wstring usbVidIdWhitelist[] = {
+ L"0FD9", /* elgato */
+ L"3842", /* evga */
+ };
+
+ if (MatchingStartToken(path, usbToken)) {
+ /* Get USB vendor ID */
+ wstring vid = path.substr(usbToken.size(), VEN_ID_SIZE);
+ for (wstring &whitelistId : usbVidIdWhitelist) {
+ if (vid == whitelistId) {
return true;
+ }
}
}
/* PCI */
- wstring pciToken = L"PCI\\VEN_";
+ wstring pciVenToken = L"PCI\\VEN_";
wstring pciSubsysToken = L"SUBSYS_";
- wstring pciVidElgato = L"1CFA";
+ wstring pciVenIdWhitelist[] = {
+ L"1CD7", /* magewell */
+ };
+ wstring pciSubsysIdWhitelist[] = {
+ L"1CFA", /* elgato */
+ };
+
+ if (MatchingStartToken(path, pciVenToken)) {
+ wstring vid = path.substr(usbToken.size(), VEN_ID_SIZE);
+ for (wstring &whitelistId : pciVenIdWhitelist) {
+ if (vid == whitelistId) {
+ return true;
+ }
+ }
- if (path.find(pciToken) == 0) {
- size_t pos = path.find(pciSubsysToken);
- size_t devSize =
- pos + pciSubsysToken.size() + 4; /* skip product ID*/
- size_t expectedSize = devSize + pciVidElgato.size();
+ size_t subsysPos = path.find(pciSubsysToken);
+ size_t subsysIdPos =
+ subsysPos + pciSubsysToken.size() + VEN_ID_SIZE;
+ size_t expectedSize = subsysIdPos + VEN_ID_SIZE;
- if (pos != string::npos && path.size() >= expectedSize) {
+ if (subsysPos != string::npos && path.size() >= expectedSize) {
/* Get PCI subsystem vendor ID */
- wstring vid = path.substr(devSize, pciVidElgato.size());
- if (vid == pciVidElgato)
- return true;
+ wstring ssid = path.substr(subsysIdPos, VEN_ID_SIZE);
+ for (wstring &whitelistId : pciSubsysIdWhitelist) {
+ if (ssid == whitelistId) {
+ return true;
+ }
+ }
}
}
wchar_t vidDevInstPath[512];
HRESULT hr = DevicePathToDeviceInstancePath(vidDevPath, vidDevInstPath,
_ARRAYSIZE(vidDevInstPath));
+ if (FAILED(hr))
+ return false;
- /* Only enabled for Elgato devices for now to do not change behavior
- * for any other devices (e.g. webcams) */
#if 1
- if (!IsElgatoDevice(vidDevInstPath))
+ /* Only enabled for certain whitelisted devices for now */
+ if (!IsUncoupledDevice(vidDevInstPath))
return false;
#endif
No build results available
No rpmlint results available
Request History
boombatower created request over 4 years ago
- Update to version 26.0.1:
* coreaudio-encoder: Fix path on windows
* coreaudio-encoder: Refactor windows import
* rtmp-services: Update AfreecaTV
* Revert "UI: Delete existing fullscreen projector"
* win-capture: Update hook version
* win-dshow: Fix decoupled audio with EVGA/magewell
* libobs-winrt: Use native cursor draw for WGC
* win-capture: Violate Vulkan spec for compatibility
* obs-ffmpeg: Add error detection to ffmpeg-mux
* obs-ffmpeg: Signal a remote disconnect for network streams from ffmpeg-mux
* Revert "mac-capture: show actual windows in Window Capture sources"
* UI: Greatly improve main window repaint performance
* win-capture: Fix mask handling on some color cursors
* CI: Fix swig dependency on FreeBSD
* cmake: Fix finding libfdk header path
* UI: Fix tab order for controls dock
* CI: Use tag number only for macOS plist when triggered by version tag
* rtmp-services: Remove weabook.live
* UI: Skip ChromeOS test on FreeBSD
* rtmp-services: Set actual integer value of bframes in services
* UI: Implement exit on CTRL + Q for linux
* UI: Disable QT's implicit colourspace conversion on macOS
* UI: Move "Add [transition]" to bottom of combo
* UI/updater: Fix cmd prompts popping up registering vcam
* UI/updater: Fix race condition
boombatower accepted request over 4 years ago
ok