Changeset 243109 in webkit


Ignore:
Timestamp:
Mar 18, 2019 3:29:55 PM (5 years ago)
Author:
jer.noble@apple.com
Message:

Add experimental "alphaChannel" property to VideoConfiguration
https://bugs.webkit.org/show_bug.cgi?id=195853

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/mediacapabilities/mock-decodingInfo-alphaChannel.html

Add a new, experimental addition to Media Capabilities to allow pages to query for
alpha channel support.

  • Modules/mediacapabilities/MediaCapabilities.cpp:

(WebCore::MediaCapabilities::decodingInfo):

  • Modules/mediacapabilities/MediaCapabilities.h:
  • Modules/mediacapabilities/MediaCapabilities.idl:
  • Modules/mediacapabilities/VideoConfiguration.idl:
  • SourcesCocoa.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/cocoa/VideoToolboxSoftLink.cpp:
  • platform/cocoa/VideoToolboxSoftLink.h:
  • platform/graphics/cocoa/HEVCUtilitiesCocoa.h:
  • platform/graphics/cocoa/HEVCUtilitiesCocoa.mm: Renamed from Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.cpp.

(WebCore::validateHEVCParameters):

  • platform/graphics/cocoa/MediaEngineConfigurationFactoryCocoa.cpp:

(WebCore::createMediaPlayerDecodingConfigurationCocoa):

  • platform/mediacapabilities/VideoConfiguration.h:
  • platform/mock/MediaEngineConfigurationFactoryMock.cpp:

(WebCore::canDecodeMedia):
(WebCore::canEncodeMedia):

LayoutTests:

  • media/mediacapabilities/mock-decodingInfo-alphaChannel-expected.txt: Added.
  • media/mediacapabilities/mock-decodingInfo-alphaChannel.html: Added.
Location:
trunk
Files:
2 added
14 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r243105 r243109  
     12019-03-18  Jer Noble  <jer.noble@apple.com>
     2
     3        Add experimental "alphaChannel" property to VideoConfiguration
     4        https://bugs.webkit.org/show_bug.cgi?id=195853
     5
     6        Reviewed by Eric Carlson.
     7
     8        * media/mediacapabilities/mock-decodingInfo-alphaChannel-expected.txt: Added.
     9        * media/mediacapabilities/mock-decodingInfo-alphaChannel.html: Added.
     10
    1112019-03-18  Myles C. Maxfield  <mmaxfield@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r243106 r243109  
     12019-03-18  Jer Noble  <jer.noble@apple.com>
     2
     3        Add experimental "alphaChannel" property to VideoConfiguration
     4        https://bugs.webkit.org/show_bug.cgi?id=195853
     5
     6        Reviewed by Eric Carlson.
     7
     8        Test: media/mediacapabilities/mock-decodingInfo-alphaChannel.html
     9
     10        Add a new, experimental addition to Media Capabilities to allow pages to query for
     11        alpha channel support.
     12
     13        * Modules/mediacapabilities/MediaCapabilities.cpp:
     14        (WebCore::MediaCapabilities::decodingInfo):
     15        * Modules/mediacapabilities/MediaCapabilities.h:
     16        * Modules/mediacapabilities/MediaCapabilities.idl:
     17        * Modules/mediacapabilities/VideoConfiguration.idl:
     18        * SourcesCocoa.txt:
     19        * WebCore.xcodeproj/project.pbxproj:
     20        * platform/cocoa/VideoToolboxSoftLink.cpp:
     21        * platform/cocoa/VideoToolboxSoftLink.h:
     22        * platform/graphics/cocoa/HEVCUtilitiesCocoa.h:
     23        * platform/graphics/cocoa/HEVCUtilitiesCocoa.mm: Renamed from Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.cpp.
     24        (WebCore::validateHEVCParameters):
     25        * platform/graphics/cocoa/MediaEngineConfigurationFactoryCocoa.cpp:
     26        (WebCore::createMediaPlayerDecodingConfigurationCocoa):
     27        * platform/mediacapabilities/VideoConfiguration.h:
     28        * platform/mock/MediaEngineConfigurationFactoryMock.cpp:
     29        (WebCore::canDecodeMedia):
     30        (WebCore::canEncodeMedia):
     31
    1322019-03-18  Ryosuke Niwa  <rniwa@webkit.org>
    233
  • trunk/Source/WebCore/Modules/mediacapabilities/MediaCapabilities.cpp

    r243014 r243109  
    2828
    2929#include "ContentType.h"
     30#include "Document.h"
    3031#include "JSMediaCapabilitiesDecodingInfo.h"
    3132#include "JSMediaCapabilitiesEncodingInfo.h"
     
    3536#include "MediaEncodingConfiguration.h"
    3637#include "MediaEngineConfigurationFactory.h"
     38#include "Settings.h"
    3739#include <wtf/HashSet.h>
    3840
     
    160162}
    161163
    162 void MediaCapabilities::decodingInfo(MediaDecodingConfiguration&& configuration, Ref<DeferredPromise>&& promise)
     164void MediaCapabilities::decodingInfo(Document& document, MediaDecodingConfiguration&& configuration, Ref<DeferredPromise>&& promise)
    163165{
    164166    // 2.4 Media Capabilities Interface
     
    172174        return;
    173175    }
     176
     177    if (!document.settings().mediaCapabilitiesExtensionsEnabled() && configuration.video)
     178        configuration.video.value().alphaChannel.reset();
    174179
    175180    // 4. Let p be a new promise.
  • trunk/Source/WebCore/Modules/mediacapabilities/MediaCapabilities.h

    r226228 r243109  
    3232namespace WebCore {
    3333
     34class Document;
    3435struct MediaDecodingConfiguration;
    3536struct MediaEncodingConfiguration;
     
    3738class MediaCapabilities : public RefCounted<MediaCapabilities> {
    3839public:
    39     void decodingInfo(MediaDecodingConfiguration&&, Ref<DeferredPromise>&&);
     40    void decodingInfo(Document&, MediaDecodingConfiguration&&, Ref<DeferredPromise>&&);
    4041    void encodingInfo(MediaEncodingConfiguration&&, Ref<DeferredPromise>&&);
    4142
  • trunk/Source/WebCore/Modules/mediacapabilities/MediaCapabilities.idl

    r243014 r243109  
    2929]
    3030interface MediaCapabilities {
    31   Promise<MediaCapabilitiesDecodingInfo> decodingInfo(MediaDecodingConfiguration configuration);
     31  [CallWith=Document] Promise<MediaCapabilitiesDecodingInfo> decodingInfo(MediaDecodingConfiguration configuration);
    3232  Promise<MediaCapabilitiesEncodingInfo> encodingInfo(MediaEncodingConfiguration configuration);
    3333};
  • trunk/Source/WebCore/Modules/mediacapabilities/VideoConfiguration.idl

    r243014 r243109  
    3434  required unsigned long long bitrate;
    3535  required double framerate;
     36  [EnabledBySetting=MediaCapabilitiesExtensions] boolean alphaChannel;
    3637};
  • trunk/Source/WebCore/SourcesCocoa.txt

    r242913 r243109  
    301301platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp
    302302platform/graphics/cocoa/FontPlatformDataCocoa.mm
    303 platform/graphics/cocoa/HEVCUtilitiesCocoa.cpp
     303platform/graphics/cocoa/HEVCUtilitiesCocoa.mm
    304304platform/graphics/cocoa/IOSurface.mm
    305305platform/graphics/cocoa/IOSurfacePoolCocoa.mm
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r243091 r243109  
    1377913779                CDA595922146DEC300A84185 /* HEVCUtilities.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HEVCUtilities.cpp; sourceTree = "<group>"; };
    1378013780                CDA595962146DF7800A84185 /* HEVCUtilitiesCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HEVCUtilitiesCocoa.h; sourceTree = "<group>"; };
    13781                 CDA595972146DF7800A84185 /* HEVCUtilitiesCocoa.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HEVCUtilitiesCocoa.cpp; sourceTree = "<group>"; };
     13781                CDA595972146DF7800A84185 /* HEVCUtilitiesCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HEVCUtilitiesCocoa.mm; sourceTree = "<group>"; };
    1378213782                CDA79821170A22DC00D45C55 /* AudioSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioSession.h; sourceTree = "<group>"; };
    1378313783                CDA79823170A258300D45C55 /* AudioSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioSession.cpp; sourceTree = "<group>"; };
     
    2504025040                                49FFBF1C11C8550E006A7118 /* GraphicsContext3DCocoa.mm */,
    2504125041                                B277B4030B22F37C0004BEC6 /* GraphicsContextCocoa.mm */,
    25042                                 CDA595972146DF7800A84185 /* HEVCUtilitiesCocoa.cpp */,
    2504325042                                CDA595962146DF7800A84185 /* HEVCUtilitiesCocoa.h */,
     25043                                CDA595972146DF7800A84185 /* HEVCUtilitiesCocoa.mm */,
    2504425044                                2D0B4AA918DA1CCD00434DE1 /* IOSurface.h */,
    2504525045                                2D0B4AAA18DA1CCD00434DE1 /* IOSurface.mm */,
     
    3086430864                                5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */,
    3086530865                                931BCC611124DFCB00BE70DD /* MediaCanStartListener.h in Headers */,
     30866                                CDCC9BCF22387E9A00FFB51C /* MediaCapabilitiesDecodingInfo.h in Headers */,
     30867                                CDCC9BD122387EAA00FFB51C /* MediaCapabilitiesEncodingInfo.h in Headers */,
    3086630868                                078E093A17D16E1C00420AA1 /* MediaConstraints.h in Headers */,
    3086730869                                417253AB1354BBBC00360F2A /* MediaControlElements.h in Headers */,
     
    3216732169                                26E944DD1AC4B4EA007B85B5 /* Term.h in Headers */,
    3216832170                                6550B6A6099DF0270090D781 /* Text.h in Headers */,
    32169                                 CDCC9BD122387EAA00FFB51C /* MediaCapabilitiesEncodingInfo.h in Headers */,
    3217032171                                93309E17099E64920056E581 /* TextAffinity.h in Headers */,
    3217132172                                CE7B2DB51586ABAD0098B3FA /* TextAlternativeWithRange.h in Headers */,
     
    3226132262                                FB484F4D171F821E00040755 /* TransformFunctions.h in Headers */,
    3226232263                                49E911CE0EF86D47009D0CAF /* TransformOperation.h in Headers */,
    32263                                 CDCC9BCF22387E9A00FFB51C /* MediaCapabilitiesDecodingInfo.h in Headers */,
    3226432264                                49E911D00EF86D47009D0CAF /* TransformOperations.h in Headers */,
    3226532265                                5DB1BC6A10715A6400EFAA49 /* TransformSource.h in Headers */,
  • trunk/Source/WebCore/platform/cocoa/VideoToolboxSoftLink.cpp

    r240235 r243109  
    3131#include <wtf/SoftLinking.h>
    3232
     33typedef struct OpaqueVTVideoDecoder VTVideoDecoderRef;
    3334typedef struct OpaqueVTImageRotationSession* VTImageRotationSessionRef;
    3435typedef struct OpaqueVTPixelBufferConformer* VTPixelBufferConformerRef;
     
    5152SOFT_LINK_FUNCTION_MAY_FAIL_FOR_SOURCE(WebCore, VideoToolbox, VTCopyHEVCDecoderCapabilitiesDictionary, CFDictionaryRef, (), ())
    5253SOFT_LINK_FUNCTION_MAY_FAIL_FOR_SOURCE(WebCore, VideoToolbox, VTGetHEVCCapabilitesForFormatDescription, OSStatus, (CMVideoFormatDescriptionRef formatDescription, CFDictionaryRef decoderCapabilitiesDict, Boolean* isDecodable, Boolean* mayBePlayable), (formatDescription, decoderCapabilitiesDict, isDecodable, mayBePlayable))
     54SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, VideoToolbox, VTSelectAndCreateVideoDecoderInstance, OSStatus, (CMVideoCodecType codecType, CFAllocatorRef allocator, CFDictionaryRef videoDecoderSpecification, VTVideoDecoderRef *decoderInstanceOut), (codecType, allocator, videoDecoderSpecification, decoderInstanceOut))
    5355SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, VideoToolbox, kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder, CFStringRef)
    5456SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, VideoToolbox, kVTDecompressionPropertyKey_PixelBufferPool, CFStringRef)
  • trunk/Source/WebCore/platform/cocoa/VideoToolboxSoftLink.h

    r240235 r243109  
    3131#include <wtf/SoftLinking.h>
    3232
     33typedef struct OpaqueVTVideoDecoder VTVideoDecoderRef;
    3334typedef struct OpaqueVTImageRotationSession* VTImageRotationSessionRef;
    3435typedef struct OpaqueVTPixelBufferConformer* VTPixelBufferConformerRef;
     
    6566SOFT_LINK_FUNCTION_MAY_FAIL_FOR_HEADER(WebCore, VideoToolbox, VTGetHEVCCapabilitesForFormatDescription, OSStatus, (CMVideoFormatDescriptionRef formatDescription, CFDictionaryRef decoderCapabilitiesDict, Boolean* isDecodable, Boolean* mayBePlayable), (formatDescription, decoderCapabilitiesDict, isDecodable, mayBePlayable))
    6667#define VTGetHEVCCapabilitesForFormatDescription softLink_VideoToolbox_VTGetHEVCCapabilitesForFormatDescription
     68SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, VideoToolbox, VTSelectAndCreateVideoDecoderInstance, OSStatus, (CMVideoCodecType codecType, CFAllocatorRef allocator, CFDictionaryRef videoDecoderSpecification, VTVideoDecoderRef *decoderInstanceOut), (codecType, allocator, videoDecoderSpecification, decoderInstanceOut))
     69#define VTSelectAndCreateVideoDecoderInstance softLink_VideoToolbox_VTSelectAndCreateVideoDecoderInstance
    6770SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, VideoToolbox, kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder, CFStringRef)
    6871#define kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder get_VideoToolbox_kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder()
  • trunk/Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.h

    r236094 r243109  
    3434struct MediaCapabilitiesInfo;
    3535
    36 extern bool validateHEVCParameters(HEVCParameterSet&, MediaCapabilitiesInfo&);
     36extern bool validateHEVCParameters(HEVCParameterSet&, MediaCapabilitiesInfo&, bool hasAlphaChannel);
    3737
    3838}
  • trunk/Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.mm

    r243106 r243109  
    2929#if PLATFORM(COCOA)
    3030
     31#include "FourCC.h"
    3132#include "HEVCUtilities.h"
    3233#include "MediaCapabilitiesInfo.h"
     
    3435#include "VideoToolboxSoftLink.h"
    3536
     37SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)
     38SOFT_LINK_CONSTANT_MAY_FAIL(AVFoundation, AVVideoCodecTypeHEVCWithAlpha, NSString *)
     39
    3640namespace WebCore {
    3741
    38 bool validateHEVCParameters(HEVCParameterSet& parameters, MediaCapabilitiesInfo& info)
     42bool validateHEVCParameters(HEVCParameterSet& parameters, MediaCapabilitiesInfo& info, bool hasAlphaChannel)
    3943{
     44    CMVideoCodecType codec = kCMVideoCodecType_HEVC;
     45    if (hasAlphaChannel) {
     46        if (!AVFoundationLibrary() || !canLoadAVVideoCodecTypeHEVCWithAlpha())
     47            return false;
     48
     49        auto codecCode = FourCC::fromString(getAVVideoCodecTypeHEVCWithAlpha());
     50        if (!codecCode)
     51            return false;
     52
     53        codec = codecCode.value().value;
     54    }
     55    OSStatus status = VTSelectAndCreateVideoDecoderInstance(codec, kCFAllocatorDefault, nullptr, nullptr);
     56    if (status != noErr)
     57        return false;
     58
    4059    if (!canLoad_VideoToolbox_VTCopyHEVCDecoderCapabilitiesDictionary()
    4160        || !canLoad_VideoToolbox_kVTHEVCDecoderCapability_SupportedProfiles()
  • trunk/Source/WebCore/platform/graphics/cocoa/MediaEngineConfigurationFactoryCocoa.cpp

    r243014 r243109  
    7777        }
    7878
     79        bool alphaChannel = videoConfiguration.alphaChannel && videoConfiguration.alphaChannel.value();
     80
    7981        if (videoCodecType == kCMVideoCodecType_HEVC) {
    8082            auto parameters = parseHEVCCodecParameters(codec);
    81             if (!parameters || !validateHEVCParameters(parameters.value(), info)) {
     83            if (!parameters || !validateHEVCParameters(parameters.value(), info, alphaChannel)) {
    8284                callback({{ }, WTFMove(configuration)});
    8385                return;
    8486            }
    85         } else if (canLoad_VideoToolbox_VTIsHardwareDecodeSupported()) {
    86             info.powerEfficient = VTIsHardwareDecodeSupported(videoCodecType);
    87             info.smooth = true;
     87        } else {
     88            if (alphaChannel) {
     89                callback({{ }, WTFMove(configuration)});
     90                return;
     91            }
     92
     93            if (canLoad_VideoToolbox_VTIsHardwareDecodeSupported()) {
     94                info.powerEfficient = VTIsHardwareDecodeSupported(videoCodecType);
     95                info.smooth = true;
     96            }
    8897        }
    8998    }
  • trunk/Source/WebCore/platform/mediacapabilities/VideoConfiguration.h

    r235919 r243109  
    2626#pragma once
    2727
     28#include <wtf/Optional.h>
    2829#include <wtf/text/WTFString.h>
    2930
     
    3637    uint64_t bitrate;
    3738    double framerate;
     39    Optional<bool> alphaChannel;
    3840};
    3941
  • trunk/Source/WebCore/platform/mock/MediaEngineConfigurationFactoryMock.cpp

    r243014 r243109  
    4848        return false;
    4949
     50    // Only the "mock-with-alpha" codec supports alphaChannel
     51    if (videoConfig && videoConfig->alphaChannel && videoConfig->alphaChannel.value()) {
     52        if (ContentType(videoConfig->contentType).codecsParameter() != "mock-with-alpha")
     53            return false;
     54    }
     55
    5056    // Audio decoding support limited to audio/mp4.
    5157    auto audioConfig = configuration.audio;
     
    9298    if (videoConfig && videoConfig->width > 1280 && videoConfig->height > 720)
    9399        return false;
     100
     101    // Only the "mock-with-alpha" codec supports alphaChannel
     102    if (videoConfig && videoConfig->alphaChannel && videoConfig->alphaChannel.value()) {
     103        if (ContentType(videoConfig->contentType).codecsParameter() != "mock-with-alpha")
     104            return false;
     105    }
    94106
    95107    // Audio encoding support limited to audio/mp4.
Note: See TracChangeset for help on using the changeset viewer.