Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
984 commits
Select commit Hold shift + click to select a range
ceff2df
Keep the last split child's contexts above the largest partition
JimBobSquarePants Sep 24, 2026
0ef23f1
Reset the mode thresholds in the inter skip fixture
JimBobSquarePants Sep 24, 2026
caf28b4
Reset mode thresholds only where the fixture has inter storage
JimBobSquarePants Sep 24, 2026
fd887e3
Adapt the coefficient distributions of a large block one plane at a time
JimBobSquarePants Sep 24, 2026
790c3c8
Code an estimated palette block as DCT unless its first transform is not
JimBobSquarePants Sep 24, 2026
8da1117
Evaluate the shapes of an edge 16x16 limited to its unsplit shape
JimBobSquarePants Sep 24, 2026
fa76207
Clear the analyzer errors in the AV1 encoder
JimBobSquarePants Sep 24, 2026
96f8218
Encode a copied sibling from its displacement before the next leaf
JimBobSquarePants Sep 24, 2026
8792054
Search intra block copy displacements on the source frame
JimBobSquarePants Sep 24, 2026
4e35e82
Allow intra block copy only where a block can and does use it
JimBobSquarePants Sep 24, 2026
154067d
Charge the unused copy flag inside each intra luma candidate
JimBobSquarePants Sep 24, 2026
94aebca
Derive the skip flag of copied and inter blocks as the reference does
JimBobSquarePants Sep 24, 2026
68591ab
Charge uncoded chroma at the energy the transform search reports
JimBobSquarePants Sep 24, 2026
74902b3
Search the leaves of a variance partition before encoding them
JimBobSquarePants Sep 24, 2026
82a4b9f
End the inter transform type search as the reference does
JimBobSquarePants Sep 24, 2026
5668b91
Wrap the 16x16 Hadamard combine in sixteen bits as the x64 encoder does
JimBobSquarePants Sep 25, 2026
b520690
Record the verified still-picture parity in the implementation plan
JimBobSquarePants Sep 25, 2026
e4a5e7f
Follow the real-time reference for a sequence's key frame
JimBobSquarePants Sep 25, 2026
7235252
Use the real-time transform-domain distortion threshold
JimBobSquarePants Sep 25, 2026
f965fcb
Count a single-reference ALTREF neighbor in the compound contexts
JimBobSquarePants Sep 25, 2026
d0cf2ac
Follow the real-time reference structure for sequence frames
JimBobSquarePants Sep 25, 2026
e46240e
Signal motion modes and follow real-time inter tools
JimBobSquarePants Sep 25, 2026
5edef85
Port the large-block skip model and intra skip of the non-RD search
JimBobSquarePants Sep 25, 2026
3496836
Port the CBR projection search and the non-RD partition merge
JimBobSquarePants Sep 25, 2026
c251c1b
Match the decoder's compound neighbor contexts in the encoder
JimBobSquarePants Sep 25, 2026
0be7c95
Port the real-time golden refresh adjustment
JimBobSquarePants Sep 25, 2026
21eb018
Prune compound candidates by their single-reference variance
JimBobSquarePants Sep 25, 2026
0214a29
Port the constant-bitrate motion vector bias
JimBobSquarePants Sep 25, 2026
943065e
Use the block color sensitivity for the CDEF skip
JimBobSquarePants Sep 25, 2026
111ef69
Code no filter for compound global blocks with a non-translation model
JimBobSquarePants Sep 25, 2026
f8496e1
Round neighbor vectors to full samples in variance partitioning
JimBobSquarePants Sep 25, 2026
33a9627
Round the NEWMV search start to the nearest full sample
JimBobSquarePants Sep 25, 2026
a2d1aa6
Predict intra chroma estimates from the best intra mode so far
JimBobSquarePants Sep 25, 2026
7a739d8
Update the plan with the sequence parity state
JimBobSquarePants Sep 25, 2026
8cb9da9
Size the inter-prediction scratch for the widest block
JimBobSquarePants Sep 25, 2026
792df42
Code a skipped inter block with the largest transform
JimBobSquarePants Sep 25, 2026
1a5472c
Use 64x64 superblocks for real-time sequences up to 720p
JimBobSquarePants Sep 25, 2026
aef4ee5
Let variance partitioning use ALTREF
JimBobSquarePants Sep 25, 2026
ea58d8c
Search only the regular and smooth filters in the non-RD search
JimBobSquarePants Sep 25, 2026
b5a46cc
Start every real-time frame with switchable filters
JimBobSquarePants Sep 25, 2026
0c1013b
Keep intra estimate edges apart from live inter predictions
JimBobSquarePants Sep 25, 2026
2e80dcd
Update the plan with the sized sequence parity state
JimBobSquarePants Sep 25, 2026
e27b170
Restore the frame probability tables at a golden refresh
JimBobSquarePants Sep 25, 2026
14ed539
Update the plan with the real-time sequence coverage
JimBobSquarePants Sep 25, 2026
6f4ad29
Fix two faults in the GOOD-mode inter search
JimBobSquarePants Sep 25, 2026
78d7c95
Record the GOOD-mode sequence starting state in the plan
JimBobSquarePants Sep 25, 2026
a18e5ed
Enable inter-intra compound in GOOD sequences and keep searched compo…
JimBobSquarePants Sep 25, 2026
bcabdd8
Match the GOOD key frame with aomenc at every speed
JimBobSquarePants Sep 25, 2026
a54ba07
Port the good-quality lag-0 reference structure
JimBobSquarePants Sep 25, 2026
2cc6920
Port warped motion for mode-loop winners and fix GOOD inter parity
JimBobSquarePants Sep 25, 2026
a807d1c
Port reference-frame limits and intra budget check for GOOD inter frames
JimBobSquarePants Sep 25, 2026
41f49fa
Match GOOD speed 5 inter frames with aomenc
JimBobSquarePants Sep 25, 2026
a20bc2a
Match GOOD speed 4 inter frames with aomenc
JimBobSquarePants Sep 25, 2026
b4e32fe
Match GOOD speed 3 inter frames with aomenc
JimBobSquarePants Sep 25, 2026
9412152
Match GOOD speed 2 inter frames with aomenc
JimBobSquarePants Sep 25, 2026
5a5f26e
Match GOOD speed 1 inter frames with aomenc
JimBobSquarePants Sep 25, 2026
6c5bee4
Match GOOD speed 0 inter frames 1-3 with aomenc
JimBobSquarePants Sep 25, 2026
62f1d60
Match GOOD speed 0 inter frames 4-5 with aomenc
JimBobSquarePants Sep 25, 2026
1c63ddd
Vectorize the OBMC search measures and target with the operator pattern
JimBobSquarePants Sep 28, 2026
d314a95
Vectorize the compound motion search measures with the operator pattern
JimBobSquarePants Sep 28, 2026
e2a82e8
Port the wedge search measures with the operator pattern
JimBobSquarePants Sep 28, 2026
4b7e5e8
Move the residual square sums and coefficient measures to the operato…
JimBobSquarePants Sep 28, 2026
96f2530
Move the end-of-block search to the operator pattern
JimBobSquarePants Sep 28, 2026
8634a72
Port the residual block statistics and neighbor correlation with the …
JimBobSquarePants Sep 28, 2026
2ffec04
Port the motion projections and intra estimate measures with the oper…
JimBobSquarePants Sep 28, 2026
ec3dfc5
Reduce the HEIF test suite to the size of the other formats and test …
JimBobSquarePants Sep 28, 2026
810e28f
Use the avifenc defaults for quality, speed, range and chroma sampling
JimBobSquarePants Sep 28, 2026
8317af4
Report the HEIF chroma sampling in metadata and keep it when re-encoding
JimBobSquarePants Sep 28, 2026
c1de6fe
Carry the libavif encoder options and turn loop restoration off for 1…
JimBobSquarePants Sep 28, 2026
88e72c5
Port the libavif tune=iq and tune=ssim defaults with their libaom fea…
JimBobSquarePants Sep 28, 2026
1ad7218
Port the libaom global motion search and the GOOD inter fixes it exposed
JimBobSquarePants Sep 29, 2026
a3d9349
Match aomenc on the tune=ssim GOOD sequences
JimBobSquarePants Sep 29, 2026
90e560c
Port the libaom one-pass CBR rate control for real-time sequences
JimBobSquarePants Sep 29, 2026
140e115
Merge remote-tracking branch 'upstream/main' into heic-support
JimBobSquarePants Sep 29, 2026
f8c9059
Measure the zero-motion chroma SAD of the variance partition against …
JimBobSquarePants Sep 29, 2026
e952516
Add blank lines after multi-line statements and port the Q-mode key-f…
JimBobSquarePants Sep 29, 2026
f9fb729
Remove obsolete items from the HEIF implementation plan
JimBobSquarePants Sep 29, 2026
269aa2c
Keep the full quantizer range for constant-quality sequences and add …
JimBobSquarePants Sep 29, 2026
20e41ff
Predict a kept wedge from the references, as libaom does
JimBobSquarePants Sep 29, 2026
bb6706a
Update the HEIF plan: speed 0 Q mode and the RT cut case now match ao…
JimBobSquarePants Sep 29, 2026
28d8fb3
Port the libaom temporal filter
JimBobSquarePants Sep 29, 2026
3dc0432
Port the libaom first pass for the lookahead stage
JimBobSquarePants Sep 29, 2026
30eef15
Port the libaom one-pass lookahead group and key-frame decisions
JimBobSquarePants Sep 29, 2026
3b6601d
Port the libaom TPL model
JimBobSquarePants Sep 29, 2026
f679603
Derive good-quality speed features from the frame update type
JimBobSquarePants Sep 29, 2026
4f42d32
Add the lookahead sequence driver and wire the TPL consumers
JimBobSquarePants Sep 29, 2026
e15d8d9
Port the macroblock residual-hash reuse of the luma transform search
JimBobSquarePants Sep 29, 2026
134a454
Match aomenc on lagged GOOD sequences without filtering or TPL
JimBobSquarePants Sep 29, 2026
6b005d9
Match aomenc temporal filtering on lagged GOOD sequences
JimBobSquarePants Sep 29, 2026
aa45292
Update the HEIF plan: lag-35 stages A and B match aomenc; audited ope…
JimBobSquarePants Sep 29, 2026
618d901
HEIF plan: verify the remaining open items and the test list
JimBobSquarePants Sep 29, 2026
829912f
HEIF plan: drop the unverified intrinsics test note
JimBobSquarePants Sep 29, 2026
108f173
Port the remaining libaom encoder decisions reached by libavif config…
JimBobSquarePants Sep 30, 2026
464cf90
Mirror the JPEG color conversion structure in HEIF decoding
JimBobSquarePants Sep 30, 2026
470179a
Store the transposed HEIF alpha resize window in a flat buffer
JimBobSquarePants Sep 30, 2026
2502b6f
Port libaom lag-35 encoder decisions and motion vector precision stat…
JimBobSquarePants Oct 1, 2026
ef3efbc
Add AVIF tile options and libavif automatic tiling
JimBobSquarePants Oct 1, 2026
4fa2296
Make the HEIF encoding speed a plain enum option, as the other encode…
JimBobSquarePants Oct 1, 2026
4727ad6
Run the first pass tile by tile, and tidy the HEIF encoder option docs
JimBobSquarePants Oct 1, 2026
063ee45
Add a key frame interval to the HEIF encoder
JimBobSquarePants Oct 1, 2026
0e4f294
Add a sharpness option to the HEIF encoder
JimBobSquarePants Oct 1, 2026
bc8eee7
Add a tune option to the HEIF encoder
JimBobSquarePants Oct 1, 2026
bd3b612
Add variance adaptive quantization to the HEIF encoder
JimBobSquarePants Oct 1, 2026
bf211ba
Port complexity adaptive quantization to the AV1 encoder
JimBobSquarePants Oct 1, 2026
37ed0f0
Add cyclic refresh, film grain, the SSIMULACRA 2 tune and separate ch…
JimBobSquarePants Oct 1, 2026
4eaf3a1
Add layered images to the HEIF encoder and fix the delta quantizer an…
JimBobSquarePants Oct 1, 2026
e85ef3c
Add scaled layers to layered HEIF images
JimBobSquarePants Oct 1, 2026
4d2919c
Add bit-budget rate control to AV1 still images
JimBobSquarePants Oct 2, 2026
ff3962c
Add bit-budget rate control to good-quality sequences without lookahead
JimBobSquarePants Oct 2, 2026
ce2be5b
Add variable-bitrate, constrained-quality and constant-quality real-t…
JimBobSquarePants Oct 2, 2026
f78c490
Add bit-budget rate control to look-ahead sequences
JimBobSquarePants Oct 2, 2026
4ff9c3b
Add the recode loop to look-ahead sequences under a bit budget
JimBobSquarePants Oct 2, 2026
b513cc2
Add the rate control option to the HEIF encoder
JimBobSquarePants Oct 2, 2026
3c9747a
Expose complexity adaptive quantization in the HEIF encoder
JimBobSquarePants Oct 2, 2026
df7c232
Code lossless animations with inter frames
JimBobSquarePants Oct 2, 2026
b876784
Charge smooth predictions at sharpness 3
JimBobSquarePants Oct 2, 2026
5cc57d4
Test that HEIF encoding stops on cancellation
JimBobSquarePants Oct 2, 2026
e06aed7
Stop a canceled HEIF encode between superblock rows
JimBobSquarePants Oct 2, 2026
9f24901
Pass mutable structs by value instead of in
JimBobSquarePants Oct 2, 2026
1022acb
Fix lossless subsampled color and test cancellation like other encoders
JimBobSquarePants Oct 2, 2026
2e63a1d
Reuse the texture sample loads for the smoothing measure
JimBobSquarePants Oct 2, 2026
a1a5e34
Cover complexity segments and lossless alpha and gray animations
JimBobSquarePants Oct 2, 2026
c35f2c4
Benchmark the smoothing variance measure against the reference loop
JimBobSquarePants Oct 2, 2026
81bf0aa
Charge the sharpness 3 mode loop by the frame buffer destination
JimBobSquarePants Oct 6, 2026
9d56aa8
Build the HEIF encoder clean on net11.0
JimBobSquarePants Oct 6, 2026
b2ece54
Remove the diagnostic symbol trace from the AV1 encoder and decoder
JimBobSquarePants Oct 6, 2026
58efdd2
Reduce the new motion search range from the reference list vectors
JimBobSquarePants Oct 6, 2026
00cf7a1
Clear the analyzer warnings in the HEIF tests
JimBobSquarePants Oct 6, 2026
1e4ae33
Validate compound vectors as libaom build_cur_mv() does
JimBobSquarePants Oct 6, 2026
ef11274
Cover lookahead animations at speeds 0, 2 and 4
JimBobSquarePants Oct 6, 2026
a2dca83
Gate intra modes in inter frames with libaom best_inter_yrd
JimBobSquarePants Oct 6, 2026
c40b150
Bound compound type estimates as libaom av1_compound_type_rd() does
JimBobSquarePants Oct 6, 2026
ac19a7d
Test AV1 decoding with AVIF inputs as the other codecs do
JimBobSquarePants Oct 6, 2026
3a92184
Port two inter search quirks that speed 0 reaches
JimBobSquarePants Oct 6, 2026
1f57d58
Follow libaom's intra mode stops in inter frames
JimBobSquarePants Oct 6, 2026
6d2871a
Set interpolation skip flags as libaom calc_interp_skip_pred_flag() does
JimBobSquarePants Oct 6, 2026
f1339c1
Store the inter-intra model error as the reference's prediction error
JimBobSquarePants Oct 7, 2026
b4fbe62
Remove the native libaom benchmark tooling
JimBobSquarePants Oct 7, 2026
20a89eb
Compare HEIF coding against Magick.NET as the other codec benchmarks do
JimBobSquarePants Oct 7, 2026
00264fb
Run benchmarks on the project target framework and record HEIF results
JimBobSquarePants Oct 7, 2026
77713df
Remove the HEIF implementation plan from the repository
JimBobSquarePants Oct 7, 2026
0ce062f
Match speed and chroma sampling in the HEIF encode benchmark
JimBobSquarePants Oct 7, 2026
7918395
Match the SSIM tune in the HEIF encode benchmark and record stable re…
JimBobSquarePants Oct 7, 2026
5c73e9b
Record stable HEIF decode benchmark results
JimBobSquarePants Oct 7, 2026
f8decf9
Add single-core Magick cases to the HEIF benchmarks
JimBobSquarePants Oct 7, 2026
992fc7c
Update the AV1 encoder port to libaom 4cea455cab
JimBobSquarePants Oct 7, 2026
695e0f0
Write intra luma trials into the frame as libaom writes pd->dst, and …
JimBobSquarePants Oct 7, 2026
661e166
Write intra chroma trials into the frame as libaom writes pd->dst, an…
JimBobSquarePants Oct 7, 2026
8da3c12
Write inter luma trials into the frame as libaom writes pd->dst
JimBobSquarePants Oct 7, 2026
9bbf481
Test the frame for a noise pattern in the trellis of the final encode…
JimBobSquarePants Oct 7, 2026
7f560e9
Start each encoder frame buffer at zero, as libaom does
JimBobSquarePants Oct 7, 2026
00ea148
Keep the memory of a reused frame buffer when the new frame fits, as …
JimBobSquarePants Oct 7, 2026
90690c6
Record the HEIF encode benchmark results after the frame memory changes
JimBobSquarePants Oct 7, 2026
bbd5601
Record elevated HEIF benchmark results with native memory
JimBobSquarePants Oct 7, 2026
8def346
State the measured cause of the ImageSharp native leak in the HEIF be…
JimBobSquarePants Oct 7, 2026
08dbe8a
Reconstruct the transform type search winner only when libaom does
JimBobSquarePants Oct 7, 2026
c3c47e8
Keep no quantized coefficients from the intra mode search, as libaom …
JimBobSquarePants Oct 7, 2026
42944f4
Skip the alpha item of a single image whose alpha is opaque, as libav…
JimBobSquarePants Oct 7, 2026
02d1a5e
Stop the coefficient context sum once it passes the mask, as libaom does
JimBobSquarePants Oct 7, 2026
fefb5d5
Read spans and costs once outside loops in the encoder hot paths
JimBobSquarePants Oct 7, 2026
1d240f0
Resolve spans outside loops throughout the HEIF code
JimBobSquarePants Oct 7, 2026
2f33715
Pass plane spans to block functions instead of reading planes per call
JimBobSquarePants Oct 7, 2026
be94b94
Read the mode-information grid once outside neighbor and unit loops
JimBobSquarePants Oct 7, 2026
543b826
Add narrow residual kernels and pass the plane block to intra edge pr…
JimBobSquarePants Oct 7, 2026
d5df104
Read luma block values once before the mode and palette loops
JimBobSquarePants Oct 7, 2026
915337d
Pin the block workspace and read distribution thresholds by reference
JimBobSquarePants Oct 7, 2026
877818c
Pin the frame mode-information storage and view it through pointers
JimBobSquarePants Oct 7, 2026
cb8699b
Revert "Pin the frame mode-information storage and view it through po…
JimBobSquarePants Oct 8, 2026
a0f266f
Revert "Pin the block workspace and read distribution thresholds by r…
JimBobSquarePants Oct 8, 2026
3f2c3e7
Read the luma mode contexts once for all mode trials of a block
JimBobSquarePants Oct 8, 2026
760934c
Describe each chroma plane once before the chroma mode loop
JimBobSquarePants Oct 8, 2026
dd67a1d
Read the rate tables once for each transform-type search
JimBobSquarePants Oct 8, 2026
85efc14
Keep lines within 160 characters and document the core cost methods
JimBobSquarePants Oct 8, 2026
9bda182
Read distribution thresholds through a reference to the first threshold
JimBobSquarePants Oct 8, 2026
3bfbc71
Quantize the DC coefficient in the first vector of the block
JimBobSquarePants Oct 8, 2026
1022340
Quantize the DC coefficient in the first vector of the regular quantizer
JimBobSquarePants Oct 8, 2026
6fbb18b
Fill the level plane of a 4-wide transform four rows at a time
JimBobSquarePants Oct 8, 2026
9782f07
Read the coefficient context sum through references
JimBobSquarePants Oct 8, 2026
b80bbf3
Pass the transform buffers and rate tables into every lossy transform…
JimBobSquarePants Oct 8, 2026
caebbb1
Read the trellis coefficients and levels through references
JimBobSquarePants Oct 8, 2026
91e3954
Price chroma candidate coefficients with the tables of the plane
JimBobSquarePants Oct 8, 2026
2248748
Read the rate tables once for the inter transform estimate and tree s…
JimBobSquarePants Oct 8, 2026
8d14057
Count work only when the work counters are switched on
JimBobSquarePants Oct 8, 2026
9605ef7
Remove the work counters from the encoder
JimBobSquarePants Oct 8, 2026
88adf0d
Pass neighbor context edges as spans instead of reading the storage p…
JimBobSquarePants Oct 8, 2026
47c4c64
Pass the transform workspace to intra prediction instead of the block…
JimBobSquarePants Oct 8, 2026
bed8ebd
Give each tile its own growing range-coder buffer and pass it to ever…
JimBobSquarePants Oct 8, 2026
e0fa877
Pass the transform buffers and mode rates to the transform type and m…
JimBobSquarePants Oct 8, 2026
20b3888
Read the search buffers and the skip, palette and size rates once per…
JimBobSquarePants Oct 8, 2026
358e6dc
Pass the transform buffers as span parameters and remove the buffer b…
JimBobSquarePants Oct 8, 2026
1f71dfb
Pass the motion vector rates, rate tables and mode buffers as parameters
JimBobSquarePants Oct 8, 2026
da7d13f
Give each mode decision buffer one name and one parameter order
JimBobSquarePants Oct 8, 2026
3ec4546
Read the block search buffers once per frame pass in the tile encoder
JimBobSquarePants Oct 8, 2026
462e873
Read the tile neighbor edges once per tile and pass them down
JimBobSquarePants Oct 8, 2026
9aaa219
Read the decoder coefficient levels once per tile and index them dire…
JimBobSquarePants Oct 8, 2026
202205a
Read the decoder neighbor contexts once per tile and pass them down
JimBobSquarePants Oct 8, 2026
29849b2
Read the picture mode state once per frame pass in the tile writer
JimBobSquarePants Oct 8, 2026
5a7f1c2
Pass the mode information grid and allocation down the tile writer an…
JimBobSquarePants Oct 8, 2026
77e1050
Pass the displacement vectors and reference contexts down the mode de…
JimBobSquarePants Oct 8, 2026
6f7a74a
Pass the symbol counts and segment maps down the tile writer
JimBobSquarePants Oct 8, 2026
b27ea29
Pass the segment maps down the mode decision
JimBobSquarePants Oct 8, 2026
9270aae
Read the coefficient storage once per superblock and pass it down
JimBobSquarePants Oct 8, 2026
f4f76cf
Read the block workspace storage once per frame pass and pass it down
JimBobSquarePants Oct 8, 2026
65e7508
Read the source and reconstruction samples once per frame pass and pa…
JimBobSquarePants Oct 8, 2026
82e7c67
Remove encoder work that libaom does not do
JimBobSquarePants Oct 9, 2026
98ef176
Use the segment lossless flag and the all-intra mode where libaom does
JimBobSquarePants Oct 9, 2026
550bc72
Remove screen-tune branches and use the detection that libaom uses
JimBobSquarePants Oct 9, 2026
82b1c96
Build the chroma gradient skip mask at the first directional mode tha…
JimBobSquarePants Oct 9, 2026
a69a55a
Evaluate every network with the addition order of the x64 kernels
JimBobSquarePants Oct 9, 2026
515fd4a
Predict intra trials straight into the frame
JimBobSquarePants Oct 9, 2026
3791d06
Record the HEIF encode benchmark with the image quality tune
JimBobSquarePants Oct 9, 2026
f423f03
Merge remote-tracking branch 'upstream/main' into heic-support
JimBobSquarePants Oct 9, 2026
ee52cf4
Remove the AV1 specification PDF from the source tree
JimBobSquarePants Oct 9, 2026
339f45d
Validate HEIF container input before allocating and rewrite its comments
JimBobSquarePants Oct 9, 2026
e5fc01c
Rewrite the mode decision comments to say what the code does
JimBobSquarePants Oct 9, 2026
0d9076c
Rewrite the filter, lookahead and temporal model comments to say what…
JimBobSquarePants Oct 9, 2026
0da569e
Reject references outside the AV1 scaling range and rewrite the reade…
JimBobSquarePants Oct 9, 2026
b83c405
Rewrite the frame encoder, rate control and quantizer comments to say…
JimBobSquarePants Oct 9, 2026
8bef063
Code the transform type only when the segment quantizer index is abov…
JimBobSquarePants Oct 9, 2026
22406d9
Rewrite the motion, prediction and transform comments to say what the…
JimBobSquarePants Oct 9, 2026
0c24cc8
Remove pass-through wrappers in the AV1 encoder
JimBobSquarePants Oct 9, 2026
1b0d9db
Remove unreferenced AV1 members
JimBobSquarePants Oct 9, 2026
c3121c6
Remove AV1 options and enum values that never change
JimBobSquarePants Oct 9, 2026
56564a6
Replace AV1 encoder interfaces that have one implementation
JimBobSquarePants Oct 9, 2026
6502d73
Remove an unreachable rate branch and unused TPL block fields
JimBobSquarePants Oct 9, 2026
e38bd39
Name HEIF and AV1 working buffers for what they hold
JimBobSquarePants Oct 9, 2026
c3008e5
Explain why the high-bit-depth sequence encoder skips two 8-bit steps
JimBobSquarePants Oct 9, 2026
87c8fcc
Write partition children from a child offset table
JimBobSquarePants Oct 9, 2026
5b6d5b8
Name AV1 buffer lengths and helpers for what they hold
JimBobSquarePants Oct 9, 2026
ea9c82a
Remove unreferenced HEIF and AV1 members
JimBobSquarePants Oct 9, 2026
4e86ede
Write each inverse transform stage network once
JimBobSquarePants Oct 9, 2026
f0ced4e
Write the 8-bit and high-bit-depth sequence encoders once
JimBobSquarePants Oct 9, 2026
28b33fe
Remove the always-true SIMD flag from warped prediction
JimBobSquarePants Oct 9, 2026
d1a7604
Share one diamond search and one mesh search across the motion searches
JimBobSquarePants Oct 9, 2026
eabccc0
Move or remove test-only AV1 code
JimBobSquarePants Oct 9, 2026
7dc9d4a
Share one partition child layout between the tile writer and mode dec…
JimBobSquarePants Oct 9, 2026
3b13a1e
Keep 8-bit coefficients above 16383 exact in the 8x8 identity row tra…
JimBobSquarePants Oct 9, 2026
105c7a3
Call the generic sample kernels directly from the block and motion op…
JimBobSquarePants Oct 9, 2026
52ce135
Write temporal filter, OBMC and lookahead sample kernels once
JimBobSquarePants Oct 9, 2026
f813576
Write the intra candidate, prediction and reconstruction paths once f…
JimBobSquarePants Oct 9, 2026
411a316
Call the OBMC target scale directly
JimBobSquarePants Oct 9, 2026
94d597c
Make the temporal filter frame count read-only
JimBobSquarePants Oct 9, 2026
40ed33f
Keep the CI test diagnostics on every runner
JimBobSquarePants Oct 9, 2026
23d1f1b
Add animation conversion tests between AVIF and GIF, PNG and WebP
JimBobSquarePants Oct 9, 2026
c19bfbe
Save the converted animations from the AVIF conversion tests
JimBobSquarePants Oct 10, 2026
6080e43
Convert from a looping animated AVIF in the AVIF to GIF, PNG and WebP…
JimBobSquarePants Oct 10, 2026
861ca33
Upload only the actual output folder when a CI job fails
JimBobSquarePants Oct 10, 2026
1578245
Upload the test results folder when a CI job fails
JimBobSquarePants Oct 10, 2026
dc24375
Remove optional parameters from the HEIF and AV1 source
JimBobSquarePants Oct 10, 2026
f56393e
Keep the chroma mode and transform size of a losing real-time palette
JimBobSquarePants Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,12 @@
*.heic filter=lfs diff=lfs merge=lfs -text
*.hif filter=lfs diff=lfs merge=lfs -text
*.avif filter=lfs diff=lfs merge=lfs -text
*.hvc1 filter=lfs diff=lfs merge=lfs -text
*.hvcc filter=lfs diff=lfs merge=lfs -text
*.ivf filter=lfs diff=lfs merge=lfs -text
*.y4m filter=lfs diff=lfs merge=lfs -text
*.yuv filter=lfs diff=lfs merge=lfs -text
*.bit filter=lfs diff=lfs merge=lfs -text
###############################################################################
# Handle ICC files by git lfs
###############################################################################
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -213,8 +213,13 @@ jobs:
uses: actions/upload-artifact@v7
if: failure()
with:
name: actual_output_${{ runner.os }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip
path: tests/Images/ActualOutput/
name: actual_output_${{ runner.os }}_${{ runner.arch }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip
# ActualOutput holds the images that the tests write and the test runner log from ci-test.ps1.
# TestResults is the default results folder of dotnet test. When the test process crashes, --blame
# writes a sequence file there that lists the tests that ran before the crash.
path: |
tests/Images/ActualOutput/
tests/ImageSharp.Tests/TestResults/

Publish:
needs: [Build]
Expand Down
5 changes: 5 additions & 0 deletions ImageSharp.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,11 @@
<File Path="tests/Images/Input/Gif/issues/issue405_badappextlength252-2.gif" />
<File Path="tests/Images/Input/Gif/issues/issue405_badappextlength252.gif" />
</Folder>
<Folder Name="/tests/Images/Input/Heif/">
<File Path="tests/Images/Input/Heif/Irvine_CA.avif" />
<File Path="tests/Images/Input/Heif/jpeg444_xnconvert.avif" />
<File Path="tests/Images/Input/Heif/Orange4x4.avif" />
</Folder>
<Folder Name="/tests/Images/Input/Icon/">
<File Path="tests/Images/Input/Icon/aero_arrow.cur" />
<File Path="tests/Images/Input/Icon/flutter.ico" />
Expand Down
142 changes: 142 additions & 0 deletions THIRD-PARTY-NOTICES.TXT
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,145 @@ See the LICENSE file in the CoreFX project root for more information.
https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/LICENSE.TXT
https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/src/Common/src/CoreLib/System/IO/Stream.cs#L742
https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/src/Common/src/CoreLib/System/IO/Stream.cs#L775


License notice for the AOM AV1 Codec Library
-----

Parts of the AV1 implementation are adapted from the AOM AV1 Codec Library.
https://aomedia.googlesource.com/aom/

Copyright (c) 2016, Alliance for Open Media. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

Alliance for Open Media Patent License 1.0

1. License Terms.

1.1. Patent License. Subject to the terms and conditions of this License, each
Licensor, on behalf of itself and successors in interest and assigns,
grants Licensee a non-sublicensable, perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable (except as expressly stated in this
License) patent license to its Necessary Claims to make, use, sell, offer
for sale, import or distribute any Implementation.

1.2. Conditions.

1.2.1. Availability. As a condition to the grant of rights to Licensee to make,
sell, offer for sale, import or distribute an Implementation under
Section 1.1, Licensee must make its Necessary Claims available under
this License, and must reproduce this License with any Implementation
as follows:

a. For distribution in source code, by including this License in the
root directory of the source code with its Implementation.

b. For distribution in any other form (including binary, object form,
and/or hardware description code (e.g., HDL, RTL, Gate Level Netlist,
GDSII, etc.)), by including this License in the documentation, legal
notices, and/or other written materials provided with the
Implementation.

1.2.2. Additional Conditions. This license is directly from Licensor to
Licensee. Licensee acknowledges as a condition of benefiting from it
that no rights from Licensor are received from suppliers, distributors,
or otherwise in connection with this License.

1.3. Defensive Termination. If any Licensee, its Affiliates, or its agents
initiates patent litigation or files, maintains, or voluntarily
participates in a lawsuit against another entity or any person asserting
that any Implementation infringes Necessary Claims, any patent licenses
granted under this License directly to the Licensee are immediately
terminated as of the date of the initiation of action unless 1) that suit
was in response to a corresponding suit regarding an Implementation first
brought against an initiating entity, or 2) that suit was brought to
enforce the terms of this License (including intervention in a third-party
action by a Licensee).

