commit d10472b3356f92c5d640ed1a09f243dd6721a0a7
parent a6df7e0a96d17f16d8bdd41dea688ef7f6d1a943
Author: Oliver Lowe <o@olowe.co>
Date: Wed, 17 Jul 2024 17:36:56 +1000
cmd/avhelp: initial sketch of a GUI to some packages we've written
Diffstat:
4 files changed, 147 insertions(+), 2 deletions(-)
diff --git a/cmd/avhelp/avhelp.go b/cmd/avhelp/avhelp.go
@@ -0,0 +1,69 @@
+// Command avhelp serves...
+package main
+
+import (
+ "embed"
+ "html/template"
+ "log"
+ "net"
+ "net/http"
+
+ "github.com/untangledco/streaming/rtp"
+)
+
+//go:embed template
+var content embed.FS
+
+type server struct {
+ templates *template.Template
+ pconn net.PacketConn
+ buf [5]rtp.Packet
+}
+
+func (srv *server) serveRTPInfo(w http.ResponseWriter, req *http.Request) {
+ if err := srv.templates.ExecuteTemplate(w, "rtp.html", srv.buf); err != nil {
+ log.Println("serve %s: render rtp.html: %v", req.URL, err)
+ }
+}
+
+func (srv *server) receive() {
+ buf := make([]byte, 1360)
+ var i int
+ for {
+ n, _, err := srv.pconn.ReadFrom(buf)
+ if err != nil {
+ log.Printf("receive packet: %v", err)
+ }
+ var packet rtp.Packet
+ if err := rtp.Unmarshal(buf[:n], &packet); err != nil {
+ log.Printf("unmarshal packet: %v", err)
+ }
+ if i == 5 {
+ srv.buf[0] = packet
+ i = 1
+ } else {
+ srv.buf[i] = packet
+ i++
+ }
+ }
+}
+
+func main() {
+ tmpl, err := template.ParseFS(content, "template/*.html")
+ if err != nil {
+ log.Fatal(err)
+ }
+ pc, err := net.ListenPacket("udp", ":6969")
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ srv := &server{
+ templates: tmpl,
+ pconn: pc,
+ }
+ go srv.receive()
+
+ http.HandleFunc("/rtp/", srv.serveRTPInfo)
+ log.Fatal(http.ListenAndServe(":8080", nil))
+}
diff --git a/cmd/avhelp/template/index.html b/cmd/avhelp/template/index.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>avhelp</title>
+<link rel="stylesheet" href="/style.css">
+</head>
+
+<body>
+<p>Hello, {{ . }}!</p>
+</body>
+</html>
diff --git a/cmd/avhelp/template/rtp.html b/cmd/avhelp/template/rtp.html
@@ -0,0 +1,66 @@
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>avhelp</title>
+<link rel="stylesheet" href="https://unpkg.com/missing.css@1.1.2">
+</head>
+
+<body>
+<header></header>
+
+<main>
+<h1>RTP</h1>
+<p>Real-time Transport Protocol is specified in
+<a href="https://www.rfc-editor.org/rfc/rfc3550.html">RFC 3550</a>.</p>
+
+<h2>Packet layout</h2>
+
+<dl>
+ <dt>Version</dt>
+ <dd>Version specifies the version of RTP used.</dd>
+ <dt>Marker</dt>
+ <dd>The payload determines how this value is interpreted.</dd>
+ <dt>...</dt>
+ <dd>...</dd>
+</dl>
+
+<h2>Troubleshooting</h2>
+
+<p>Send RTP packets to <code>[::1]:6969</code></p>
+
+<table>
+ <caption>Recently received packets</caption>
+ <thead>
+ <tr>
+ <th scope="col">Version</th>
+ <th scope="col">Marker</th>
+ <th scope="col">Type</th>
+ <th scope="col">Sequence</th>
+ <th scope="col">Timestamp</th>
+ <th scope="col">Sync. source</th>
+ <th scope="col">Contrib. sources</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{range .}}
+ <tr>
+ <td>{{ .Header.Version }}</td>
+ <td>{{if .Header.Marker}}set{{else}}unset{{end}}</td>
+ <td>{{ .Header.Type}}</td>
+ <td>{{ .Header.Sequence }}</td>
+ <td>{{ .Header.Timestamp }}</td>
+ <td>{{ .Header.SyncSource }}</td>
+ <td>{{ range .Header.ContribSource }} {{ . }}, {{ end }}</td>
+ </tr>
+ {{end}}
+ </tbody>
+</table>
+</main>
+
+<footer>
+<a href="https://github.com/untangledco/streaming">Source code</code>
+</footer>
+
+</body>
+</html>
diff --git a/cmd/demo/demo.go b/cmd/demo/demo.go
@@ -1,2 +0,0 @@
-// Command demo serves...
-package main