Integrate jxl-rs JPEG XL decoder into Blink [chromium/src : main]

0 views
Skip to first unread message

Philip Jägenstedt (Gerrit)

unread,
Nov 25, 2025, 2:50:43 PMNov 25
to Helmut Januschka, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
Attention needed from Helmut Januschka

Philip Jägenstedt added 3 comments

File third_party/blink/public/mojom/use_counter/metrics/webdx_feature.mojom
Line 479, Patchset 14 (Latest): kJxl = 417,
Philip Jägenstedt . unresolved

In order for the data to show up at https://webstatus.dev/features/jpegxl this will need to be based on the web-features ID, like this:

```suggestion
kJpegxl = 417,
```
File third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc
Line 65, Patchset 14 (Latest): use_counter->CountUse(WebFeature::kJXLImage);
Philip Jägenstedt . unresolved

Note that you could call `use_counter->CountWebDXFeature()` here and get rid of WebFeature::kJXLImage, but it's totally fine either way.

File third_party/blink/renderer/platform/image-decoders/image_decoder.cc
Line 338, Patchset 14 (Latest): base::FeatureList::IsEnabled(features::kJXLImageFormat)) {
Philip Jägenstedt . unresolved

Is there another feature check needed for `<picture><source type="image/jxl">`? I assume that won't reach this code path because at the time we decide which image to load we're not yet creating a decoder instance.

Open in Gerrit

Related details

Attention is currently required from:
  • Helmut Januschka
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • requirement is not satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
Gerrit-Change-Number: 7184969
Gerrit-PatchSet: 14
Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
Gerrit-CC: Dave Tapuska <dtap...@chromium.org>
Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
Gerrit-CC: Stephen Chenney <sche...@chromium.org>
Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
Gerrit-Comment-Date: Tue, 25 Nov 2025 19:50:25 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Helmut Januschka (Gerrit)

unread,
Dec 2, 2025, 4:03:29 PMDec 2
to Helmut Januschka, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
Attention needed from Dave Tapuska and Philip Jägenstedt

Helmut Januschka added 16 comments

Patchset-level comments
File-level comment, Patchset 23 (Latest):
Helmut Januschka . resolved

thanks, rebased, conflicts solved and feedback has been addressed!

File cc/tiles/image_decode_cache.h
Line 92, Patchset 8: return ScopedImageType::kOther;
Dave Tapuska . resolved

This should be kJxl

Helmut Januschka

Done

File third_party/blink/common/mime_util/mime_util.cc
Line 127, Patchset 8:#if BUILDFLAG(ENABLE_JXL_DECODER)
Dave Tapuska . resolved

Not necessary. The array will contain it based on the build flag.

Helmut Januschka

true, but other comments changed that `return true` to `base::FeatureList::IsEnabled(features::kJXLImageFormat);` to be able to killswitch it. let me know if that works for you.

File third_party/blink/common/mime_util/mime_util_unittest.cc
Line 61, Patchset 8:TEST(MimeUtilTest, LookupTypes) {
Dave Tapuska . resolved

Likely should be parameterized (assuming that this isn't enabled by default in this CL).

Helmut Januschka

done

File third_party/blink/public/mojom/use_counter/metrics/webdx_feature.mojom
Line 479, Patchset 14: kJxl = 417,
Philip Jägenstedt . resolved

In order for the data to show up at https://webstatus.dev/features/jpegxl this will need to be based on the web-features ID, like this:

```suggestion
kJpegxl = 417,
```
Helmut Januschka

thanks, also for the link, nice to know that!

File third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc
Line 65, Patchset 14: use_counter->CountUse(WebFeature::kJXLImage);
Philip Jägenstedt . resolved

Note that you could call `use_counter->CountWebDXFeature()` here and get rid of WebFeature::kJXLImage, but it's totally fine either way.

Helmut Januschka

Done

File third_party/blink/renderer/platform/image-decoders/image_decoder.cc
Line 338, Patchset 8: LOG(INFO) << "Creating JXL decoder for mime_type: " << mime_type;
Dave Tapuska . resolved

Remove

Helmut Januschka

Done

Line 338, Patchset 14: base::FeatureList::IsEnabled(features::kJXLImageFormat)) {
Philip Jägenstedt . resolved

Is there another feature check needed for `<picture><source type="image/jxl">`? I assume that won't reach this code path because at the time we decide which image to load we're not yet creating a decoder instance.

Helmut Januschka

thanks, moved it to IsSupportedImageMimeType, makes more sense there, but still with killswitch able flag.

Line 342, Patchset 8: LOG(INFO) << "JXL decoder created successfully";
Dave Tapuska . resolved

Same

Helmut Januschka

Done

File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
Line 75, Patchset 8: const uint8_t* contents =
Dave Tapuska . resolved

GetConsecutiveData(0, sizeof(buffer), buffer) returns a span. We should examine only that range, not sizeof(buffer) on line 78.

Helmut Januschka

Marked as resolved.

Line 82, Patchset 8: Decode(0, true);
Dave Tapuska . resolved

/*only_size=*/

Helmut Januschka

Done

Line 90, Patchset 8: Decode(0, true);
Dave Tapuska . resolved

same

Helmut Januschka

Done

Line 97, Patchset 8: // Return the number of frames we've discovered
Dave Tapuska . resolved

comments should terminate with period, here and other places

Helmut Januschka

Done

Line 340, Patchset 8: pixel_buffer_.resize(pixel_size);
Dave Tapuska . resolved

Likely should worry about the sizing here. You are truncating a size_t to a wtf_size_t. Probably want to check overflow.

Does this need to resize it always? Like can we skip this if the buffer is already of required size?

Helmut Januschka

thanks, using `base::CheckedNumeric` now, about the resize, there is a if around now

Line 354, Patchset 8: size_t src_idx = (y * basic_info_.width + x) * 4;
Dave Tapuska . resolved

This looks like it could use some skia macros for creating these colors.

Helmut Januschka

Done

Line 419, Patchset 8: if (index >= frame_info_.size()) {
Dave Tapuska . resolved

If you have the item in the frame_buffer_cache_ you likely can just get the timestamp directly no?

Helmut Januschka

thanks!

Open in Gerrit

Related details

Attention is currently required from:
  • Dave Tapuska
  • Philip Jägenstedt
Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement is not satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
    Gerrit-Change-Number: 7184969
    Gerrit-PatchSet: 23
    Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
    Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
    Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
    Gerrit-CC: Dave Tapuska <dtap...@chromium.org>
    Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
    Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
    Gerrit-CC: Stephen Chenney <sche...@chromium.org>
    Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
    Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
    Gerrit-Comment-Date: Tue, 02 Dec 2025 21:03:13 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: No
    Comment-In-Reply-To: Philip Jägenstedt <foo...@chromium.org>
    Comment-In-Reply-To: Dave Tapuska <dtap...@chromium.org>
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Dale Curtis (Gerrit)

    unread,
    Dec 2, 2025, 4:24:33 PMDec 2
    to Helmut Januschka, Łukasz Anforowicz, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
    Attention needed from Dave Tapuska, Helmut Januschka, Philip Jägenstedt and Łukasz Anforowicz

    Dale Curtis added 2 comments

    Patchset-level comments
    Dale Curtis . unresolved

    I defer to image/ and Skia OWNERs, but FWIW our other rust based codec is implemented in Skia so that it can reuse SkiaImageDecoderBase:

    There's even already a JXL one here:

    That maybe should be replaced with the rust version?

    @luk...@chromium.org who did the Rust PNG decoder and may have opinions.

    File media/media_options.gni
    Line 149, Patchset 23 (Latest): # Enable JXL decoder in Blink for JPEG XL image decoding.
    Dale Curtis . unresolved

    Since none of this code is in media, this should be defined elsewhere. Maybe in blink build flags somewhere?

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Dave Tapuska
    • Helmut Januschka
    • Philip Jägenstedt
    • Łukasz Anforowicz
    Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
      Gerrit-Change-Number: 7184969
      Gerrit-PatchSet: 23
      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
      Gerrit-CC: Dave Tapuska <dtap...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Tue, 02 Dec 2025 21:24:22 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Helmut Januschka (Gerrit)

      unread,
      Dec 2, 2025, 5:13:16 PMDec 2
      to Helmut Januschka, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dale Curtis, Dave Tapuska, Philip Jägenstedt and Łukasz Anforowicz

      Helmut Januschka added 1 comment

      Patchset-level comments
      Dale Curtis . unresolved

      I defer to image/ and Skia OWNERs, but FWIW our other rust based codec is implemented in Skia so that it can reuse SkiaImageDecoderBase:

      There's even already a JXL one here:

      That maybe should be replaced with the rust version?

      @luk...@chromium.org who did the Rust PNG decoder and may have opinions.

      Helmut Januschka

      @dalec...@chromium.org i see png rust uses a small wrapper in chromium around the skia decoder. is that the route we should take?
      so - i'd need to do a CL in skia first?

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dale Curtis
      • Dave Tapuska
      • Philip Jägenstedt
      • Łukasz Anforowicz
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Dale Curtis <dalec...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Tue, 02 Dec 2025 22:13:00 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Dale Curtis <dalec...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Dale Curtis (Gerrit)

      unread,
      Dec 2, 2025, 5:15:56 PMDec 2
      to Helmut Januschka, Łukasz Anforowicz, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Helmut Januschka, Philip Jägenstedt and Łukasz Anforowicz

      Dale Curtis added 1 comment

      Patchset-level comments
      Dale Curtis . unresolved

      I defer to image/ and Skia OWNERs, but FWIW our other rust based codec is implemented in Skia so that it can reuse SkiaImageDecoderBase:

      There's even already a JXL one here:

      That maybe should be replaced with the rust version?

      @luk...@chromium.org who did the Rust PNG decoder and may have opinions.

      Helmut Januschka

      @dalec...@chromium.org i see png rust uses a small wrapper in chromium around the skia decoder. is that the route we should take?
      so - i'd need to do a CL in skia first?

      Dale Curtis

      Possibly, but I defer to Skia and folks like Lukas who are more familiar with this area.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Helmut Januschka
      • Philip Jägenstedt
      • Łukasz Anforowicz
      Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Tue, 02 Dec 2025 22:15:47 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
      Comment-In-Reply-To: Dale Curtis <dalec...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Łukasz Anforowicz (Gerrit)

      unread,
      Dec 2, 2025, 7:15:02 PMDec 2
      to Helmut Januschka, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Helmut Januschka and Philip Jägenstedt

      Łukasz Anforowicz added 1 comment

      Patchset-level comments
      Dale Curtis . unresolved

      I defer to image/ and Skia OWNERs, but FWIW our other rust based codec is implemented in Skia so that it can reuse SkiaImageDecoderBase:

      There's even already a JXL one here:

      That maybe should be replaced with the rust version?

      @luk...@chromium.org who did the Rust PNG decoder and may have opinions.

      Helmut Januschka

      @dalec...@chromium.org i see png rust uses a small wrapper in chromium around the skia decoder. is that the route we should take?
      so - i'd need to do a CL in skia first?

      Dale Curtis

      Possibly, but I defer to Skia and folks like Lukas who are more familiar with this area.

      Łukasz Anforowicz

      This CL (i.e. direct Blink => `jxl-rs` integration) LGTM (speaking as one of `//third_party/rust/OWNERS`). I think this is the simplest path forward for now (and it doesn't necessarily prevent having an `jxl-rs`-based `SkCodec` in the future). That said, I ultimately defer to `//third_party/blink/renderer/platform/image-decoders/OWNERS` here.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Helmut Januschka
      • Philip Jägenstedt
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Wed, 03 Dec 2025 00:14:51 +0000
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Philip Jägenstedt (Gerrit)

      unread,
      Dec 3, 2025, 11:36:46 AMDec 3
      to Helmut Januschka, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska and Helmut Januschka

      Philip Jägenstedt added 1 comment

      File media/media_options.gni
      Line 149, Patchset 23 (Latest): # Enable JXL decoder in Blink for JPEG XL image decoding.
      Dale Curtis . unresolved

      Since none of this code is in media, this should be defined elsewhere. Maybe in blink build flags somewhere?

      Philip Jägenstedt

      Maybe others will have input, but I think in third_party/blink/renderer/platform/BUILD.gn looks like the best candidate.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Helmut Januschka
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Wed, 03 Dec 2025 16:36:33 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Dale Curtis <dalec...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Dave Tapuska (Gerrit)

      unread,
      Dec 3, 2025, 12:10:52 PMDec 3
      to Helmut Januschka, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Helmut Januschka

      Dave Tapuska added 1 comment

      File media/media_options.gni
      Line 149, Patchset 23 (Latest): # Enable JXL decoder in Blink for JPEG XL image decoding.
      Dale Curtis . unresolved

      Since none of this code is in media, this should be defined elsewhere. Maybe in blink build flags somewhere?

      Philip Jägenstedt

      Maybe others will have input, but I think in third_party/blink/renderer/platform/BUILD.gn looks like the best candidate.

      Attention is currently required from:
      • Helmut Januschka
      Gerrit-Comment-Date: Wed, 03 Dec 2025 17:10:43 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Philip Jägenstedt <foo...@chromium.org>
      Comment-In-Reply-To: Dale Curtis <dalec...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Helmut Januschka (Gerrit)

      unread,
      Dec 3, 2025, 5:49:44 PMDec 3
      to Helmut Januschka, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Dave Tapuska, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dale Curtis, Dave Tapuska, Philip Jägenstedt and Łukasz Anforowicz

      Helmut Januschka added 2 comments

      Patchset-level comments
      Dale Curtis . unresolved

      I defer to image/ and Skia OWNERs, but FWIW our other rust based codec is implemented in Skia so that it can reuse SkiaImageDecoderBase:

      There's even already a JXL one here:

      That maybe should be replaced with the rust version?

      @luk...@chromium.org who did the Rust PNG decoder and may have opinions.

      Helmut Januschka

      @dalec...@chromium.org i see png rust uses a small wrapper in chromium around the skia decoder. is that the route we should take?
      so - i'd need to do a CL in skia first?

      Dale Curtis

      Possibly, but I defer to Skia and folks like Lukas who are more familiar with this area.

      Łukasz Anforowicz

      This CL (i.e. direct Blink => `jxl-rs` integration) LGTM (speaking as one of `//third_party/rust/OWNERS`). I think this is the simplest path forward for now (and it doesn't necessarily prevent having an `jxl-rs`-based `SkCodec` in the future). That said, I ultimately defer to `//third_party/blink/renderer/platform/image-decoders/OWNERS` here.

      Helmut Januschka

      thanks, i would also like to go ahead with blink approach. lets see what image-decoders/owners suggest!

      File media/media_options.gni
      Line 149, Patchset 23: # Enable JXL decoder in Blink for JPEG XL image decoding.
      Dale Curtis . resolved

      Since none of this code is in media, this should be defined elsewhere. Maybe in blink build flags somewhere?

      Philip Jägenstedt

      Maybe others will have input, but I think in third_party/blink/renderer/platform/BUILD.gn looks like the best candidate.

      Dave Tapuska

      Let's put it in https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/config.gni

      Helmut Januschka

      Done

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dale Curtis
      • Dave Tapuska
      • Philip Jägenstedt
      • Łukasz Anforowicz
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
      Gerrit-Change-Number: 7184969
      Gerrit-PatchSet: 29
      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
      Gerrit-CC: Dave Tapuska <dtap...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Dale Curtis <dalec...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Wed, 03 Dec 2025 22:49:26 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
      Comment-In-Reply-To: Philip Jägenstedt <foo...@chromium.org>
      Comment-In-Reply-To: Łukasz Anforowicz <luk...@chromium.org>
      Comment-In-Reply-To: Dale Curtis <dalec...@chromium.org>
      Comment-In-Reply-To: Dave Tapuska <dtap...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Helmut Januschka (Gerrit)

      unread,
      Dec 10, 2025, 8:48:49 PM (9 days ago) Dec 10
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Hans Wennborg, Luca Versari, Philip Jägenstedt, Vladimir Levin and mmenke

      Helmut Januschka added 1 comment

      Patchset-level comments
      File-level comment, Patchset 35:
      Helmut Januschka . resolved

      hello reviewers,

      thanks in advance for your time! please let me know if you want me to address anything.


      cheers,
      helmut

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Hans Wennborg
      • Luca Versari
      • Philip Jägenstedt
      • Vladimir Levin
      • mmenke
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
      Gerrit-Change-Number: 7184969
      Gerrit-PatchSet: 35
      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Luca Versari <vel...@google.com>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Reviewer: mmenke <mme...@chromium.org>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
      Gerrit-Attention: mmenke <mme...@chromium.org>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Attention: Luca Versari <vel...@google.com>
      Gerrit-Comment-Date: Thu, 11 Dec 2025 01:48:28 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Luca Versari (Gerrit)

      unread,
      Dec 11, 2025, 6:48:43 AM (9 days ago) Dec 11
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Philip Jägenstedt, Vladimir Levin and mmenke

      Luca Versari added 10 comments

      File third_party/blink/common/features.cc
      Line 1029, Patchset 36 (Latest):BASE_FEATURE(kJXLImageFormat, base::FEATURE_ENABLED_BY_DEFAULT);
      Luca Versari . unresolved

      I imagine this shouldn't be enabled by default yet.

      File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
      Line 25, Patchset 36 (Latest):// Convert float32 to float16 (IEEE 754 binary16).
      Luca Versari . unresolved

      We should add a TODO to let jxl-rs handle this once it is supported.

      Line 204, Patchset 36 (Latest): // jxl-rs doesn't support incremental input, so we must reset and start
      Luca Versari . unresolved

      I don't believe that is true.

      Line 214, Patchset 36 (Latest): need_reset = true;
      Luca Versari . unresolved

      I don't think this is necessary. If we only need the size, we can pause decoding as soon as we get the image's metadata, and resume decoding actual frames from there.

      Line 233, Patchset 36 (Latest): }
      Luca Versari . unresolved

      There probably should be a need_rewind flag instead of need_reset - for now they can both call reset(), but rewind() should eventually be cheaper.

      Line 252, Patchset 36 (Latest): if (need_new_decoder) {
      Luca Versari . unresolved

      this probably should just be `decoder_.has_value()` since nothing else can set the value.

      Line 258, Patchset 36 (Latest): // Feed data only when we have a new/reset decoder or new data.
      Luca Versari . unresolved

      As I mentioned above, I don't think this is necessary.

      Line 369, Patchset 36 (Latest): num_frame_events_in_scan_++;
      Luca Versari . unresolved

      Do we *need* to figure out frame count in advance?

      Line 402, Patchset 36 (Latest): if (decode_to_half_float_) {
      Luca Versari . unresolved

      I don't think ~any of this logic should be here, instead it should go in jxl-rs itself and we should write directly into Chrome's framebuffers from there using the correct data types.

      File third_party/rust/jxl/v0_1/wrapper/lib.rs
      File-level comment, Patchset 36 (Latest):
      Luca Versari . unresolved

      I am not sure why this file exists, instead of using directly JxlDecoderInner (which is intended for usage from FFI situations).

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Hans Wennborg
      • Helmut Januschka
      • Philip Jägenstedt
      • Vladimir Levin
      • mmenke
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
      Gerrit-Change-Number: 7184969
      Gerrit-PatchSet: 36
      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Luca Versari <vel...@google.com>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Reviewer: mmenke <mme...@chromium.org>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
      Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
      Gerrit-Attention: mmenke <mme...@chromium.org>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Thu, 11 Dec 2025 11:48:27 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Hans Wennborg (Gerrit)

      unread,
      Dec 11, 2025, 7:17:54 AM (9 days ago) Dec 11
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Helmut Januschka, Philip Jägenstedt, Vladimir Levin and mmenke

      Hans Wennborg added 2 comments

      Patchset-level comments
      Helmut Januschka . resolved

      hello reviewers,

      thanks in advance for your time! please let me know if you want me to address anything.


      cheers,
      helmut

      Hans Wennborg

      Any particular areas you want the different reviewers to focus on? I just looked at BUILD.gn for now.

      File BUILD.gn
      Line 845, Patchset 36 (Latest): "//third_party/rust/jxl/v0_1:lib", # Prevents build pruning for CL #1
      Hans Wennborg . unresolved

      Can you expand on the "CL #1" comment?

      Actually you probably don't really need to add this to "all_rust". I think that was mostly used during the Rust toolchain bringup. Today I believe we have a lot more Rust dependencies than what's listed here.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      Gerrit-Attention: mmenke <mme...@chromium.org>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Thu, 11 Dec 2025 12:17:34 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      mmenke (Gerrit)

      unread,
      Dec 11, 2025, 11:31:26 AM (9 days ago) Dec 11
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Helmut Januschka, Philip Jägenstedt and Vladimir Levin

      mmenke added 1 comment

      File net/base/mime_util.cc
      Line 184, Patchset 36: {"image/avif", "avif"},
      {"image/jxl", "jxl"},
      mmenke . unresolved

      The CL description implies jxl is already supported via libjxl. Why are we adding these as part of swapping jxl decoding library (and adding an accept header)?

      I don't oppose this change, I just want to better understand why this wasn't needed before, the previous state of jxl support, and why this CL is so large.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Helmut Januschka
      • Philip Jägenstedt
      • Vladimir Levin
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
      Gerrit-Change-Number: 7184969
      Gerrit-PatchSet: 37
      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Luca Versari <vel...@google.com>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Reviewer: mmenke <mme...@chromium.org>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Comment-Date: Thu, 11 Dec 2025 16:31:20 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      mmenke (Gerrit)

      unread,
      Dec 11, 2025, 11:33:38 AM (9 days ago) Dec 11
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Helmut Januschka, Philip Jägenstedt and Vladimir Levin

      mmenke added 1 comment

      File net/base/mime_util.cc
      Line 184, Patchset 36: {"image/avif", "avif"},
      {"image/jxl", "jxl"},
      mmenke . unresolved

      The CL description implies jxl is already supported via libjxl. Why are we adding these as part of swapping jxl decoding library (and adding an accept header)?

      I don't oppose this change, I just want to better understand why this wasn't needed before, the previous state of jxl support, and why this CL is so large.

      mmenke

      Oh, and a response would best be added to the CL description, rather than as an answer to this comment, so it's more discoverable by folks digging through commit history.

      Gerrit-Comment-Date: Thu, 11 Dec 2025 16:33:32 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: mmenke <mme...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Helmut Januschka (Gerrit)

      unread,
      Dec 11, 2025, 1:59:13 PM (9 days ago) Dec 11
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dale Curtis, Dave Tapuska, Hans Wennborg, Luca Versari, Philip Jägenstedt, Vladimir Levin, mmenke and Łukasz Anforowicz

      Helmut Januschka added 13 comments

      Patchset-level comments
      File-level comment, Patchset 23:
      Dale Curtis . resolved

      I defer to image/ and Skia OWNERs, but FWIW our other rust based codec is implemented in Skia so that it can reuse SkiaImageDecoderBase:

      There's even already a JXL one here:

      That maybe should be replaced with the rust version?

      @luk...@chromium.org who did the Rust PNG decoder and may have opinions.

      Helmut Januschka

      @dalec...@chromium.org i see png rust uses a small wrapper in chromium around the skia decoder. is that the route we should take?
      so - i'd need to do a CL in skia first?

      Dale Curtis

      Possibly, but I defer to Skia and folks like Lukas who are more familiar with this area.

      Łukasz Anforowicz

      This CL (i.e. direct Blink => `jxl-rs` integration) LGTM (speaking as one of `//third_party/rust/OWNERS`). I think this is the simplest path forward for now (and it doesn't necessarily prevent having an `jxl-rs`-based `SkCodec` in the future). That said, I ultimately defer to `//third_party/blink/renderer/platform/image-decoders/OWNERS` here.

      Helmut Januschka

      thanks, i would also like to go ahead with blink approach. lets see what image-decoders/owners suggest!

      Helmut Januschka

      Done

      File BUILD.gn
      Line 845, Patchset 36: "//third_party/rust/jxl/v0_1:lib", # Prevents build pruning for CL #1
      Hans Wennborg . resolved

      Can you expand on the "CL #1" comment?

      Actually you probably don't really need to add this to "all_rust". I think that was mostly used during the Rust toolchain bringup. Today I believe we have a lot more Rust dependencies than what's listed here.

      Helmut Januschka

      removed it

      File net/base/mime_util.cc
      Line 184, Patchset 36: {"image/avif", "avif"},
      {"image/jxl", "jxl"},
      mmenke . resolved

      The CL description implies jxl is already supported via libjxl. Why are we adding these as part of swapping jxl decoding library (and adding an accept header)?

      I don't oppose this change, I just want to better understand why this wasn't needed before, the previous state of jxl support, and why this CL is so large.

      mmenke

      Oh, and a response would best be added to the CL description, rather than as an answer to this comment, so it's more discoverable by folks digging through commit history.

      Helmut Januschka
      The CL is large because it re-adds the complete end-to-end integration that was previously removed:
      - New Blink image decoder (now using jxl-rs)
      - MIME type registration (was removed in M110)
      - Accept header support for image/jxl (was removed in M110)
      - Feature flag (kJXLImageFormat) for killswitch capability
      - Use counters, devtools instrumentation, tests, and fuzzer
      File third_party/blink/common/features.cc
      Line 1029, Patchset 36:BASE_FEATURE(kJXLImageFormat, base::FEATURE_ENABLED_BY_DEFAULT);
      Luca Versari . resolved

      I imagine this shouldn't be enabled by default yet.

      Helmut Januschka

      Done

      File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
      Line 25, Patchset 36:// Convert float32 to float16 (IEEE 754 binary16).
      Luca Versari . resolved

      We should add a TODO to let jxl-rs handle this once it is supported.

      Helmut Januschka

      Done

      Line 204, Patchset 36: // jxl-rs doesn't support incremental input, so we must reset and start
      Luca Versari . resolved

      I don't believe that is true.

      Helmut Januschka

      Done

      Line 214, Patchset 36: need_reset = true;
      Luca Versari . resolved

      I don't think this is necessary. If we only need the size, we can pause decoding as soon as we get the image's metadata, and resume decoding actual frames from there.

      Helmut Januschka

      JXL format doesn't store frame count in the header. Each frame has is_last flag - you must parse through frames to know the count.

      Line 233, Patchset 36: }
      Luca Versari . resolved

      There probably should be a need_rewind flag instead of need_reset - for now they can both call reset(), but rewind() should eventually be cheaper.

      Helmut Januschka

      Done

      Line 252, Patchset 36: if (need_new_decoder) {
      Luca Versari . resolved

      this probably should just be `decoder_.has_value()` since nothing else can set the value.

      Helmut Januschka

      Done

      Line 258, Patchset 36: // Feed data only when we have a new/reset decoder or new data.
      Luca Versari . unresolved

      As I mentioned above, I don't think this is necessary.

      Helmut Januschka

      we need frame count upfront, we should do a framecount() in jxl-rs, atleast from my current understanding of blink and my trial and error

      Line 369, Patchset 36: num_frame_events_in_scan_++;
      Luca Versari . resolved

      Do we *need* to figure out frame count in advance?

      Helmut Januschka

      yes i need that for blink integration

      Line 402, Patchset 36: if (decode_to_half_float_) {
      Luca Versari . resolved

      I don't think ~any of this logic should be here, instead it should go in jxl-rs itself and we should write directly into Chrome's framebuffers from there using the correct data types.

      Helmut Januschka

      same as below, will do PRs in jxl-rs

      File third_party/rust/jxl/v0_1/wrapper/lib.rs
      Luca Versari . unresolved

      I am not sure why this file exists, instead of using directly JxlDecoderInner (which is intended for usage from FFI situations).

      Helmut Januschka

      The wrapper exists primarily for the CXX bridge to enable Rust<->C++ interop with Blink. The typestate pattern in JxlDecoder<State> can't cross FFI boundaries, so this flattens it into a runtime state machine. (and follows the pattern of rust png decoder, that also does rust<->c++)

      I agree with your point that much of the logic here—especially pixel format conversion—should ideally live in jxl-rs itself. i'll do some PR's there and then we can thin out the wrapper!

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dale Curtis
      • Dave Tapuska
      • Hans Wennborg
      • Luca Versari
      • Philip Jägenstedt
      • Vladimir Levin
      • mmenke
      • Łukasz Anforowicz
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement is not satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
      Gerrit-Change-Number: 7184969
      Gerrit-PatchSet: 38
      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
      Gerrit-Reviewer: Luca Versari <vel...@google.com>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Reviewer: mmenke <mme...@chromium.org>
      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
      Gerrit-Attention: mmenke <mme...@chromium.org>
      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
      Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
      Gerrit-Attention: Dale Curtis <dalec...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
      Gerrit-Attention: Luca Versari <vel...@google.com>
      Gerrit-Comment-Date: Thu, 11 Dec 2025 18:58:53 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
      Comment-In-Reply-To: Hans Wennborg <ha...@chromium.org>
      Comment-In-Reply-To: mmenke <mme...@chromium.org>
      Comment-In-Reply-To: Łukasz Anforowicz <luk...@chromium.org>
      Comment-In-Reply-To: Dale Curtis <dalec...@chromium.org>
      Comment-In-Reply-To: Luca Versari <vel...@google.com>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      mmenke (Gerrit)

      unread,
      Dec 11, 2025, 2:09:04 PM (9 days ago) Dec 11
      to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
      Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Luca Versari, Philip Jägenstedt, Vladimir Levin and Łukasz Anforowicz

      mmenke voted and added 3 comments

      Votes added by mmenke

      Code-Review+1

      3 comments

      Patchset-level comments
      File-level comment, Patchset 38 (Latest):
      mmenke . resolved

      net/, content/browser/network/, third_party/blink/common/loader/, and third_party/blink/common/mime_util/ LGTM

      File net/base/mime_util.cc
      Line 184, Patchset 36: {"image/avif", "avif"},
      {"image/jxl", "jxl"},
      mmenke . resolved

      The CL description implies jxl is already supported via libjxl. Why are we adding these as part of swapping jxl decoding library (and adding an accept header)?

      I don't oppose this change, I just want to better understand why this wasn't needed before, the previous state of jxl support, and why this CL is so large.

      mmenke

      Oh, and a response would best be added to the CL description, rather than as an answer to this comment, so it's more discoverable by folks digging through commit history.

      Helmut Januschka
      The CL is large because it re-adds the complete end-to-end integration that was previously removed:
      - New Blink image decoder (now using jxl-rs)
      - MIME type registration (was removed in M110)
      - Accept header support for image/jxl (was removed in M110)
      - Feature flag (kJXLImageFormat) for killswitch capability
      - Use counters, devtools instrumentation, tests, and fuzzer
      mmenke

      Thanks so much for the explanation!

      File third_party/blink/common/mime_util/mime_util.cc
      Line 49, Patchset 38 (Latest):#if BUILDFLAG(ENABLE_JXL_DECODER)
      "image/jxl",
      #endif
      mmenke . unresolved

      Out of caution, suggest not including this here for now, and adding a TODO referencing the linked bug to IsSupportedImageMimeType() to move add it here once it's enabled by default.

      Alternatively, we could inline this as-is in IsSupportedImageMimeType(), to prevent anything else from using it without the extra jxl check that's in IsSupportedImageMimeType().

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Dave Tapuska
      • Hans Wennborg
      • Helmut Januschka
      • Luca Versari
      • Philip Jägenstedt
      • Vladimir Levin
      • Łukasz Anforowicz
      Submit Requirements:
        • requirement satisfiedCode-Coverage
        • requirement is not satisfiedCode-Owners
        • requirement satisfiedCode-Review
        • requirement is not satisfiedNo-Unresolved-Comments
        • requirement satisfiedReview-Enforcement
        Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
        Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
        Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
        Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
        Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
        Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
        Gerrit-Attention: Luca Versari <vel...@google.com>
        Gerrit-Comment-Date: Thu, 11 Dec 2025 19:08:57 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: Yes
        Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
        Comment-In-Reply-To: mmenke <mme...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        mmenke (Gerrit)

        unread,
        Dec 11, 2025, 2:09:51 PM (9 days ago) Dec 11
        to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
        Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Luca Versari, Philip Jägenstedt, Vladimir Levin and Łukasz Anforowicz

        mmenke added 1 comment

        File third_party/blink/common/mime_util/mime_util.cc
        Line 49, Patchset 38 (Latest):#if BUILDFLAG(ENABLE_JXL_DECODER)
        "image/jxl",
        #endif
        mmenke . unresolved

        Out of caution, suggest not including this here for now, and adding a TODO referencing the linked bug to IsSupportedImageMimeType() to move add it here once it's enabled by default.

        Alternatively, we could inline this as-is in IsSupportedImageMimeType(), to prevent anything else from using it without the extra jxl check that's in IsSupportedImageMimeType().

        mmenke

        Sorry, not once it's enabled by default, once the base::Feature is removed, and it's always enabled.

        Gerrit-Comment-Date: Thu, 11 Dec 2025 19:09:42 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: mmenke <mme...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Łukasz Anforowicz (Gerrit)

        unread,
        Dec 11, 2025, 2:16:58 PM (9 days ago) Dec 11
        to Helmut Januschka, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
        Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Luca Versari, Philip Jägenstedt and Vladimir Levin

        Łukasz Anforowicz added 1 comment

        File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
        Line 214, Patchset 36: need_reset = true;
        Luca Versari . unresolved

        I don't think this is necessary. If we only need the size, we can pause decoding as soon as we get the image's metadata, and resume decoding actual frames from there.

        Helmut Januschka

        JXL format doesn't store frame count in the header. Each frame has is_last flag - you must parse through frames to know the count.

        Łukasz Anforowicz

        FWIW PNG decoder doesn't actually discover all the frame metadata upfront. For example, you can take a look at [`AnimatedPNGTests.ByteByByteMetaData`](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/image-decoders/png/png_image_decoder_test.cc;l=356;drc=d13bec8226f277ce88e32a23ca0741346e9cf053) to see how `image_decoder->FrameCount()` expectations change as the read offset moves through the input data.

        Also note that the doc comment of the (`virtual`/per-codec) `blink::ImageDecoder::DecodeFrameCount` method [says](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/image-decoders/image_decoder.h;l=508-511;drc=d13bec8226f277ce88e32a23ca0741346e9cf053):

        ```
        // This method may return an increasing frame count as frames are received and
        // parsed. Alternatively, if the total frame count is available in the image
        // header, this method may return the total frame count without checking how
        // many frames are received.
        ```
        Open in Gerrit

        Related details

        Attention is currently required from:
        • Dave Tapuska
        • Hans Wennborg
        • Helmut Januschka
        • Luca Versari
        • Philip Jägenstedt
        • Vladimir Levin
        Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
        Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
        Gerrit-Attention: Luca Versari <vel...@google.com>
        Gerrit-Comment-Date: Thu, 11 Dec 2025 19:16:48 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
        Comment-In-Reply-To: Luca Versari <vel...@google.com>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Vladimir Levin (Gerrit)

        unread,
        Dec 11, 2025, 3:52:01 PM (9 days ago) Dec 11
        to Helmut Januschka, ccameron chromium, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
        Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Luca Versari, Philip Jägenstedt and ccameron chromium

        Vladimir Levin added 1 comment

        Patchset-level comments
        Vladimir Levin . resolved

        This looks fine to me from the plumbing perspective, albeit a little strange to have both a build flag and a runtime flag. I'm not at all qualified to figure out the correctness of the decoder, so happy to stamp when everyone else is happy with the work.

        (also +ccameron)

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Dave Tapuska
        • Hans Wennborg
        • Helmut Januschka
        • Luca Versari
        • Philip Jägenstedt
        • ccameron chromium
        Submit Requirements:
        • requirement satisfiedCode-Coverage
        • requirement is not satisfiedCode-Owners
        • requirement satisfiedCode-Review
        • requirement is not satisfiedNo-Unresolved-Comments
        • requirement satisfiedReview-Enforcement
        Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
        Gerrit-MessageType: comment
        Gerrit-Project: chromium/src
        Gerrit-Branch: main
        Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
        Gerrit-Change-Number: 7184969
        Gerrit-PatchSet: 38
        Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
        Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
        Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
        Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
        Gerrit-Reviewer: Luca Versari <vel...@google.com>
        Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
        Gerrit-Reviewer: ccameron chromium <ccam...@chromium.org>
        Gerrit-Reviewer: mmenke <mme...@chromium.org>
        Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
        Gerrit-CC: Dale Curtis <dalec...@chromium.org>
        Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
        Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
        Gerrit-CC: Stephen Chenney <sche...@chromium.org>
        Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
        Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
        Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
        Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
        Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
        Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
        Gerrit-Attention: Luca Versari <vel...@google.com>
        Gerrit-Comment-Date: Thu, 11 Dec 2025 20:51:53 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Dave Tapuska (Gerrit)

        unread,
        Dec 11, 2025, 4:45:05 PM (9 days ago) Dec 11
        to Helmut Januschka, ccameron chromium, Vladimir Levin, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
        Attention needed from Hans Wennborg, Helmut Januschka, Luca Versari, Philip Jägenstedt and ccameron chromium

        Dave Tapuska added 7 comments

        File third_party/blink/common/mime_util/mime_util.cc
        Line 49, Patchset 38 (Latest):#if BUILDFLAG(ENABLE_JXL_DECODER)
        "image/jxl",
        #endif
        mmenke . unresolved

        Out of caution, suggest not including this here for now, and adding a TODO referencing the linked bug to IsSupportedImageMimeType() to move add it here once it's enabled by default.

        Alternatively, we could inline this as-is in IsSupportedImageMimeType(), to prevent anything else from using it without the extra jxl check that's in IsSupportedImageMimeType().

        mmenke

        Sorry, not once it's enabled by default, once the base::Feature is removed, and it's always enabled.

        Dave Tapuska

        +1

        File third_party/blink/renderer/config.gni
        Line 23, Patchset 38 (Latest): enable_jxl_decoder = use_blink
        Dave Tapuska . unresolved

        I feel like this should just be true. If we are in here including this gni file, I'd expect that use_blink is true.

        File third_party/blink/renderer/platform/image-decoders/BUILD.gn
        Line 64, Patchset 38 (Latest): "//media:media_buildflags",
        Dave Tapuska . unresolved

        Is this left over from before?

        File third_party/blink/renderer/platform/image-decoders/image_decoder_fuzzer_utils.cc
        Line 8, Patchset 38 (Latest):#include "media/media_buildflags.h"
        Dave Tapuska . unresolved

        again

        Line 15, Patchset 38 (Latest):#if BUILDFLAG(ENABLE_JXL_DECODER)
        Dave Tapuska . unresolved

        conditional includes come after standard includes (with whitespace in between)

        File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.h
        Line 10, Patchset 38 (Latest):#include <vector>
        Dave Tapuska . unresolved

        likewise

        Line 8, Patchset 38 (Latest):#include <memory>
        Dave Tapuska . unresolved

        where is this used in this header?

        Open in Gerrit

        Related details

        Attention is currently required from:
        Gerrit-Attention: Luca Versari <vel...@google.com>
        Gerrit-Comment-Date: Thu, 11 Dec 2025 21:44:58 +0000
        Gerrit-HasComments: Yes
        Gerrit-Has-Labels: No
        Comment-In-Reply-To: mmenke <mme...@chromium.org>
        satisfied_requirement
        unsatisfied_requirement
        open
        diffy

        Luca Versari (Gerrit)

        unread,
        Dec 18, 2025, 8:28:44 AM (2 days ago) Dec 18
        to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
        Attention needed from Hans Wennborg, Helmut Januschka, Philip Jägenstedt, ccameron chromium and mmenke

        Luca Versari added 5 comments

        File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
        Line 24, Patchset 46 (Latest):constexpr uint64_t kMaxJxlFileSize = 0x10000000; // 256 MB
        Luca Versari . unresolved

        FYI, rather than having a limit on the file size, it might be better to limit the total number of decoded pixels (which the API now supports).

        Leaving a TODO to do this would also be OK with me.

        Line 90, Patchset 46 (Latest): if (IsAllDataReceived() && !all_frames_discovered_ && !Failed()) {
        Luca Versari . unresolved

        What happens if we return something like

        `all_frames_discovered_ ? num_decoded_frames_ : num_decoded_frames_ + 1`

        ?

        (or possibly smarter logic, but in general avoiding to decode the entire file here)

        Line 258, Patchset 36: // Feed data only when we have a new/reset decoder or new data.
        Luca Versari . resolved

        As I mentioned above, I don't think this is necessary.

        Helmut Januschka

        we need frame count upfront, we should do a framecount() in jxl-rs, atleast from my current understanding of blink and my trial and error

        Luca Versari

        Done

        Line 395, Patchset 46 (Latest): // Copy pixels to frame buffer.
        const uint32_t width = basic_info_.width;
        const uint32_t height = basic_info_.height;

        if (decode_to_half_float_) {
        base::span<const uint8_t> buffer_bytes(pixel_buffer_);

        for (uint32_t y = 0; y < height; ++y) {
        for (uint32_t x = 0; x < width; ++x) {
        size_t byte_offset = (y * width + x) * 8;
        auto pixel_bytes = buffer_bytes.subspan(byte_offset, 8u);

        uint16_t r =
        base::U16FromNativeEndian(pixel_bytes.subspan<0, 2>());
        uint16_t g =
        base::U16FromNativeEndian(pixel_bytes.subspan<2, 2>());
        uint16_t b =
        base::U16FromNativeEndian(pixel_bytes.subspan<4, 2>());
        uint16_t a =
        base::U16FromNativeEndian(pixel_bytes.subspan<6, 2>());

        (void)premultiply;

        uint64_t* dst = frame.GetAddrF16(x, y);
        *dst = (static_cast<uint64_t>(a) << 48) |
        (static_cast<uint64_t>(b) << 32) |
        (static_cast<uint64_t>(g) << 16) |
        static_cast<uint64_t>(r);
        }
        }
        } else {
        base::span<const uint8_t> src_bytes(pixel_buffer_);
        const size_t row_stride = width * 4;

        if (premultiply) {
        for (uint32_t y = 0; y < height; ++y) {
        auto row = src_bytes.subspan(y * row_stride, row_stride);

        for (uint32_t x = 0; x < width; ++x) {
        auto pixel = row.subspan(x * 4, 4u);
        uint8_t r = pixel[0];
        uint8_t g = pixel[1];
        uint8_t b = pixel[2];
        uint8_t a = pixel[3];

        r = (r * a + 128) >> 8;
        g = (g * a + 128) >> 8;
        b = (b * a + 128) >> 8;

        ImageFrame::PixelData* dst = frame.GetAddr(x, y);
        *dst = (a << SK_A32_SHIFT) | (r << SK_R32_SHIFT) |
        (g << SK_G32_SHIFT) | (b << SK_B32_SHIFT);
        }
        }
        } else {
        for (uint32_t y = 0; y < height; ++y) {
        auto row = src_bytes.subspan(y * row_stride, row_stride);

        for (uint32_t x = 0; x < width; ++x) {
        auto pixel = row.subspan(x * 4, 4u);
        ImageFrame::PixelData* dst = frame.GetAddr(x, y);
        *dst = (pixel[3] << SK_A32_SHIFT) | (pixel[0] << SK_R32_SHIFT) |
        (pixel[1] << SK_G32_SHIFT) | (pixel[2] << SK_B32_SHIFT);
        }
        }
        }
        }
        Luca Versari . unresolved

        I think we should decode directly into the frame buffer, instead of copying the data over after the fact.

        Relatedly, I believe for progressive rendering to work properly we should also `frame.SetPixelsChanged(true);` even if `decode_frame` returns `JxlRsStatus::NeedMoreInput`.

        File third_party/rust/jxl/v0_1/wrapper/lib.rs
        File-level comment, Patchset 36:
        Luca Versari . resolved

        I am not sure why this file exists, instead of using directly JxlDecoderInner (which is intended for usage from FFI situations).

        Helmut Januschka

        The wrapper exists primarily for the CXX bridge to enable Rust<->C++ interop with Blink. The typestate pattern in JxlDecoder<State> can't cross FFI boundaries, so this flattens it into a runtime state machine. (and follows the pattern of rust png decoder, that also does rust<->c++)

        I agree with your point that much of the logic here—especially pixel format conversion—should ideally live in jxl-rs itself. i'll do some PR's there and then we can thin out the wrapper!

        Luca Versari

        Done

        Open in Gerrit

        Related details

        Attention is currently required from:
        • Hans Wennborg
        • Helmut Januschka
        • Philip Jägenstedt
        • ccameron chromium
        • mmenke
        Submit Requirements:
          • requirement satisfiedCode-Coverage
          • requirement is not satisfiedCode-Owners
          • requirement is not satisfiedCode-Review
          • requirement is not satisfiedNo-Unresolved-Comments
          • requirement is not satisfiedReview-Enforcement
          Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
          Gerrit-MessageType: comment
          Gerrit-Project: chromium/src
          Gerrit-Branch: main
          Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
          Gerrit-Change-Number: 7184969
          Gerrit-PatchSet: 46
          Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
          Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
          Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
          Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
          Gerrit-Reviewer: Luca Versari <vel...@google.com>
          Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
          Gerrit-Reviewer: ccameron chromium <ccam...@chromium.org>
          Gerrit-Reviewer: mmenke <mme...@chromium.org>
          Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
          Gerrit-CC: Dale Curtis <dalec...@chromium.org>
          Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
          Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
          Gerrit-CC: Stephen Chenney <sche...@chromium.org>
          Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
          Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
          Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
          Gerrit-Attention: mmenke <mme...@chromium.org>
          Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
          Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
          Gerrit-Comment-Date: Thu, 18 Dec 2025 13:28:27 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: No
          satisfied_requirement
          unsatisfied_requirement
          open
          diffy

          Łukasz Anforowicz (Gerrit)

          unread,
          Dec 18, 2025, 3:22:00 PM (2 days ago) Dec 18
          to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
          Attention needed from Hans Wennborg, Helmut Januschka, Philip Jägenstedt and ccameron chromium

          Łukasz Anforowicz added 5 comments

          Patchset-level comments
          File-level comment, Patchset 46 (Latest):
          Łukasz Anforowicz . resolved

          @veluca asked me to take a quick peek at the FFI / `#[cxx::bridge]` - I am sharing a few minor nits/questions below.

          File third_party/rust/jxl/v0_1/wrapper/lib.rs
          Line 12, Patchset 46 (Latest):#[cxx::bridge]
          Łukasz Anforowicz . unresolved

          Please specify a namespace - e.g. `#[cxx::bridge(namespace = "blink")]` (or `#[cxx::bridge(namespace = "blink::jxl_rs")]`).

          Line 96, Patchset 46 (Latest):pub use ffi::*;
          Łukasz Anforowicz . unresolved

          Is this `pub` (and other `pub` below) necessary? This API won't be called from any other Rust crates, right? (i.e. this API will only be called over the `#[cxx::bridge]` / C++ API / FFI API - and this doesn't require `pub` IIUC)

          Line 155, Patchset 46 (Latest): Ok(ProcessingResult::Complete { .. }) => {
          Łukasz Anforowicz . unresolved

          I am focusing my review on cxx::bridge usage and I defer to @veluca for `jxl` API usage, but I noticed that `fn parse_basic_info` here only tries to access-and-store `self.decoder.embedded_color_profile()`, when `self.decoder.process(...)` returns `ProcessingResult::Complete`. With PNG the ICC data comes before IDAT/pixels, so even incomplete decoding can provide ICC info (and I imagine that the partially-decoded pixels should also be color-profile-corrected). So I wanted to double-check if this is ok?

          Line 182, Patchset 46 (Latest): self.error_message = format!("{}", e);
          Łukasz Anforowicz . unresolved

          Does Blink ever use the error message? Maybe `error_message: String` field can be replaced with `had_error: Result<(), ()>` or `has_failed: bool`?

          Open in Gerrit

          Related details

          Attention is currently required from:
          • Hans Wennborg
          • Helmut Januschka
          • Philip Jägenstedt
          • ccameron chromium
          Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
          Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
          Gerrit-Comment-Date: Thu, 18 Dec 2025 20:21:49 +0000
          Gerrit-HasComments: Yes
          Gerrit-Has-Labels: No
          satisfied_requirement
          unsatisfied_requirement
          open
          diffy

          Helmut Januschka (Gerrit)

          unread,
          Dec 19, 2025, 1:13:24 AM (yesterday) Dec 19
          to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
          Attention needed from Dave Tapuska, Hans Wennborg, Luca Versari, Philip Jägenstedt, ccameron chromium, mmenke and Łukasz Anforowicz

          Helmut Januschka added 16 comments

          Patchset-level comments
          File-level comment, Patchset 48 (Latest):
          Helmut Januschka . resolved

          thanks to all for taking time to review - feedback has been addressed.

          File third_party/blink/common/mime_util/mime_util.cc
          Line 49, Patchset 38:#if BUILDFLAG(ENABLE_JXL_DECODER)
          "image/jxl",
          #endif
          mmenke . resolved

          Out of caution, suggest not including this here for now, and adding a TODO referencing the linked bug to IsSupportedImageMimeType() to move add it here once it's enabled by default.

          Alternatively, we could inline this as-is in IsSupportedImageMimeType(), to prevent anything else from using it without the extra jxl check that's in IsSupportedImageMimeType().

          mmenke

          Sorry, not once it's enabled by default, once the base::Feature is removed, and it's always enabled.

          Dave Tapuska

          +1

          Helmut Januschka

          thanks, removed it from here.

          File third_party/blink/renderer/config.gni
          Line 23, Patchset 38: enable_jxl_decoder = use_blink
          Dave Tapuska . resolved

          I feel like this should just be true. If we are in here including this gni file, I'd expect that use_blink is true.

          Helmut Januschka

          Done

          File third_party/blink/renderer/platform/image-decoders/BUILD.gn
          Line 64, Patchset 38: "//media:media_buildflags",
          Dave Tapuska . resolved

          Is this left over from before?

          Helmut Januschka

          Done

          File third_party/blink/renderer/platform/image-decoders/image_decoder_fuzzer_utils.cc
          Line 8, Patchset 38:#include "media/media_buildflags.h"
          Dave Tapuska . resolved

          again

          Helmut Januschka

          Done

          Line 15, Patchset 38:#if BUILDFLAG(ENABLE_JXL_DECODER)
          Dave Tapuska . resolved

          conditional includes come after standard includes (with whitespace in between)

          Helmut Januschka

          Done

          File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.h
          Line 10, Patchset 38:#include <vector>
          Dave Tapuska . resolved

          likewise

          Helmut Januschka

          Done

          Line 8, Patchset 38:#include <memory>
          Dave Tapuska . resolved

          where is this used in this header?

          Helmut Januschka

          thanks for the catch!

          File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
          Line 24, Patchset 46:constexpr uint64_t kMaxJxlFileSize = 0x10000000; // 256 MB
          Luca Versari . resolved

          FYI, rather than having a limit on the file size, it might be better to limit the total number of decoded pixels (which the API now supports).

          Leaving a TODO to do this would also be OK with me.

          Helmut Januschka

          done, without todo

          Line 90, Patchset 46: if (IsAllDataReceived() && !all_frames_discovered_ && !Failed()) {
          Luca Versari . resolved

          What happens if we return something like

          `all_frames_discovered_ ? num_decoded_frames_ : num_decoded_frames_ + 1`

          ?

          (or possibly smarter logic, but in general avoiding to decode the entire file here)

          Helmut Januschka

          tried your solution, ended up with a peek-ahead 2 frame approach that works, and is eliminating the entire file decoding.

          Line 214, Patchset 36: need_reset = true;
          Luca Versari . resolved

          I don't think this is necessary. If we only need the size, we can pause decoding as soon as we get the image's metadata, and resume decoding actual frames from there.

          Helmut Januschka

          JXL format doesn't store frame count in the header. Each frame has is_last flag - you must parse through frames to know the count.

          Łukasz Anforowicz

          FWIW PNG decoder doesn't actually discover all the frame metadata upfront. For example, you can take a look at [`AnimatedPNGTests.ByteByByteMetaData`](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/image-decoders/png/png_image_decoder_test.cc;l=356;drc=d13bec8226f277ce88e32a23ca0741346e9cf053) to see how `image_decoder->FrameCount()` expectations change as the read offset moves through the input data.

          Also note that the doc comment of the (`virtual`/per-codec) `blink::ImageDecoder::DecodeFrameCount` method [says](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/image-decoders/image_decoder.h;l=508-511;drc=d13bec8226f277ce88e32a23ca0741346e9cf053):

          ```
          // This method may return an increasing frame count as frames are received and
          // parsed. Alternatively, if the total frame count is available in the image
          // header, this method may return the total frame count without checking how
          // many frames are received.
          ```
          Helmut Januschka

          think with the last PS and 2 frame peek it works! and did not regress any animation glitches - thank you Łukas!.

          Line 395, Patchset 46: // Copy pixels to frame buffer.
          Luca Versari . resolved

          I think we should decode directly into the frame buffer, instead of copying the data over after the fact.

          Relatedly, I believe for progressive rendering to work properly we should also `frame.SetPixelsChanged(true);` even if `decode_frame` returns `JxlRsStatus::NeedMoreInput`.

          Helmut Januschka
          decoding fixed, should be now
          -> jxl-rs -> frame_buffer -> in-place permultiply

          no more copy.

          setpixelchange also addressed.

          File third_party/rust/jxl/v0_1/wrapper/lib.rs
          Line 12, Patchset 46:#[cxx::bridge]
          Łukasz Anforowicz . resolved

          Please specify a namespace - e.g. `#[cxx::bridge(namespace = "blink")]` (or `#[cxx::bridge(namespace = "blink::jxl_rs")]`).

          Helmut Januschka

          Done. Added `namespace = "blink::jxl_rs"`

          Line 96, Patchset 46:pub use ffi::*;
          Łukasz Anforowicz . resolved

          Is this `pub` (and other `pub` below) necessary? This API won't be called from any other Rust crates, right? (i.e. this API will only be called over the `#[cxx::bridge]` / C++ API / FFI API - and this doesn't require `pub` IIUC)

          Helmut Januschka

          thanks, removed pub

          Line 155, Patchset 46: Ok(ProcessingResult::Complete { .. }) => {
          Łukasz Anforowicz . resolved

          I am focusing my review on cxx::bridge usage and I defer to @veluca for `jxl` API usage, but I noticed that `fn parse_basic_info` here only tries to access-and-store `self.decoder.embedded_color_profile()`, when `self.decoder.process(...)` returns `ProcessingResult::Complete`. With PNG the ICC data comes before IDAT/pixels, so even incomplete decoding can provide ICC info (and I imagine that the partially-decoded pixels should also be color-profile-corrected). So I wanted to double-check if this is ok?

          Helmut Januschka

          This is correct for JXL. The color profile is part of the image header metadata, and jxl-rs makes it available via `embedded_color_profile()` only after the header is fully parsed (when `process()` returns `Complete`). On `NeedsMoreInput`, the header isn't complete yet, so the ICC profile wouldn't be available. Unlike PNG where ICC comes as a separate chunk before IDAT, JXL bundles it atomically in the header structure.

          Line 182, Patchset 46: self.error_message = format!("{}", e);
          Łukasz Anforowicz . resolved

          Does Blink ever use the error message? Maybe `error_message: String` field can be replaced with `had_error: Result<(), ()>` or `has_failed: bool`?

          Helmut Januschka

          Done. Removed error_message storage entirely - C++ only checks status codes, doesn't use get_error(). Simplified to just return JxlRsStatus::Error

          Open in Gerrit

          Related details

          Attention is currently required from:
          • Dave Tapuska
          • Hans Wennborg
          • Luca Versari
          • Philip Jägenstedt
          • ccameron chromium
          • mmenke
          • Łukasz Anforowicz
          Submit Requirements:
            • requirement satisfiedCode-Coverage
            • requirement is not satisfiedCode-Owners
            • requirement is not satisfiedCode-Review
            • requirement is not satisfiedReview-Enforcement
            Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
            Gerrit-MessageType: comment
            Gerrit-Project: chromium/src
            Gerrit-Branch: main
            Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
            Gerrit-Change-Number: 7184969
            Gerrit-PatchSet: 48
            Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
            Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
            Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
            Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
            Gerrit-Reviewer: Luca Versari <vel...@chromium.org>
            Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
            Gerrit-Reviewer: ccameron chromium <ccam...@chromium.org>
            Gerrit-Reviewer: mmenke <mme...@chromium.org>
            Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
            Gerrit-CC: Dale Curtis <dalec...@chromium.org>
            Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
            Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
            Gerrit-CC: Stephen Chenney <sche...@chromium.org>
            Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
            Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
            Gerrit-Attention: mmenke <mme...@chromium.org>
            Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
            Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
            Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
            Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
            Gerrit-Attention: Luca Versari <vel...@chromium.org>
            Gerrit-Comment-Date: Fri, 19 Dec 2025 06:13:03 +0000
            Gerrit-HasComments: Yes
            Gerrit-Has-Labels: No
            Comment-In-Reply-To: Helmut Januschka <hel...@januschka.com>
            Comment-In-Reply-To: mmenke <mme...@chromium.org>
            Comment-In-Reply-To: Łukasz Anforowicz <luk...@chromium.org>
            Comment-In-Reply-To: Dave Tapuska <dtap...@chromium.org>
            Comment-In-Reply-To: Luca Versari <vel...@chromium.org>
            satisfied_requirement
            unsatisfied_requirement
            open
            diffy

            Luca Versari (Gerrit)

            unread,
            Dec 19, 2025, 8:17:31 AM (yesterday) Dec 19
            to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
            Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Philip Jägenstedt, ccameron chromium, mmenke and Łukasz Anforowicz

            Luca Versari added 3 comments

            File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
            Line 81, Patchset 48 (Latest):constexpr uint64_t kMaxDecodedPixels = 256 * 1024 * 1024;
            Luca Versari . unresolved

            I think this is way too low, it should be at least 4 times this value (level 5 limits want 268435456 *pixels*, and this limit is in *samples*)

            Line 189, Patchset 48 (Latest): buffer.SetPremultiplyAlpha(premultiply_alpha_);
            Luca Versari . unresolved

            (I write this message under the assumption that premultiply_alpha_ is an optimization hint, and we can, if we so wish, use SetPremultiplyAlpha to do differently. Someone with more knowledge of Skia should probably comment on this).

            I don't think this is quite right. JPEG XL can have associated alpha channels in the bitstream, and jxl-rs currently does not either multiply or un-premultiply them (especially because that operation is not really possible to do in all cases).

            Instead, I think we should set premultiply_alpha_ to whether or not the first alpha channel is premultiplied in the bitstream (it's probably fine to assume it is not for now and leave a todo), and in either case we should not do the premultiplication manually here, as either Skia or jxl-rs are in a better position to do so performance-wise.

            Line 433, Patchset 48 (Latest): // Post-process: apply premultiplication if needed.
            // jxl-rs outputs non-premultiplied, Skia may need premultiplied.
            if (premultiply) {
            // SAFETY: frame_pixels is valid for buffer_size bytes as verified
            // above.
            base::span<uint8_t> buffer_span =
            UNSAFE_BUFFERS(base::span(frame_pixels, buffer_size));

            if (decode_to_half_float_) {
            // In-place premultiplication for RGBA F16.
            // RGBA F16 layout: R=bytes 0-1, G=bytes 2-3, B=bytes 4-5, A=bytes
            // 6-7

            for (uint32_t y = 0; y < height; ++y) {
            auto row = buffer_span.subspan(y * row_stride, width * 8);

            for (uint32_t x = 0; x < width; ++x) {
            auto pixel = row.subspan(x * 8, 8u);
            uint16_t r_half = static_cast<uint16_t>(pixel[0]) |
            (static_cast<uint16_t>(pixel[1]) << 8);
            uint16_t g_half = static_cast<uint16_t>(pixel[2]) |
            (static_cast<uint16_t>(pixel[3]) << 8);
            uint16_t b_half = static_cast<uint16_t>(pixel[4]) |
            (static_cast<uint16_t>(pixel[5]) << 8);
            uint16_t a_half = static_cast<uint16_t>(pixel[6]) |
            (static_cast<uint16_t>(pixel[7]) << 8);

            float r = HalfToFloat(r_half);
            float g = HalfToFloat(g_half);
            float b = HalfToFloat(b_half);
            float a = HalfToFloat(a_half);

            r *= a;
            g *= a;
            b *= a;

            r_half = FloatToHalf(r);
            g_half = FloatToHalf(g);
            b_half = FloatToHalf(b);

            pixel[0] = static_cast<uint8_t>(r_half & 0xFF);
            pixel[1] = static_cast<uint8_t>(r_half >> 8);
            pixel[2] = static_cast<uint8_t>(g_half & 0xFF);
            pixel[3] = static_cast<uint8_t>(g_half >> 8);
            pixel[4] = static_cast<uint8_t>(b_half & 0xFF);
            pixel[5] = static_cast<uint8_t>(b_half >> 8);
            // Alpha stays the same
            }
            }
            } else {
            // In-place premultiplication for BGRA8.
            // BGRA layout: B=0, G=1, R=2, A=3

            for (uint32_t y = 0; y < height; ++y) {
            auto row = buffer_span.subspan(y * row_stride, width * 4);

            for (uint32_t x = 0; x < width; ++x) {
            auto pixel = row.subspan(x * 4, 4u);
            uint8_t b = pixel[0];

            uint8_t g = pixel[1];
            uint8_t r = pixel[2];

            uint8_t a = pixel[3];

            pixel[0] = (b * a + 128) >> 8;
            pixel[1] = (g * a + 128) >> 8;
            pixel[2] = (r * a + 128) >> 8;
            // Alpha stays the same
            }
            }
            }
            }
            Luca Versari . unresolved

            See comment above on premultiplication. I also think this doesn't work as written, since with partial rendering some parts of the image will be multiplied twice.

            Open in Gerrit

            Related details

            Attention is currently required from:
            • Dave Tapuska
            • Hans Wennborg
            • Helmut Januschka
            • Philip Jägenstedt
            • ccameron chromium
            • mmenke
            • Łukasz Anforowicz
              Submit Requirements:
                • requirement satisfiedCode-Coverage
                • requirement is not satisfiedCode-Owners
                • requirement is not satisfiedCode-Review
                • requirement is not satisfiedNo-Unresolved-Comments
                • requirement is not satisfiedReview-Enforcement
                Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                Gerrit-MessageType: comment
                Gerrit-Project: chromium/src
                Gerrit-Branch: main
                Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
                Gerrit-Change-Number: 7184969
                Gerrit-PatchSet: 48
                Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
                Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
                Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
                Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
                Gerrit-Reviewer: Luca Versari <vel...@google.com>
                Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
                Gerrit-Reviewer: ccameron chromium <ccam...@chromium.org>
                Gerrit-Reviewer: mmenke <mme...@chromium.org>
                Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
                Gerrit-CC: Dale Curtis <dalec...@chromium.org>
                Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
                Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
                Gerrit-CC: Stephen Chenney <sche...@chromium.org>
                Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
                Gerrit-Attention: Helmut Januschka <hel...@januschka.com>
                Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
                Gerrit-Attention: mmenke <mme...@chromium.org>
                Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
                Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
                Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
                Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
                Gerrit-Comment-Date: Fri, 19 Dec 2025 13:17:09 +0000
                Gerrit-HasComments: Yes
                Gerrit-Has-Labels: No
                satisfied_requirement
                unsatisfied_requirement
                open
                diffy

                mmenke (Gerrit)

                unread,
                Dec 19, 2025, 11:21:22 AM (21 hours ago) Dec 19
                to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
                Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Philip Jägenstedt, ccameron chromium and Łukasz Anforowicz

                mmenke voted and added 2 comments

                Votes added by mmenke

                Code-Review+1

                2 comments

                Patchset-level comments
                mmenke . resolved

                Signing off now, since I'm out for the next two weeks. Given the size of this CL, though, probably best to hold off until January before landing, anyways, just so folks are around in the case of breakage.

                File third_party/blink/common/mime_util/mime_util_unittest.cc
                Line 66, Patchset 48 (Parent): EXPECT_TRUE(IsSupportedImageMimeType("Image/JPEG"));
                EXPECT_FALSE(IsSupportedImageMimeType("image/jxl"));
                mmenke . unresolved

                We should still make sure this isn't supported when !BUILDFLAG(ENABLE_JXL_DECODER)

                Open in Gerrit

                Related details

                Attention is currently required from:
                • Dave Tapuska
                • Hans Wennborg
                • Helmut Januschka
                • Philip Jägenstedt
                • ccameron chromium
                • Łukasz Anforowicz
                Submit Requirements:
                  • requirement satisfiedCode-Coverage
                  • requirement is not satisfiedCode-Owners
                  • requirement satisfiedCode-Review
                  • requirement is not satisfiedNo-Unresolved-Comments
                  • requirement satisfiedReview-Enforcement
                  Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
                  Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
                  Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
                  Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
                  Gerrit-Comment-Date: Fri, 19 Dec 2025 16:21:14 +0000
                  Gerrit-HasComments: Yes
                  Gerrit-Has-Labels: Yes
                  satisfied_requirement
                  unsatisfied_requirement
                  open
                  diffy

                  Łukasz Anforowicz (Gerrit)

                  unread,
                  Dec 19, 2025, 11:51:59 AM (21 hours ago) Dec 19
                  to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
                  Attention needed from Dave Tapuska, Hans Wennborg, Helmut Januschka, Philip Jägenstedt and ccameron chromium

                  Łukasz Anforowicz added 1 comment

                  File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
                  Line 189, Patchset 48 (Latest): buffer.SetPremultiplyAlpha(premultiply_alpha_);
                  Luca Versari . unresolved

                  (I write this message under the assumption that premultiply_alpha_ is an optimization hint, and we can, if we so wish, use SetPremultiplyAlpha to do differently. Someone with more knowledge of Skia should probably comment on this).

                  I don't think this is quite right. JPEG XL can have associated alpha channels in the bitstream, and jxl-rs currently does not either multiply or un-premultiply them (especially because that operation is not really possible to do in all cases).

                  Instead, I think we should set premultiply_alpha_ to whether or not the first alpha channel is premultiplied in the bitstream (it's probably fine to assume it is not for now and leave a todo), and in either case we should not do the premultiplication manually here, as either Skia or jxl-rs are in a better position to do so performance-wise.

                  Łukasz Anforowicz

                  [...] premultiply_alpha_ is an optimization hint [...] Someone with more knowledge of Skia should probably comment on this).

                  I don't have _much_ more knowledge of Skia, but I think you want to do something similar to the code here: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc;l=365-372;drc=d13bec8226f277ce88e32a23ca0741346e9cf053 where Blink-side `premultiply_alpha_` (whether output should use premultiplied alpha or not) is translated into `SkImageInfo image_info = ...` that tells a Skia's `SkCodec` how the output should look like. I am guessing that `ImageDecoder::premultiply_alpha_` is based on `AlphaOption` passed to the constructor of `SkiaImageDecoderBase`.

                  So:

                  • IIUC treatment of alpha is not just a hint, but a requirement
                  • It does seem to make sense to process alpha within the codec (there are exceptions of course - the old libpng-based PNG codec did this in Blink)
                  Open in Gerrit

                  Related details

                  Attention is currently required from:
                  • Dave Tapuska
                  • Hans Wennborg
                  • Helmut Januschka
                  • Philip Jägenstedt
                  • ccameron chromium
                  Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
                  Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
                  Gerrit-Comment-Date: Fri, 19 Dec 2025 16:51:48 +0000
                  Gerrit-HasComments: Yes
                  Gerrit-Has-Labels: No
                  Comment-In-Reply-To: Luca Versari <vel...@google.com>
                  satisfied_requirement
                  unsatisfied_requirement
                  open
                  diffy

                  Helmut Januschka (Gerrit)

                  unread,
                  Dec 19, 2025, 2:42:00 PM (18 hours ago) Dec 19
                  to Helmut Januschka, ccameron chromium, Vladimir Levin, Dave Tapuska, Luca Versari, Hans Wennborg, Łukasz Anforowicz, Dale Curtis, Chromium Metrics Reviews, Stephen Chenney, Dirk Schulze, Philip Jägenstedt, AyeAye, Chromium LUCI CQ, chromium...@chromium.org, devtools...@chromium.org, kinuko+...@chromium.org, jmedle...@chromium.org, asvitki...@chromium.org, jshin...@chromium.org, fserb...@chromium.org, asvitkine...@chromium.org, drott+bl...@chromium.org, csharris...@chromium.org, blink-reviews-p...@chromium.org, blink-re...@chromium.org, fmalit...@chromium.org, bmcquad...@chromium.org, loading-rev...@chromium.org, speed-metrics...@chromium.org, speed-metr...@chromium.org, blink-revie...@chromium.org, blink-...@chromium.org, bnc+...@chromium.org, cblume+im...@chromium.org, cc-...@chromium.org, devtools-re...@chromium.org, feature-me...@chromium.org, fuzzin...@chromium.org, kinuko...@chromium.org, mbarowsky+watc...@chromium.org, net-r...@chromium.org
                  Attention needed from Dave Tapuska, Hans Wennborg, Luca Versari, Philip Jägenstedt, ccameron chromium, mmenke and Łukasz Anforowicz

                  Helmut Januschka added 3 comments

                  File third_party/blink/renderer/platform/image-decoders/jxl/jxl_image_decoder.cc
                  Line 81, Patchset 48:constexpr uint64_t kMaxDecodedPixels = 256 * 1024 * 1024;
                  Luca Versari . resolved

                  I think this is way too low, it should be at least 4 times this value (level 5 limits want 268435456 *pixels*, and this limit is in *samples*)

                  Helmut Januschka

                  Done

                  Line 189, Patchset 48: buffer.SetPremultiplyAlpha(premultiply_alpha_);
                  Luca Versari . resolved

                  (I write this message under the assumption that premultiply_alpha_ is an optimization hint, and we can, if we so wish, use SetPremultiplyAlpha to do differently. Someone with more knowledge of Skia should probably comment on this).

                  I don't think this is quite right. JPEG XL can have associated alpha channels in the bitstream, and jxl-rs currently does not either multiply or un-premultiply them (especially because that operation is not really possible to do in all cases).

                  Instead, I think we should set premultiply_alpha_ to whether or not the first alpha channel is premultiplied in the bitstream (it's probably fine to assume it is not for now and leave a todo), and in either case we should not do the premultiplication manually here, as either Skia or jxl-rs are in a better position to do so performance-wise.

                  Helmut Januschka

                  Done. Removed manual premultiplication entirely - jxl-rs should handle this.

                  this CL is broken right now, it requires https://github.com/libjxl/jxl-rs/pull/574 to land and roll!

                  Line 433, Patchset 48: // Post-process: apply premultiplication if needed.
                  Luca Versari . resolved

                  See comment above on premultiplication. I also think this doesn't work as written, since with partial rendering some parts of the image will be multiplied twice.

                  Helmut Januschka

                  Done

                  Open in Gerrit

                  Related details

                  Attention is currently required from:
                  • Dave Tapuska
                  • Hans Wennborg
                  • Luca Versari
                  • Philip Jägenstedt
                  • ccameron chromium
                  • mmenke
                  • Łukasz Anforowicz
                    Submit Requirements:
                      • requirement satisfiedCode-Coverage
                      • requirement is not satisfiedCode-Owners
                      • requirement is not satisfiedCode-Review
                      • requirement is not satisfiedNo-Unresolved-Comments
                      • requirement is not satisfiedReview-Enforcement
                      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
                      Gerrit-MessageType: comment
                      Gerrit-Project: chromium/src
                      Gerrit-Branch: main
                      Gerrit-Change-Id: I0e3570202b06cf3fbbc1c5dc13f3109b21648f30
                      Gerrit-Change-Number: 7184969
                      Gerrit-PatchSet: 49
                      Gerrit-Owner: Helmut Januschka <hel...@januschka.com>
                      Gerrit-Reviewer: Dave Tapuska <dtap...@chromium.org>
                      Gerrit-Reviewer: Hans Wennborg <ha...@chromium.org>
                      Gerrit-Reviewer: Helmut Januschka <hel...@januschka.com>
                      Gerrit-Reviewer: Luca Versari <vel...@google.com>
                      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
                      Gerrit-Reviewer: ccameron chromium <ccam...@chromium.org>
                      Gerrit-Reviewer: mmenke <mme...@chromium.org>
                      Gerrit-CC: Chromium Metrics Reviews <chromium-met...@google.com>
                      Gerrit-CC: Dale Curtis <dalec...@chromium.org>
                      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
                      Gerrit-CC: Philip Jägenstedt <foo...@chromium.org>
                      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
                      Gerrit-CC: Łukasz Anforowicz <luk...@chromium.org>
                      Gerrit-Attention: Hans Wennborg <ha...@chromium.org>
                      Gerrit-Attention: mmenke <mme...@chromium.org>
                      Gerrit-Attention: Philip Jägenstedt <foo...@chromium.org>
                      Gerrit-Attention: Łukasz Anforowicz <luk...@chromium.org>
                      Gerrit-Attention: ccameron chromium <ccam...@chromium.org>
                      Gerrit-Attention: Dave Tapuska <dtap...@chromium.org>
                      Gerrit-Attention: Luca Versari <vel...@google.com>
                      Gerrit-Comment-Date: Fri, 19 Dec 2025 19:41:41 +0000
                      satisfied_requirement
                      unsatisfied_requirement
                      open
                      diffy
                      Reply all
                      Reply to author
                      Forward
                      0 new messages