Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: d7336d4f5da69f80f35c36f8083e53d3c6217dda
      
https://github.com/WebKit/WebKit/commit/d7336d4f5da69f80f35c36f8083e53d3c6217dda
  Author: Andy Estes <aes...@apple.com>
  Date:   2024-01-22 (Mon, 22 Jan 2024)

  Changed paths:
    M LayoutTests/http/tests/media/fairplay/eme2016.js
    A 
LayoutTests/http/tests/media/fairplay/fps-mse-attach-cdm-after-key-exchange-expected.txt
    A 
LayoutTests/http/tests/media/fairplay/fps-mse-attach-cdm-after-key-exchange.html
    M LayoutTests/http/tests/media/fairplay/fps-mse-play-while-not-in-dom.html
    M LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-audio-only.html
    M LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-key-renewal.html
    M LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-key-rotation.html
    M LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-multiple-keys.html
    M LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-same-key.html
    M LayoutTests/platform/mac/TestExpectations
    M Source/WebCore/html/HTMLMediaElement.cpp
    M 
Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h
    M 
Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm
    M 
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h
    M 
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm

  Log Message:
  -----------
  [EME] Blocked encrypted samples are not enqueued after a CDM is attached to a 
SourceBuffer (affects netflix.com)
https://bugs.webkit.org/show_bug.cgi?id=267804
rdar://120879185

Reviewed by Jean-Yves Avenard and Jer Noble.

When SourceBuffer attempts to enqueue an encrypted sample before either a CDM 
is attached or a
usable key is present it adds the sample to a list of "blocked" samples. The 
intention was to later
enqueue these samples once a CDM was attached and usable keys were present, 
however this would
never occur for two reasons:

1. While SourceBufferPrivateAVFObjC had a key status observer that would 
enqueue blocked samples
when called, it was never added to the attached CDM and therefore never called.
2. Even if the observer were added, if key status resolved to a terminal state 
prior to the CDM
being attached then the observer would never be called.

These issues manifested in sporadic playback failures on netflix.com (and 
possibly other EME sites).

Addressed (1) by adding SourceBufferPrivateAVFObjC's key status observer to the 
attached CDM.
Addressed (2) by attempting to enqueue blocked samples immediately at CDM 
attachment time.

Added a layout test.

* LayoutTests/http/tests/media/fairplay/eme2016.js:
(async startEME):
(async fetchAppendAndWaitForEncrypted):
(async createBufferAppendAndWaitForEncrypted):
* 
LayoutTests/http/tests/media/fairplay/fps-mse-attach-cdm-after-key-exchange-expected.txt:
 Added.
* 
LayoutTests/http/tests/media/fairplay/fps-mse-attach-cdm-after-key-exchange.html:
 Copied from 
LayoutTests/http/tests/media/fairplay/fps-mse-play-while-not-in-dom.html.
* LayoutTests/http/tests/media/fairplay/fps-mse-play-while-not-in-dom.html:
* LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-audio-only.html:
* LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-key-renewal.html:
* LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-key-rotation.html:
* LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-multiple-keys.html:
* LayoutTests/http/tests/media/fairplay/fps-mse-unmuxed-same-key.html:
* LayoutTests/platform/mac/TestExpectations:
* Source/WebCore/html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::enterFullscreen):
* 
Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
* 
Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::addKeyStatusesChangedObserver):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::removeKeyStatusesChangedObserver):
* 
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h:
* 
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
(WebCore::SourceBufferPrivateAVFObjC::SourceBufferPrivateAVFObjC):
(WebCore::SourceBufferPrivateAVFObjC::setCDMInstance):
(WebCore::SourceBufferPrivateAVFObjC::attemptToDecrypt):
(WebCore::SourceBufferPrivateAVFObjC::tryToEnqueueBlockedSamples):
(WebCore::SourceBufferPrivateAVFObjC::keyStatusesChanged): Renamed to 
tryToEnqueueBlockedSamples.

Canonical link: https://commits.webkit.org/273340@main


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to