DATV VK3RGL Updates

Welcome to the VK3RGL DATV Repeater Update Page

This page is dedicated to sharing the journey of developing and installing the VK3RGL Digital Amateur Television Repeater, located at Mount Anakie, near Geelong, Victoria.

VK3RGL is a pioneering project – the first DATV repeater to use fully software-based methods for signal receiving, compositing, source switching, H.264 encoding, and Transport Stream generation. The system is built on the powerful GStreamer framework, combined with FFmpeg and custom C/C++ tools developed specifically for this repeater.

Our goal is to bring high-quality Digital Amateur Television (DATV) to the Geelong region, providing local amateurs with the opportunity to experiment, connect, and share video over the airwaves.

Here you’ll find:

  • Progress updates from the workshop to the mount

  • Technical details of the build and configuration

  • Photos and videos of the installation process

  • Insights into the challenges and solutions we discover along the way

The VK3RGL DATV repeater is a community-driven project made possible by the dedication of local ATVers. We hope this page not only keeps you informed but also inspires your own interest in amateur television.

Stay tuned – as the project moves from design and testing through to full on-air operation, we’ll be updating this page with every milestone.

DATV Repeater Development Report   (May 2026)

VK3RGL  Digital Amateur Television Repeater Software Progress continues.

1. Project Overview

The DATV repeater software has evolved into a professional multi-service DVB transport-stream generation and repeater platform. The current work has focused heavily on the vk3dvbmux transport-stream muxer, supporting DVB-compliant service signalling, EPG/EIT, HbbTV/AIT, teletext, DVB subtitles, KLV metadata, and real-world RF output through the Hides DVB-T modulator backend.

The overall aim is to build a deterministic, long-running DATV repeater system suitable for unattended operation at VK3RGL, with robust receiver compatibility on domestic televisions and set-top boxes.

The current architecture is moving toward the name vk3dvbtsmux, which better reflects the role of the plugin as a full DVB Transport Stream muxer rather than only a generic DVB metadata muxer.


2. Major Engineering Goal: Deterministic Packet Scheduling

A central design decision has been to treat the transport muxer as a deterministic packet scheduler.

The muxer’s realtime path should do only the minimum timing-critical work:

  • select ready A/V buffers,
  • packetise PES into TS packets,
  • stamp PCR/PTS/DTS correctly,
  • insert already-prepared PSI/SI tables,
  • insert paced side-data streams,
  • add null packets where required,
  • return immediately to the next mux cycle.

The realtime mux path must avoid:

  • expensive logging,
  • XML parsing,
  • long descriptor generation,
  • unnecessary allocation,
  • blocking I/O,
  • sparse stream stalls,
  • burst insertion of side data.

This model has now become the guiding architecture for the TS muxer.


3. GST Logging Removed from Hot Path

A major performance and determinism improvement was the removal of GST_LOG_OBJECT, GST_DEBUG_OBJECT, and periodic INFO logging from the main TS muxer hot path.

Previously, logging existed in functions that could be called for every packet, PES fragment, aggregate cycle, SI insertion, or alignment operation. Even if disabled, these logging calls still added branch/check overhead. If enabled at runtime, they could generate massive output and disturb mux timing.

Hot-path logging was replaced with close-coupled metrics counters.

Affected areas included:

  • gst_base_ts_mux_push_packets(),
  • gst_base_ts_mux_find_best_pad(),
  • force-key event forwarding,
  • AAC ADTS preparation,
  • SI periodic insertion,
  • lower-level padding/null-packet paths.

The design now separates:

  • hot path: counters only,
  • cold/control path: normal GST logging allowed,
  • error path: GST warning/error logging allowed.

This improves deterministic timing and reduces the risk of accidental debug settings causing jitter.


4. HbbTV / AIT Implementation

HbbTV Application Information Table support was added after analysis of Australian FTA broadcast streams.

The muxer now supports:

  • AIT table generation,
  • PMT AIT stream signalling,
  • one or more HbbTV applications,
  • HbbTV application_type 0x0010,
  • HTTP back-channel transport protocol descriptor,
  • application descriptor,
  • application name descriptor,
  • simple application location descriptor,
  • configurable base URL and initial path.

The VK3RGL HbbTV app currently points to:

http://www.vk3atl.org/hbbtv/

The earlier idea of embedding PNG icons directly into image/icon descriptors was dropped because it was too limited and did not match how modern TV EPG/logo systems are expected to work. The preferred design is now to host application and icon assets on the VK3ATL website and advertise the HbbTV entry point through AIT.

This mirrors the model observed in commercial Australian DVB-T services, where AIT metadata points receivers to broadcaster-hosted HbbTV applications.


5. EPG / EIT Enhancements

The XMLTV to EIT path has been expanded to support a richer EPG descriptor suite.

Current and planned EPG metadata includes:

  • programme title,
  • subtitle,
  • long description,
  • category/content classification,
  • Australian parental rating,
  • CRID / series identifiers,
  • present/following EIT,
  • schedule EIT.