1.4. Disclaimers. The Reference Implementation and Specification are provided
"AS IS" and without warranty. The entire risk as to implementing or
otherwise using the Reference Implementation or Specification is assumed
by the implementer and user. Licensor expressly disclaims any warranties
(express, implied, or otherwise), including implied warranties of
merchantability, non-infringement, fitness for a particular purpose, or
title, related to the material. IN NO EVENT WILL LICENSOR BE LIABLE TO
ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL,
INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF
ACTION OF ANY KIND WITH RESPECT TO THIS LICENSE, WHETHER BASED ON BREACH
OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR
NOT THE OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

2. Definitions.

2.1. Affiliate. "Affiliate" means an entity that directly or indirectly
Controls, is Controlled by, or is under common Control of that party.

2.2. Control. "Control" means direct or indirect control of more than 50% of
the voting power to elect directors of that corporation, or for any other
entity, the power to direct management of such entity.

2.3. Decoder. "Decoder" means any decoder that conforms fully with all
non-optional portions of the Specification.

2.4. Encoder. "Encoder" means any encoder that produces a bitstream that can
be decoded by a Decoder only to the extent it produces such a bitstream.

2.5. Final Deliverable. "Final Deliverable" means the final version of a
deliverable approved by the Alliance for Open Media as a Final
Deliverable.

