Skip to content

Kooha cannot record screen in niri compositor #372

@ffs-akl

Description

@ffs-akl

Affected version
kooha 2.3.1-2

Bug summary
Kooha fails to record

the output message under Fullscrenn mode kooha 2026-03-21T04:56:17.881660Z INFO kooha::application: Kooha (io.github.seadve.Kooha) 2026-03-21T04:56:17.881675Z INFO kooha::application: Version: 2.3.1 () 2026-03-21T04:56:17.881698Z INFO kooha::application: Datadir: /usr/share/kooha 2026-03-21T04:56:32.173420Z ERROR kooha::window: Failed to start recording Caused by: 0: Failed to initialize pipeline state to playing 1: Element failed to change its state
the output message under Area mode kooha 2026-03-21T04:52:32.689426Z INFO kooha::application: Kooha (io.github.seadve.Kooha) 2026-03-21T04:52:32.689441Z INFO kooha::application: Version: 2.3.1 () 2026-03-21T04:52:32.689464Z INFO kooha::application: Datadir: /usr/share/kooha 2026-03-21T04:52:42.734995Z ERROR kooha::window: Element failed to change its state 2026-03-21T04:52:42.754791Z ERROR kooha::area_selector: Received error message on bus: Error { structure: Some(GstMessageError { gerror: (GError) ((GError*) 0x7fc3440047d0), debug: (gchararray) "../pipewire/src/gst/gstpipewiresrc.c(929): on_state_changed (): /GstPipeline:pipeline0/GstBin:kooha-pipewiresrc-bin/GstPipeWireSrc:pipewiresrc0" }), source: Some((Object { inner: TypedObjectRef { inner: 0x55c31327bb10, type: GstPipeWireSrc } }, "pipewiresrc0")), error: Error { domain: gst-resource-error-quark, code: 1, message: "stream error: no more input formats" }, debug: Some("../pipewire/src/gst/gstpipewiresrc.c(929): on_state_changed (): /GstPipeline:pipeline0/GstBin:kooha-pipewiresrc-bin/GstPipeWireSrc:pipewiresrc0"), details: None }
GST_DEBUG=3 kooha GST_DEBUG=3 kooha 2026-03-21T14:59:30.417372Z INFO kooha::application: Kooha (io.github.seadve.Kooha) 2026-03-21T14:59:30.417386Z INFO kooha::application: Version: 2.3.1 () 2026-03-21T14:59:30.417390Z INFO kooha::application: Datadir: /usr/share/kooha 0:00:05.310185850 8717 8754 FIXME default gstutils.c:4213:gst_element_decorate_stream_id_internal: Creating random stream-id, consider implementing a deterministic way of creating a stream-id 0:00:05.356384616 8717 8752 WARN pipewiresrc gstpipewiresrc.c:929:on_state_changed: error: stream error: no more input formats 0:00:05.356477843 8717 8754 WARN basesrc gstbasesrc.c:3187:gst_base_src_loop: error: Internal data stream error. 0:00:05.357141970 8717 8754 WARN basesrc gstbasesrc.c:3187:gst_base_src_loop: error: streaming stopped, reason not-negotiated (-4) 2026-03-21T14:59:35.763485Z ERROR kooha::window: Failed to start recording

Caused by:
0: Failed to initialize pipeline state to playing
1: Element failed to change its state

Steps to reproduce

Expected behavior
I expect Kooha to be able to record the screen in a niri session just as OBS Studio does.

obs output message on fullscreen mode

debug: Found portal inhibitor
debug: Attempted path: /usr/bin/../share/obs/obs-studio/locale/en-US.ini
debug: Attempted path: /usr/bin/../share/obs/obs-studio/locale.ini
debug: Attempted path: /usr/bin/../share/obs/obs-studio/themes
debug: Attempted path: /usr/bin/../share/obs/obs-studio/themes/
info: Platform: Wayland
info: CPU Name: Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz
info: CPU Speed: 2998.495MHz
info: Physical Cores: 4, Logical Cores: 4
info: Physical Memory: 11867MB Total, 7574MB Free
info: Kernel Version: Linux 6.19.8-arch1-1
info: Distribution: "Arch Linux" Unknown
info: Desktop Environment: niri (niri)
info: Session Type: wayland
info: Current Date/Time: 2026-03-21, 03:25:19 PM
info: Browser Hardware Acceleration: true
info: Qt Version: 6.10.2 (runtime), 6.10.2 (compiled)
info: Portable mode: false
info: OBS 32.1.0 (linux)
info: ---------------------------------
info: ---------------------------------
info: audio settings reset:
samples per sec: 48000
speakers: 2
max buffering: 960 milliseconds
buffering type: dynamically increasing
info: ---------------------------------
info: Initializing OpenGL...
info: Using EGL/Wayland
info: Initialized EGL 1.5
info: Loading up OpenGL on adapter Intel Mesa Intel(R) HD Graphics 530 (SKL GT2)
info: OpenGL loaded successfully, version 4.6 (Core Profile) Mesa 26.0.3-arch1.1, shading language 4.60
info: ---------------------------------
info: video settings reset:
base resolution: 1920x1080
output resolution: 1280x720
downscale filter: Bicubic
fps: 30/1
format: NV12
YUV mode: Rec. 709/Partial
info: NV12 texture support enabled
info: P010 texture support not available
info: Audio monitoring device:
name: Default
id: default
info: ---------------------------------
warning: Failed to load 'en-US' text for module: 'decklink-captions.so'
warning: Failed to load 'en-US' text for module: 'decklink-output-ui.so'
libDeckLinkAPI.so: cannot open shared object file: No such file or directory
warning: A DeckLink iterator could not be created. The DeckLink drivers may not be installed
warning: Failed to initialize module 'decklink.so'
info: [pipewire] Available capture sources:
info: [pipewire] - Monitor source
info: [pipewire] - Window source
warning: v4l2loopback not installed, virtual camera not registered
info: VAAPI: API version 1.23
info: FFmpeg VAAPI H264 encoding supported
info: FFmpeg VAAPI AV1 encoding not supported
info: FFmpeg VAAPI HEVC encoding supported
error: os_dlopen(libnvidia-encode.so.1->libnvidia-encode.so.1): libnvidia-encode.so.1: cannot open shared object file: No such file or directory

info: NVENC not supported
warning: Failed to initialize module 'obs-nvenc.so'
info: [obs-websocket] [obs_module_load] you can haz websockets (Version: 5.7.2 | RPC Version: 1)
info: [obs-websocket] [obs_module_load] Qt version (compile-time): 6.10.2 | Qt version (run-time): 6.10.2
info: [obs-websocket] [obs_module_load] Linked ASIO Version: 103600
info: [obs-websocket] [obs_module_load] Module loaded.
info: ---------------------------------
info: Loaded Modules:
info: text-freetype2.so
info: rtmp-services.so
info: obs-x264.so
info: obs-websocket.so
info: obs-webrtc.so
info: obs-vst.so
info: obs-transitions.so
info: obs-qsv11.so
info: obs-outputs.so
info: obs-libfdk.so
info: obs-filters.so
info: obs-ffmpeg.so
info: linux-v4l2.so
info: linux-pulseaudio.so
info: linux-pipewire.so
info: linux-jack.so
info: linux-capture.so
info: linux-alsa.so
info: image-source.so
info: frontend-tools.so
info: decklink-output-ui.so
info: decklink-captions.so
info: ---------------------------------
info: ---------------------------------
info: Available Encoders:
info: Video Encoders:
info: - ffmpeg_svt_av1 (SVT-AV1)
info: - ffmpeg_aom_av1 (AOM AV1)
info: - ffmpeg_vaapi_tex (FFmpeg VAAPI H.264)
info: - hevc_ffmpeg_vaapi_tex (FFmpeg VAAPI HEVC)
info: - obs_qsv11_v2 (QuickSync H.264)
info: - obs_qsv11_hevc (QuickSync HEVC)
info: - obs_x264 (x264)
info: Audio Encoders:
info: - ffmpeg_aac (FFmpeg AAC)
info: - ffmpeg_opus (FFmpeg Opus)
info: - ffmpeg_pcm_s16le (FFmpeg PCM (16-bit))
info: - ffmpeg_pcm_s24le (FFmpeg PCM (24-bit))
info: - ffmpeg_pcm_f32le (FFmpeg PCM (32-bit float))
info: - ffmpeg_alac (FFmpeg ALAC (24-bit))
info: - ffmpeg_flac (FFmpeg FLAC (16-bit))
info: - libfdk_aac (libfdk AAC)
info: ==== Startup complete ===============================================
warning: Failed to register with host portal QDBusError("org.freedesktop.portal.Error.Failed", "Could not register app ID: Connection already associated with an application ID")
info: All scene data cleared
info: ------------------------------------------------
info: Device for 'Audio Output Capture' source Desktop Audio is also used for audio monitoring.
Deduplication logic is being applied to all monitored sources.
info: pulse-input: Server name: 'PulseAudio (on PipeWire 1.6.2) 15.0.0'
info: pulse-input: Audio format: s32le, 48000 Hz, 2 channels
info: pulse-input: Started recording from 'alsa_output.pci-0000_00_1f.3.analog-stereo.monitor' (default)
info: [Loaded global audio device]: 'Desktop Audio'
info: pulse-input: Server name: 'PulseAudio (on PipeWire 1.6.2) 15.0.0'
info: pulse-input: Audio format: s32le, 48000 Hz, 2 channels
info: pulse-input: Started recording from 'alsa_input.pci-0000_00_1f.3.analog-stereo' (default)
info: [Loaded global audio device]: 'Micphone/Aux'
info: Switched to scene 'Scene 1'
info: ------------------------------------------------
info: Loaded scenes:
info: - scene 'Scene 1':
info: ------------------------------------------------
info: Device for 'Audio Output Capture' source Desktop Audio is also used for audio monitoring.
Deduplication logic is being applied to all monitored sources.
info: adding 21 milliseconds of audio buffering, total audio buffering is now 21 milliseconds (source: Desktop Audio)