The script-generated XMLTV test data now includes richer event metadata across four services.

A future enhancement remains planned: move EIT/EPG parsing and descriptor building into a worker/cache path. The realtime mux loop should only rotate already-built EIT sections, not parse XMLTV or build descriptors inline.

This is expected to further reduce possible timing disturbance from EPG processing.


6. KLV Metadata Development

Initial Issue

KLV metadata support was added using:

vk3klvencsrc ! application/x-klv,parsed=true ! mux.sink_x

The PMT stream type was configured as private PES 0x06, with the required SMPTE KLV registration descriptor:

registration_descriptor: "KLVA"

The KLV data path was confirmed by finding repeated SMPTE KLV universal labels in the TS:

060E2B34...

However, the original KLV source emitted one small keepalive packet approximately every second. When connected as a normal GstAggregator sink pad, this caused the entire mux to be paced by the sparse KLV pad. The result was severe video slowdown and visible freezing.

The moving videotestsrc pattern=ball proved this very clearly: the ball would stagger or freeze in sync with KLV insertion.

Failed Sparse-PES Attempt

A first attempt was made to move KLV into an internal sparse PES store inside the muxer. This avoided selecting KLV as the best A/V pad, but it did not solve the underlying GstAggregator pad pacing problem. KLV was still a normal aggregator sink pad, so the aggregator still waited on its sparse cadence.

This confirmed the actual issue: the aggregator must see continuous timeline progress from sparse streams.

Final Working Approach

The correct solution was to make vk3klvencsrc behave like a paced timed metadata stream.

The KLV source now:

  • emits real KLV buffers when a keepalive or command is due,
  • emits GAP/timing buffers between real KLV packets,
  • uses a default timeline tick of 40 ms,
  • sets PTS/DTS/duration on all buffers,
  • keeps the conventional GStreamer branch model.

The working branch is now:

vk3klvencsrc gap-interval-ms=40 keepalive-interval-ms=1000
  ! application/x-klv,parsed=true
  ! queue leaky=downstream
  ! mux.sink_x

This gives GstAggregator the timing progress it expects.

Current KLV Status

KLV is now working correctly as a paced stream.

Confirmed achievements:

  • smooth ball-pattern playback,
  • full-speed video,
  • KLV PID present,
  • repeated SMPTE KLV payloads present,
  • PMT advertises KLVA,
  • no TS continuity errors,
  • monotonic PCR,
  • good A/V timestamp alignment.

This is a major milestone.


7. Teletext Development

The teletext encoder was reviewed after the KLV issue.

The existing vk3ttxencsrc was already much better behaved than the original KLV source because it emits real teletext packets at packet-rate.

At packet-rate=100, teletext produces a packet every 10 ms, which is already a paced stream from the aggregator’s point of view.

However, to future-proof the design, GAP/timing support was added to vk3ttxencsrc as well.

The updated teletext behaviour is:

  • real teletext packets are sent according to packet-rate,
  • GAP/timing buffers are emitted when no real teletext packet is due,
  • low teletext packet rates no longer risk pacing or stalling the mux,
  • the mux drops GAP teletext buffers rather than converting them into PES data.

Testing at a very low teletext rate worked correctly. Page updates became slow, as expected, but the mux did not stutter.

Recommended operating rates:

100 packets/sec  fast page cycle, about 150 kbit/s
50 packets/sec   good compromise, about 75 kbit/s
25 packets/sec   slower, broadcast-like, about 37.6 kbit/s
10 packets/sec   safe but visibly slow updates

8. DVB Subtitle Testing

DVB subtitle support was tested using the standard GStreamer subtitle path:

subparse -> textrender -> dvbsubenc -> mux

DVB subtitles worked correctly and were visible in VLC.

The reason subtitles behaved better than the original KLV source is that subparse and dvbsubenc produce properly timed subtitle events and handle timing/GAP behaviour. They do not leave the mux waiting on a silent one-second sparse pad.

This finding directly informed the KLV and teletext pacing model.


9. Four-Service Real-World RF Test Script

The overnight Hides test script has developed into a flexible real-world four-service RF validation tool.

Current services:

Service 1

VK3RGL-1HD
H.264 HD + AAC
Optional teletext
Optional KLV
HbbTV/AIT
EPG/EIT

Service 2

VK3RGL-2HD
H.264 HD + AAC

Service 3

VK3RGL-3HD
H.264 HD + AC-3
Now using VK3 PM5644 test chart source instead of snow

Service 4

VK3RGL-4SD
MPEG-2 SD video + MPEG Layer II audio

The fourth service was changed from HEVC because the target TV did not support or display H.265 correctly. MPEG-2 SD with Layer II audio is a much safer compatibility test.

The script now supports toggles:

ENABLE_EPG=0/1
ENABLE_TTX=0/1
ENABLE_KLV=0/1

