# pjsip/pjproject architecture

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

- Interactive diagram: https://gitdiagram.com/pjsip/pjproject
- Repository: https://github.com/pjsip/pjproject

## Overview

PJSIP is a portable multimedia communications library and application framework. A typical client configures an account through PJSUA/PJSUA2, uses the SIP stack for signaling and SDP negotiation, and establishes audio/video media streams over RTP; PJNATH supplies STUN/TURN/ICE traversal. PJMEDIA handles codecs, devices, and media processing, while PJLIB and PJLIB-UTIL provide portable runtime and protocol utilities. The graph combines README-documented capabilities with sampled call/reference evidence; many implementation links are documented at subsystem level because their source was not sampled.

Main entry points: [`pjsip-apps/src/pygui/application.py`](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/application.py) (Python GUI), [`pjmedia/src/pjmedia/stream.c`](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/stream.c) (RTP streams), [`pjsip-apps/src/pjsua/pjsua_app.c`](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pjsua/pjsua_app.c) (PJSUA application), [`pjsip-apps/src/pygui/account.py`](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/account.py) (GUI accounts)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["Applications and APIs"]
  node_pjsua_app["PJSUA application<br/>[pjsua_app.c]"]
  node_pygui["Python GUI<br/>[application.py]"]
  node_py_account["GUI accounts<br/>[account.py]"]
  node_py_settings["Account settings<br/>[accountsetting.py]"]
  node_py_buddy["Buddy management<br/>[buddy.py]"]
  node_py_call["Call interface<br/>[call.py]"]
  node_py_chat["Chat interface<br/>[chat.py]"]
  node_py_endpoint["Python endpoint<br/>[endpoint.py]"]
end

subgraph group_sip["SIP Signaling"]
  node_sip_stack["SIP stack<br/>[sip_parser.c]"]
  node_sip_auth["SIP authentication<br/>[sip_auth_client.c]"]
  node_sip_invite["Invitation sessions<br/>[sip_inv.c]"]
  node_sdp["SDP negotiation<br/>[sdp_neg.c]"]
end

subgraph group_media["Media Framework"]
  node_media_session["Media sessions<br/>[session.c]"]
  node_media_stream["RTP streams<br/>[stream.c]"]
  node_media_codec["Media codecs<br/>[audio_codecs.c]"]
  node_audio_devices["Audio devices<br/>[audiodev.c]"]
  node_video_devices["Video devices<br/>[videodev.c]"]
end

subgraph group_nat["NAT Traversal"]
  node_ice["ICE transport<br/>[transport_ice.c]"]
  node_stun_turn["STUN and TURN<br/>[stun_session.c]"]
end

subgraph group_runtime["Portable Runtime"]
  node_pjlib["PJLIB runtime"]
  node_pjlib_util["Utility protocols<br/>[resolver.c]"]
end

node_user(("Application user"))

node_user -->|"uses client"| node_pjsua_app
node_user -->|"uses GUI"| node_pygui
node_pygui -->|"manages accounts"| node_py_account
node_pygui -->|"opens settings"| node_py_settings
node_pygui -->|"manages buddies"| node_py_buddy
node_pygui -->|"uses endpoint"| node_py_endpoint
node_py_account -->|"uses calls"| node_py_call
node_py_account -->|"uses chat"| node_py_chat
node_py_endpoint -->|"launches GUI"| node_pygui
node_pjsua_app -->|"signaling API"| node_sip_stack
node_sip_stack -->|"authenticates requests"| node_sip_auth
node_sip_stack -->|"handles invitations"| node_sip_invite
node_sip_invite -->|"negotiates media"| node_sdp
node_sdp -->|"configures media"| node_media_session
node_media_session -->|"creates streams"| node_media_stream
node_media_stream -->|"encodes media"| node_media_codec
node_media_stream -->|"uses audio"| node_audio_devices
node_media_stream -->|"uses video"| node_video_devices
node_media_stream -->|"uses transport"| node_ice
node_ice -->|"traverses NAT"| node_stun_turn
node_pjsua_app -->|"uses runtime"| node_pjlib
node_pjlib_util -->|"builds on"| node_pjlib

click node_pjsua_app "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pjsua/pjsua_app.c"
click node_pygui "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/application.py"
click node_py_account "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/account.py"
click node_py_settings "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/accountsetting.py"
click node_py_buddy "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/buddy.py"
click node_py_call "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/call.py"
click node_py_chat "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/chat.py"
click node_py_endpoint "https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/endpoint.py"
click node_sip_stack "https://github.com/pjsip/pjproject/blob/master/pjsip/src/pjsip/sip_parser.c"
click node_sip_auth "https://github.com/pjsip/pjproject/blob/master/pjsip/src/pjsip/sip_auth_client.c"
click node_sip_invite "https://github.com/pjsip/pjproject/blob/master/pjsip/src/pjsip-ua/sip_inv.c"
click node_sdp "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/sdp_neg.c"
click node_media_session "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/session.c"
click node_media_stream "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/stream.c"
click node_media_codec "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia-codec/audio_codecs.c"
click node_audio_devices "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia-audiodev/audiodev.c"
click node_video_devices "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia-videodev/videodev.c"
click node_ice "https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/transport_ice.c"
click node_stun_turn "https://github.com/pjsip/pjproject/blob/master/pjnath/src/pjnath/stun_session.c"
click node_pjlib_util "https://github.com/pjsip/pjproject/blob/master/pjlib-util/src/pjlib-util/resolver.c"

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_pjsua_app,node_pygui,node_py_account,node_py_settings,node_py_buddy,node_py_call,node_py_chat,node_py_endpoint,node_user toneBlue
class node_sip_stack,node_sip_auth,node_sip_invite,node_sdp toneAmber
class node_media_session,node_media_stream,node_media_codec,node_audio_devices,node_video_devices toneMint
class node_ice,node_stun_turn toneRose
class node_pjlib,node_pjlib_util toneIndigo
```

## Components

### Applications and APIs

- [PJSUA application](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pjsua/pjsua_app.c): `pjsip-apps/src/pjsua/pjsua_app.c`
- [Python GUI](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/application.py): `pjsip-apps/src/pygui/application.py`
- [GUI accounts](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/account.py): `pjsip-apps/src/pygui/account.py`
- [Account settings](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/accountsetting.py): `pjsip-apps/src/pygui/accountsetting.py`
- [Buddy management](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/buddy.py): `pjsip-apps/src/pygui/buddy.py`
- [Call interface](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/call.py): `pjsip-apps/src/pygui/call.py`
- [Chat interface](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/chat.py): `pjsip-apps/src/pygui/chat.py`
- [Python endpoint](https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pygui/endpoint.py): `pjsip-apps/src/pygui/endpoint.py`

### SIP Signaling

- [SIP stack](https://github.com/pjsip/pjproject/blob/master/pjsip/src/pjsip/sip_parser.c): `pjsip/src/pjsip/sip_parser.c`
- [SIP authentication](https://github.com/pjsip/pjproject/blob/master/pjsip/src/pjsip/sip_auth_client.c): `pjsip/src/pjsip/sip_auth_client.c`
- [Invitation sessions](https://github.com/pjsip/pjproject/blob/master/pjsip/src/pjsip-ua/sip_inv.c): `pjsip/src/pjsip-ua/sip_inv.c`
- [SDP negotiation](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/sdp_neg.c): `pjmedia/src/pjmedia/sdp_neg.c`

### Media Framework

- [Media sessions](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/session.c): `pjmedia/src/pjmedia/session.c`
- [RTP streams](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/stream.c): `pjmedia/src/pjmedia/stream.c`
- [Media codecs](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia-codec/audio_codecs.c): `pjmedia/src/pjmedia-codec/audio_codecs.c`
- [Audio devices](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia-audiodev/audiodev.c): `pjmedia/src/pjmedia-audiodev/audiodev.c`
- [Video devices](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia-videodev/videodev.c): `pjmedia/src/pjmedia-videodev/videodev.c`

### NAT Traversal

- [ICE transport](https://github.com/pjsip/pjproject/blob/master/pjmedia/src/pjmedia/transport_ice.c): `pjmedia/src/pjmedia/transport_ice.c`
- [STUN and TURN](https://github.com/pjsip/pjproject/blob/master/pjnath/src/pjnath/stun_session.c): `pjnath/src/pjnath/stun_session.c`

### Portable Runtime

- **PJLIB runtime**
- [Utility protocols](https://github.com/pjsip/pjproject/blob/master/pjlib-util/src/pjlib-util/resolver.c): `pjlib-util/src/pjlib-util/resolver.c`

### Other components

- **Application user**

## Connections

- Application user → PJSUA application: uses client
- Application user → Python GUI: uses GUI
- Python GUI → GUI accounts: manages accounts (evidence: `pjsip-apps/src/pygui/application.py`)
- Python GUI → Account settings: opens settings (evidence: `pjsip-apps/src/pygui/application.py`)
- Python GUI → Buddy management: manages buddies (evidence: `pjsip-apps/src/pygui/application.py`)
- Python GUI → Python endpoint: uses endpoint (evidence: `pjsip-apps/src/pygui/application.py`)
- GUI accounts → Call interface: uses calls (evidence: `pjsip-apps/src/pygui/account.py`)
- GUI accounts → Chat interface: uses chat (evidence: `pjsip-apps/src/pygui/account.py`)
- Python endpoint → Python GUI: launches GUI (evidence: `pjsip-apps/src/pygui/endpoint.py`)
- PJSUA application → SIP stack: signaling API
- SIP stack → SIP authentication: authenticates requests
- SIP stack → Invitation sessions: handles invitations
- Invitation sessions → SDP negotiation: negotiates media
- SDP negotiation → Media sessions: configures media
- Media sessions → RTP streams: creates streams
- RTP streams → Media codecs: encodes media
- RTP streams → Audio devices: uses audio
- RTP streams → Video devices: uses video
- RTP streams → ICE transport: uses transport
- ICE transport → STUN and TURN: traverses NAT
- PJSUA application → PJLIB runtime: uses runtime
- Utility protocols → PJLIB runtime: builds on
