qc

module
v1.0.0 Latest Latest
Warning

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

Go to latest
Published: Sep 30, 2026 License: MIT

README

qc - Video Quality Control

CI Go Reference

Fast, statistically honest video quality analysis: a Go library and a CLI that take a video and give you technical metrics, a VMAF score and a per-title adaptive streaming ladder (H.264, HEVC, AV1) as fast as the reliability you ask for allows.

The qc wizard review screen, the live dashboard during a ladder build, and the HTML report with its verdict and key numbers

  • Technical analysis in seconds: bitrate, peaks and GOP structure without decoding. Then one decode fanned out to SI/TI (ITU-T P.910), shot detection, black and frozen segments, letterbox/pillarbox, luma levels and camera motion (each shot static, pan, tilt, zoom, tracking or handheld, with a shake measure).
  • Audio QC at no extra wall time: every audio track measured while the video decodes: loudness per ITU-R BS.1770-5 (integrated, range, true peak, EBU Tech 3341/3342 conformant, within 0.01 LU of ffmpeg's ebur128) against EBU R 128, ATSC A/85 or a streaming target; silence, muted channels, clipping, DC offset and phase problems (audio).
  • VMAF with a confidence interval: short clips sampled across shots until the 95% interval is narrower than your target. The intervals really cover the truth 95% of the time, measured by replaying thousands of runs. --exact scores every frame, bit-exact with Netflix's vmaf tool, at 8 and 10 bits. Or pick a fixed budget (--sample 2%, --sample 1/scene).
  • Beyond VMAF, on the same frames: XPSNR (a pure-Go port matching ffmpeg's filter), CAMBI banding, PSNR, PSNR-HVS, SSIM, MS-SSIM, CIEDE2000 or the whole AV2 CTC set, each with its own confidence interval, and VMAF per viewing device (phone, TV, 4K).
  • Per-title ladders, verified: probe encodes of a representative digest, rate-quality curves per resolution, their upper envelope, rungs one just-noticeable difference apart, then a real encode of every rung. It lands on the exhaustive optimum (−0.04 VMAF, −0.7% bitrate on average) in a fraction of the time. Impose the shape (--rungs 1080,720,540), probe adaptively where the rungs are uncertain, add per-shot rungs, or let AV1 synthesise film grain; verified rungs are checked for banding and for VMAF/XPSNR disagreements.
  • HDR aware: HDR10/HLG checked, MaxCLL/MaxFALL measured, wPSNR and ΔE ITP next to VMAF, 10-bit ladders carrying the HDR10 metadata (HDR).
  • See what was measured: --overlay annotated.mp4 burns the analysis into a copy of the video, frame by frame: timecode, bitrate, shots, camera motion, SI/TI, levels, VMAF of each scored frame and a timeline (annotated videos).
  • A terminal UI you'll enjoy: a live dashboard with progress, ETA and panels that show VMAF converging and probes landing on a braille chart. There is also an interactive wizard, plus JSON and self-contained HTML reports.

Install

Docker (linux/amd64, linux/arm64): qc, libvmaf 3.2.1 with its models and ffmpeg with x264, x265 and SVT-AV1, nothing else to install. Mount your videos on /data:

docker run --rm -v "$PWD:/data" ghcr.io/eko/qc vmaf reference.mov encode.mp4
docker run --rm -v "$PWD:/data" ghcr.io/eko/qc ladder source.mov -c av1 --html ladder.html

Homebrew (macOS, Linux):

brew install eko/tap/qc

Prebuilt binaries (Linux amd64/arm64, static; macOS arm64): on every release, with libvmaf and the VMAF models built in; only ffmpeg is needed (install).

From source: Go (see go.mod) with cgo, ffmpeg and ffprobe with libx264, libx265 and libsvtav1, libvmaf ≥ 3.2.1 with its models and pkg-config:

brew install ffmpeg libvmaf pkgconf   # macOS; Debian/Ubuntu: see docs/install.md
go install github.com/eko/qc/cmd/qc@latest

qc version --check checks the installation. Linux prerequisites, the image contents and troubleshooting: docs/install.md.

Quick start

qc                                                        # interactive wizard
qc run source.mov --codecs h264,av1 --html report.html    # analysis + ladders
qc run encode.mp4 -r source.mov                           # + VMAF against the source

qc analyze video.mp4 [--fast]                             # technical analysis (--fast: no decoding)
qc analyze video.mp4 --loudness-target atsc               # audio checked against ATSC A/85 (default: EBU R 128)
qc vmaf reference.mov distorted.mp4 [--exact]             # VMAF ± 95% CI, or every frame
qc vmaf reference.mov distorted.mp4 --sample 5%           # fixed budget (or 2/scene), one pass, CI reported
qc vmaf reference.mov distorted.mp4 --exact --overlay annotated.mp4   # + a copy with per-frame VMAF burnt in
qc ladder source.mov -c av1 --encode-bit-depth 10         # per-title Main10 AV1 ladder
qc ladder source.mov --rungs 1080,720,540,360 --top-vmaf 93   # impose the rungs, bitrates computed
qc ladder source.mov -c av1 --encode-ladder renditions/    # + the renditions, checked on the whole title

Every command accepts -o report.json, --html report.html and -f json. See the CLI reference.

Performance

Apple M2 Max, real 1080p25 H.264 sources:

Task Exact / exhaustive qc
Frame analysis of a 59 min title (every frame: SI/TI, shots, black, freeze, crop, levels, camera motion) 225 s (one CPU decode) 62–71 s at 26 Mbit/s, 49–52 s at 6 Mbit/s, same report to the bit (VideoToolbox segments, details)
VMAF of a 10:36 title (x264 720p rendition) 149 s (131 s with VideoToolbox decoding) 18.6 s at ±0.5 (26.5 s with CPU decoding; real 95% CI coverage: 94.5%)
VMAF of a 59 min title 897 s (704 s with VideoToolbox decoding) 42.1 s at ±0.5, 108 s at --sample 5% (58.7 / 184 s with CPU decoding)
H.264 ladder of a 10:36 title ≈ 2 h (dense grid on the full title) 1 min 39 s, every rung verified
H.264 ladder of a 1 min title vs the exhaustive optimum 13 min 2 min, −0.04 VMAF / −0.7% bitrate from the optimum

How these numbers were obtained, and how to reproduce them on your own content: docs/validation.md.

Documentation

Library

dec := decode.NewFFmpeg("ffmpeg", 0) // decode.WithHWAccel(decode.HWAccelAuto): VideoToolbox segments on macOS; HWAccelCUDA: NVDEC
analyzer := analysis.New(logger,
	probe.NewFFprobe("ffprobe"),
	bitstream.NewFFprobeReader("ffprobe"),
	dec,
	quality.NewMeter(dec, libvmaf.NewEngine()),
)

report, err := analyzer.Analyze(ctx, "video.mp4", analysis.Options{})
cmp, err := analyzer.Compare(ctx, "reference.mov", "encode.mp4", analysis.CompareOptions{})
ffmpeg := encode.NewFFmpeg("ffmpeg") // encodes, digests, grain measurements, renditions
engine := ladder.NewEngine(analyzer, ffmpeg, ffmpeg,
	ladder.WithGrainLab(ffmpeg), ladder.WithRenditionEncoder(ffmpeg))
res, err := engine.Build(ctx, "source.mov", ladder.Options{Codec: "av1"})

Every options struct has a useful zero value, except that ladder.Options needs its Codec. To go further:

cmp, err := analyzer.Compare(ctx, "reference.mov", "encode.mp4", analysis.CompareOptions{
	Quality: quality.Options{
		Precision: 0.25,                                         // or Exact: true, or Sample below
		Metrics:   []string{quality.MetricXPSNR, quality.MetricCAMBI},
		Devices:   []string{vmaf.DevicePhone, vmaf.Device4K},
	},
})
xpsnrY, _ := cmp.VMAF.Metric(quality.SeriesXPSNRY)  // mean and 95% CI, like VMAF
phone, _ := cmp.VMAF.Device(vmaf.DevicePhone)
banding := cmp.VMAF.Banding                         // segments where CAMBI > 5

// A fixed budget instead of a precision; the analysed encode gives its shot
// cuts to per-scene budgets and is not inspected again.
budget, _ := quality.ParseSample("2/scene")        // or "5%"
cmp, err = analyzer.Compare(ctx, "reference.mov", "encode.mp4", analysis.CompareOptions{
	Quality:   quality.Options{Sample: budget},
	Distorted: report,
})

// An imposed AV1 ladder, probed adaptively, with checked rungs.
res, err = engine.Build(ctx, "source.mov", ladder.Options{
	Codec:       "av1",
	Constraints: ladder.Constraints{Resolutions: []int{1080, 720, 540, 360}, TopVMAF: 93},
	Probing:     ladder.ProbingAdaptive,
	FilmGrain:   ladder.FilmGrainAuto,
	Metrics:     []string{quality.MetricXPSNR, quality.MetricCAMBI},
})
banded := ladder.BandedRungs(res.Rungs)        // rungs capped by banding
conflicts := ladder.RankConflicts(res.Rungs)   // VMAF and XPSNR disagree

// Per-shot rungs: one CRF per shot at an equal rate-quality slope.
res, err = engine.Build(ctx, "source.mov", ladder.Options{Codec: "hevc", PerShot: true})
for shot, cell := range res.ShotLadder(0) {    // the top rung, shot by shot
	fmt.Println(res.ShotInterval(shot).Start, cell.CRF, cell.PredictedBitrate)
}
if top := res.Rungs[0].PerShot; top != nil {
	fmt.Println(top.PooledBitrate(res.Shots))  // its bitrate over the whole title
}

// The renditions: every rung (and per-shot version) encoded on the whole
// title, each checked against the source.
renditions, err := engine.Encode(ctx, "source.mov", res, ladder.RenditionOptions{
	Dir:   "renditions",
	Check: &quality.Options{Precision: 0.5},
})
for _, rd := range renditions {
	vmafPredicted, bitratePredicted := res.Prediction(rd)
	fmt.Println(rd.Path, rd.Bitrate, bitratePredicted, rd.Checked.VMAFLabel(), vmafPredicted)
}

On an NVIDIA GPU, check first: NVDEC falls back to the CPU by itself, but an NVENC ladder would fail at its first encode. CUDA VMAF needs a binary built with -tags cuda against a CUDA libvmaf (libvmaf.CUDABuilt), and a model with CUDA features (VMAF v1, the default, has none):

err = nvidia.Check(ctx, "ffmpeg", nvidia.Requirements{
	HWAccel: decode.HWAccelCUDA,   // the decoder's decode.WithHWAccel
	Codecs:  []string{"hevc"},     // ladders on NVENC
})
res, err = engine.Build(ctx, "source.mov", ladder.Options{
	Codec:   "hevc",
	Encoder: encode.HardwareNVENC, // no per-shot rungs nor film grain synthesis
	Backend: vmaf.BackendAuto,     // CUDA VMAF when the model and the build allow it
})
fmt.Println(cmp.VMAF.GPUSummary()) // e.g. "NVDEC decoding (cuda) · VMAF features on CUDA"

quality/xpsnr also works on its own, on decoded frames, and matches ffmpeg's xpsnr filter. Runnable examples are on pkg.go.dev for analysis, quality, quality/xpsnr, quality/hdr, ladder, pipeline, nvidia, overlay and vmaf/libvmaf. To run everything with progress hooks, use pipeline.Runner as described in docs/architecture.md.

Contributing

Contributions are welcome. See CONTRIBUTING.md: make check runs what CI runs, and changes to the sampler or the ladder engine come with their validation numbers.

License

MIT

Directories

Path Synopsis
Package analysis orchestrates the analysis stages of a media file.
Package analysis orchestrates the analysis stages of a media file.
Package analyze fans decoded frames out to independent analyzers.
Package analyze fans decoded frames out to independent analyzers.
analyzetest
Package analyzetest checks that analyzers split into concurrent runs (analyze.Forker) give the results of a sequential pass.
Package analyzetest checks that analyzers split into concurrent runs (analyze.Forker) give the results of a sequential pass.
black
Package black detects black segments: runs of frames where nearly every thumbnail pixel is close to the nominal black level.
Package black detects black segments: runs of frames where nearly every thumbnail pixel is close to the nominal black level.
crop
Package crop detects letterboxing and pillarboxing: the smallest rectangle that contains the picture content across the whole video.
Package crop detects letterboxing and pillarboxing: the smallest rectangle that contains the picture content across the whole video.
freeze
Package freeze detects frozen segments: runs of frames whose thumbnail does not change.
Package freeze detects frozen segments: runs of frames whose thumbnail does not change.
grain
Package grain estimates the grain of video from its 8-bit luma: the standard deviation of the noise and its lag-1 correlation, measured on the flattest blocks of each frame, where the high-pass residual is grain and not texture.
Package grain estimates the grain of video from its 8-bit luma: the standard deviation of the noise and its lag-1 correlation, measured on the flattest blocks of each frame, where the high-pass residual is grain and not texture.
levels
Package levels measures per-frame luma statistics on the full-resolution plane: average, extremes and share of samples outside the legal range.
Package levels measures per-frame luma statistics on the full-resolution plane: average, extremes and share of samples outside the legal range.
light
Package light measures the light levels of HDR (PQ or HLG) frames: per frame, the brightest and the average display light of max(R, G, B) in cd/m², the quantities behind CTA-861.3's MaxCLL and MaxFALL.
Package light measures the light levels of HDR (PQ or HLG) frames: per frame, the brightest and the average display light of max(R, G, B) in cd/m², the quantities behind CTA-861.3's MaxCLL and MaxFALL.
motion
Package motion estimates the camera motion of every frame from the shared thumbnails, and classifies the camera work of every shot: static, pan, tilt, zoom, tracking (translation with parallax), handheld (shake) or mixed, with a shake measure.
Package motion estimates the camera motion of every frame from the shared thumbnails, and classifies the camera work of every shot: static, pan, tilt, zoom, tracking (translation with parallax), handheld (shake) or mixed, with a shake measure.
scene
Package scene detects hard cuts from the luma difference between consecutive thumbnails, with an adaptive threshold: a frame is a cut when its score is both high in absolute terms and much higher than its neighbours' (so that fast motion, which raises every score, does not trigger cuts).
Package scene detects hard cuts from the luma difference between consecutive thumbnails, with an adaptive threshold: a frame is a cut when its score is both high in absolute terms and much higher than its neighbours' (so that fast motion, which raises every score, does not trigger cuts).
siti
Package siti computes spatial and temporal perceptual information (SI/TI) as defined by ITU-T P.910.
Package siti computes spatial and temporal perceptual information (SI/TI) as defined by ITU-T P.910.
Package audio analyses the audio of a track in one pass over its decoded samples: its loudness against a delivery target (package loudness: ITU-R BS.1770-5, EBU R 128, ATSC A/85) and its technical defects (package defect: silence, muted channels, clipping, DC offset, phase).
Package audio analyses the audio of a track in one pass over its decoded samples: its loudness against a delivery target (package loudness: ITU-R BS.1770-5, EBU R 128, ATSC A/85) and its technical defects (package defect: silence, muted channels, clipping, DC offset, phase).
defect
Package defect finds the technical defects of an audio signal: silence (the whole mix, a channel, at the start and the end), muted channels, clipping, DC offset, and phase problems between the channels of a pair (out-of-phase segments, inverted polarity, two identical channels).
Package defect finds the technical defects of an audio signal: silence (the whole mix, a channel, at the start and the end), muted channels, clipping, DC offset, and phase problems between the channels of a pair (out-of-phase segments, inverted polarity, two identical channels).
loudness
Package loudness measures programme loudness as ITU-R BS.1770-5 defines it, with the meters of EBU Tech 3341 (momentary, short-term, integrated) and the loudness range of EBU Tech 3342, as EBU R 128 and ATSC A/85 use them, and checks it against a delivery target.
Package loudness measures programme loudness as ITU-R BS.1770-5 defines it, with the meters of EBU Tech 3341 (momentary, short-term, integrated) and the loudness range of EBU Tech 3342, as EBU R 128 and ATSC A/85 use them, and checks it against a delivery target.
bench
audioval command
Command audioval validates the audio analysis (packages audio, audio/loudness, audio/defect):
Command audioval validates the audio analysis (packages audio, audio/loudness, audio/defect):
gpuval command
Command gpuval validates qc on an NVIDIA GPU and writes a Markdown report to paste back: NVDEC decoding speed and frame identity, CUDA VMAF against CPU VMAF (agreement and speed), NVENC ladders against CPU ladders (time, bitrate at equal VMAF), and a CQ sweep calibrating the NVENC probe CQs.
Command gpuval validates qc on an NVIDIA GPU and writes a Markdown report to paste back: NVDEC decoding speed and frame identity, CUDA VMAF against CPU VMAF (agreement and speed), NVENC ladders against CPU ladders (time, bitrate at equal VMAF), and a CQ sweep calibrating the NVENC probe CQs.
ladderreplay command
Command ladderreplay replays the ladder engine on an exhaustive rate-quality grid instead of encoding: every encode the engine asks for is answered from the grid (interpolated in CRF), then the rungs are checked against the grid's own optimum.
Command ladderreplay replays the ladder engine on an exhaustive rate-quality grid instead of encoding: every encode the engine asks for is answered from the grid (interpolated in CRF), then the rungs are checked against the grid's own optimum.
ladderval command
Command ladderval checks a fast ladder (qc ladder -f json) against the exhaustive optimum of the whole title: it encodes the full title on a dense resolution × CRF grid with exact VMAF, builds the true rate-quality envelope, then encodes the full title with each rung's settings and reports how far every rung lands from the envelope.
Command ladderval checks a fast ladder (qc ladder -f json) against the exhaustive optimum of the whole title: it encodes the full title on a dense resolution × CRF grid with exact VMAF, builds the true rate-quality envelope, then encodes the full title with each rung's settings and reports how far every rung lands from the envelope.
motionval command
Command motionval checks the camera motion analysis (analyze/motion) against synthetic clips of known camera motion: pans, tilts and zooms at several speeds, handheld shake, combined moves, moving objects, parallax, grain, blur, fades and a cut.
Command motionval checks the camera motion analysis (analyze/motion) against synthetic clips of known camera motion: pans, tilts and zooms at several speeds, handheld shake, combined moves, moving objects, parallax, grain, blur, fades and a cut.
vmafsim command
Command vmafsim checks the sampled VMAF estimator against ground truth: it replays the production sampling loop many times on the per-frame scores of an exact measurement (qc vmaf --exact -f json) and reports the error, the real coverage of the confidence intervals and the share of frames scored.
Command vmafsim checks the sampled VMAF estimator against ground truth: it replays the production sampling loop many times on the per-frame scores of an exact measurement (qc vmaf --exact -f json) and reports the error, the real coverage of the confidence intervals and the share of frames scored.
Package bitstream analyses compressed packets without decoding them: bitrate over time, peaks and GOP structure.
Package bitstream analyses compressed packets without decoding them: bitrate over time, peaks and GOP structure.
cmd
qc command
Command qc analyses video files: technical metrics, VMAF against a reference and per-title streaming ladders (H.264, HEVC, AV1).
Command qc analyses video files: technical metrics, VMAF against a reference and per-title streaming ladders (H.264, HEVC, AV1).
Package decode turns a video file into a stream of frames.
Package decode turns a video file into a stream of frames.
Package encode runs ffmpeg encoders with codec-specific settings: x264, x265 and SVT-AV1 on the CPU, or NVIDIA NVENC (see Hardware).
Package encode runs ffmpeg encoders with codec-specific settings: x264, x265 and SVT-AV1 on the CPU, or NVIDIA NVENC (see Hardware).
Package frame defines decoded frames shared between analyzers.
Package frame defines decoded frames shared between analyzers.
internal
audiotest
Package audiotest synthesises test signals: the conformance signals of EBU Tech 3341 (loudness meters, true peak) and Tech 3342 (loudness range) as their tables describe them, with the expected readings and tolerances of the specifications, and PCM streams with known defects.
Package audiotest synthesises test signals: the conformance signals of EBU Tech 3341 (loudness meters, true peak) and Tech 3342 (loudness range) as their tables describe them, with the expected readings and tolerances of the specifications, and PCM streams with known defects.
colorimetry
Package colorimetry holds the colour science of ITU-R BT.2100 HDR signals shared by the light level analyzer and the HDR quality metrics: the PQ (SMPTE ST 2084) and HLG (ARIB STD-B67) transfer functions, the BT.2020 non-constant-luminance Y′CbCr matrix, the quantisation of code values and the ICtCp representation behind ΔE ITP (ITU-R BT.2124).
Package colorimetry holds the colour science of ITU-R BT.2100 HDR signals shared by the light level analyzer and the HDR quality metrics: the PQ (SMPTE ST 2084) and HLG (ARIB STD-B67) transfer functions, the BT.2020 non-constant-luminance Y′CbCr matrix, the quantisation of code values and the ICtCp representation behind ΔE ITP (ITU-R BT.2124).
ffexec
Package ffexec runs FFmpeg command-line tools and streams their output.
Package ffexec runs FFmpeg command-line tools and streams their output.
findings
Package findings holds the rules that turn a report into noteworthy facts: the thresholds, the level of each fact, the time ranges and the rungs it concerns.
Package findings holds the rules that turn a report into noteworthy facts: the thresholds, the level of each fact, the time ranges and the rungs it concerns.
htmlreport
Package htmlreport renders analysis results as a single self-contained HTML page: inline SVG charts, style and script, no external resource.
Package htmlreport renders analysis results as a single self-contained HTML page: inline SVG charts, style and script, no external resource.
htmlreport/svg
Package svg draws the charts of the HTML reports: a static SVG readable without script, a legend, and the chart's data at full resolution for the page script, which adds tooltips, zoom and legend toggles.
Package svg draws the charts of the HTML reports: a static SVG readable without script, a legend, and the chart's data at full resolution for the page script, which adds tooltips, zoom and legend toggles.
linalg
Package linalg is the small dense linear algebra behind the ladder's regressions: systems of a handful of unknowns, where a dependency would cost more than the few loops here.
Package linalg is the small dense linear algebra behind the ladder's regressions: systems of a handful of unknowns, where a dependency would cost more than the few loops here.
segments
Package segments turns per-frame flags into time intervals.
Package segments turns per-frame flags into time intervals.
stats
Package stats provides small descriptive statistics helpers.
Package stats provides small descriptive statistics helpers.
testutil
Package testutil provides helpers for tests that need real media files.
Package testutil provides helpers for tests that need real media files.
tui
Package tui renders analysis reports and progress for terminals.
Package tui renders analysis reports and progress for terminals.
Package ladder builds a per-title adaptive streaming ladder: probe encodes of a representative digest of the title give rate-quality curves per resolution, whose upper envelope drives the choice of rungs.
Package ladder builds a per-title adaptive streaming ladder: probe encodes of a representative digest of the title give rate-quality curves per resolution, whose upper envelope drives the choice of rungs.
internal/shotalloc
Package shotalloc is the pure math of per-shot encoding: the local rate-quality model of a shot, its prediction for shots the digest misses, and the equal-slope allocation of settings to shots (the per-shot convex hull of the Dynamic Optimizer).
Package shotalloc is the pure math of per-shot encoding: the local rate-quality model of a shot, its prediction for shots the digest misses, and the equal-slope allocation of settings to shots (the per-shot convex hull of the Dynamic Optimizer).
Package media holds the domain types shared by every analysis stage.
Package media holds the domain types shared by every analysis stage.
Package nvidia checks, before any long job, that an ffmpeg binary and the machine can do the NVIDIA GPU work a run asks for: NVDEC decoding (decode.WithHWAccel), and NVENC encoding (ladder.Options.Encoder set to encode.HardwareNVENC).
Package nvidia checks, before any long job, that an ffmpeg binary and the machine can do the NVIDIA GPU work a run asks for: NVDEC decoding (decode.WithHWAccel), and NVENC encoding (ladder.Options.Encoder set to encode.HardwareNVENC).
Package overlay turns analysis results into a debug overlay burnt into a copy of the video: an ASS subtitle script (Write) that libass renders through ffmpeg's subtitles filter, in the same encode that writes the copy (Renderer, through its Burner port, encode.FFmpeg in practice).
Package overlay turns analysis results into a debug overlay burnt into a copy of the video: an ASS subtitle script (Write) that libass renders through ffmpeg's subtitles filter, in the same encode that writes the copy (Renderer, through its Burner port, encode.FFmpeg in practice).
Package pipeline chains every analysis of a title: technical analysis, VMAF against a reference and streaming ladders, optionally encoded into renditions (Options.Renditions, WithLadderEncoder), reporting each stage.
Package pipeline chains every analysis of a title: technical analysis, VMAF against a reference and streaming ladders, optionally encoded into renditions (Options.Renditions, WithLadderEncoder), reporting each stage.
Package probe extracts container and stream level information from a media file.
Package probe extracts container and stream level information from a media file.
Package quality measures the full-reference quality (VMAF) of a distorted video against its reference, as fast as the requested precision allows.
Package quality measures the full-reference quality (VMAF) of a distorted video against its reference, as fast as the requested precision allows.
hdr
Package hdr measures the fidelity of HDR (PQ or HLG) video on decoded 4:2:0 frames, in pure Go, with two metrics of the HDR literature:
Package hdr measures the fidelity of HDR (PQ or HLG) video on decoded 4:2:0 frames, in pure Go, with two metrics of the HDR literature:
xpsnr
Package xpsnr computes XPSNR, the extended perceptually weighted PSNR of Fraunhofer HHI (Helmrich et al.), on decoded 4:2:0 frames.
Package xpsnr computes XPSNR, the extended perceptually weighted PSNR of Fraunhofer HHI (Helmrich et al.), on decoded 4:2:0 frames.
Package vmaf describes VMAF measurements without depending on libvmaf: models and the resolution they are evaluated at (ModelSpec, ResolveModel, DeviceModel), extra feature extractors (Extractor), where the model features are extracted (Backend, ResolveBackend) and the contract of a scoring engine (Models, Scorer).
Package vmaf describes VMAF measurements without depending on libvmaf: models and the resolution they are evaluated at (ModelSpec, ResolveModel, DeviceModel), extra feature extractors (Extractor), where the model features are extracted (Backend, ResolveBackend) and the contract of a scoring engine (Models, Scorer).
libvmaf
Package libvmaf binds libvmaf (cgo) to score pairs of decoded frames: it implements the scoring contract of package vmaf (vmaf.Models, vmaf.Scorer), and Engine plugs it into quality.Meter.
Package libvmaf binds libvmaf (cgo) to score pairs of decoded frames: it implements the scoring contract of package vmaf (vmaf.Models, vmaf.Scorer), and Engine plugs it into quality.Meter.

Jump to

Keyboard shortcuts

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