mirror of
https://github.com/pion/mediadevices.git
synced 2026-04-22 15:57:27 +08:00
a68a5ba4a6
* Add VPX improvements from pion-mediadevices - Add vpx_image.go: VpxImage wrapper for vpx_image_t with convenient methods - Move BitrateTracker to vpx package: More specific to VPX codec usage - Add bitrate_tracker_test.go: Test coverage for VPX-specific bitrate tracking - Remove generic codec-level BitrateTracker: Replaced by VPX-specific version These changes improve VPX codec functionality and organization by: 1. Adding image handling utilities specific to VPX 2. Providing better bitrate tracking for VPX codecs 3. Improving code organization by moving VPX-specific code to VPX package * Revert bitrate tracker changes - Remove vpx-specific bitrate tracker files - Restore original codec-level bitrate tracker and test - Keep only the vpx_image.go addition from pion-mediadevices * Add comprehensive unit tests for VpxImage - Add vpx_image_test.go with full test coverage for VpxImage wrapper - Test interface compliance and constructor behavior - Test nil pointer handling (documents expected panic behavior) - Test common video format constants and plane indices - All tests pass and integrate with existing VPX test suite This improves test coverage for the new VpxImage utility from pion-mediadevices. * Add comprehensive unit tests for VpxImage - Add vpx_image_test.go with full test coverage for VpxImage wrapper - Test interface compliance and constructor behavior - Test nil pointer handling (documents expected panic behavior) - Test common video format constants and plane indices - All tests pass and integrate with existing VPX test suite This improves test coverage for the new VpxImage utility from pion-mediadevices.
49 lines
958 B
Go
49 lines
958 B
Go
package vpx
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type BitrateTracker struct {
|
|
windowSize time.Duration
|
|
buffer []int
|
|
times []time.Time
|
|
}
|
|
|
|
func NewBitrateTracker(windowSize time.Duration) *BitrateTracker {
|
|
return &BitrateTracker{
|
|
windowSize: windowSize,
|
|
}
|
|
}
|
|
|
|
func (bt *BitrateTracker) AddFrame(sizeBytes int, timestamp time.Time) {
|
|
bt.buffer = append(bt.buffer, sizeBytes)
|
|
bt.times = append(bt.times, timestamp)
|
|
|
|
// Remove old entries outside the window
|
|
cutoff := timestamp.Add(-bt.windowSize)
|
|
i := 0
|
|
for ; i < len(bt.times); i++ {
|
|
if bt.times[i].After(cutoff) {
|
|
break
|
|
}
|
|
}
|
|
bt.buffer = bt.buffer[i:]
|
|
bt.times = bt.times[i:]
|
|
}
|
|
|
|
func (bt *BitrateTracker) GetBitrate() float64 {
|
|
if len(bt.times) < 2 {
|
|
return 0
|
|
}
|
|
totalBytes := 0
|
|
for _, b := range bt.buffer {
|
|
totalBytes += b
|
|
}
|
|
duration := bt.times[len(bt.times)-1].Sub(bt.times[0]).Seconds()
|
|
if duration <= 0 {
|
|
return 0
|
|
}
|
|
return float64(totalBytes*8) / duration // bits per second
|
|
}
|