Video upscaling by resampling, not by inventing pixels
Video upscaling by resampling, not by inventing pixels?
The tool page says local, no upload, no AI. The code matches that wording. WebCodecs decodes frames, a WebAssembly module resamples them, and WebCodecs encodes the result. Lanczos3, bicubic, and bilinear are the filters. Edge contrast is a small 3×3 Laplacian: natural, subtle, or crisp.
The tool page says local, no upload, no AI. The code matches that wording. WebCodecs decodes frames, a WebAssembly module resamples them, and WebCodecs encodes the result. Lanczos3, bicubic, and bilinear are the filters. Edge contrast is a small 3×3 Laplacian: natural, subtle, or crisp. The filter does not add faces, letters, or texture that were not in the frame.
Quality presets are Best (Lanczos3), Balanced (bicubic), and Fast (bilinear). Output targets are 1080p, 1440p, 4K UHD, 2×, and a custom size inside the control’s limits. The options on a case are the controls that were used, not a list of presets nobody ran.
The current resampler works on 8-bit SDR frames. HDR and 10-bit color are not kept as a promised path. Compatible audio is copied when the output container can carry it. Standard container tags are omitted when “Strip metadata” stays on, which is the default.
Bigger frames usually make a bigger file. The byte counts on each case are the captured sizes. This page does not turn them into a quality score. SIMD is used when the browser has it; that is not a rate measured for every visitor.
This is not a generative or diffusion upscaler.
Any timing number appears only when that case’s probe recorded it.
Generated CC0 lab input via tests/helpers/video-acceptance.mjs makeSyntheticMp4 (testsrc 320x240, 15 fps, 2 seconds, sine 440 Hz). This is an original lab input, not a product output and not a real-world recording.
{"videoStart":0,"videoEnd":2,"audioStart":-0.02322,"audioEnd":2,"startDriftSec":0.02322,"endDriftSec":0,"scope":"this clip only; not a general A/V sync guarantee"}
This download probed as h264 with aac audio. Output is 122742 bytes and the input fixture is 36625 bytes. The output file is larger than the input on this clip. The output audio stream is present on this clip. Packet start drift 0.02322s is for this clip only. Elapsed 947ms is for this environment only. Output is 640x480 and input is 320x240. Dimensions increased by resampling. This does not show recovered detail.
publicClaims
["This download probed as h264 with aac audio.","Output is 122742 bytes and the input fixture is 36625 bytes. The output file is larger than the input on this clip.","The output audio stream is present on this clip.","Packet start drift 0.02322s is for this clip only.","Elapsed 947ms is for this environment only.","Output is 640x480 and input is 320x240. Dimensions increased by resampling. This does not show recovered detail."]
{"videoStart":0,"videoEnd":2,"audioStart":-0.02322,"audioEnd":2,"startDriftSec":0.02322,"endDriftSec":0,"scope":"this clip only; not a general A/V sync guarantee"}
{"method":"Relative box at 8% from the left and 12% from the top, covering 40% by 40% of each frame. The output crop was scaled down to the input crop pixel size with sharp lanczos3 as a reading aid.","productStep":false,"qualityScore":false}
observedStates
[{"t":1790925450460,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925450590,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925451686,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925451745,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925451915,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925451979,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925452552,"phase":"","rowState":"","busy":false,"progress":"0% Frame 0 of 30"},{"t":1790925452703,"phase":"","rowState":"","busy":false,"progress":"63% Frame 18 of 30 · 23.4 FPS"},{"t":1790925452779,"phase":"","rowState":"","busy":false,"progress":"100% Frame 29 of 30 · 34.3 FPS"},{"t":1790925452814,"phase":"","rowState":"","busy":false,"progress":"100% Frame 30 of 30 · 34 FPS"},{"t":1790925452976,"phase":"","rowState":"","busy":false,"progress":"100% Frame 30 of 30 · 34 FPS"}]
{"observedUnique":10,"violations":[],"scope":"Observed requests in this run only. Not a universal no-exfiltration certificate."}
pageErrorCount
0
Paired frames and detail crops
The pictures are the paired frames or detail crops saved with this case. A changed width or height is the recorded mathematical resize. It is not new image detail.
Decoded input frame from this clip.Browser-output frame from this clip.
Decoded input frame and browser-output frame from this clip.
Input crop from the same relative box, kept as a reading aid.Browser-output crop from the same relative box, kept as a reading aid.
Relative box at 8% from the left and 12% from the top, covering 40% by 40% of each frame. The output crop was scaled down to the input crop pixel size with sharp lanczos3 as a reading aid. This pair is a reading aid.
Limitations recorded for this case
The upscaler control is mathematical resampling (Lanczos3, bicubic, or bilinear), not a generative model.
Capture instrumentation aborts known preexisting Cloudflare telemetry at static.cloudflareinsights.com and /cdn-cgi/rum before transmission. That block is not evidence that production has no analytics.
Screenshots from the capture
Input · settings visible · 1120×571. Video upscaler for cpk-lab-cc0-chart-motion-sine-320x240.mp4. Target text 640 × 480. Quality high. Sharpen off.Processing · running progress 0% · 1120×806. upscaling-lab-chart-sine-lanczos3-2x while the page showed running progress 0%.Output · result visible · 1120×818. Video upscaler result for cpk-lab-cc0-chart-motion-sine-320x240.mp4.
tests/fixtures/media-corpus manifest MC-VID-001, constructed by scripts/generate-media-corpus.mjs. CC0-1.0 constructed original. Not regenerated by this capture.
{"videoStart":0,"videoEnd":1,"audioStart":-0.064,"audioEnd":1,"startDriftSec":0.064,"endDriftSec":0,"scope":"this clip only; not a general A/V sync guarantee"}
This download probed as h264 with aac audio. Output is 6097 bytes and the input fixture is 7209 bytes. The output byte count is not larger than the input on this clip. The output audio stream is present on this clip. Packet start drift 0.064s is for this clip only. Elapsed 352ms is for this environment only. Output is 128x128 and input is 64x48. Dimensions increased by resampling. This does not show recovered detail.
publicClaims
["This download probed as h264 with aac audio.","Output is 6097 bytes and the input fixture is 7209 bytes. The output byte count is not larger than the input on this clip.","The output audio stream is present on this clip.","Packet start drift 0.064s is for this clip only.","Elapsed 352ms is for this environment only.","Output is 128x128 and input is 64x48. Dimensions increased by resampling. This does not show recovered detail."]
{"videoStart":0,"videoEnd":1,"audioStart":-0.064,"audioEnd":1,"startDriftSec":0.064,"endDriftSec":0,"scope":"this clip only; not a general A/V sync guarantee"}
{"method":"Relative box at 8% from the left and 12% from the top, covering 40% by 40% of each frame. The output crop was scaled down to the input crop pixel size with sharp lanczos3 as a reading aid.","productStep":false,"qualityScore":false}
observedStates
[{"t":1790925454580,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925454706,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925455192,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925455247,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925455412,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925455465,"phase":"","rowState":"","busy":false,"progress":"0% Starting local processing…"},{"t":1790925455699,"phase":"","rowState":"","busy":false,"progress":"100% Frame 11 of 12 · 37.2 FPS"},{"t":1790925455741,"phase":"","rowState":"","busy":false,"progress":"100% Frame 12 of 12 · 37.1 FPS"},{"t":1790925455875,"phase":"","rowState":"","busy":false,"progress":"100% Frame 12 of 12 · 37.1 FPS"}]
{"observedUnique":10,"violations":[],"scope":"Observed requests in this run only. Not a universal no-exfiltration certificate."}
pageErrorCount
0
Paired frames and detail crops
The pictures are the paired frames or detail crops saved with this case. A changed width or height is the recorded mathematical resize. It is not new image detail.
Decoded input frame from this clip.Browser-output frame from this clip.
Decoded input frame and browser-output frame from this clip.
Input crop from the same relative box, kept as a reading aid.Browser-output crop from the same relative box, kept as a reading aid.
Relative box at 8% from the left and 12% from the top, covering 40% by 40% of each frame. The output crop was scaled down to the input crop pixel size with sharp lanczos3 as a reading aid. This pair is a reading aid.
Limitations recorded for this case
The upscaler control is mathematical resampling (Lanczos3, bicubic, or bilinear), not a generative model.
MC-VID-001 is 64x48, about 1 second, 12 fps, and 7209 bytes. It is a limitation case, not a quality benchmark.
Capture instrumentation aborts known preexisting Cloudflare telemetry at static.cloudflareinsights.com and /cdn-cgi/rum before transmission. That block is not evidence that production has no analytics.
Screenshots from the capture
Input · settings visible · 1120×571. Video upscaler for mc-vid-h264-aac-1s.mp4. Target text 128 × 128. Quality high. Sharpen off.Processing · running progress 0% · 1120×806. upscaling-mc-vid-001-limitation while the page showed running progress 0%.Output · result visible · 1120×818. Video upscaler result for mc-vid-h264-aac-1s.mp4.