info: PipeWire initialized
info: User added source 'Screen Capture (PipeWire)' (pipewire-screen-capture-source) to scene 'Scene 1'
warning: virtual void QtWaylandClient::QWaylandTextInputv3::disableSurface(wl_surface*) Try to disable surface 0x559a0222fac0 with focusing surface 0x559a0421ad80
info: [pipewire] Screencast session created
info: [pipewire] Asking for monitor and window
info: [pipewire] source selected, setting up screencast
info: [pipewire] Server version: 1.6.2
info: [pipewire] Library version: 1.6.2
info: [pipewire] Header version: 1.6.1
info: [pipewire] Created stream 0x559a041bfa20
info: [pipewire] Stream 0x559a041bfa20 state: "connecting" (error: none)
info: [pipewire] Playing stream 0x559a041bfa20
info: [pipewire] Stream 0x559a041bfa20 state: "paused" (error: none)
info: [pipewire] Negotiated format:
info: [pipewire] Format: 8 (Spa:Enum:VideoFormat:BGRx)
info: [pipewire] Modifier: 0x0
info: [pipewire] Size: 1920x1080
info: [pipewire] Framerate: 0/1
info: [pipewire] Negotiated format:
info: [pipewire] Format: 8 (Spa:Enum:VideoFormat:BGRx)
info: [pipewire] Modifier: 0x100000000000004
info: [pipewire] Size: 1920x1080
info: [pipewire] Framerate: 0/1
info: [pipewire] Stream 0x559a041bfa20 state: "streaming" (error: none)
info: ---------------------------------
info: [x264 encoder: 'simple_video_stream'] preset: veryfast
info: [x264 encoder: 'simple_video_stream'] settings:
rate_control: CBR
bitrate: 6000
buffer size: 6000
crf: 23
fps_num: 30
fps_den: 1
width: 1280
height: 720
keyint: 250

