Add custom quality factors and quantizer bitrate mode (#448)

* Add custom quality factors and quantizer bitrate mode (closes #327)

* Fix quantizer mode fallback and per-frame quantizer edge cases

* Clean up quantizer mode tests

* Quantizer implementation

* Add quality tests

* Improve conversion codec error message, make test more lenient

* Add quantizer support blog post

---------

Co-authored-by: Vanilagy <[email protected]>
This commit is contained in:
Don Carignan
2026-07-30 17:24:59 +02:00
committed by GitHub
co-authored by Vanilagy
parent 1a99b0371d
commit c3df2a24e5
48 changed files with 1372 additions and 371 deletions
+4 -4
View File
@@ -15,7 +15,7 @@ import { Conversion, ConversionCanceledError } from '../../src/conversion.js';
import { assert } from '../../src/misc.js';
import { InputVideoTrack } from '../../src/input-track.js';
import { CanvasSource, EncodedAudioPacketSource } from '../../src/media-source.js';
import { QUALITY_HIGH } from '../../src/encode.js';
import { Quality } from '../../src/encode.js';
import { EncodedPacket } from '../../src/packet.js';
test('Rotation is baked in when rerendering', async () => {
@@ -161,7 +161,7 @@ test('HLS track assignability is kept #1', async () => {
ctx.fillStyle = 'red';
ctx.fillRect(100, 100, 200, 200);
const videoSource = new CanvasSource(canvas, { codec: 'avc', bitrate: QUALITY_HIGH });
const videoSource = new CanvasSource(canvas, { codec: 'avc', quality: new Quality('high') });
output.addVideoTrack(videoSource);
const audioSource = new EncodedAudioPacketSource('aac');
@@ -240,7 +240,7 @@ test('HLS track assignability is kept #2', async () => {
const a = new OutputTrackGroup();
const b = new OutputTrackGroup();
const videoSource = new CanvasSource(canvas, { codec: 'avc', bitrate: QUALITY_HIGH });
const videoSource = new CanvasSource(canvas, { codec: 'avc', quality: new Quality('high') });
output.addVideoTrack(videoSource, { group: a });
const audioSource = new EncodedAudioPacketSource('aac');
@@ -319,7 +319,7 @@ test('HLS track assignability can be overridden', async () => {
const a = new OutputTrackGroup();
const b = new OutputTrackGroup();
const videoSource = new CanvasSource(canvas, { codec: 'avc', bitrate: QUALITY_HIGH });
const videoSource = new CanvasSource(canvas, { codec: 'avc', quality: new Quality('high') });
output.addVideoTrack(videoSource, { group: a });
const audioSource = new EncodedAudioPacketSource('aac');