# calegix-net/mumble-video architecture

> Architecture diagram of the GitHub repository calegix-net/mumble-video, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/calegix-net/mumble-video
- Repository: https://github.com/calegix-net/mumble-video

## Overview

Mumble Video is a voice-chat client/server fork adding opt-in camera, screen, and share-audio streams. The main workflow is capture and encode on a client, transport through the video protocol, permissioned subscription and relay on the server, then reassembly, decode, and playback/rendering for viewers. The README documents these relationships and major capabilities; some server routing and platform capture implementations are unsampled or absent from the supplied tree, so those nodes use supported enclosing-directory paths and are not expanded beyond documented behavior.

Main entry points: [`src/murmur/Server.cpp`](https://github.com/calegix-net/mumble-video/blob/main/src/murmur/Server.cpp) (Murmur server), [`src/mumble/VideoStreamDispatcher.cpp`](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoStreamDispatcher.cpp) (Stream dispatcher), [`src/mumble/VideoBroadcaster.cpp`](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoBroadcaster.cpp) (Video broadcaster), [`src/mumble/VpxCodec.cpp`](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VpxCodec.cpp) (Video codecs)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Sharing client"]
  node_picker["Share picker"]
  node_camera["Camera capture"]
  node_screens["Screen capture"]
  node_shareaudio["Share audio capture"]
end

subgraph group_media["Media pipeline"]
  node_broadcaster["Video broadcaster"]
  node_audiobroadcaster["Audio broadcaster"]
  node_codec["Video codecs<br/>[VpxCodec.cpp]"]
  node_fragment["Fragmentation"]
  node_transport["Video transport<br/>[VideoTransport.h]"]
end

subgraph group_server["Server routing"]
  node_server["Murmur server<br/>[Server.cpp]"]
  node_router["Video router"]
  node_acl["ACL permissions<br/>[ACL.h]"]
end

subgraph group_viewer["Viewer client"]
  node_dispatcher["Stream dispatcher"]
  node_reassembly["Reassembly"]
  node_grid["Video grid<br/>[VideoGrid.cpp]"]
  node_audioout["Share audio playback"]
end

subgraph group_state["Server state"]
  node_db[("Server database<br/>[ServerDatabase.cpp]")]
end

node_user(("User"))

node_user -->|"selects share"| node_picker
node_picker -->|"chooses source"| node_screens
node_user -->|"starts camera"| node_camera
node_camera -->|"frames"| node_broadcaster
node_screens -->|"frames"| node_broadcaster
node_user -->|"chooses audio"| node_shareaudio
node_shareaudio -->|"audio input"| node_audiobroadcaster
node_broadcaster -->|"encodes video"| node_codec
node_codec -->|"video units"| node_fragment
node_fragment -->|"fragments units"| node_transport
node_audiobroadcaster -->|"sends share audio"| node_transport
node_transport -->|"UDP datagrams"| node_server
node_server -->|"routes streams"| node_router
node_router -->|"checks privileges"| node_acl
node_server -.->|"persists server state"| node_db
node_server -->|"relays streams"| node_dispatcher
node_dispatcher -.->|"hands off units"| node_reassembly
node_reassembly -->|"reassembled frames"| node_grid
node_grid -->|"decodes video"| node_codec
node_dispatcher -->|"dispatches share audio"| node_audioout

click node_picker "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/ScreenSharePickerDialog.cpp"
click node_camera "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/CameraVideoSource.cpp"
click node_screens "https://github.com/calegix-net/mumble-video/tree/main/src/mumble"
click node_shareaudio "https://github.com/calegix-net/mumble-video/tree/main/src/mumble"
click node_broadcaster "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoBroadcaster.cpp"
click node_audiobroadcaster "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/ScreenAudioBroadcaster.cpp"
click node_codec "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VpxCodec.cpp"
click node_fragment "https://github.com/calegix-net/mumble-video/blob/main/src/mumble-core/VideoFragmentation.cpp"
click node_transport "https://github.com/calegix-net/mumble-video/blob/main/src/mumble-core/VideoTransport.h"
click node_server "https://github.com/calegix-net/mumble-video/blob/main/src/murmur/Server.cpp"
click node_router "https://github.com/calegix-net/mumble-video/tree/main/src/murmur"
click node_acl "https://github.com/calegix-net/mumble-video/blob/main/src/ACL.h"
click node_db "https://github.com/calegix-net/mumble-video/blob/main/src/murmur/database/ServerDatabase.cpp"
click node_dispatcher "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoStreamDispatcher.cpp"
click node_reassembly "https://github.com/calegix-net/mumble-video/blob/main/src/mumble-core/VideoFragmentation.cpp"
click node_grid "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoGrid.cpp"
click node_audioout "https://github.com/calegix-net/mumble-video/blob/main/src/mumble/AudioOutputScreenShare.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_picker,node_camera,node_screens,node_shareaudio,node_user toneBlue
class node_broadcaster,node_audiobroadcaster,node_codec,node_fragment,node_transport toneAmber
class node_server,node_router,node_acl toneMint
class node_dispatcher,node_reassembly,node_grid,node_audioout toneRose
class node_db toneIndigo
```

## Components

### Sharing client

- [Share picker](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/ScreenSharePickerDialog.cpp): `src/mumble/ScreenSharePickerDialog.cpp`
- [Camera capture](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/CameraVideoSource.cpp): `src/mumble/CameraVideoSource.cpp`
- [Screen capture](https://github.com/calegix-net/mumble-video/tree/main/src/mumble): `src/mumble`
- [Share audio capture](https://github.com/calegix-net/mumble-video/tree/main/src/mumble): `src/mumble`

### Media pipeline

- [Video broadcaster](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoBroadcaster.cpp): `src/mumble/VideoBroadcaster.cpp`
- [Audio broadcaster](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/ScreenAudioBroadcaster.cpp): `src/mumble/ScreenAudioBroadcaster.cpp`
- [Video codecs](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VpxCodec.cpp): `src/mumble/VpxCodec.cpp`
- [Fragmentation](https://github.com/calegix-net/mumble-video/blob/main/src/mumble-core/VideoFragmentation.cpp): `src/mumble-core/VideoFragmentation.cpp`
- [Video transport](https://github.com/calegix-net/mumble-video/blob/main/src/mumble-core/VideoTransport.h): `src/mumble-core/VideoTransport.h`

### Server routing

- [Murmur server](https://github.com/calegix-net/mumble-video/blob/main/src/murmur/Server.cpp): `src/murmur/Server.cpp`
- [Video router](https://github.com/calegix-net/mumble-video/tree/main/src/murmur): `src/murmur`
- [ACL permissions](https://github.com/calegix-net/mumble-video/blob/main/src/ACL.h): `src/ACL.h`

### Viewer client

- [Stream dispatcher](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoStreamDispatcher.cpp): `src/mumble/VideoStreamDispatcher.cpp`
- [Reassembly](https://github.com/calegix-net/mumble-video/blob/main/src/mumble-core/VideoFragmentation.cpp): `src/mumble-core/VideoFragmentation.cpp`
- [Video grid](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/VideoGrid.cpp): `src/mumble/VideoGrid.cpp`
- [Share audio playback](https://github.com/calegix-net/mumble-video/blob/main/src/mumble/AudioOutputScreenShare.cpp): `src/mumble/AudioOutputScreenShare.cpp`

### Server state

- [Server database](https://github.com/calegix-net/mumble-video/blob/main/src/murmur/database/ServerDatabase.cpp): `src/murmur/database/ServerDatabase.cpp`

### Other components

- **User**

## Connections

- User → Share picker: selects share (evidence: `README.md`)
- Share picker → Screen capture: chooses source (evidence: `README.md`)
- User → Camera capture: starts camera (evidence: `README.md`)
- Camera capture → Video broadcaster: frames (evidence: `README.md`)
- Screen capture → Video broadcaster: frames (evidence: `README.md`)
- User → Share audio capture: chooses audio (evidence: `README.md`)
- Share audio capture → Audio broadcaster: audio input (evidence: `README.md`)
- Video broadcaster → Video codecs: encodes video (evidence: `README.md`)
- Video codecs → Fragmentation: video units (evidence: `README.md`)
- Fragmentation → Video transport: fragments units (evidence: `README.md`)
- Audio broadcaster → Video transport: sends share audio (evidence: `README.md`)
- Video transport → Murmur server: UDP datagrams (evidence: `README.md`)
- Murmur server → Video router: routes streams (evidence: `README.md`)
- Video router → ACL permissions: checks privileges (evidence: `README.md`)
- Murmur server → Server database: persists server state
- Murmur server → Stream dispatcher: relays streams (evidence: `README.md`)
- Stream dispatcher → Reassembly: hands off units
- Reassembly → Video grid: reassembled frames (evidence: `README.md`)
- Video grid → Video codecs: decodes video (evidence: `README.md`)
- Stream dispatcher → Share audio playback: dispatches share audio (evidence: `README.md`)