2.6. Implementation. "Implementation" means any implementation, including the
Reference Implementation, that is an Encoder and/or a Decoder. An
Implementation also includes components of an Implementation only to the
extent they are used as part of an Implementation.

2.7. License. "License" means this license.

2.8. Licensee. "Licensee" means any person or entity who exercises patent
rights granted under this License.

2.9. Licensor. "Licensor" means (i) any Licensee that makes, sells, offers
for sale, imports or distributes any Implementation, or (ii) a person
or entity that has a licensing obligation to the Implementation as a
result of its membership and/or participation in the Alliance for Open
Media working group that developed the Specification.

2.10. Necessary Claims. "Necessary Claims" means all claims of patents or
patent applications, (a) that currently or at any time in the future,
are owned or controlled by the Licensor, and (b) (i) would be an
Essential Claim as defined by the W3C Policy as of February 5, 2004
(https://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential)
as if the Specification was a W3C Recommendation; or (ii) are infringed
by the Reference Implementation.

2.11. Reference Implementation. "Reference Implementation" means an Encoder
and/or Decoder released by the Alliance for Open Media as a Final
Deliverable.

2.12. Specification. "Specification" means the specification designated by
the Alliance for Open Media as a Final Deliverable for which this
License was issued.
7 changes: 5 additions & 2 deletions ci-test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ if ($codecov -eq 'true') {

# Allow toggling of profile to workaround any potential JIT errors caused by code injection.
dotnet clean -c $codecovProfile
dotnet test --collect "XPlat Code Coverage" --settings .\tests\coverlet.runsettings -c $codecovProfile -f $targetFramework /p:CodeCov=true
dotnet test --collect "XPlat Code Coverage" --settings (Join-Path $PSScriptRoot 'tests' 'coverlet.runsettings') -c $codecovProfile -f $targetFramework /p:CodeCov=true
}
elseif ($platform -eq '-x86' -and $targetFramework -match $netFxRegex) {

Expand All @@ -33,5 +33,8 @@ elseif ($platform -eq '-x86' -and $targetFramework -match $netFxRegex) {
}
else {

dotnet test --no-build -c Release -f $targetFramework --blame --diag .tests\Images\ActualOutput\diaglog.txt
# The workflow uploads tests/Images/ActualOutput when a job fails, so the diagnostic log must be written there.
# Join-Path keeps the path valid on Linux and macOS, where a backslash is part of the file name.
$diagLog = Join-Path $PSScriptRoot 'tests' 'Images' 'ActualOutput' 'diaglog.txt'
dotnet test --no-build -c Release -f $targetFramework --blame --diag $diagLog
}
2 changes: 1 addition & 1 deletion shared-infrastructure
5 changes: 5 additions & 0 deletions src/ImageSharp/ColorProfiles/ColorConversionOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ public YCbCrTransform YCbCrTransform
/// </summary>
public IccProfile? TargetIccProfile { get; init; }

/// <summary>
/// Gets the interpolation method used for ICC color lookup tables. Defaults to <see cref="IccInterpolationMethod.Auto"/>.
/// </summary>
public IccInterpolationMethod IccInterpolationMethod { get; init; }

/// <summary>
/// Gets the transformation matrix used in conversion to perform chromatic adaptation.
/// <see cref="KnownChromaticAdaptationMatrices"/> for further information. Default is Bradford.
Expand Down
13 changes: 13 additions & 0 deletions src/ImageSharp/ColorProfiles/ColorProfileConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ namespace SixLabors.ImageSharp.ColorProfiles;
/// </summary>
public class ColorProfileConverter
{
/// <summary>
/// The ICC transforms, built on first use. They depend only on the immutable options and hold no mutable state,
/// so every conversion and every thread shares them.
/// </summary>
private ColorProfileConverterExtensionsIcc.IccTransform? iccTransform;

/// <summary>
/// Initializes a new instance of the <see cref="ColorProfileConverter"/> class.
/// </summary>
Expand All @@ -28,6 +34,13 @@ public ColorProfileConverter(ColorConversionOptions options)
/// </summary>
public ColorConversionOptions Options { get; }

/// <summary>
/// Gets the ICC transforms of this converter, building them on first use.
/// </summary>
/// <returns>The <see cref="ColorProfileConverterExtensionsIcc.IccTransform"/>.</returns>
internal ColorProfileConverterExtensionsIcc.IccTransform GetIccTransform()
=> LazyInitializer.EnsureInitialized(ref this.iccTransform, () => new ColorProfileConverterExtensionsIcc.IccTransform(this.Options));

internal (CieXyz From, CieXyz To) GetChromaticAdaptionWhitePoints<TFrom, TTo>()
where TFrom : struct, IColorProfile
where TTo : struct, IColorProfile
Expand Down
83 changes: 56 additions & 27 deletions src/ImageSharp/ColorProfiles/ColorProfileConverterExtensionsIcc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,11 @@ internal static TTo ConvertUsingIccProfile<TFrom, TTo>(this ColorProfileConverte
throw new InvalidOperationException("Target ICC profile is missing.");
}

// The embedded source profile supplies the connection's intent. Use it for both transform
// selection and PCS adjustment; the destination header may recommend a different intent.
IccRenderingIntent renderingIntent = converter.Options.SourceIccProfile.Header.RenderingIntent;
ConversionParams sourceParams = new(converter.Options.SourceIccProfile, toPcs: true, renderingIntent);
ConversionParams targetParams = new(converter.Options.TargetIccProfile, toPcs: false, renderingIntent);

ColorProfileConverter pcsConverter = new(new ColorConversionOptions
{
MemoryAllocator = converter.Options.MemoryAllocator,
SourceWhitePoint = KnownIlluminants.D50Icc,
TargetWhitePoint = KnownIlluminants.D50Icc
});
// The transforms depend only on the converter's options, so they are built once per converter.
IccTransform transform = converter.GetIccTransform();
ConversionParams sourceParams = transform.Source;
ConversionParams targetParams = transform.Target;
ColorProfileConverter pcsConverter = transform.PcsConverter;

// Normalize the source, then convert to the PCS space.
Vector4 sourcePcs = sourceParams.Converter.Calculate(source.ToScaledVector4());
Expand Down Expand Up @@ -145,18 +138,11 @@ internal static void ConvertUsingIccProfile<TFrom, TTo>(this ColorProfileConvert

Guard.MustBeGreaterThanOrEqualTo(source.Length, destination.Length, nameof(destination));

// Resolve the connection's intent once for the entire span, before selecting either transform
// or deciding whether perceptual PCS adjustment is needed.
IccRenderingIntent renderingIntent = converter.Options.SourceIccProfile.Header.RenderingIntent;
ConversionParams sourceParams = new(converter.Options.SourceIccProfile, toPcs: true, renderingIntent);
ConversionParams targetParams = new(converter.Options.TargetIccProfile, toPcs: false, renderingIntent);

ColorProfileConverter pcsConverter = new(new ColorConversionOptions
{
MemoryAllocator = converter.Options.MemoryAllocator,
SourceWhitePoint = KnownIlluminants.D50Icc,
TargetWhitePoint = KnownIlluminants.D50Icc
});
// The transforms depend only on the converter's options, so they are built once per converter.
IccTransform transform = converter.GetIccTransform();
ConversionParams sourceParams = transform.Source;
ConversionParams targetParams = transform.Target;
ColorProfileConverter pcsConverter = transform.PcsConverter;

using IMemoryOwner<Vector4> pcsBuffer = converter.Options.MemoryAllocator.Allocate<Vector4>(source.Length);
Span<Vector4> pcs = pcsBuffer.GetSpan();
Expand Down Expand Up @@ -694,7 +680,47 @@ private static void LabToLab(Span<Vector4> source, Span<Vector4> destination, [C
TensorPrimitives.Multiply(MemoryMarshal.Cast<Vector4, float>(source), scale, MemoryMarshal.Cast<Vector4, float>(destination));
}

private class ConversionParams
/// <summary>
/// The immutable ICC connection of a converter: both profile transforms and the PCS converter.
/// </summary>
internal sealed class IccTransform
{
/// <summary>
/// Initializes a new instance of the <see cref="IccTransform"/> class.
/// </summary>
/// <param name="options">The conversion options carrying both ICC profiles.</param>
public IccTransform(ColorConversionOptions options)
{
// The embedded source profile supplies the connection's intent. Use it for both transform
// selection and PCS adjustment; the destination header may recommend a different intent.
IccRenderingIntent renderingIntent = options.SourceIccProfile!.Header.RenderingIntent;
this.Source = new ConversionParams(options.SourceIccProfile, toPcs: true, renderingIntent, options.IccInterpolationMethod);
this.Target = new ConversionParams(options.TargetIccProfile!, toPcs: false, renderingIntent, options.IccInterpolationMethod);
this.PcsConverter = new ColorProfileConverter(new ColorConversionOptions
{
MemoryAllocator = options.MemoryAllocator,
SourceWhitePoint = KnownIlluminants.D50Icc,
TargetWhitePoint = KnownIlluminants.D50Icc
});
}

/// <summary>
/// Gets the transform from the source profile's device values to its PCS.
/// </summary>
public ConversionParams Source { get; }

/// <summary>
/// Gets the transform from the PCS to the target profile's device values.
/// </summary>
public ConversionParams Target { get; }

/// <summary>
/// Gets the converter between the two profile connection spaces.
/// </summary>
public ColorProfileConverter PcsConverter { get; }
}

internal sealed class ConversionParams
{
private readonly IccProfile profile;

Expand All @@ -704,11 +730,14 @@ private class ConversionParams
/// <param name="profile">The profile used by this transform.</param>
/// <param name="toPcs">Whether this transform converts device values to the PCS.</param>
/// <param name="renderingIntent">The rendering intent shared by both profiles.</param>
internal ConversionParams(IccProfile profile, bool toPcs, IccRenderingIntent renderingIntent)
/// <param name="interpolationMethod">The interpolation method used for color lookup tables.</param>
internal ConversionParams(IccProfile profile, bool toPcs, IccRenderingIntent renderingIntent, IccInterpolationMethod interpolationMethod)
{
this.profile = profile;
this.Intent = renderingIntent;
this.Converter = toPcs ? new IccDataToPcsConverter(profile, renderingIntent) : new IccPcsToDataConverter(profile, renderingIntent);
this.Converter = toPcs
? new IccDataToPcsConverter(profile, renderingIntent, interpolationMethod)
: new IccPcsToDataConverter(profile, renderingIntent, interpolationMethod);
}

internal IccConverterBase Converter { get; }
Expand Down
Loading
Loading