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>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user