Skip to content

Commit

Permalink
Revert "Cherry-pick d9ce6b4. rdar://123467550"
Browse files Browse the repository at this point in the history
This reverts commit 74198e5.

Identifier: 273664.1400@safari-7619.1.5-branch
  • Loading branch information
MyahCobbs committed Mar 12, 2024
1 parent 5c5bb79 commit 42e2bb6
Show file tree
Hide file tree
Showing 34 changed files with 327 additions and 410 deletions.
1 change: 1 addition & 0 deletions Source/WebCore/SourcesCocoa.txt
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ platform/graphics/cocoa/IOSurfacePoolCocoa.mm
platform/graphics/cocoa/IconCocoa.mm
platform/graphics/cocoa/IntRectCocoa.mm
platform/graphics/cocoa/MediaEngineConfigurationFactoryCocoa.cpp
platform/graphics/cocoa/MediaPlaybackTargetContext.mm
platform/graphics/cocoa/MediaPlayerCocoa.mm
platform/graphics/cocoa/MediaPlayerPrivateWebM.mm
platform/graphics/cocoa/SourceBufferParser.cpp
Expand Down
6 changes: 6 additions & 0 deletions Source/WebCore/WebCore.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6247,6 +6247,7 @@
F45EAC872A8C1A65009B986E /* LayoutMilestones.serialization.in in Headers */ = {isa = PBXBuildFile; fileRef = F45EAC862A8C1972009B986E /* LayoutMilestones.serialization.in */; settings = {ATTRIBUTES = (Private, ); }; };
F45EAC962A940124009B986E /* MDNSRegisterError.serialization.in in Headers */ = {isa = PBXBuildFile; fileRef = F45EAC952A940124009B986E /* MDNSRegisterError.serialization.in */; settings = {ATTRIBUTES = (Private, ); }; };
F45EAC982A950D12009B986E /* MediaProducer.serialization.in in Headers */ = {isa = PBXBuildFile; fileRef = F45EAC972A950D12009B986E /* MediaProducer.serialization.in */; settings = {ATTRIBUTES = (Private, ); }; };
F45EAC9A2A951A5B009B986E /* MediaPlaybackTargetContext.serialization.in in Headers */ = {isa = PBXBuildFile; fileRef = F45EAC992A951A5B009B986E /* MediaPlaybackTargetContext.serialization.in */; settings = {ATTRIBUTES = (Private, ); }; };
F46284552A7B1BBD00A01B18 /* HTTPHeaderNames.serialization.in in Headers */ = {isa = PBXBuildFile; fileRef = F46284532A7B196400A01B18 /* HTTPHeaderNames.serialization.in */; settings = {ATTRIBUTES = (Private, ); }; };
F46729281E0DE68500ACC3D8 /* ScrollSnapOffsetsInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = F46729251E0DE5AB00ACC3D8 /* ScrollSnapOffsetsInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
F46C447E234654540039A79D /* ClipboardItemBindingsDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = F46C447C234654540039A79D /* ClipboardItemBindingsDataSource.h */; };
Expand Down Expand Up @@ -8846,6 +8847,7 @@
1CFAE3220A6D6A3F0032593D /* libobjc.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libobjc.dylib; path = /usr/lib/libobjc.dylib; sourceTree = "<absolute>"; };
1D0026A22374D62300CA6CDF /* JSPictureInPictureWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPictureInPictureWindow.h; sourceTree = "<group>"; };
1D0026A32374D62400CA6CDF /* JSPictureInPictureWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPictureInPictureWindow.cpp; sourceTree = "<group>"; };
1D008AA5262108C000EE3ADE /* MediaPlaybackTargetContext.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaPlaybackTargetContext.mm; sourceTree = "<group>"; };
1D2C82B6236A3F6A0055D6C5 /* PictureInPictureSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PictureInPictureSupport.h; sourceTree = "<group>"; };
1D47658D25CCA778007AF312 /* ImageDecoderIdentifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ImageDecoderIdentifier.h; sourceTree = "<group>"; };
1DAB3113251D725C00FC9485 /* VideoLayerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoLayerManager.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -20135,6 +20137,7 @@
F45EAC862A8C1972009B986E /* LayoutMilestones.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = LayoutMilestones.serialization.in; sourceTree = "<group>"; };
F45EAC952A940124009B986E /* MDNSRegisterError.serialization.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MDNSRegisterError.serialization.in; sourceTree = "<group>"; };
F45EAC972A950D12009B986E /* MediaProducer.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = MediaProducer.serialization.in; sourceTree = "<group>"; };
F45EAC992A951A5B009B986E /* MediaPlaybackTargetContext.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = MediaPlaybackTargetContext.serialization.in; sourceTree = "<group>"; };
F46284532A7B196400A01B18 /* HTTPHeaderNames.serialization.in */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; path = HTTPHeaderNames.serialization.in; sourceTree = "<group>"; };
F4628A9E234D3BBF00BC884C /* PlatformPasteboardCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlatformPasteboardCocoa.mm; sourceTree = "<group>"; };
F462E79F242ADA3C00204DDD /* DragDataCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DragDataCocoa.mm; sourceTree = "<group>"; };
Expand Down Expand Up @@ -33033,6 +33036,8 @@
CDC48AC82149CF2A0024FD59 /* MediaEngineConfigurationFactoryCocoa.cpp */,
CDC48AC72149CF2A0024FD59 /* MediaEngineConfigurationFactoryCocoa.h */,
07F876831AD4A94500905849 /* MediaPlaybackTargetContext.h */,
1D008AA5262108C000EE3ADE /* MediaPlaybackTargetContext.mm */,
F45EAC992A951A5B009B986E /* MediaPlaybackTargetContext.serialization.in */,
A1DD618F2B7EBD8200075A92 /* MediaPlayerCocoa.mm */,
CD3578AC2A28F5AA0059D97D /* MediaPlayerEnumsCocoa.h */,
CD3578AD2A28F5AA0059D97D /* MediaPlayerEnumsCocoa.mm */,
Expand Down Expand Up @@ -40887,6 +40892,7 @@
079216551AA560AA00A3C049 /* MediaPlaybackTargetClient.h in Headers */,
071E49701AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h in Headers */,
07F876841AD580F900905849 /* MediaPlaybackTargetContext.h in Headers */,
F45EAC9A2A951A5B009B986E /* MediaPlaybackTargetContext.serialization.in in Headers */,
077B64171B95F703003E9AD5 /* MediaPlaybackTargetMock.h in Headers */,
078E43DA1ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.h in Headers */,
078E43DD1ABB6F6F001C2FA6 /* MediaPlaybackTargetPickerMac.h in Headers */,
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/graphics/MediaPlaybackTarget.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class MediaPlaybackTarget : public RefCounted<MediaPlaybackTarget> {
public:
virtual ~MediaPlaybackTarget() = default;

enum class TargetType : uint8_t { AVFoundation, Mock, Serialized };
enum class TargetType : uint8_t { AVFoundation, Mock };
virtual TargetType targetType() const = 0;
virtual const MediaPlaybackTargetContext& targetContext() const = 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,57 +30,32 @@
#include "MediaPlaybackTarget.h"
#include <wtf/RetainPtr.h>

OBJC_CLASS AVOutputContext;

namespace WebCore {

class WEBCORE_EXPORT MediaPlaybackTargetContextCocoa final : public MediaPlaybackTargetContext {
public:
explicit MediaPlaybackTargetContextCocoa(RetainPtr<AVOutputContext>&&);
~MediaPlaybackTargetContextCocoa();

RetainPtr<AVOutputContext> outputContext() const;
private:
String deviceName() const final;
bool hasActiveRoute() const final;
bool supportsRemoteVideoPlayback() const final;

RetainPtr<AVOutputContext> m_outputContext;
};

class MediaPlaybackTargetCocoa final : public MediaPlaybackTarget {
class MediaPlaybackTargetCocoa : public MediaPlaybackTarget {
public:
WEBCORE_EXPORT static Ref<MediaPlaybackTarget> create(MediaPlaybackTargetContextCocoa&&);
WEBCORE_EXPORT static Ref<MediaPlaybackTarget> create(AVOutputContext *);
WEBCORE_EXPORT static Ref<MediaPlaybackTarget> create(MediaPlaybackTargetContext&&);

#if PLATFORM(IOS_FAMILY) && !PLATFORM(IOS_FAMILY_SIMULATOR) && !PLATFORM(MACCATALYST)
WEBCORE_EXPORT static Ref<MediaPlaybackTargetCocoa> create();
static Ref<MediaPlaybackTarget> create();
#endif

virtual ~MediaPlaybackTargetCocoa();

TargetType targetType() const final { return TargetType::AVFoundation; }
const MediaPlaybackTargetContext& targetContext() const final { return m_context; }

AVOutputContext* outputContext() { return m_context.outputContext().get(); }

private:
explicit MediaPlaybackTargetCocoa(MediaPlaybackTargetContextCocoa&&);
protected:
explicit MediaPlaybackTargetCocoa(AVOutputContext *);
explicit MediaPlaybackTargetCocoa(MediaPlaybackTargetContext&&);

MediaPlaybackTargetContextCocoa m_context;
MediaPlaybackTargetContext m_context;
};

} // namespace WebCore

SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::MediaPlaybackTargetContextCocoa)
static bool isType(const WebCore::MediaPlaybackTargetContext& context)
{
return context.type() == WebCore::MediaPlaybackTargetContextType::AVOutputContext;
}
SPECIALIZE_TYPE_TRAITS_END()
MediaPlaybackTargetCocoa* toMediaPlaybackTargetCocoa(MediaPlaybackTarget*);
const MediaPlaybackTargetCocoa* toMediaPlaybackTargetCocoa(const MediaPlaybackTarget*);

SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::MediaPlaybackTargetCocoa)
static bool isType(const WebCore::MediaPlaybackTarget& target)
{
return target.targetType() == WebCore::MediaPlaybackTarget::TargetType::AVFoundation;
}
SPECIALIZE_TYPE_TRAITS_END()

#endif // ENABLE(WIRELESS_PLAYBACK_TARGET)
Original file line number Diff line number Diff line change
Expand Up @@ -28,87 +28,54 @@

#if ENABLE(WIRELESS_PLAYBACK_TARGET)

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <pal/spi/cocoa/AVFoundationSPI.h>
#import <pal/cocoa/AVFoundationSoftLink.h>

namespace WebCore {

MediaPlaybackTargetContextCocoa::MediaPlaybackTargetContextCocoa(RetainPtr<AVOutputContext>&& outputContext)
: MediaPlaybackTargetContext(Type::AVOutputContext)
, m_outputContext(WTFMove(outputContext))
Ref<MediaPlaybackTarget> MediaPlaybackTargetCocoa::create(AVOutputContext *outputContext)
{
ASSERT(m_outputContext);
return adoptRef(*new MediaPlaybackTargetCocoa(outputContext));
}

MediaPlaybackTargetContextCocoa::~MediaPlaybackTargetContextCocoa() = default;

RetainPtr<AVOutputContext> MediaPlaybackTargetContextCocoa::outputContext() const
Ref<MediaPlaybackTarget> MediaPlaybackTargetCocoa::create(MediaPlaybackTargetContext&& context)
{
return m_outputContext;
return adoptRef(*new MediaPlaybackTargetCocoa(WTFMove(context)));
}

String MediaPlaybackTargetContextCocoa::deviceName() const
MediaPlaybackTargetCocoa::MediaPlaybackTargetCocoa(AVOutputContext *outputContext)
: m_context(outputContext)
{
if (![m_outputContext supportsMultipleOutputDevices])
return [m_outputContext deviceName];

auto outputDeviceNames = adoptNS([[NSMutableArray alloc] init]);
for (AVOutputDevice *outputDevice in [m_outputContext outputDevices])
[outputDeviceNames addObject:[outputDevice deviceName]];

return [outputDeviceNames componentsJoinedByString:@" + "];
}

bool MediaPlaybackTargetContextCocoa::hasActiveRoute() const
MediaPlaybackTargetCocoa::MediaPlaybackTargetCocoa(MediaPlaybackTargetContext&& context)
: m_context(WTFMove(context))
{
if ([m_outputContext respondsToSelector:@selector(supportsMultipleOutputDevices)] && [m_outputContext supportsMultipleOutputDevices] && [m_outputContext respondsToSelector:@selector(outputDevices)]) {
for (AVOutputDevice *outputDevice in [m_outputContext outputDevices]) {
if (outputDevice.deviceFeatures & (AVOutputDeviceFeatureVideo | AVOutputDeviceFeatureAudio))
return true;
}
} else if ([m_outputContext respondsToSelector:@selector(outputDevice)]) {
if (auto *outputDevice = [m_outputContext outputDevice])
return outputDevice.deviceFeatures & (AVOutputDeviceFeatureVideo | AVOutputDeviceFeatureAudio);
}
return m_outputContext.get().deviceName;
}
bool MediaPlaybackTargetContextCocoa::supportsRemoteVideoPlayback() const
{
if (![m_outputContext respondsToSelector:@selector(supportsMultipleOutputDevices)] || ![m_outputContext supportsMultipleOutputDevices] || ![m_outputContext respondsToSelector:@selector(outputDevices)]) {
if (auto *outputDevice = [m_outputContext outputDevice]) {
if (outputDevice.deviceFeatures & AVOutputDeviceFeatureVideo)
return true;
}
return false;
}

for (AVOutputDevice *outputDevice in [m_outputContext outputDevices]) {
if (outputDevice.deviceFeatures & AVOutputDeviceFeatureVideo)
return true;
}

return false;
#if PLATFORM(IOS_FAMILY) && !PLATFORM(IOS_FAMILY_SIMULATOR) && !PLATFORM(MACCATALYST)
Ref<MediaPlaybackTarget> MediaPlaybackTargetCocoa::create()
{
auto *routingContextUID = [[PAL::getAVAudioSessionClass() sharedInstance] routingContextUID];
return adoptRef(*new MediaPlaybackTargetCocoa([PAL::getAVOutputContextClass() outputContextForID:routingContextUID]));
}
#endif

Ref<MediaPlaybackTarget> MediaPlaybackTargetCocoa::create(MediaPlaybackTargetContextCocoa&& context)
MediaPlaybackTargetCocoa::~MediaPlaybackTargetCocoa()
{
return adoptRef(*new MediaPlaybackTargetCocoa(WTFMove(context)));
}

MediaPlaybackTargetCocoa::MediaPlaybackTargetCocoa(MediaPlaybackTargetContextCocoa&& context)
: m_context(context.outputContext())
MediaPlaybackTargetCocoa* toMediaPlaybackTargetCocoa(MediaPlaybackTarget* rep)
{
return const_cast<MediaPlaybackTargetCocoa*>(toMediaPlaybackTargetCocoa(const_cast<const MediaPlaybackTarget*>(rep)));
}

#if PLATFORM(IOS_FAMILY) && !PLATFORM(IOS_FAMILY_SIMULATOR) && !PLATFORM(MACCATALYST)
Ref<MediaPlaybackTargetCocoa> MediaPlaybackTargetCocoa::create()
const MediaPlaybackTargetCocoa* toMediaPlaybackTargetCocoa(const MediaPlaybackTarget* rep)
{
auto *routingContextUID = [[PAL::getAVAudioSessionClass() sharedInstance] routingContextUID];
return adoptRef(*new MediaPlaybackTargetCocoa(MediaPlaybackTargetContextCocoa([PAL::getAVOutputContextClass() outputContextForID:routingContextUID])));
RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(rep->targetType() == MediaPlaybackTarget::TargetType::AVFoundation);
return static_cast<const MediaPlaybackTargetCocoa*>(rep);
}
#endif

} // namespace WebCore

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@

Ref<MediaPlaybackTarget> MediaPlaybackTargetPickerMac::playbackTarget()
{
return WebCore::MediaPlaybackTargetCocoa::create(MediaPlaybackTargetContextCocoa(routePicker().outputContext()));
return WebCore::MediaPlaybackTargetCocoa::create(routePicker().outputContext());
}

AVPlaybackTargetPicker& MediaPlaybackTargetPickerMac::routePicker()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3417,7 +3417,7 @@ void determineChangedTracksFromNewTracksAndOldItems(MediaSelectionGroupAVFObjC*
{
m_playbackTarget = WTFMove(target);

m_outputContext = is<MediaPlaybackTargetCocoa>(m_playbackTarget) ? downcast<MediaPlaybackTargetCocoa>(m_playbackTarget)->outputContext() : nullptr;
m_outputContext = m_playbackTarget->targetType() == MediaPlaybackTarget::TargetType::AVFoundation ? toMediaPlaybackTargetCocoa(m_playbackTarget.get())->targetContext().outputContext() : nullptr;

INFO_LOG(LOGIDENTIFIER);

Expand Down
55 changes: 44 additions & 11 deletions Source/WebCore/platform/graphics/cocoa/MediaPlaybackTargetContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@

#if ENABLE(WIRELESS_PLAYBACK_TARGET)

#include <wtf/RetainPtr.h>
#include <wtf/text/WTFString.h>

OBJC_CLASS AVOutputContext;
OBJC_CLASS NSData;

namespace WebCore {

enum class MediaPlaybackTargetContextMockState : uint8_t {
Expand All @@ -38,33 +42,62 @@ enum class MediaPlaybackTargetContextMockState : uint8_t {
};

enum class MediaPlaybackTargetContextType : uint8_t {
None,
AVOutputContext,
Mock,
Serialized,
};

class MediaPlaybackTargetContext {
WTF_MAKE_FAST_ALLOCATED;
public:

using Type = MediaPlaybackTargetContextType;
using MockState = MediaPlaybackTargetContextMockState;

WEBCORE_EXPORT virtual ~MediaPlaybackTargetContext() = default;
MediaPlaybackTargetContext() = default;
WEBCORE_EXPORT explicit MediaPlaybackTargetContext(RetainPtr<AVOutputContext>&&);

MediaPlaybackTargetContext(const String& mockDeviceName, MockState state)
: m_type(Type::Mock)
, m_mockDeviceName(mockDeviceName)
, m_mockState(state)
{
}

struct NonPlatformData {
String mockDeviceName;
MockState mockState;
};

using IPCData = std::optional<std::variant<RetainPtr<AVOutputContext>, NonPlatformData>>;

Type type() const { return m_type; }
WEBCORE_EXPORT virtual String deviceName() const = 0;
WEBCORE_EXPORT virtual bool hasActiveRoute() const = 0;
WEBCORE_EXPORT virtual bool supportsRemoteVideoPlayback() const = 0;
WEBCORE_EXPORT String deviceName() const;
WEBCORE_EXPORT bool hasActiveRoute() const;
bool supportsRemoteVideoPlayback() const;

protected:
MediaPlaybackTargetContext(Type type)
: m_type(type)
MockState mockState() const
{
ASSERT(m_type == Type::Mock);
return m_mockState;
}

RetainPtr<AVOutputContext> outputContext() const
{
ASSERT(m_type == Type::AVOutputContext);
return m_outputContext;
}

bool encodingRequiresPlatformData() const { return m_type == Type::AVOutputContext; }

WEBCORE_EXPORT IPCData ipcData() const;
WEBCORE_EXPORT static std::optional<MediaPlaybackTargetContext> fromIPCData(IPCData&&);

private:
// This should be const, however IPC's Decoder's handling doesn't allow for const member.
Type m_type;

Type m_type { Type::None };
RetainPtr<AVOutputContext> m_outputContext;
String m_mockDeviceName;
MockState m_mockState { MockState::Unknown };
};

} // namespace WebCore
Expand Down
Loading

0 comments on commit 42e2bb6

Please sign in to comment.