Open Bug 2062654 Opened 16 days ago Updated 15 days ago

play.geforcenow.com - Firefox is blocked from AV1 codec support

Categories

(Web Compatibility :: Site Reports, defect, P2)

Tracking

(Webcompat Priority:P2, Webcompat Score:5)

Webcompat Priority P2
Webcompat Score 5

People

(Reporter: saschanaz, Unassigned)

References

(Blocks 1 open bug, )

Details

(Keywords: webcompat:platform-bug, webcompat:site-report, Whiteboard: [autowebcompat:processed][autowebcompat:repro-failed])

User Story

autowebcompat-repro-status:failed
autowebcompat-repro-reason:login
platform:windows,mac,linux
impact:feature-broken
configuration:general
affects:all
branch:release
diagnosis-team:video-conferencing
user-impact-score:150

Attachments

(1 file)

In https://play.geforcenow.com/mall/#/layout/settings/gameplay, the codec support is limited to H.264 while AV1 and H.265 options are grayed out.

We have bug 2062642 that incorrectly makes powerEfficient false, but even before checking that, Nvidia checks browser and only allows Chrome/Edge/Opera GX to access AV1.

Further diagnosis incoming in comment.

Whiteboard: [autowebcompat:processed]

https://play.geforcenow.com/mall/vendor.74c936ece8331518.js

A function named getSupportedCodecs (aka Va) checks support for AV1/H265/H264.

U.getSupportedCodecs = Va,
                  function Va(h, i) {
                    return Xo.apply(this, arguments)
                  }
                  function Xo() {
                    return Xo = a(
                      function * (h, i) {
                        var d;
                        let m = [];
                        const C = null !== (d = k.codecList) &&
                        void 0 !== d ? d : k.Ho.codecList;
                        if (C) for (const O of C) m.push(O);
                         else {
                          const [O,
                          F] = yield Promise.all([Ki(h, i),
                          Ja(h, i)]);
                          O &&
                          m.push('AV1'),
                          F &&
                          m.push('H265'),
                          (ei(h) || be(h)) &&
                          es(i) ||
                          m.push('H264')
                        }
                        return m
                      }
                    ),
                    Xo.apply(this, arguments)
                  }

Here, Ki and Ja are responsible respectively for AV1/H265.

                  function Ki(h, i) {
                    return Ba.apply(this, arguments)
                  }
                  function Ba() {
                    return Ba = a(
                      function * (h, i) {
                        var d,
                        m,
                        C;
                        const O = null !== (
                          m = null !== (d = k.enableAv1Support) &&
                          void 0 !== d ? d : k.Ho.enableAv1Support
                        ) &&
                        void 0 !== m ? m : Yt(Ie = h) ? Qi(Ie) : xe(Ie) ? Qi(Ie) ||
                        It(Ie) ||
                        An(Ie) : !!ei(Ie),
                        F = null !== (C = k.Ho.enableAv1ByResolutionAndFps) &&
                        void 0 !== C ? C : 7;
                        var Ie;
                        if (!O || xl(F, i) || !Ia('AV1')) return !1;
                        const z = Ot(h),
                        ne = ei(h) ||
                        z ? i : void 0,
                        de = z ? 'av1; profile=0; tier=0; level-idx=15' : 'av1',
                        Ee = z,
                        ke = yield la.EI(ne, de, Ee);
                        return !(null == ke || !ke.powerEfficient)
                      , 
                    ),
                    Ba.apply(this, arguments)
                  }

Specifically, this includes the condition variable O:

const O =
  null !==
    (m =
      null !== (d = k.enableAv1Support) && void 0 !== d
        ? d
        : k.Ho.enableAv1Support) && void 0 !== m
    ? m
    : Yt((Ie = h))
      ? Qi(Ie)
      : xe(Ie)
        ? Qi(Ie) || It(Ie) || An(Ie)
        : !!ei(Ie);

Here, the k.enableAv1Support stuff doesn't matter as it seems to be some internal pref override stuff. What matters is the line after that, so it reduces to:

const O = Yt((Ie = h))
  ? Qi(Ie)
  : xe(Ie)
    ? Qi(Ie) || It(Ie) || An(Ie)
    : !!ei(Ie);

With some platform and browser checkers:

      function Yt(h) {
        return h.os === c.PlatformOS.CHROME_OS
      }

Which we don't care, so further reduces to:

const O = xe(Ie) ? Qi(Ie) || It(Ie) || An(Ie) : !!ei(Ie);

Which gets more interesting:

      function xe(h) {
        return h.os === c.PlatformOS.WINDOWS
      }
      function Qi(h) {
        return h.browser == c.PlatformBrowser.CHROME
      }
      function It(h) {
        return h.browser === c.PlatformBrowser.EDGE
      }
      function An(h) {
        return h.browser === c.PlatformBrowser.OPERAGX
      }

So O becomes false because we are not Chrome/Edge/Opera GX. So if (!O || xl(F, i) || !Ia('AV1')) return !1; makes us return early without actual feature detection. Overriding that with k.enableAv1Support = true makes us pass the feature detection and get the AV1 option in the UI, with a local patch for bug 2062642 applied.

Recommended action is to reach out and ask why this limitation exists.

User Story: (updated)
Whiteboard: [autowebcompat:processed] → [autowebcompat:processed][autowebcompat:repro-failed]
Severity: -- → S3
User Story: (updated)
Webcompat Priority: --- → P2
Webcompat Score: --- → 5
Priority: -- → P2
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: