Changeset 279375 in webkit


Ignore:
Timestamp:
Jun 29, 2021 10:11:34 AM (13 months ago)
Author:
jer.noble@apple.com
Message:

Loading WebM hangs if server sends only small amount of data
https://bugs.webkit.org/show_bug.cgi?id=226217
<rdar://problem/78709010>

Source/WebCore/PAL:

Reviewed by Eric Carlson.

  • pal/cf/CoreMediaSoftLink.cpp:
  • pal/cf/CoreMediaSoftLink.h:
  • pal/spi/cf/CoreMediaSPI.h:

Source/WebKit:

Reviewed by Eric Carlson.

Test: http/tests/media/video-webm-stall.html

Adopt FigThread{Un,}RegisterAbortAction() when blocking against track parsing.

CoreMedia will attempt to abort reads during AVPlayer teardown, but because the parsing
thread is blocked on a Condition variable in WebKit code, the abort request has no effect.
Adopt methods from CoreMedia to run code during an abort request, and wrap these calls in a
stack-based object. The new AbortAction object takes a Condition variable to notify during
an abort, and its aborted() state can be queried by the Condition's predicate.

Drive-by Fix: enable running an unsigned MTFormatReaderPlugin in the GPU process for
engineering builds.

  • Configurations/BaseTarget.xcconfig:
  • GPUProcess/mac/GPUProcessMac.mm:

(WebKit::GPUProcess::initializeProcess):

  • Shared/mac/MediaFormatReader/MediaFormatReader.cpp:

(WebKit::AbortAction::AbortAction):
(WebKit::AbortAction::~AbortAction):
(WebKit::AbortAction::aborted const):
(WebKit::AbortAction::action):
(WebKit::MediaFormatReader::copyProperty):
(WebKit::MediaFormatReader::copyTrackArray):

LayoutTests:

Reviewed by NOBODY Eric Carlson.

  • http/tests/media/resources/.htaccess: Added.
  • http/tests/media/video-webm-stall-expected.txt: Added.
  • http/tests/media/video-webm-stall.html: Added.