This allows comparison testing:

baseline only
EPG only
teletext only
KLV only
EPG + teletext + KLV

This has been useful for isolating possible sources of receiver disturbance.


10. Video Encoding Lessons

The original third programme used:

videotestsrc pattern=snow

This proved to be an extreme worst-case encoder stress pattern. Even at high bitrates, snow looked poor because it is near-random full-frame motion, which H.264 cannot compress efficiently.

Attempts to improve quality using slower x264 settings, B-frames, and larger VBV buffers caused GStreamer latency negotiation problems:

Impossible to configure latency:
max 1.0s < min 2.48s

The pipeline was returned to low-latency encoder settings.

Service 3 now uses a generated PM5644 test chart instead of snow. This is more receiver-friendly, visually useful, and much better for long-running RF validation.


11. DVB Descriptor and PMT Cleanups

Several descriptor-related fixes and cleanups were made.

KLV PMT Descriptor

KLV is now correctly signalled as:

stream_type:     0x06 private PES
descriptor:      registration_descriptor "KLVA"

This is required for receivers/analyzers to identify the private PES as SMPTE KLV.

Blu-ray / HDMV Descriptor Removal

Old Blu-ray/HDMV descriptor logic was removed from the DVB-only muxer path.

For DVB broadcast, H.264 is sufficiently signalled by:

stream_type 0x1B

The muxer should not emit Blu-ray-specific HDMV registration descriptors.

This makes the code cleaner and better aligned with the intended DVB transport-stream role.

NIT Frequency

The NIT frequency path was checked to avoid hardcoded 474 MHz behaviour. The muxer should use the configured network-map frequency and allow the test frequency currently used around 690.5 MHz.


12. Current Working State

The current working development state includes:

  • gstvk3dvbmux around v0.1.59,
  • gstvk3klv v0.1.3 paced KLV source,
  • KLV GAP/timing behaviour working,
  • teletext GAP/timing behaviour working,
  • four-service Hides RF script with EPG/TTX/KLV toggles,
  • HbbTV/AIT support,
  • XMLTV/EIT richer descriptor support,
  • SD MPEG-2 fourth service for receiver compatibility,
  • PM5644 test chart on service 3,
  • hot-path GST logging reduced/replaced with metrics.

The most important achievement is that KLV, previously the source of major stuttering, now works as a conventional GStreamer mux input without disturbing video timing.


13. Remaining Work

The next logical development stages are:

13.1 EIT/EPG Worker and Cache

Move XMLTV parsing and EIT descriptor generation outside the realtime mux path.

Target model:

XMLTV reader / EPG worker
  -> build EIT sections
  -> mark table store ready
  -> mux loop inserts already-built EIT sections

13.2 Table Store Refactor

Create a clearer internal table store for:

  • PAT,
  • PMT,
  • SDT,
  • NIT,
  • AIT,
  • EIT p/f,
  • EIT schedule.

Only TDT/TOT need to stay dynamically generated because they are time-dependent.

13.3 Formal Metrics Export

The internal mux metrics structure should eventually be exposed through:

  • a read-only property,
  • bus messages,
  • telemetry JSON,
  • or integration into the DATV repeater web UI.

Useful metrics include:

  • packets output,
  • null packets,
  • SI insertions,
  • KLV packets,
  • teletext packets,
  • dropped GAP buffers,
  • EIT insertions,
  • continuity errors,
  • PCR timing statistics.

13.4 Rename to vk3dvbtsmux

Once stable, rename the plugin from:

vk3dvbmux

to:

vk3dvbtsmux

This better describes the plugin as a DVB Transport Stream muxer with full SI/PSI, EPG, AIT, teletext, subtitles, and metadata support.

13.5 Documentation

The deterministic packet scheduler model should become part of the official technical documentation.

Key documentation topics:

  • mux loop architecture,
  • timing model,
  • service-map/prog-map/lcn-map,
  • AIT/HbbTV configuration,
  • EPG/EIT XMLTV handling,
  • teletext and KLV pacing,
  • RF test scripts,
  • known receiver compatibility lessons,
  • lessons learned from sparse streams and GstAggregator.

14. Summary

The DATV repeater muxing system has made significant progress.

The project has moved from basic DVB muxing toward a much more complete and receiver-aware DVB-T transport-stream generator. The most difficult recent issue was sparse stream timing, especially KLV, which initially caused severe video pacing problems. By changing KLV and teletext to behave as properly paced timed streams, the muxer now works with GstAggregator rather than fighting it.

The system now supports modern DVB features such as EPG, HbbTV/AIT, teletext, KLV metadata, AC-3, MPEG-2 SD compatibility service, and multi-service RF testing.

The next big step is to move EIT/EPG generation into a worker/cache model, further strengthening the deterministic packet scheduler design.

The project is now much closer to a robust long-running DATV repeater transport-stream platform suitable for VK3RGL operation.