Hello community, here is the log from the commit of package chromium for openSUSE:Factory checked in at 2020-03-26 23:31:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/chromium (Old) and /work/SRC/openSUSE:Factory/.chromium.new.3160 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "chromium" Thu Mar 26 23:31:16 2020 rev:250 rq:788109 version:80.0.3987.149 Changes: -------- --- /work/SRC/openSUSE:Factory/chromium/chromium.changes 2020-03-24 22:30:39.201038380 +0100 +++ /work/SRC/openSUSE:Factory/.chromium.new.3160/chromium.changes 2020-03-26 23:31:19.202732704 +0100 @@ -1,0 +2,7 @@ +Mon Mar 23 16:49:16 UTC 2020 - Antonio Larrosa <alarr...@suse.com> + +- Add patch to allow building with pipewire 0.3: + * build-with-pipewire-0.3.patch +- Use pipewire in Leap 15.2 + +------------------------------------------------------------------- New: ---- build-with-pipewire-0.3.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ chromium.spec ++++++ --- /var/tmp/diff_new_pack.nugiEQ/_old 2020-03-26 23:31:27.882735838 +0100 +++ /var/tmp/diff_new_pack.nugiEQ/_new 2020-03-26 23:31:27.886735840 +0100 @@ -29,10 +29,17 @@ %bcond_without system_icu %bcond_without system_harfbuzz %bcond_without pipewire +%bcond_without pipewire0_3 %else %bcond_with system_icu %bcond_with system_harfbuzz +%if 0%{?sle_version} >= 150200 +%bcond_without pipewire +%bcond_without pipewire0_3 +%else %bcond_with pipewire +%bcond_with pipewire0_3 +%endif %endif %if 0%{?suse_version} >= 1500 %bcond_without system_libxml @@ -103,6 +110,7 @@ Patch100: chromium-vaapi.patch Patch101: old-libva.patch Patch102: chromium-vaapi-fix.patch +Patch103: build-with-pipewire-0.3.patch # PATCH-FIX-SUSE: allow prop codecs to be set with chromium branding Patch200: chromium-prop-codecs.patch BuildRequires: SDL-devel @@ -220,8 +228,12 @@ # no 32bit supported and it takes ages to build ExcludeArch: %{ix86} %{arm} ppc ppc64 ppc64le s390 s390x %if %{with pipewire} +%if %{with pipewire0_3} +BuildRequires: pkgconfig(libpipewire-0.3) +%else BuildRequires: pkgconfig(libpipewire-0.2) %endif +%endif %if %{with wayland} BuildRequires: pkgconfig(gbm) BuildRequires: pkgconfig(wayland-client) @@ -651,6 +663,9 @@ myconf_gn+=" enable_hevc_demuxing=true" %if %{with pipewire} myconf_gn+=" rtc_use_pipewire=true rtc_link_pipewire=true" +%if %{with pipewire0_3} +myconf_gn+=" rtc_use_pipewire_version=\"0.3\"" +%endif %endif # ozone stuff %if %{with wayland} ++++++ build-with-pipewire-0.3.patch ++++++ Index: chromium-80.0.3987.132/third_party/webrtc/modules/desktop_capture/BUILD.gn =================================================================== --- chromium-80.0.3987.132.orig/third_party/webrtc/modules/desktop_capture/BUILD.gn +++ chromium-80.0.3987.132/third_party/webrtc/modules/desktop_capture/BUILD.gn @@ -190,7 +190,7 @@ if (is_linux) { if (rtc_link_pipewire) { pkg_config("pipewire") { - packages = [ "libpipewire-0.2" ] + packages = [ "libpipewire-${rtc_use_pipewire_version}" ] } } else { # When libpipewire is not directly linked, use stubs to allow for dlopening of Index: chromium-80.0.3987.132/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc =================================================================== --- chromium-80.0.3987.132.orig/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +++ chromium-80.0.3987.132/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc @@ -14,8 +14,13 @@ #include <glib-object.h> #include <spa/param/format-utils.h> #include <spa/param/props.h> +#if PW_CHECK_VERSION(0, 2, 90) +#include <spa/utils/result.h> +#include <spa/utils/defs.h> +#else #include <spa/param/video/raw-utils.h> #include <spa/support/type-map.h> +#endif #include <memory> #include <utility> @@ -51,6 +56,21 @@ const char kPipeWireLib[] = "libpipewire #endif // static +#if PW_CHECK_VERSION(0, 2, 90) +void BaseCapturerPipeWire::OnCoreError(void* data, + uint32_t id, + int seq, + int res, + const char *message) { + BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data); + RTC_DCHECK(that); + + RTC_LOG(LS_WARNING) << "PipeWire core error: id:" << id << " : " << message; + + if (id == PW_ID_CORE && res == -EPIPE) + RTC_LOG(LS_WARNING) << "PipeWire core error: Pipe closed."; +}; +#else void BaseCapturerPipeWire::OnStateChanged(void* data, pw_remote_state old_state, pw_remote_state state, @@ -64,7 +84,7 @@ void BaseCapturerPipeWire::OnStateChange break; case PW_REMOTE_STATE_CONNECTED: RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; - that->CreateReceivingStream(); + that->pw_stream_ = that->CreateReceivingStream(); break; case PW_REMOTE_STATE_CONNECTING: RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; @@ -74,6 +94,7 @@ void BaseCapturerPipeWire::OnStateChange break; } } +#endif // static void BaseCapturerPipeWire::OnStreamStateChanged(void* data, @@ -87,12 +108,16 @@ void BaseCapturerPipeWire::OnStreamState case PW_STREAM_STATE_ERROR: RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; break; +#if !PW_CHECK_VERSION(0, 2, 90) case PW_STREAM_STATE_CONFIGURE: - pw_stream_set_active(that->pw_stream_, true); + pw_stream_set_active(that->pw_stream_, true); // TODO FIXME Removing this might cause problems? break; +#endif case PW_STREAM_STATE_UNCONNECTED: case PW_STREAM_STATE_CONNECTING: +#if !PW_CHECK_VERSION(0, 2, 90) case PW_STREAM_STATE_READY: +#endif case PW_STREAM_STATE_PAUSED: case PW_STREAM_STATE_STREAMING: break; @@ -100,22 +125,39 @@ void BaseCapturerPipeWire::OnStreamState } // static + + +#if PW_CHECK_VERSION(0, 2, 90) +void BaseCapturerPipeWire::OnStreamParamChanged(void* data, + uint32_t id, + const struct spa_pod* format) { +#else void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, const struct spa_pod* format) { +#endif BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data); RTC_DCHECK(that); RTC_LOG(LS_INFO) << "PipeWire stream format changed."; +#if PW_CHECK_VERSION(0, 2, 90) + if (!format || id != SPA_PARAM_Format) + return; +#else if (!format) { pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr, /*n_params=*/0); return; } +#endif that->spa_video_format_ = new spa_video_info_raw(); +#if PW_CHECK_VERSION(0, 2, 90) + spa_format_video_raw_parse(format, that->spa_video_format_); +#else spa_format_video_raw_parse(format, that->spa_video_format_, &that->pw_type_->format_video); +#endif auto width = that->spa_video_format_->size.width; auto height = that->spa_video_format_->size.height; @@ -127,6 +169,16 @@ void BaseCapturerPipeWire::OnStreamForma // Setup buffers and meta header for new format. const struct spa_pod* params[2]; +#if PW_CHECK_VERSION(0, 2, 90) + params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( + &builder, + SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, + SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int (8, 1, 32), + SPA_PARAM_BUFFERS_blocks, SPA_POD_Int (1), + SPA_PARAM_BUFFERS_size, SPA_POD_Int (size), + SPA_PARAM_BUFFERS_stride, SPA_POD_Int (stride), + SPA_PARAM_BUFFERS_align, SPA_POD_Int (16))); +#else params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object( &builder, // id to enumerate buffer requirements @@ -145,6 +197,19 @@ void BaseCapturerPipeWire::OnStreamForma // Align: memory alignment of the buffer, set as integer (i) to specified // value ":", that->pw_core_type_->param_buffers.align, "i", 16)); +#endif + + + +#if PW_CHECK_VERSION(0, 2, 90) + params[1] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( + &builder, + SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, + SPA_PARAM_META_type, SPA_POD_Id (SPA_META_Header), + SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_header)))); + + pw_stream_update_params(that->pw_stream_, params, /*n_params=*/2); +#else params[1] = reinterpret_cast<spa_pod*>(spa_pod_builder_object( &builder, // id to enumerate supported metadata @@ -157,6 +222,7 @@ void BaseCapturerPipeWire::OnStreamForma sizeof(struct spa_meta_header))); pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2); +#endif } // static @@ -183,9 +249,11 @@ BaseCapturerPipeWire::~BaseCapturerPipeW pw_thread_loop_stop(pw_main_loop_); } +#if !PW_CHECK_VERSION(0, 2, 90) if (pw_type_) { delete pw_type_; } +#endif if (spa_video_format_) { delete spa_video_format_; @@ -195,6 +263,16 @@ BaseCapturerPipeWire::~BaseCapturerPipeW pw_stream_destroy(pw_stream_); } + +#if PW_CHECK_VERSION(0, 2, 90) + if (pw_core_) { + pw_core_disconnect(pw_core_); + } + + if (pw_context_) { + pw_context_destroy(pw_context_); + } +#else if (pw_remote_) { pw_remote_destroy(pw_remote_); } @@ -202,14 +280,17 @@ BaseCapturerPipeWire::~BaseCapturerPipeW if (pw_core_) { pw_core_destroy(pw_core_); } +#endif if (pw_main_loop_) { pw_thread_loop_destroy(pw_main_loop_); } +#if !PW_CHECK_VERSION(0, 2, 90) if (pw_loop_) { pw_loop_destroy(pw_loop_); } +#endif if (current_frame_) { free(current_frame_); @@ -284,6 +365,27 @@ void BaseCapturerPipeWire::InitPipeWire( pw_init(/*argc=*/nullptr, /*argc=*/nullptr); +#if PW_CHECK_VERSION(0, 2, 90) + pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr); + + pw_context_ = pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), /*properties=*/nullptr, /*user_data_size=*/0); + if (!pw_context_) + { + RTC_LOG(LS_ERROR) << "Failed to create PipeWire context."; + portal_init_failed_ = true; + return; + } + + pw_core_ = pw_context_connect(pw_context_, nullptr, /*user_data_size=*/0); + if (!pw_core_) + { + RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context."; + portal_init_failed_ = true; + return; + } + pw_core_events_.version = PW_VERSION_CORE_EVENTS; + pw_core_events_.error = &OnCoreError; +#else pw_loop_ = pw_loop_new(/*properties=*/nullptr); pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop"); @@ -296,15 +398,30 @@ void BaseCapturerPipeWire::InitPipeWire( // Initialize event handlers, remote end and stream-related. pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS; pw_remote_events_.state_changed = &OnStateChanged; +#endif pw_stream_events_.version = PW_VERSION_STREAM_EVENTS; pw_stream_events_.state_changed = &OnStreamStateChanged; +#if PW_CHECK_VERSION(0, 2, 90) + pw_stream_events_.param_changed = &OnStreamParamChanged; +#else pw_stream_events_.format_changed = &OnStreamFormatChanged; +#endif pw_stream_events_.process = &OnStreamProcess; +#if PW_CHECK_VERSION(0, 2, 90) + pw_core_add_listener (pw_core_, + &pw_core_listener_, + &pw_core_events_, + this); + pw_stream_ = CreateReceivingStream (); + if (!pw_stream_) + return; +#else pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_, this); pw_remote_connect_fd(pw_remote_, pw_fd_); +#endif if (pw_thread_loop_start(pw_main_loop_) < 0) { RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop"; @@ -314,6 +431,7 @@ void BaseCapturerPipeWire::InitPipeWire( RTC_LOG(LS_INFO) << "PipeWire remote opened."; } +#if !PW_CHECK_VERSION(0, 2, 90) void BaseCapturerPipeWire::InitPipeWireTypes() { spa_type_map* map = pw_core_type_->map; pw_type_ = new PipeWireType(); @@ -323,23 +441,41 @@ void BaseCapturerPipeWire::InitPipeWireT spa_type_format_video_map(map, &pw_type_->format_video); spa_type_video_format_map(map, &pw_type_->video_format); } +#endif -void BaseCapturerPipeWire::CreateReceivingStream() { - spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; +pw_stream *BaseCapturerPipeWire::CreateReceivingStream() { + spa_rectangle pwMinScreenBounds = SPA_RECTANGLE(1, 1); spa_rectangle pwScreenBounds = - spa_rectangle{static_cast<uint32_t>(desktop_size_.width()), - static_cast<uint32_t>(desktop_size_.height())}; + SPA_RECTANGLE(static_cast<uint32_t>(desktop_size_.width()), + static_cast<uint32_t>(desktop_size_.height())); + + spa_fraction pwFrameRateMin = SPA_FRACTION(0, 1); + spa_fraction pwFrameRateMax = SPA_FRACTION(60, 1); - spa_fraction pwFrameRateMin = spa_fraction{0, 1}; - spa_fraction pwFrameRateMax = spa_fraction{60, 1}; pw_properties* reuseProps = pw_properties_new_string("pipewire.client.reuse=1"); - pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); +#if PW_CHECK_VERSION(0, 2, 90) + pw_stream *stream = pw_stream_new(pw_core_, "webrtc-consume-stream", reuseProps); +#else + pw_stream *stream = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); +#endif uint8_t buffer[1024] = {}; const spa_pod* params[1]; spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)}; +#if PW_CHECK_VERSION(0, 2, 90) + params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_add_object( + &builder, + // id to enumerate formats + SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, + SPA_FORMAT_mediaType, SPA_POD_Id (SPA_MEDIA_TYPE_video), + SPA_FORMAT_mediaSubtype, SPA_POD_Id (SPA_MEDIA_SUBTYPE_raw), + SPA_FORMAT_VIDEO_format, SPA_POD_Id (SPA_VIDEO_FORMAT_BGRx), + SPA_FORMAT_VIDEO_size, SPA_POD_CHOICE_RANGE_Rectangle(&pwScreenBounds, &pwMinScreenBounds, &pwScreenBounds), + SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction(&pwFrameRateMin), + SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction(&pwFrameRateMax, &pwFrameRateMin, &pwFrameRateMax))); +#else params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object( &builder, // id to enumerate formats @@ -364,19 +500,28 @@ void BaseCapturerPipeWire::CreateReceivi // min and max values and it is undecided (u) to allow negotiation ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2, &pwFrameRateMin, &pwFrameRateMax)); - - pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, + pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, this); +#endif + pw_stream_flags flags = static_cast<pw_stream_flags>( PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE | PW_STREAM_FLAG_MAP_BUFFERS); - if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr, + +#if PW_CHECK_VERSION(0, 2, 90) + if (pw_stream_connect(stream, PW_DIRECTION_INPUT, PW_ID_ANY, + flags, params, + /*n_params=*/1) != 0) { +#else + if (pw_stream_connect(stream, PW_DIRECTION_INPUT, /*port_path=*/nullptr, flags, params, /*n_params=*/1) != 0) { +#endif RTC_LOG(LS_ERROR) << "Could not connect receiving stream."; portal_init_failed_ = true; - return; } + + return stream; } void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { @@ -404,7 +549,11 @@ void BaseCapturerPipeWire::HandleBuffer( // If both sides decided to go with the RGBx format we need to convert it to // BGRx to match color format expected by WebRTC. +#if PW_CHECK_VERSION(0, 2, 90) + if (spa_video_format_->format == SPA_VIDEO_FORMAT_RGBx) { +#else if (spa_video_format_->format == pw_type_->video_format.RGBx) { +#endif uint8_t* tempFrame = static_cast<uint8_t*>(malloc(maxSize)); std::memcpy(tempFrame, src, maxSize); ConvertRGBxToBGRx(tempFrame, maxSize); Index: chromium-80.0.3987.132/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h =================================================================== --- chromium-80.0.3987.132.orig/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +++ chromium-80.0.3987.132/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h @@ -22,6 +22,7 @@ namespace webrtc { +#if !PW_CHECK_VERSION(0, 2, 90) class PipeWireType { public: spa_type_media_type media_type; @@ -29,6 +30,7 @@ class PipeWireType { spa_type_format_video format_video; spa_type_video_format video_format; }; +#endif class BaseCapturerPipeWire : public DesktopCapturer { public: @@ -45,6 +47,18 @@ class BaseCapturerPipeWire : public Desk private: // PipeWire types --> +#if PW_CHECK_VERSION(0, 2, 90) + pw_context* pw_context_ = nullptr; + pw_core* pw_core_ = nullptr; + pw_stream* pw_stream_ = nullptr; + pw_thread_loop* pw_main_loop_ = nullptr; + + spa_hook pw_core_listener_ = {}; + spa_hook spa_stream_listener_ = {}; + + pw_core_events pw_core_events_ = {}; + pw_stream_events pw_stream_events_ = {}; +#else pw_core* pw_core_ = nullptr; pw_type* pw_core_type_ = nullptr; pw_stream* pw_stream_ = nullptr; @@ -58,6 +72,7 @@ class BaseCapturerPipeWire : public Desk pw_stream_events pw_stream_events_ = {}; pw_remote_events pw_remote_events_ = {}; +#endif spa_video_info_raw* spa_video_format_ = nullptr; @@ -89,23 +104,38 @@ class BaseCapturerPipeWire : public Desk void InitPortal(); void InitPipeWire(); +#if !PW_CHECK_VERSION(0, 2, 90) void InitPipeWireTypes(); +#endif - void CreateReceivingStream(); + pw_stream *CreateReceivingStream(); void HandleBuffer(pw_buffer* buffer); void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size); +#if PW_CHECK_VERSION(0, 2, 90) + static void OnCoreError(void* data, + uint32_t id, + int seq, + int res, + const char *message); +#else static void OnStateChanged(void* data, pw_remote_state old_state, pw_remote_state state, const char* error); +#endif static void OnStreamStateChanged(void* data, pw_stream_state old_state, pw_stream_state state, const char* error_message); +#if PW_CHECK_VERSION(0, 2, 90) + static void OnStreamParamChanged(void* data, uint32_t id, const struct spa_pod* format); +#else static void OnStreamFormatChanged(void* data, const struct spa_pod* format); +#endif + static void OnStreamProcess(void* data); static void OnNewBuffer(void* data, uint32_t id); Index: chromium-80.0.3987.132/third_party/webrtc/webrtc.gni =================================================================== --- chromium-80.0.3987.132.orig/third_party/webrtc/webrtc.gni +++ chromium-80.0.3987.132/third_party/webrtc/webrtc.gni @@ -114,6 +114,9 @@ declare_args() { # supported Ubuntu and Debian distributions. rtc_use_pipewire = is_desktop_linux && use_sysroot + # Sets the pipewire pkg-config version to use if rtc_use_pipewire is true + rtc_use_pipewire_version = "0.2" + # Set this to link PipeWire directly instead of using the dlopen. rtc_link_pipewire = false