Projects
Multimedia
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 82
View file
obs-studio.changes
Changed
@@ -1,4 +1,34 @@ ------------------------------------------------------------------- +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:
View file
obs-studio.spec
Changed
@@ -1,5 +1,5 @@ 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
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/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>
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">e24aaa0b5847f0d61a74b46d52e472be02a5688a</param> + <param name="changesrevision">11602bc93341e8643878810d65d6a414c60b1ac7</param> </service> </servicedata>
View file
obs-studio-26.0.0.tar.xz/.cirrus.yml -> obs-studio-26.0.1.tar.xz/.cirrus.yml
Changed
@@ -9,7 +9,7 @@ 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
View file
obs-studio-26.0.0.tar.xz/.github/workflows/main.yml -> obs-studio-26.0.1.tar.xz/.github/workflows/main.yml
Changed
@@ -236,8 +236,14 @@ 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
View file
obs-studio-26.0.0.tar.xz/UI/obs-app.cpp -> obs-studio-26.0.1.tar.xz/UI/obs-app.cpp
Changed
@@ -1981,7 +1981,7 @@ 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");
View file
obs-studio-26.0.0.tar.xz/UI/platform-osx.mm -> obs-studio-26.0.1.tar.xz/UI/platform-osx.mm
Changed
@@ -144,6 +144,13 @@ 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();
View file
obs-studio-26.0.0.tar.xz/UI/platform.hpp -> obs-studio-26.0.1.tar.xz/UI/platform.hpp
Changed
@@ -67,4 +67,5 @@ void EnableOSXVSync(bool enable); void EnableOSXDockIcon(bool enable); void InstallNSApplicationSubclass(); +void disableColorSpaceConversion(QWidget *window); #endif
View file
obs-studio-26.0.0.tar.xz/UI/volume-control.cpp -> obs-studio-26.0.1.tar.xz/UI/volume-control.cpp
Changed
@@ -531,6 +531,8 @@ 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); @@ -1041,6 +1043,11 @@ // 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);
View file
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
@@ -45,11 +45,13 @@ 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) @@ -57,14 +59,14 @@ 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; }
View file
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
@@ -1427,6 +1427,23 @@ /* ------------------------------------- * * 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]; @@ -1441,20 +1458,20 @@ 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); } }
View file
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
@@ -50,8 +50,14 @@ 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; @@ -73,22 +79,26 @@ 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); }
View file
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
@@ -326,6 +326,10 @@ 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); @@ -1554,6 +1558,8 @@ vcamButton->setProperty("themeID", "vcamButton"); ui->buttonsVLayout->insertWidget(2, vcamButton); + setTabOrder(ui->recordButton, vcamButton); + setTabOrder(vcamButton, ui->modeSwitch); } void OBSBasic::ResetOutputs() @@ -1588,6 +1594,9 @@ replayBufferButton->setProperty("themeID", "replayBufferButton"); ui->buttonsVLayout->insertLayout(2, replayLayout); + setTabOrder(ui->recordButton, replayBufferButton); + setTabOrder(replayBufferButton, + ui->buttonsVLayout->itemAt(3)->widget()); } if (sysTrayReplayBuffer) @@ -1867,6 +1876,10 @@ SystemTray(true); #endif +#ifdef __APPLE__ + disableColorSpaceConversion(this); +#endif + bool has_last_version = config_has_user_value(App()->GlobalConfig(), "General", "LastVersion"); bool first_run = @@ -7035,15 +7048,6 @@ 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); @@ -8211,6 +8215,10 @@ 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)
View file
obs-studio-26.0.0.tar.xz/cmake/Modules/FindLibfdk.cmake -> obs-studio-26.0.1.tar.xz/cmake/Modules/FindLibfdk.cmake
Changed
@@ -32,7 +32,9 @@ ${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
View file
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
@@ -137,58 +137,6 @@ 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 &) @@ -256,10 +204,6 @@ frame_surface.get()); } - if (capture_cursor && cursor_visible) { - draw_cursor(); - } - texture_written = true; } @@ -342,9 +286,9 @@ 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; @@ -425,12 +369,13 @@ 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); @@ -523,7 +468,12 @@ 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,
View file
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
@@ -361,49 +361,58 @@ 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; }
View file
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
@@ -18,8 +18,6 @@ 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);
View file
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
@@ -23,25 +23,14 @@ 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
View file
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
@@ -304,7 +304,7 @@ *codec = avcodec_find_encoder(desc->id); if (!*codec) { - fprintf(stderr, "Couldn't create encoder"); + fprintf(stderr, "Couldn't create encoder\n"); return false; } @@ -520,7 +520,7 @@ 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; } @@ -529,7 +529,7 @@ 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); @@ -548,7 +548,7 @@ 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); @@ -723,7 +723,14 @@ 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; } /* ------------------------------------------------------------------------- */ @@ -772,7 +779,7 @@ 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; }
View file
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
@@ -440,7 +440,11 @@ 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);
View file
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
@@ -1,10 +1,10 @@ { "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 147, + "version": 148, "files": [ { "name": "services.json", - "version": 147 + "version": 148 } ] }
View file
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
@@ -760,6 +760,10 @@ "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" } @@ -1727,32 +1731,6 @@ } }, { - "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": [ {
View file
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
@@ -515,8 +515,10 @@ } 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)) {
View file
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
@@ -6,8 +6,7 @@ { 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); @@ -40,10 +39,17 @@ 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, @@ -69,7 +75,7 @@ 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); }
View file
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
@@ -13,7 +13,7 @@ #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) \
View file
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
@@ -1742,21 +1742,21 @@ 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); @@ -1766,24 +1766,43 @@ 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); @@ -1792,9 +1811,10 @@ 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
View file
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
@@ -671,7 +671,16 @@ 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) @@ -681,35 +690,52 @@ /* 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; + } + } } } @@ -762,11 +788,12 @@ 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
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
.