{"record":{"id":"021b0ff47a0556b1","repo":"niri-wm/niri","slug":"unknown-data-type-in-dequeue-buffer-and-render","errorCode":null,"errorMessage":"unknown data type in dequeue_buffer_and_render","messagePattern":"unknown data type in dequeue_buffer_and_render","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/screencasting/pw_utils.rs","lineNumber":1306,"sourceCode":"            let res = match (*(*spa_buffer).datas).type_ {\n                x if x == DataType::DmaBuf.as_raw() => {\n                    let dmabuf = inner_.dmabufs[&fd].clone();\n                    render_to_dmabuf(renderer, damage_tracker, dmabuf, elements, states)\n                        .map(|x| (x, SharingBuf::Dma))\n                }\n                x if x == DataType::MemFd.as_raw() => {\n                    let shmbuf = inner_.shmbufs[&fd].clone();\n\n                    let fourcc = if alpha {\n                        Fourcc::Argb8888\n                    } else {\n                        Fourcc::Xrgb8888\n                    };\n\n                    render_to_shmbuf(renderer, damage_tracker, &shmbuf, fourcc, elements, states)\n                        .map(|()| (SyncPoint::signaled(), SharingBuf::Shm(shmbuf)))\n                }\n                _ => Err(anyhow::anyhow!(\n                    \"unknown data type in dequeue_buffer_and_render\"\n                )),\n            };\n\n            drop(inner);\n            match res {\n                Ok((sync_point, buf)) => {\n                    mark_buffer_as_good(pw_buffer, &mut self.sequence_counter, buf);\n                    trace!(\"queueing buffer with seq={}\", self.sequence_counter);\n                    self.queue_after_sync(pw_buffer, sync_point);\n                    true\n                }\n                Err(err) => {\n                    warn!(\"error rendering to buffer: {err:?}\");\n                    return_unused_buffer(&self.stream, pw_buffer);\n                    false\n                }\n            }","sourceCodeStart":1288,"sourceCodeEnd":1324,"githubUrl":"https://github.com/niri-wm/niri/blob/62c230a662ac913a54fc49c86fda0406da3f3ba9/src/screencasting/pw_utils.rs#L1288-L1324","documentation":"dequeue_buffer_and_render dispatches on the buffer's DataType (Dma, MemFd, etc.). If the stored data type raw value matches none of the handled arms, the function returns this error, indicating an internal invariant violation: a buffer was queued with a data type the render path does not know how to render into.","triggerScenarios":"A pipewire stream buffer whose associated DataType raw flag is neither the DMA-BUF value nor the MemFd value at dequeue time — e.g. a new DataType variant added upstream or corrupted/never-initialized buffer state.","commonSituations":"Version skew between pipewire negotiation code and this module; buffer state initialized without a valid DataType; future datatype (e.g. new sharing mechanism) not yet handled in the match.","solutions":["Inspect the DataType stored on the failing buffer and add a matching arm to the match in dequeue_buffer_and_render","Ensure every buffer queued via add_buffer sets a supported DataType (Dma or MemFd)","Update the module to handle any newly negotiated pipewire buffer types"],"exampleFix":"// before\n_ => Err(anyhow::anyhow!(\"unknown data type in dequeue_buffer_and_render\")),\n// after\ndata_type if data_type == DataType::DmaBuf.as_raw() => { /* dma path */ }\ndata_type if data_type == DataType::MemFd.as_raw() => { /* shm path */ }\n_ => { log::warn!(\"unknown data type {data_type}, falling back to MemFd\"); /* shm path */ }","handlingStrategy":"type-guard","validationCode":"if !matches!(DataType::from_raw(buf.data_type), DataType::Dma | DataType::MemFd) {\n    // skip or requeue the buffer instead of rendering it\n}","typeGuard":"fn supported_data_type(raw: u32) -> Option<DataType> {\n    match raw {\n        x if x == DataType::Dma.as_raw() => Some(DataType::Dma),\n        x if x == DataType::MemFd.as_raw() => Some(DataType::MemFd),\n        _ => None,\n    }\n}","tryCatchPattern":"match dequeue_buffer_and_render(...) {\n    Err(e) if e.to_string().contains(\"unknown data type\") => {\n        // log raw type, drop buffer, requeue with a supported type\n    }\n    other => other?,\n}","preventionTips":["Set DataType explicitly for every buffer in add_buffer","Handle all DataType variants exhaustively with named arms instead of raw-value guards","Keep pipewire negotiation and buffer handling in version lockstep"],"tags":["pipewire","screencast","data-type"],"backgroundTag":"invalid-enum-value","analyzedSha":"62c230a662ac913a54fc49c86fda0406da3f3ba9","analyzedAt":"2026-09-19T19:48:44.526Z","contentChangedAt":"2026-09-19T19:48:44.526Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}