Projects
home:frispete
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 33
View file
obs-studio.changes
Changed
@@ -1,4 +1,38 @@ ------------------------------------------------------------------- +Wed Jun 21 08:03:37 UTC 2023 - hpj@urpla.net + +- Update to version 29.1.3: + * UI: Translate place holder name for new group + * UI: Fix changed state of audio settings + * UI: Fix changing quick transition to/from fade to black + * UI: Fix checked state of source toolbar menu item + * text-freetype2: Fix not updating chat log mode property + * libobs: Update version to 29.1.3 + * obs-ffmpeg: Fix logic in one of the AMF preset fallback checks + * obs-websocket: Update version to 5.2.3 + * libobs: Set video thread qos class to user interactive on macOS + * mac-capture: Explicitly set clear background for SCK + * UI: Don't update text source when nothing changed + * docs: Clarify da_erase_range + * deps/obs-scripting: Fix crash removing callbacks in script_unload + * libobs: Use da_clear() to clear obs_core_data::sources_to_tick + * libobs/util: Add da_clear() + * libobs: Don't keep the sources mutex in tick_sources + * libobs/util: Actually fix use-after-free in da_insert_new + * libobs/util: Fix use-after-free in darray_insert_new + * win-capture: Skip compat helper matching if properties are null + * win-capture: Add Honkai: Star Rail to compatibility list + * UI: Don't trigger a settings update when list is empty To avoid recursive call + * obs-ffmpeg: Consider requested throughput in AMF preset fallback + * obs-ffmpeg: Fix AMF encoder reconfiguration + * UI: Fix filter shortcuts not showing in context menu + * text-freetype2: Fix crash after reaching buffer size + * UI: Fix menu actions missing shortcuts + * libobs: Fix crash when properties are deleted in callback + * UI: Assume RTMP if service has no protcol + * Revert "UI: Reset service selection to custom if name not found" + +------------------------------------------------------------------- Fri Jun 2 15:59:13 UTC 2023 - Hans-Peter Jansen <hpj@urpla.net> - libmfx is available for x86 archs only
View file
obs-studio.spec
Changed
@@ -15,7 +15,7 @@ %bcond_without websockets Name: obs-studio -Version: 29.1.2 +Version: 29.1.3 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/29.1.2</param> + <param name="revision">refs/tags/29.1.3</param> <param name="url">https://github.com/obsproject/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">https://github.com/obsproject/obs-studio.git</param> - <param name="changesrevision">e15a92e16fc3827027a956f6d6a1223b41aced61</param> + <param name="changesrevision">c58e511813c33e93da7637d50aa431ae0cddda0c</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-29.1.2.tar.xz/UI/context-bar-controls.cpp -> obs-studio-29.1.3.tar.xz/UI/context-bar-controls.cpp
Changed
@@ -728,12 +728,15 @@ if (!source) { return; } - + std::string newText = QT_TO_UTF8(ui->text->text()); + OBSDataAutoRelease settings = obs_source_get_settings(source); + if (newText == obs_data_get_string(settings, "text")) { + return; + } SaveOldProperties(source); - OBSDataAutoRelease settings = obs_data_create(); - obs_data_set_string(settings, "text", QT_TO_UTF8(ui->text->text())); - obs_source_update(source, settings); + obs_data_set_string(settings, "text", newText.c_str()); + obs_source_update(source, nullptr); SetUndoProperties(source, true); }
View file
obs-studio-29.1.2.tar.xz/UI/forms/OBSBasic.ui -> obs-studio-29.1.3.tar.xz/UI/forms/OBSBasic.ui
Changed
@@ -1683,6 +1683,9 @@ <property name="shortcutContext"> <enum>Qt::WidgetWithChildrenShortcut</enum> </property> + <property name="iconVisibleInMenu"> + <bool>false</bool> + </property> <property name="themeID" stdset="0"> <string notr="true">removeIconSmall</string> </property> @@ -1704,6 +1707,9 @@ <property name="shortcutContext"> <enum>Qt::WidgetWithChildrenShortcut</enum> </property> + <property name="iconVisibleInMenu"> + <bool>false</bool> + </property> <property name="themeID" stdset="0"> <string notr="true">removeIconSmall</string> </property>
View file
obs-studio-29.1.2.tar.xz/UI/forms/OBSBasicFilters.ui -> obs-studio-29.1.3.tar.xz/UI/forms/OBSBasicFilters.ui
Changed
@@ -597,6 +597,9 @@ <property name="shortcut"> <string>Del</string> </property> + <property name="iconVisibleInMenu"> + <bool>false</bool> + </property> </action> <action name="actionMoveUp"> <property name="icon"> @@ -622,6 +625,11 @@ <string>Ctrl+Down</string> </property> </action> + <action name="actionRenameFilter"> + <property name="text"> + <string>Rename</string> + </property> + </action> </widget> <customwidgets> <customwidget>
View file
obs-studio-29.1.2.tar.xz/UI/properties-view.cpp -> obs-studio-29.1.3.tar.xz/UI/properties-view.cpp
Changed
@@ -647,7 +647,7 @@ children.emplace_back(info); /* trigger a settings update if the index was not found */ - if (idx == -1) + if (count && idx == -1) info->ControlChanged(); return combo;
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-filters.cpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-filters.cpp
Changed
@@ -81,6 +81,7 @@ QApplication::translate("OBSBasicFilters", "Del", nullptr)); #endif // QT_NO_SHORTCUT + addAction(ui->actionRenameFilter); addAction(ui->actionRemoveFilter); addAction(ui->actionMoveUp); addAction(ui->actionMoveDown); @@ -154,24 +155,10 @@ ui->preview->hide(); } - QAction *renameAsync = new QAction(ui->asyncWidget); - renameAsync->setShortcutContext(Qt::WidgetWithChildrenShortcut); - connect(renameAsync, SIGNAL(triggered()), this, - SLOT(RenameAsyncFilter())); - ui->asyncWidget->addAction(renameAsync); - - QAction *renameEffect = new QAction(ui->effectWidget); - renameEffect->setShortcutContext(Qt::WidgetWithChildrenShortcut); - connect(renameEffect, SIGNAL(triggered()), this, - SLOT(RenameEffectFilter())); - ui->effectWidget->addAction(renameEffect); - #ifdef __APPLE__ - renameAsync->setShortcut({Qt::Key_Return}); - renameEffect->setShortcut({Qt::Key_Return}); + ui->actionRenameFilter->setShortcut({Qt::Key_Return}); #else - renameAsync->setShortcut({Qt::Key_F2}); - renameEffect->setShortcut({Qt::Key_F2}); + ui->actionRenameFilter->setShortcut({Qt::Key_F2}); #endif UpdateFilters(); @@ -932,6 +919,14 @@ on_moveEffectFilterDown_clicked(); } +void OBSBasicFilters::on_actionRenameFilter_triggered() +{ + if (ui->asyncFilters->hasFocus()) + RenameAsyncFilter(); + else if (ui->effectFilters->hasFocus()) + RenameEffectFilter(); +} + void OBSBasicFilters::CustomContextMenu(const QPoint &pos, bool async) { QListWidget *list = async ? ui->asyncFilters : ui->effectFilters; @@ -948,17 +943,11 @@ async ? SLOT(DuplicateAsyncFilter()) : SLOT(DuplicateEffectFilter()); - const char *renameSlot = async ? SLOT(RenameAsyncFilter()) - : SLOT(RenameEffectFilter()); - const char *removeSlot = - async ? SLOT(on_removeAsyncFilter_clicked()) - : SLOT(on_removeEffectFilter_clicked()); - popup.addSeparator(); popup.addAction(QTStr("Duplicate"), this, dulpicateSlot); popup.addSeparator(); - popup.addAction(QTStr("Rename"), this, renameSlot); - popup.addAction(QTStr("Remove"), this, removeSlot); + popup.addAction(ui->actionRenameFilter); + popup.addAction(ui->actionRemoveFilter); popup.addSeparator(); QAction *copyAction = new QAction(QTStr("Copy"));
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-filters.hpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-filters.hpp
Changed
@@ -113,6 +113,8 @@ void on_actionMoveUp_triggered(); void on_actionMoveDown_triggered(); + void on_actionRenameFilter_triggered(); + void AsyncFilterNameEdited(QWidget *editor); void EffectFilterNameEdited(QWidget *editor);
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-main-transitions.cpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-main-transitions.cpp
Changed
@@ -1476,6 +1476,7 @@ trIdx); if (tr) { qt->source = tr; + qt->fadeToBlack = fadeToBlack; ResetQuickTransitionText(qt); } }
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-main.cpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-main.cpp
Changed
@@ -392,12 +392,12 @@ connect(diskFullTimer, SIGNAL(timeout()), this, SLOT(CheckDiskSpaceRemaining())); - renameScene = new QAction(ui->scenesDock); + renameScene = new QAction(QTStr("Rename"), ui->scenesDock); renameScene->setShortcutContext(Qt::WidgetWithChildrenShortcut); connect(renameScene, SIGNAL(triggered()), this, SLOT(EditSceneName())); ui->scenesDock->addAction(renameScene); - renameSource = new QAction(ui->sourcesDock); + renameSource = new QAction(QTStr("Rename"), ui->sourcesDock); renameSource->setShortcutContext(Qt::WidgetWithChildrenShortcut); connect(renameSource, SIGNAL(triggered()), this, SLOT(EditSceneItemName())); @@ -5385,9 +5385,8 @@ popup.addAction(copyFilters); popup.addAction(pasteFilters); popup.addSeparator(); - popup.addAction(QTStr("Rename"), this, SLOT(EditSceneName())); - popup.addAction(QTStr("Remove"), this, - SLOT(RemoveSelectedScene())); + popup.addAction(renameScene); + popup.addAction(ui->actionRemoveScene); popup.addSeparator(); order.addAction(QTStr("Basic.MainMenu.Edit.Order.MoveUp"), this, @@ -5893,10 +5892,8 @@ colorSelect = new ColorSelect(colorMenu); popup.addMenu(AddBackgroundColorMenu( colorMenu, colorWidgetAction, colorSelect, sceneItem)); - popup.addAction(QTStr("Rename"), this, - SLOT(EditSceneItemName())); - popup.addAction(QTStr("Remove"), this, - SLOT(on_actionRemoveSource_triggered())); + popup.addAction(renameSource); + popup.addAction(ui->actionRemoveSource); popup.addSeparator(); popup.addMenu(ui->orderMenu); @@ -9368,11 +9365,13 @@ void OBSBasic::ShowContextBar() { on_toggleContextBar_toggled(true); + ui->toggleContextBar->setChecked(true); } void OBSBasic::HideContextBar() { on_toggleContextBar_toggled(false); + ui->toggleContextBar->setChecked(false); } void OBSBasic::on_toggleContextBar_toggled(bool visible)
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-settings-stream.cpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-settings-stream.cpp
Changed
@@ -140,10 +140,11 @@ QTStr("Basic.Settings.Stream.Custom.Password.ToolTip")); } else { int idx = ui->service->findText(service); - /* 29.1 crash workaround: Fall back to "Custom" if service not found. */ - if (idx == -1) - idx = 0; - + if (idx == -1) { + if (service && *service) + ui->service->insertItem(1, service); + idx = 1; + } ui->service->setCurrentIndex(idx); lastServiceIdx = idx; @@ -565,7 +566,10 @@ obs_properties_destroy(props); - return QT_UTF8(obs_data_get_string(settings, "protocol")); + const char *protocol = + obs_data_get_string(settings, "protocol"); + if (protocol && *protocol) + return QT_UTF8(protocol); } return QString("RTMP");
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-settings.cpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-settings.cpp
Changed
@@ -4643,17 +4643,15 @@ if (currentChannelIndex != channelIndex || currentSampleRateIndex != sampleRateIndex || currentLLAudioBufVal != llBufferingEnabled) { - audioChanged = true; ui->audioMsg->setText( QTStr("Basic.Settings.ProgramRestart")); - sender()->setProperty("changed", QVariant(true)); - EnableApplyButton(true); } else { - audioChanged = false; ui->audioMsg->setText(""); - sender()->setProperty("changed", QVariant(false)); - EnableApplyButton(false); } + + audioChanged = true; + sender()->setProperty("changed", QVariant(true)); + EnableApplyButton(true); } }
View file
obs-studio-29.1.2.tar.xz/UI/window-basic-source-select.cpp -> obs-studio-29.1.3.tar.xz/UI/window-basic-source-select.cpp
Changed
@@ -367,6 +367,8 @@ { if (strcmp(id, "scene") == 0) return Str("Basic.Scene"); + else if (strcmp(id, "group") == 0) + return Str("Group"); const char *v_id = obs_get_latest_input_type_id(id); return obs_source_get_display_name(v_id); }
View file
obs-studio-29.1.2.tar.xz/deps/obs-scripting/obs-scripting-lua.c -> obs-studio-29.1.3.tar.xz/deps/obs-scripting/obs-scripting-lua.c
Changed
@@ -1228,10 +1228,13 @@ /* call script_unload */ pthread_mutex_lock(&data->mutex); + current_lua_script = data; lua_getglobal(script, "script_unload"); lua_pcall(script, 0, 0, 0); + current_lua_script = NULL; + /* ---------------------------- */ /* remove all callbacks */
View file
obs-studio-29.1.2.tar.xz/docs/sphinx/reference-libobs-util-darray.rst -> obs-studio-29.1.3.tar.xz/docs/sphinx/reference-libobs-util-darray.rst
Changed
@@ -236,7 +236,8 @@ .. function:: void da_erase_range(da, size_t start_idx, size_t end_idx) - Erases a range of values. + Erases a range of values, including the element at ``start_idx``, but + not the one at ``end_idx``. :param da: The dynamic array :param start_idx: The starting index
View file
obs-studio-29.1.2.tar.xz/libobs/obs-config.h -> obs-studio-29.1.3.tar.xz/libobs/obs-config.h
Changed
@@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 2 +#define LIBOBS_API_PATCH_VER 3 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \ ((major << 24) | (minor << 16) | patch)
View file
obs-studio-29.1.2.tar.xz/libobs/obs-internal.h -> obs-studio-29.1.3.tar.xz/libobs/obs-internal.h
Changed
@@ -419,6 +419,7 @@ volatile bool valid; DARRAY(char *) protocols; + DARRAY(obs_source_t *) sources_to_tick; }; /* user hotkeys */
View file
obs-studio-29.1.2.tar.xz/libobs/obs-properties.c -> obs-studio-29.1.3.tar.xz/libobs/obs-properties.c
Changed
@@ -363,9 +363,9 @@ obs_data_t *settings, obs_properties_t *realprops) { - struct obs_property *p, *tmp; + struct obs_property *p = props->properties; - HASH_ITER (hh, props->properties, p, tmp) { + while (p) { if (p->type == OBS_PROPERTY_GROUP) { obs_properties_apply_settings_internal( obs_property_group_content(p), settings, @@ -375,6 +375,8 @@ p->modified(realprops, p, settings); else if (p->modified2) p->modified2(p->priv, realprops, p, settings); + + p = p->hh.next; } }
View file
obs-studio-29.1.2.tar.xz/libobs/obs-video.c -> obs-studio-29.1.3.tar.xz/libobs/obs-video.c
Changed
@@ -45,35 +45,42 @@ /* ------------------------------------- */ /* call tick callbacks */ - pthread_mutex_lock(&obs->data.draw_callbacks_mutex); + pthread_mutex_lock(&data->draw_callbacks_mutex); - for (size_t i = obs->data.tick_callbacks.num; i > 0; i--) { + for (size_t i = data->tick_callbacks.num; i > 0; i--) { struct tick_callback *callback; - callback = obs->data.tick_callbacks.array + (i - 1); + callback = data->tick_callbacks.array + (i - 1); callback->tick(callback->param, seconds); } - pthread_mutex_unlock(&obs->data.draw_callbacks_mutex); + pthread_mutex_unlock(&data->draw_callbacks_mutex); /* ------------------------------------- */ - /* call the tick function of each source */ + /* get an array of all sources to tick */ + + da_clear(data->sources_to_tick); pthread_mutex_lock(&data->sources_mutex); source = data->sources; while (source) { obs_source_t *s = obs_source_get_ref(source); - - if (s) { - obs_source_video_tick(s, seconds); - obs_source_release(s); - } - + if (s) + da_push_back(data->sources_to_tick, &s); source = (struct obs_source *)source->context.hh_uuid.next; } pthread_mutex_unlock(&data->sources_mutex); + /* ------------------------------------- */ + /* call the tick function of each source */ + + for (size_t i = 0; i < data->sources_to_tick.num; i++) { + obs_source_t *s = data->sources_to_tick.arrayi; + obs_source_video_tick(s, seconds); + obs_source_release(s); + } + return cur_time; }
View file
obs-studio-29.1.2.tar.xz/libobs/obs.c -> obs-studio-29.1.3.tar.xz/libobs/obs.c
Changed
@@ -748,7 +748,10 @@ int errorcode; #ifdef __APPLE__ - errorcode = pthread_create(&video->video_thread, NULL, + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_set_qos_class_np(&attr, QOS_CLASS_USER_INTERACTIVE, 0); + errorcode = pthread_create(&video->video_thread, &attr, obs_graphics_thread_autorelease, obs); #else errorcode = pthread_create(&video->video_thread, NULL, @@ -1083,6 +1086,7 @@ for (size_t i = 0; i < data->protocols.num; i++) bfree(data->protocols.arrayi); da_free(data->protocols); + da_free(data->sources_to_tick); } static const char *obs_signals = {
View file
obs-studio-29.1.2.tar.xz/libobs/util/darray.h -> obs-studio-29.1.3.tar.xz/libobs/util/darray.h
Changed
@@ -121,6 +121,11 @@ dst->capacity = new_cap; } +static inline void darray_clear(struct darray *dst) +{ + dst->num = 0; +} + static inline void darray_resize(const size_t element_size, struct darray *dst, const size_t size) { @@ -269,10 +274,10 @@ if (idx == dst->num) return darray_push_back_new(element_size, dst); - item = darray_item(element_size, dst, idx); - move_count = dst->num - idx; darray_ensure_capacity(element_size, dst, ++dst->num); + + item = darray_item(element_size, dst, idx); memmove(darray_item(element_size, dst, idx + 1), item, move_count * element_size); @@ -487,6 +492,8 @@ #define da_resize(v, size) darray_resize(sizeof(*v.array), &v.da, size) +#define da_clear(v) darray_clear(&v.da) + #define da_copy(dst, src) darray_copy(sizeof(*dst.array), &dst.da, &src.da) #define da_copy_array(dst, src_array, n) \
View file
obs-studio-29.1.2.tar.xz/plugins/mac-capture/mac-screen-capture.m -> obs-studio-29.1.3.tar.xz/plugins/mac-capture/mac-screen-capture.m
Changed
@@ -455,9 +455,12 @@ } break; } os_sem_post(sc->shareable_content_available); + + CGColorRef background = CGColorGetConstantColor(kCGColorClear); sc->stream_properties setQueueDepth:8; sc->stream_properties setShowsCursor:!sc->hide_cursor; sc->stream_properties setColorSpaceName:kCGColorSpaceDisplayP3; + sc->stream_properties setBackgroundColor:background; FourCharCode l10r_type = 0; l10r_type = ('l' << 24) | ('1' << 16) | ('0' << 8) | 'r'; sc->stream_properties setPixelFormat:l10r_type;
View file
obs-studio-29.1.2.tar.xz/plugins/obs-ffmpeg/texture-amf.cpp -> obs-studio-29.1.3.tar.xz/plugins/obs-ffmpeg/texture-amf.cpp
Changed
@@ -104,6 +104,7 @@ AMF_SURFACE_FORMAT amf_format; amf_int64 max_throughput = 0; + amf_int64 requested_throughput = 0; amf_int64 throughput = 0; int64_t dts_offset = 0; uint32_t cx; @@ -440,6 +441,8 @@ if (res == AMF_OK) { caps->GetProperty(get_opt_name(CAP_MAX_THROUGHPUT), &enc->max_throughput); + caps->GetProperty(get_opt_name(CAP_REQUESTED_THROUGHPUT), + &enc->requested_throughput); } } @@ -455,7 +458,8 @@ preset = "quality"; set_opt(QUALITY_PRESET, get_preset(enc, preset)); } else { - if (enc->max_throughput < enc->throughput) { + if (enc->max_throughput - enc->requested_throughput < + enc->throughput) { preset = "quality"; refresh_throughput_caps(enc, preset); } @@ -467,7 +471,8 @@ preset = "balanced"; set_opt(QUALITY_PRESET, get_preset(enc, preset)); } else { - if (enc->max_throughput < enc->throughput) { + if (enc->max_throughput - enc->requested_throughput < + enc->throughput) { preset = "balanced"; refresh_throughput_caps(enc, preset); } @@ -476,7 +481,8 @@ if (astrcmpi(preset, "balanced") == 0) { if (enc->max_throughput && - enc->max_throughput < enc->throughput) { + enc->max_throughput - enc->requested_throughput < + enc->throughput) { preset = "speed"; refresh_throughput_caps(enc, preset); } @@ -1254,13 +1260,17 @@ int64_t qp = obs_data_get_int(settings, "cqp"); const char *rc_str = obs_data_get_string(settings, "rate_control"); int rc = get_avc_rate_control(rc_str); - AMF_RESULT res; + AMF_RESULT res = AMF_OK; amf_avc_update_data(enc, rc, bitrate * 1000, qp); + res = enc->amf_encoder->Flush(); + if (res != AMF_OK) + throw amf_error("AMFComponent::Flush failed", res); + res = enc->amf_encoder->ReInit(enc->cx, enc->cy); if (res != AMF_OK) - throw amf_error("AMFComponent::Init failed", res); + throw amf_error("AMFComponent::ReInit failed", res); return true; @@ -1364,6 +1374,8 @@ &enc->bframes_supported); caps->GetProperty(AMF_VIDEO_ENCODER_CAP_MAX_THROUGHPUT, &enc->max_throughput); + caps->GetProperty(AMF_VIDEO_ENCODER_CAP_REQUESTED_THROUGHPUT, + &enc->requested_throughput); } const char *preset = obs_data_get_string(settings, "preset"); @@ -1488,8 +1500,7 @@ amf_encoder_info.get_name = amf_avc_get_name; amf_encoder_info.create = amf_avc_create_texencode; amf_encoder_info.destroy = amf_destroy; - /* FIXME: Figure out why encoder does not survive reconfiguration - amf_encoder_info.update = amf_avc_update; */ + amf_encoder_info.update = amf_avc_update; amf_encoder_info.encode_texture = amf_encode_tex; amf_encoder_info.get_defaults = amf_defaults; amf_encoder_info.get_properties = amf_avc_properties; @@ -1581,13 +1592,17 @@ int64_t qp = obs_data_get_int(settings, "cqp"); const char *rc_str = obs_data_get_string(settings, "rate_control"); int rc = get_hevc_rate_control(rc_str); - AMF_RESULT res; + AMF_RESULT res = AMF_OK; amf_hevc_update_data(enc, rc, bitrate * 1000, qp); + res = enc->amf_encoder->Flush(); + if (res != AMF_OK) + throw amf_error("AMFComponent::Flush failed", res); + res = enc->amf_encoder->ReInit(enc->cx, enc->cy); if (res != AMF_OK) - throw amf_error("AMFComponent::Init failed", res); + throw amf_error("AMFComponent::ReInit failed", res); return true; @@ -1693,6 +1708,9 @@ if (res == AMF_OK) { caps->GetProperty(AMF_VIDEO_ENCODER_HEVC_CAP_MAX_THROUGHPUT, &enc->max_throughput); + caps->GetProperty( + AMF_VIDEO_ENCODER_HEVC_CAP_REQUESTED_THROUGHPUT, + &enc->requested_throughput); } const bool is10bit = enc->amf_format == AMF_SURFACE_P010; @@ -1835,8 +1853,7 @@ amf_encoder_info.get_name = amf_hevc_get_name; amf_encoder_info.create = amf_hevc_create_texencode; amf_encoder_info.destroy = amf_destroy; - /* FIXME: Figure out why encoder does not survive reconfiguration - amf_encoder_info.update = amf_hevc_update; */ + amf_encoder_info.update = amf_hevc_update; amf_encoder_info.encode_texture = amf_encode_tex; amf_encoder_info.get_defaults = amf_defaults; amf_encoder_info.get_properties = amf_hevc_properties; @@ -1947,12 +1964,17 @@ int64_t cq_level = obs_data_get_int(settings, "cqp"); const char *rc_str = obs_data_get_string(settings, "rate_control"); int rc = get_av1_rate_control(rc_str); + AMF_RESULT res = AMF_OK; amf_av1_update_data(enc, rc, bitrate * 1000, cq_level); - AMF_RESULT res = enc->amf_encoder->ReInit(enc->cx, enc->cy); + res = enc->amf_encoder->Flush(); if (res != AMF_OK) - throw amf_error("AMFComponent::Init failed", res); + throw amf_error("AMFComponent::Flush failed", res); + + res = enc->amf_encoder->ReInit(enc->cx, enc->cy); + if (res != AMF_OK) + throw amf_error("AMFComponent::ReInit failed", res); return true; @@ -2027,6 +2049,9 @@ if (res == AMF_OK) { caps->GetProperty(AMF_VIDEO_ENCODER_AV1_CAP_MAX_THROUGHPUT, &enc->max_throughput); + caps->GetProperty( + AMF_VIDEO_ENCODER_AV1_CAP_REQUESTED_THROUGHPUT, + &enc->requested_throughput); } const bool is10bit = enc->amf_format == AMF_SURFACE_P010; @@ -2153,8 +2178,7 @@ amf_encoder_info.get_name = amf_av1_get_name; amf_encoder_info.create = amf_av1_create_texencode; amf_encoder_info.destroy = amf_destroy; - /* FIXME: Figure out why encoder does not survive reconfiguration - amf_encoder_info.update = amf_av1_update; */ + amf_encoder_info.update = amf_av1_update; amf_encoder_info.encode_texture = amf_encode_tex; amf_encoder_info.get_defaults = amf_av1_defaults; amf_encoder_info.get_properties = amf_av1_properties;
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/CMakeLists.txt -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/CMakeLists.txt
Changed
@@ -2,7 +2,7 @@ legacy_check() -set(obs-websocket_VERSION 5.2.2) +set(obs-websocket_VERSION 5.2.3) set(OBS_WEBSOCKET_RPC_VERSION 1) option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON) @@ -142,7 +142,7 @@ $<$<PLATFORM_ID:Darwin,Linux,FreeBSD>:-Wall> $<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=float-conversion;-Wno-error=shadow> $<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow;-Wno-error=int-conversion;-Wno-error=comment> - $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations;-Wno-error=implicit-int-conversion;-Wno-error=shorten-64-to-32> + $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations;-Wno-error=implicit-int-conversion;-Wno-error=shorten-64-to-32;-Wno-comma;-Wno-quoted-include-in-framework-header> ) target_link_libraries(
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/cmake/legacy.cmake -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/cmake/legacy.cmake
Changed
@@ -1,4 +1,4 @@ -project(obs-websocket VERSION 5.2.2) +project(obs-websocket VERSION 5.2.3) set(OBS_WEBSOCKET_RPC_VERSION 1) option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/docs/generated/protocol.json -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/docs/generated/protocol.json
Changed
@@ -238,6 +238,14 @@ "enumValue": 206 }, { + "description": "The server is not ready to handle the request.\n\nNote: This usually occurs during OBS scene collection change or exit. Requests may be tried again after a delay if this code is given.", + "enumIdentifier": "NotReady", + "rpcVersion": "1", + "deprecated": false, + "initialVersion": "5.3.0", + "enumValue": 207 + }, + { "description": "A required request field is missing.", "enumIdentifier": "MissingRequestField", "rpcVersion": "1",
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/docs/generated/protocol.md -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/docs/generated/protocol.md
Changed
@@ -471,6 +471,7 @@ - RequestStatus::UnknownRequestType(#requeststatusunknownrequesttype) - RequestStatus::GenericError(#requeststatusgenericerror) - RequestStatus::UnsupportedRequestBatchExecutionType(#requeststatusunsupportedrequestbatchexecutiontype) + - RequestStatus::NotReady(#requeststatusnotready) - RequestStatus::MissingRequestField(#requeststatusmissingrequestfield) - RequestStatus::MissingRequestData(#requeststatusmissingrequestdata) - RequestStatus::InvalidRequestField(#requeststatusinvalidrequestfield) @@ -879,6 +880,18 @@ --- +### RequestStatus::NotReady + +The server is not ready to handle the request. + +Note: This usually occurs during OBS scene collection change or exit. Requests may be tried again after a delay if this code is given. + +- Identifier Value: `207` +- Latest Supported RPC Version: `1` +- Added in v5.3.0 + +--- + ### RequestStatus::MissingRequestField A required request field is missing.
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler.cpp -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler.cpp
Changed
@@ -269,7 +269,7 @@ case OBS_FRONTEND_EVENT_FINISHED_LOADING: eventHandler->FrontendFinishedLoadingMultiHandler(); break; - case OBS_FRONTEND_EVENT_EXIT: + case OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN: eventHandler->FrontendExitMultiHandler(); break;
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Scenes.cpp -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Scenes.cpp
Changed
@@ -103,7 +103,10 @@ OBSSourceAutoRelease currentScene = obs_frontend_get_current_scene(); json eventData; - eventData"sceneName" = obs_source_get_name(currentScene); + if (currentScene) + eventData"sceneName" = obs_source_get_name(currentScene); + else + eventData"sceneName" = nullptr; BroadcastEvent(EventSubscription::Scenes, "CurrentProgramSceneChanged", eventData); }
View file
obs-studio-29.1.2.tar.xz/plugins/obs-websocket/src/requesthandler/types/RequestStatus.h -> obs-studio-29.1.3.tar.xz/plugins/obs-websocket/src/requesthandler/types/RequestStatus.h
Changed
@@ -103,6 +103,19 @@ * @api enums */ UnsupportedRequestBatchExecutionType = 206, + /** + * The server is not ready to handle the request. + * + * Note: This usually occurs during OBS scene collection change or exit. Requests may be tried again after a delay if this code is given. + * + * @enumIdentifier NotReady + * @enumValue 207 + * @enumType RequestStatus + * @rpcVersion -1 + * @initialVersion 5.3.0 + * @api enums + */ + NotReady = 207, /** * A required request field is missing.
View file
obs-studio-29.1.2.tar.xz/plugins/text-freetype2/text-freetype2.c -> obs-studio-29.1.3.tar.xz/plugins/text-freetype2/text-freetype2.c
Changed
@@ -376,7 +376,10 @@ srcdata->log_lines = log_lines; vbuf_needs_update = true; } - srcdata->log_mode = chat_log_mode; + if (srcdata->log_mode != chat_log_mode) { + srcdata->log_mode = chat_log_mode; + vbuf_needs_update = true; + } if (ft2_lib == NULL) goto error;
View file
obs-studio-29.1.2.tar.xz/plugins/text-freetype2/text-functionality.c -> obs-studio-29.1.3.tar.xz/plugins/text-freetype2/text-functionality.c
Changed
@@ -140,7 +140,8 @@ next_char:; glyph_index = FT_Get_Char_Index(srcdata->font_face, srcdata->texti); - word_width += src_glyph->xadv; + if (src_glyph) + word_width += src_glyph->xadv; eos_skip:; }
View file
obs-studio-29.1.2.tar.xz/plugins/win-capture/compat-helpers.c -> obs-studio-29.1.3.tar.xz/plugins/win-capture/compat-helpers.c
Changed
@@ -145,16 +145,17 @@ const char *j_title = get_string_val(entry, "window_title"); const char *j_class = get_string_val(entry, "window_class"); - if (win_class && (match_flags & MATCH_CLASS) && - strcmp(win_class, j_class) != 0) + if ((match_flags & MATCH_CLASS) && + (!win_class || strcmp(win_class, j_class) != 0)) continue; - if (exe && (match_flags & MATCH_EXE) && - astrcmpi(exe, j_exe) != 0) + if ((match_flags & MATCH_EXE) && + (!exe || astrcmpi(exe, j_exe) != 0)) continue; /* Title supports partial matches as some games append additional * information after the title, e.g., "Minecraft 1.18". */ - if (win_title && (match_flags & MATCH_TITLE) && - astrcmpi_n(win_title, j_title, strlen(j_title)) != 0) + if ((match_flags & MATCH_TITLE) && + (!win_title || + astrcmpi_n(win_title, j_title, strlen(j_title)) != 0)) continue; /* Attempt to translate and compile message */
View file
obs-studio-29.1.2.tar.xz/plugins/win-capture/data/compatibility.json -> obs-studio-29.1.3.tar.xz/plugins/win-capture/data/compatibility.json
Changed
@@ -211,6 +211,20 @@ "window_capture_wgc": false, "message": "Edge may not be capturable using the selected Capture Method (BitBlt).", "url": "" + }, + { + "name": "Honkai: Star Rail", + "translation_key": "Compatibility.GameCapture.Admin", + "severity": 1, + "executable": "StarRail.exe", + "window_class": "", + "window_title": "", + "match_flags": 1, + "game_capture": true, + "window_capture": false, + "window_capture_wgc": false, + "message": "Honkai: Star Rail may require OBS to be run as admin to use Game Capture.", + "url": "https://obsproject.com/kb/game-capture-troubleshooting" } }
View file
obs-studio-29.1.2.tar.xz/plugins/win-capture/data/package.json -> obs-studio-29.1.3.tar.xz/plugins/win-capture/data/package.json
Changed
@@ -1,11 +1,11 @@ { "$schema": "schema/package-schema.json", "url": "https://obsproject.com/obs2_update/win-capture/v1", - "version": 1, + "version": 2, "files": { "name": "compatibility.json", - "version": 1 + "version": 2 } }
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
.