Files
punktfunk/crates/pyrowave-sys/vendor/pyrowave/metrics/plot.py
T
enricobuehler 4c3b11445c feat(host): vendor PyroWave + minimal Granite subset as crates/pyrowave-sys
Phase 0 of design/pyrowave-codec-plan.md — the opt-in wired-LAN ultra-low-
latency codec. Vendored at upstream 509e4f88 (API 0.4.0, Granite 44362775,
volk + vulkan-headers pins in PUNKTFUNK-VENDOR.txt), pruned to the 6.6 MB
the standalone no-renderer build needs; scripts/vendor-pyrowave.sh
reproduces the tree (a pin bump is protocol-affecting, plan §4.2).

build.rs drives the wrapper CMakeLists (static archives incl. a static
C-API lib upstream only ships shared) + bindgen over pyrowave.h; Linux and
Windows only, empty stub elsewhere (Apple gets a native Metal port, §4.7).
Offline-safe by construction: no network, no system lib, vendored Vulkan
headers — same model as the opus dep (flatpak builder has no network).

Phase-0 validation on .21 (RTX 5070 Ti, driver 610.43.03):
- upstream pyrowave-c-test + interop test (incl. dmabuf/DRM-modifier
  Vulkan<->Vulkan) pass, from the pristine AND the pruned tree
- GPU kernel times at ~1.6 bpp noise: encode/decode 0.090/0.042 ms @800p,
  0.146/0.067 @1080p, 0.226/0.103 @1440p, 0.477/0.201 @4K — order of
  magnitude under NVENC's 1-2 ms retrieve, CBR lands within ~100 B of
  target
- cargo test -p pyrowave-sys green (static link + API-version pin check)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:35:10 +02:00

59 lines
1.8 KiB
Python

#!/usr/bin/env python3
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import sys
import csv
import os
def main():
codecs = ['h264_nvenc', 'hevc_nvenc', 'av1_nvenc', 'pyrowave']
cols = ['xpsnr', 'ssim', 'ssimulacra2', 'vmaf', 'vmafneg']
codec_name = {
'h264_nvenc' : 'H.264 NVENC',
'hevc_nvenc' : 'H.265 NVENC',
'av1_nvenc' : 'AV1 NVENC',
'pyrowave' : 'PyroWave' }
metric_name = {
'xpsnr' : 'W-XPSNR',
'ssim' : 'SSIM',
'ssimulacra2' : 'SSIMULACRA2',
'vmaf' : 'VMAF',
'vmafneg' : 'VMAF NEG' }
data_sets = {}
for codec in codecs:
with open(os.path.join(sys.argv[1], codec + '.csv')) as f:
reader = csv.DictReader(f)
bpps = []
results = dict()
for col in cols:
results[col] = []
for row in reader:
bpp = row['bpp']
bpps.append(bpp)
for col in cols:
results[col].append(float(row[col]))
data_sets[codec] = ([float(x) for x in bpps], results)
print(data_sets)
for col in cols:
fig = go.Figure()
for codec in codecs:
codec_results = data_sets[codec]
fig.add_trace(go.Scatter(x = codec_results[0], y = codec_results[1][col], name = codec_name[codec], showlegend = True))
fig.update_traces(mode = 'markers+lines')
fig.update_xaxes(title_text = 'bits per pixel')
fig.update_yaxes(title_text = metric_name[col])
fig.update_layout(legend = dict(title = dict(text = 'codec')))
fig.update_layout(title = os.path.basename(sys.argv[1]))
fig.write_image(os.path.join(sys.argv[1], col + '.png'))
if __name__ == '__main__':
main()