diff --git a/rtpconn/rtpstats.go b/rtpconn/rtpstats.go index e7975bd..16e934b 100644 --- a/rtpconn/rtpstats.go +++ b/rtpconn/rtpstats.go @@ -23,8 +23,11 @@ func (c *webClient) GetStats() *stats.Client { tracks := up.getTracks() for _, t := range tracks { s := t.cache.GetStats(false) - loss := float64(s.Expected - s.Received) / - float64(s.Expected) + var loss float64 + if s.Expected > 0 { + loss = float64(s.Expected-s.Received) / + float64(s.Expected) + } jitter := time.Duration(t.jitter.Jitter()) * (time.Second / time.Duration(t.jitter.HZ())) rate, _ := t.rate.Estimate() diff --git a/static/stats.js b/static/stats.js index 31c5fa0..25dc692 100644 --- a/static/stats.js +++ b/static/stats.js @@ -56,11 +56,15 @@ function formatGroup(group) { tr2.appendChild(td3); table.appendChild(tr2); if(client.up) - for(let j = 0; j < client.up.length; j++) - table.appendChild(formatConn('↑', client.up[j])); + for(let j = 0; j < client.up.length; j++) { + let rows = formatConn('↑', client.up[j]); + rows.forEach(r => table.appendChild(r)); + } if(client.down) - for(let j = 0; j < client.down.length; j++) - table.appendChild(formatConn('↓', client.down[j])); + for(let j = 0; j < client.down.length; j++) { + let rows = formatConn('↓', client.down[j]); + rows.forEach(r => table.appendChild(r)); + } } td2.appendChild(table); tr.appendChild(td2); @@ -76,24 +80,25 @@ function formatConn(direction, conn) { td2.textContent = conn.id; tr.appendChild(td2); let td3 = document.createElement('td'); - if(conn.maxBitrate) - td3.textContent = direction + ' ' + conn.maxBitrate; - else - td3.textContent = direction; + td3.textContent = direction; tr.appendChild(td3); let td4 = document.createElement('td'); - if(conn.tracks) { - let table = document.createElement('table'); - for(let i = 0; i < conn.tracks.length; i++) - table.appendChild(formatTrack(conn.tracks[i])); - td4.appendChild(table); - } + if(conn.maxBitrate) + td4.textContent = `${conn.maxBitrate}`; tr.appendChild(td4); - return tr; + let rows = [tr]; + if(conn.tracks) { + for(let i = 0; i < conn.tracks.length; i++) + rows.push(formatTrack(conn.tracks[i])); + } + return rows; } function formatTrack(track) { let tr = document.createElement('tr'); + tr.appendChild(document.createElement('td')); + tr.appendChild(document.createElement('td')); + tr.appendChild(document.createElement('td')); let td = document.createElement('td'); if(track.maxBitrate) td.textContent = `${track.bitrate||0}/${track.maxBitrate}`; diff --git a/webserver/webserver.go b/webserver/webserver.go index 805fc0e..36348bc 100644 --- a/webserver/webserver.go +++ b/webserver/webserver.go @@ -370,7 +370,10 @@ func statsHandler(w http.ResponseWriter, r *http.Request, dataDir string) { ss := stats.GetGroups() e := json.NewEncoder(w) - e.Encode(ss) + err = e.Encode(ss) + if err != nil { + log.Printf("stats.json: %v", err) + } return }