Location:
trunk
Files:
3 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r279374 r279375  
     12021-06-24  Jer Noble  <jer.noble@apple.com>
     2
     3        Loading WebM hangs if server sends only small amount of data
     4        https://bugs.webkit.org/show_bug.cgi?id=226217
     5        <rdar://problem/78709010>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * http/tests/media/resources/.htaccess: Added.
     10        * http/tests/media/video-webm-stall-expected.txt: Added.
     11        * http/tests/media/video-webm-stall.html: Added.
     12
    1132021-06-29  Yoshiaki Jitsukawa  <yoshiaki.jitsukawa@sony.com>
    214
  • trunk/LayoutTests/platform/ios/TestExpectations

    r279344 r279375  
    33863386imported/w3c/web-platform-tests/webxr [ Skip ]
    33873387http/wpt/webxr [ Skip ]
     3388
     3389# WebM is not supported on iOS
     3390http/tests/media/video-webm-stall.html [ Skip ]
  • trunk/LayoutTests/platform/mac-wk1/TestExpectations

    r279302 r279375  
    224224platform/mac/media/media-source/media-source-change-source.html [ Skip ]
    225225media/now-playing-status-without-media.html [ Skip ]
     226
     227# WebM not supported in WK1 on macOS.
     228http/tests/media/video-webm-stall.html
    226229
    227230#//////////////////////////////////////////////////////////////////////////////////////////
  • trunk/LayoutTests/platform/mac/TestExpectations

    r279358 r279375  
    21442144[ Catalina Mojave ] fast/text/system-font-width-9.html [ ImageOnlyFailure ]
    21452145
     2146# WebM support is on Monterey and later
     2147[ Catalina Mojave BigSur ] http/tests/media/video-webm-stall.html [ Skip ]
     2148
    21462149webkit.org/b/221152 imported/w3c/web-platform-tests/webaudio/the-audio-api/the-audioworklet-interface/audioworkletnode-automatic-pull.https.html [ Pass Failure ]
    21472150
  • trunk/Source/WebCore/PAL/ChangeLog

    r279335 r279375  
     12021-06-24  Jer Noble  <jer.noble@apple.com>
     2
     3        Loading WebM hangs if server sends only small amount of data
     4        https://bugs.webkit.org/show_bug.cgi?id=226217
     5        <rdar://problem/78709010>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * pal/cf/CoreMediaSoftLink.cpp:
     10        * pal/cf/CoreMediaSoftLink.h:
     11        * pal/spi/cf/CoreMediaSPI.h:
     12
    1132021-06-28  Jean-Yves Avenard  <jya@apple.com>
    214
  • trunk/Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.cpp

    r279335 r279375  
    214214
    215215SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, CMAudioClockCreate, OSStatus, (CFAllocatorRef allocator, CMClockRef* clockOut), (allocator, clockOut), PAL_EXPORT)
     216SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, FigThreadRegisterAbortAction, OSStatus, (FigThreadAbortAction action, void* refcon, FigThreadAbortActionToken* token), (action, refcon, token), PAL_EXPORT)
     217SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, FigThreadUnregisterAbortAction, void, (FigThreadAbortActionToken token), (token), PAL_EXPORT)
    216218
    217219SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionExtension_ProtectedContentOriginalFormat, CFStringRef, PAL_EXPORT)
  • trunk/Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.h

    r279335 r279375  
    362362SOFT_LINK_FUNCTION_FOR_HEADER(PAL, CoreMedia, CMAudioClockCreate, OSStatus, (CFAllocatorRef allocator, CMClockRef* clockOut), (allocator, clockOut))
    363363#define CMAudioClockCreate softLink_CoreMedia_CMAudioClockCreate
     364SOFT_LINK_FUNCTION_FOR_HEADER(PAL, CoreMedia, FigThreadRegisterAbortAction, OSStatus, (FigThreadAbortAction action, void* refcon, FigThreadAbortActionToken* token), (action, refcon, token))
     365#define FigThreadRegisterAbortAction softLink_CoreMedia_FigThreadRegisterAbortAction
     366SOFT_LINK_FUNCTION_FOR_HEADER(PAL, CoreMedia, FigThreadUnregisterAbortAction, void, (FigThreadAbortActionToken token), (token))
     367#define FigThreadUnregisterAbortAction softLink_CoreMedia_FigThreadUnregisterAbortAction
    364368
    365369SOFT_LINK_CONSTANT_MAY_FAIL_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionExtension_ProtectedContentOriginalFormat, CFStringRef)
  • trunk/Source/WebCore/PAL/pal/spi/cf/CoreMediaSPI.h

    r270758 r279375  
    3636#if USE(APPLE_INTERNAL_SDK)
    3737#include <CoreMedia/CMNotificationCenter.h>
     38#include <CoreMedia/FigThreadPlatform.h>
    3839#else
    3940typedef struct opaqueCMNotificationCenter *CMNotificationCenterRef;
    4041typedef void (*CMNotificationCallback)(CMNotificationCenterRef inCenter, const void *inListener, CFStringRef inNotificationName, const void *inNotifyingObject, CFTypeRef inNotificationPayload);
     42typedef void (*FigThreadAbortAction)(void* refcon);
     43typedef struct OpaqueFigThreadAbortActionToken* FigThreadAbortActionToken;
    4144#endif
    4245
     
    4548OSStatus CMNotificationCenterAddListener(CMNotificationCenterRef inCenter, const void *inListener, CMNotificationCallback inCallBack, CFStringRef inNotificationName, const void *inObjectToObserve, UInt32 inFlags);
    4649OSStatus CMNotificationCenterRemoveListener(CMNotificationCenterRef inCenter, const void *inListener, CMNotificationCallback inCallBack, CFStringRef inNotificationName, const void *inObject);
     50OSStatus FigThreadRegisterAbortAction(FigThreadAbortAction, void* refcon, FigThreadAbortActionToken*);
     51void FigThreadUnregisterAbortAction(FigThreadAbortActionToken);
    4752WTF_EXTERN_C_END
    4853
  • trunk/Source/WebKit/ChangeLog

    r279369 r279375  
     12021-06-24  Jer Noble  <jer.noble@apple.com>
     2
     3        Loading WebM hangs if server sends only small amount of data
     4        https://bugs.webkit.org/show_bug.cgi?id=226217
     5        <rdar://problem/78709010>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Test: http/tests/media/video-webm-stall.html
     10
     11        Adopt FigThread{Un,}RegisterAbortAction() when blocking against track parsing.
     12
     13        CoreMedia will attempt to abort reads during AVPlayer teardown, but because the parsing
     14        thread is blocked on a Condition variable in WebKit code, the abort request has no effect.
     15        Adopt methods from CoreMedia to run code during an abort request, and wrap these calls in a
     16        stack-based object. The new AbortAction object takes a Condition variable to notify during
     17        an abort, and its aborted() state can be queried by the Condition's predicate.
     18
     19        Drive-by Fix: enable running an unsigned MTFormatReaderPlugin in the GPU process for
     20        engineering builds.
     21
     22        * Configurations/BaseTarget.xcconfig:
     23        * GPUProcess/mac/GPUProcessMac.mm:
     24        (WebKit::GPUProcess::initializeProcess):
     25        * Shared/mac/MediaFormatReader/MediaFormatReader.cpp:
     26        (WebKit::AbortAction::AbortAction):
     27        (WebKit::AbortAction::~AbortAction):
     28        (WebKit::AbortAction::aborted const):
     29        (WebKit::AbortAction::action):
     30        (WebKit::MediaFormatReader::copyProperty):
     31        (WebKit::MediaFormatReader::copyTrackArray):
     32
    1332021-06-29  Carlos Garcia Campos  <cgarcia@igalia.com>
    234
  • trunk/Source/WebKit/Configurations/BaseTarget.xcconfig

    r267775 r279375  
    4040WK_ENABLE_EXPERIMENTAL_FEATURES_YES = ENABLE_EXPERIMENTAL_FEATURES;
    4141
     42WK_FORMATREADERBUNDLE_CODESIGNING_DEFINES = ENABLE_LOWER_FORMATREADERBUNDLE_CODESIGNING_REQUIREMENTS;
     43WK_FORMATREADERBUNDLE_CODESIGNING_DEFINES[config=Production] = ;
     44
    4245GCC_PREFIX_HEADER = WebKit2Prefix.h;
    43 GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) $(WK_ENABLE_EXPERIMENTAL_FEATURES) $(WK_CORE_PREDICTION_DEFINES) FRAMEWORK_NAME=WebKit;
     46GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) $(WK_ENABLE_EXPERIMENTAL_FEATURES) $(WK_CORE_PREDICTION_DEFINES) $(WK_FORMATREADERBUNDLE_CODESIGNING_DEFINES) FRAMEWORK_NAME=WebKit;
    4447WEBKITADDITIONS_HEADER_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)/usr/local/include/WebKitAdditions $(SDKROOT)/usr/local/include/WebKitAdditions;
    4548LIBWEBRTC_HEADER_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)/usr/local/include/webrtc $(SDKROOT)/usr/local/include/webrtc;
  • trunk/Source/WebKit/GPUProcess/mac/GPUProcessMac.mm

    r253098 r279375  
    5050#endif
    5151
     52#if ENABLE(LOWER_FORMATREADERBUNDLE_CODESIGNING_REQUIREMENTS)
     53    // For testing in engineering builds, allow CoreMedia to load the MediaFormatReader bundle no matter its code signature.
     54    auto userDefaults = adoptNS([[NSUserDefaults alloc] initWithSuiteName:@"com.apple.coremedia"]);
     55    [userDefaults registerDefaults:@{ @"pluginformatreader_unsigned": @YES }];
     56#endif
     57
    5258    launchServicesCheckIn();
    5359}
  • trunk/Source/WebKit/Shared/mac/MediaFormatReader/MediaFormatReader.cpp

    r279335 r279375  
    5959static const char* logClassName() { return "MediaFormatReader"; }
    6060
     61class AbortAction {
     62public:
     63    AbortAction(Condition& condition)
     64        : m_condition(condition)
     65    {
     66        if (noErr != PAL::FigThreadRegisterAbortAction(action, this, &m_token))
     67            m_token = nullptr;
     68    }
     69
     70    ~AbortAction()
     71    {
     72        if (m_token)
     73            PAL::FigThreadUnregisterAbortAction(m_token);
     74    }
     75
     76    bool aborted() const { return m_aborted; }
     77
     78private:
     79    static void action(void* refcon)
     80    {
     81        auto thisPtr = static_cast<AbortAction*>(refcon);
     82        thisPtr->m_aborted = true;
     83        thisPtr->m_condition.notifyAll();
     84    }
     85
     86    Condition& m_condition;
     87    FigThreadAbortActionToken m_token { nullptr };
     88    bool m_aborted { false };
     89};
     90
    6191CMBaseClassID MediaFormatReader::wrapperClassID()
    6292{
     
    236266    }
    237267
     268    AbortAction action { m_parseTracksCondition };
     269
    238270    Locker locker { m_parseTracksLock };
    239271    m_parseTracksCondition.wait(m_parseTracksLock, [&] {
    240272        assertIsHeld(m_parseTracksLock);
    241         return m_parseTracksStatus.has_value();
     273        return m_parseTracksStatus.has_value() || action.aborted();
    242274    });
    243275
     
    256288OSStatus MediaFormatReader::copyTrackArray(CFArrayRef* trackArrayCopy)
    257289{
     290    AbortAction action { m_parseTracksCondition };
     291
    258292    Locker locker { m_parseTracksLock };
    259293    m_parseTracksCondition.wait(m_parseTracksLock, [&] {
    260294        assertIsHeld(m_parseTracksLock);
    261         return m_parseTracksStatus.has_value();
     295        return m_parseTracksStatus.has_value() || action.aborted();
    262296    });
    263297
Note: See TracChangeset for help on using the changeset viewer.