info: libfdk_aac encoder created
info: libfdk_aac bitrate: 160, channels: 2
info: ==== Recording Start ===============================================
info: [mp4 output: 'simple_file_output'] Writing Hybrid MP4/MOV file '/home/knm/2026-03-21 15-26-17.mp4'...
info: [mp4 muxer: 'simple_file_output'] Flushing final fragment...
info: [mp4 muxer: 'simple_file_output'] Number of fragments: 1
info: [mp4 muxer: 'simple_file_output'] Full moov size: 3 KiB
info: [mp4 muxer: 'simple_file_output'] Final mdat size: 2210 KiB
info: Output 'simple_file_output': stopping
info: Output 'simple_file_output': Total frames output: 93
info: Output 'simple_file_output': Total drawn frames: 113
info: [mp4 output: 'simple_file_output'] Waiting for file writer to finish...
info: [mp4 output: 'simple_file_output'] File output complete. Finalization took 16 ms.
info: ==== Recording Stop ================================================
info: libfdk_aac encoder destroyed
info: ==== Shutting down ==================================================
info: pulse-input: Stopped recording from 'alsa_output.pci-0000_00_1f.3.analog-stereo.monitor'
info: pulse-input: Got 2535 packets with 3042000 frames
info: Deduplication logic stopped.
info: pulse-input: Stopped recording from 'alsa_input.pci-0000_00_1f.3.analog-stereo'
info: pulse-input: Got 2533 packets with 3039600 frames
info: [pipewire] Stream 0x559a041bfa20 state: "paused" (error: none)
info: [pipewire] Stream 0x559a041bfa20 state: "unconnected" (error: none)
info: All scene data cleared
info: ------------------------------------------------
error: Tried to call obs_frontend_remove_event_callback with no callbacks!
info: [obs-websocket] [obs_module_unload] Shutting down...
error: Tried to call obs_frontend_remove_event_callback with no callbacks!
info: [obs-websocket] [obs_module_unload] Finished shutting down.
info: [Scripting] Total detached callbacks: 0
info: Freeing OBS context data
info: == Profiler Results =============================
info: run_program_init: 722.127 ms
info: ┣OBSApp::AppInit: 26.904 ms
info: ┃ ┗OBSApp::InitLocale: 1.202 ms
info: ┗OBSApp::OBSInit: 669.946 ms
info: ┣obs_startup: 2.475 ms
info: ┗OBSBasic::OBSInit: 615.955 ms
info: ┣OBSBasic::InitBasicConfig: 0.7 ms
info: ┣OBSBasic::ResetAudio: 0.585 ms
info: ┣OBSBasic::ResetVideo: 129.756 ms
info: ┃ ┗obs_init_graphics: 125.239 ms
info: ┃ ┗shader compilation: 41.403 ms
info: ┣OBSBasic::InitOBSCallbacks: 0.004 ms
info: ┣OBSBasic::InitHotkeys: 0.025 ms
info: ┣obs_load_all_modules2: 253.053 ms
info: ┃ ┣obs_init_module(decklink-captions.so): 0 ms
info: ┃ ┣obs_init_module(decklink-output-ui.so): 0 ms
info: ┃ ┣obs_init_module(decklink.so): 0.136 ms
info: ┃ ┣obs_init_module(frontend-tools.so): 131.345 ms
info: ┃ ┣obs_init_module(image-source.so): 0.007 ms
info: ┃ ┣obs_init_module(linux-alsa.so): 0.001 ms
info: ┃ ┣obs_init_module(linux-capture.so): 0 ms
info: ┃ ┣obs_init_module(linux-jack.so): 0.001 ms
info: ┃ ┣obs_init_module(linux-pipewire.so): 19.242 ms
info: ┃ ┣obs_init_module(linux-pulseaudio.so): 0.002 ms
info: ┃ ┣obs_init_module(linux-v4l2.so): 5.215 ms
info: ┃ ┣obs_init_module(obs-ffmpeg.so): 7.302 ms
info: ┃ ┣obs_init_module(obs-filters.so): 0.02 ms
info: ┃ ┣obs_init_module(obs-libfdk.so): 0.001 ms
info: ┃ ┣obs_init_module(obs-nvenc.so): 0.137 ms
info: ┃ ┃ ┗nvenc_check: 0.109 ms
info: ┃ ┣obs_init_module(obs-outputs.so): 0.003 ms
info: ┃ ┣obs_init_module(obs-qsv11.so): 4.198 ms
info: ┃ ┣obs_init_module(obs-transitions.so): 0.007 ms
info: ┃ ┣obs_init_module(obs-vst.so): 0.002 ms
info: ┃ ┣obs_init_module(obs-webrtc.so): 0.003 ms
info: ┃ ┣obs_init_module(obs-websocket.so): 5.242 ms
info: ┃ ┣obs_init_module(obs-x264.so): 0.001 ms
info: ┃ ┣obs_init_module(rtmp-services.so): 0.228 ms
info: ┃ ┗obs_init_module(text-freetype2.so): 0.008 ms
info: ┣OBSBasic::InitService: 2.753 ms
info: ┣OBSBasic::ResetOutputs: 0.139 ms
info: ┣OBSBasic::CreateHotkeys: 0.023 ms
info: ┣OBSBasic::InitPrimitives: 0.134 ms
info: ┗OBSBasic::Load: 136.889 ms
info: obs_hotkey_thread(25 ms): min=0 ms, median=0.001 ms, max=0.025 ms, 99th percentile=0.002 ms, 100% below 25 ms
info: audio_thread(Audio): min=0.009 ms, median=0.106 ms, max=10.828 ms, 99th percentile=0.388 ms
info: ┗receive_audio: min=0.003 ms, median=0.215 ms, max=10.698 ms, 99th percentile=0.713 ms, 0.0596071 calls per parent call
info: ┣buffer_audio: min=0.001 ms, median=0.002 ms, max=0.01 ms, 99th percentile=0.006 ms
info: ┗do_encode: min=0.082 ms, median=0.211 ms, max=10.692 ms, 99th percentile=0.708 ms
info: ┣encode(simple_aac): min=0.079 ms, median=0.2 ms, max=0.697 ms, 99th percentile=0.3 ms
info: ┗send_packet: min=0.002 ms, median=0.008 ms, max=10.426 ms, 99th percentile=0.209 ms
info: obs_graphics_thread(33.3333 ms): min=0.102 ms, median=0.737 ms, max=31.047 ms, 99th percentile=2.691 ms, 100% below 33.333 ms
info: ┣tick_sources: min=0 ms, median=0.014 ms, max=30.815 ms, 99th percentile=0.028 ms
info: ┣output_frame: min=0.071 ms, median=0.26 ms, max=5.747 ms, 99th percentile=1.149 ms
info: ┃ ┣gs_context(video->graphics): min=0.071 ms, median=0.259 ms, max=5.746 ms, 99th percentile=0.768 ms
info: ┃ ┃ ┣render_video: min=0.012 ms, median=0.049 ms, max=5.284 ms, 99th percentile=0.285 ms
info: ┃ ┃ ┃ ┣render_main_texture: min=0.01 ms, median=0.043 ms, max=0.256 ms, 99th percentile=0.153 ms
info: ┃ ┃ ┃ ┣render_output_texture: min=0.014 ms, median=0.032 ms, max=2.48 ms, 99th percentile=0.066 ms, 0.0594369 calls per parent call
info: ┃ ┃ ┃ ┣render_convert_texture: min=0.022 ms, median=0.046 ms, max=1.807 ms, 99th percentile=0.09 ms, 0.0594369 calls per parent call
info: ┃ ┃ ┃ ┗stage_output_texture: min=0.015 ms, median=0.032 ms, max=0.856 ms, 99th percentile=0.06 ms, 0.0594369 calls per parent call
info: ┃ ┃ ┣gs_flush: min=0.046 ms, median=0.174 ms, max=1.104 ms, 99th percentile=0.404 ms
info: ┃ ┃ ┗download_frame: min=0 ms, median=0.156 ms, max=0.35 ms, 99th percentile=0.205 ms, 0.0594369 calls per parent call
info: ┃ ┗output_video_data: min=0.142 ms, median=0.322 ms, max=3.674 ms, 99th percentile=3.55 ms, 0.0589155 calls per parent call
info: ┗render_displays: min=0.006 ms, median=0.404 ms, max=4.83 ms, 99th percentile=1.241 ms
info: video_thread(video): min=1.226 ms, median=2.878 ms, max=18.633 ms, 99th percentile=6.033 ms
info: ┗receive_video: min=1.224 ms, median=2.876 ms, max=18.63 ms, 99th percentile=6.031 ms
info: ┗do_encode: min=1.223 ms, median=2.874 ms, max=18.629 ms, 99th percentile=6.029 ms
info: ┣encode(simple_video_stream): min=1.101 ms, median=2.719 ms, max=5.769 ms, 99th percentile=5.696 ms
info: ┗send_packet: min=0.007 ms, median=0.115 ms, max=16.365 ms, 99th percentile=16.365 ms, 0.831858 calls per parent call
info: =================================================
info: == Profiler Time Between Calls ==================
info: obs_hotkey_thread(25 ms): min=25.029 ms, median=25.133 ms, max=27.555 ms, 99.3723% within ±2% of 25 ms (0% lower, 0.627697% higher)
info: obs_graphics_thread(33.3333 ms): min=31.624 ms, median=33.34 ms, max=34.987 ms, 99.8957% within ±2% of 33.333 ms (0.0521648% lower, 0.0521648% higher)
info: =================================================
info: Number of memory leaks: 0

R-2026-03-21T07-41-02.mp4

Relevant logs, screenshots, screencasts, etc.

R-2026-03-21T07-18-50.mp4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions