tape

module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 25, 2026 License: MIT

README

nevr-tape

High-performance telemetry codec library for NEVR session data.

Overview

This package provides optimized processing of game session frames with support for:

  • Two tape formats — v1 (legacy telemetry.v1) and v2 (game-agnostic telemetry.v2 envelope with footer indexes)
  • High-frequency frame processing (600+ Hz capable)
  • Event detection between consecutive frames
  • Legacy codec for .echoreplay files
  • File format conversion utilities

Installation

go get github.com/echotools/nevr-tape/v1

Package Structure

pkg/
├── codecs/      # File format readers/writers (.tape, .echoreplay)
├── conversion/  # Format conversion utilities
├── events/      # Event detection algorithms
└── processing/  # Frame processing pipeline

Building

go test -v ./...                  # Run tests
go test -bench=. -benchmem ./... # Run benchmarks
go vet ./...                      # Static analysis

Usage

Zstd-compressed telemetry.v2.Envelope stream with header, frames, and footer.

import "github.com/echotools/nevr-tape/v1/pkg/codecs"

// Writing
w, err := codecs.NewTapeV2Writer("capture.tape")
if err != nil {
    log.Fatal(err)
}
err = w.WriteHeader(header) // *telemetryv2.CaptureHeader
for _, frame := range frames {
    err = w.WriteFrame(frame) // *telemetryv2.Frame
}
err = w.Close() // writes footer, closes zstd, closes file

// Reading
r, err := codecs.NewTapeV2Reader("capture.tape")
if err != nil {
    log.Fatal(err)
}
defer r.Close()

header, err := r.ReadHeader()
for {
    frame, err := r.ReadFrame()
    if err != nil {
        break // io.EOF when footer is reached
    }
}
footer, err := r.ReadFooter() // frame count, duration, keyframe/event indexes
Tape v1 Codec (legacy)

Zstd-compressed protobuf stream for telemetry.v1 types. Reads both .tape and .nevrcap files.

import "github.com/echotools/nevr-tape/v1/pkg/codecs"

// Writing
writer, err := codecs.NewTapeV1Writer("capture.tape")
if err != nil {
    log.Fatal(err)
}
defer writer.Close()
err = writer.WriteFrame(frame)

// Reading
reader, err := codecs.NewTapeV1Reader("capture.tape")
if err != nil {
    log.Fatal(err)
}
defer reader.Close()
frame, err := reader.ReadFrame()
EchoReplay Codec (.echoreplay files)

ZIP-compressed JSON format for legacy compatibility.

import "github.com/echotools/nevr-tape/v1/pkg/codecs"

// Writing
writer, err := codecs.NewEchoReplayWriter("replay.echoreplay")
if err != nil {
    log.Fatal(err)
}
defer writer.Close()

// Reading
reader, err := codecs.NewEchoReplayReader("replay.echoreplay")
if err != nil {
    log.Fatal(err)
}
defer reader.Close()
File Conversion
import "github.com/echotools/nevr-tape/v1/pkg/conversion"

// Convert .echoreplay to .tape (v1)
err := conversion.ConvertEchoReplayToNevrcap("input.echoreplay", "output.tape")

// Convert .tape (v1) to .echoreplay
err := conversion.ConvertNevrcapToEchoReplay("input.tape", "output.echoreplay")
Event Detection
import "github.com/echotools/nevr-tape/v1/pkg/events"

detector := events.NewEventDetector()
detectedEvents := detector.DetectEvents(previousFrame, currentFrame)

File Formats

Property Value
Compression Zstd
Serialization telemetry.v2.Envelope protobuf
Structure Header + frames + footer with seek indexes
Wire size ~73.5% smaller than v1 (float32 vs float64 spatial)
Random access Footer-based scanning (true seeking needs Zstd seekable frames)
.tape / .nevrcap v1 (legacy)
Property Value
Compression Zstd
Serialization telemetry.v1 protobuf
Structure Header + length-delimited frames
Size ~57% of .echoreplay size
.echoreplay (legacy)
Property Value
Compression ZIP
Serialization JSON
Structure ZIP archive with TSV lines
Features Legacy compatibility

Migration from nevr-capture

- go get github.com/echotools/nevr-capture/v3
+ go get github.com/echotools/nevr-tape/v1
Old New
codecs.NewNevrCapWriter codecs.NewTapeV1Writer
codecs.NewNevrCapReader codecs.NewTapeV1Reader
codecs.NevrCap struct codecs.TapeV1 struct
apigame.SessionResponse enginev1.SessionResponse

Proto imports changed from github.com/echotools/nevr-common/v4/gen/go/ to buf.build/gen/go/echotools/nevr-api/protocolbuffers/go/.

  • nevr-proto — Protobuf definitions (BSR: buf.build/echotools/nevr-api)
  • nevr-agent — Recording and streaming CLI

License

See LICENSE file for details.

Directories

Path Synopsis
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL