Skip to content
  • jer.noble@apple.com's avatar
    [MSE] Add mock MediaSource classes for testing. · a74247b8
    jer.noble@apple.com authored
    https://bugs.webkit.org/show_bug.cgi?id=123322
    
    Reviewed by Eric Carlson.
    
    Source/WebCore:
    
    Tests: media/media-source/media-source-addsourcebuffer.html
           media/media-source/media-source-append-buffer.html
           media/media-source/media-source-canplaythrough.html
           media/media-source/media-source-closed.html
           media/media-source/media-source-play.html
           media/media-source/media-source-track-enabled.html
           media/media-source/media-source-tracks.html
    
    Add mock implementation of platform MediaSource classes, allowing ports to test the
    MediaSource API without having a platform implementation.
    
    The MockMediaSource will support a byteformat defined in MockBox.h: a simple box-style media
    format with an initialization segment containing a number of tracks, followed by a list of
    samples.
    
    Add a means to insert a new media engine factory at runtime, so the internals object can add
    a MockMediaSourceMediaPlayer:
    * platform/graphics/MediaPlayer.cpp:
    (WebCore::MediaPlayerFactorySupport::callRegisterMediaEngine):
    * platform/graphics/MediaPlayer.h:
    * testing/Internals.cpp:
    (WebCore::Internals::initializeMockMediaSource):
    * testing/Internals.h:
    * testing/Internals.idl:
    
    For non-media-source supporting media engines, fail immediately when asked to load a media
    source, so that the MockMediaSourceMediaPlayer will be instantiated as a fall-back:
    * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
    (WebCore::MediaPlayerPrivateAVFoundation::load):
    * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
    * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
    (WebCore::MediaPlayerPrivateAVFoundationObjC::supportsType):
    * platform/graphics/mac/MediaPlayerPrivateQTKit.h:
    * platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
    (WebCore::MediaPlayerPrivateQTKit::load):
    (WebCore::MediaPlayerPrivateQTKit::supportsType):
    
    Add new files to the project:
    * WebCore.xcodeproj/project.pbxproj:
    * Source/WebCore/WebCore.exp.in:
    
    Update the MediaSource implementation:
    * Modules/mediasource/MediaSource.cpp:
    (WebCore::MediaSource::monitorSourceBuffers): Add a link to the spec.
    * Modules/mediasource/SourceBuffer.cpp:
    (WebCore::SourceBuffer::buffered): Ditto.
    (WebCore::SourceBuffer::setTimestampOffset): Ditto.
    (WebCore::SourceBuffer::validateInitializationSegment): Ditto.
    (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment): Ditto. Also,
        bring the implementation up to date with part of the spec.
    (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample): Remove "Predicate" from
        SampleIsRandomAccessPredicate.
    
    Add utility classes to parse and represent the bytestream supported by the MockMediaSource:
    * platform/mock/mediasource/MockBox.cpp: Added.
    (WebCore::MockBox::MockBox):
    (WebCore::MockBox::peekType):
    (WebCore::MockBox::peekLength):
    (WebCore::MockTrackBox::MockTrackBox):
    (WebCore::MockTrackBox::type):
    (WebCore::MockInitializationBox::MockInitializationBox):
    (WebCore::MockInitializationBox::type):
    (WebCore::MockSampleBox::MockSampleBox):
    (WebCore::MockSampleBox::type):
    * platform/mock/mediasource/MockBox.h: Added.
    (WebCore::MockBox::length):
    (WebCore::MockBox::type):
    (WebCore::MockTrackBox::trackID):
    (WebCore::MockTrackBox::codec):
    (WebCore::MockTrackBox::kind):
    (WebCore::MockInitializationBox::duration):
    (WebCore::MockInitializationBox::tracks):
    (WebCore::MockSampleBox::presentationTimestamp):
    (WebCore::MockSampleBox::decodeTimestamp):
    (WebCore::MockSampleBox::duration):
    (WebCore::MockSampleBox::trackID):
    (WebCore::MockSampleBox::flags):
    (WebCore::MockSampleBox::isSync):
    
    Add a MediaPlayerPrivate implementation which uses MockMediaSource:
    * platform/mock/mediasource/MockMediaPlayerMediaSource.cpp: Added.
    (WebCore::MockMediaPlayerMediaSource::registerMediaEngine):
    (WebCore::MockMediaPlayerMediaSource::create):
    (WebCore::mimeTypeCache):
    (WebCore::MockMediaPlayerMediaSource::getSupportedTypes):
    (WebCore::MockMediaPlayerMediaSource::supportsType):
    (WebCore::MockMediaPlayerMediaSource::MockMediaPlayerMediaSource):
    (WebCore::MockMediaPlayerMediaSource::~MockMediaPlayerMediaSource):
    (WebCore::MockMediaPlayerMediaSource::load):
    (WebCore::MockMediaPlayerMediaSource::cancelLoad):
    (WebCore::MockMediaPlayerMediaSource::play):
    (WebCore::MockMediaPlayerMediaSource::pause):
    (WebCore::MockMediaPlayerMediaSource::naturalSize):
    (WebCore::MockMediaPlayerMediaSource::hasVideo):
    (WebCore::MockMediaPlayerMediaSource::hasAudio):
    (WebCore::MockMediaPlayerMediaSource::setVisible):
    (WebCore::MockMediaPlayerMediaSource::seeking):
    (WebCore::MockMediaPlayerMediaSource::paused):
    (WebCore::MockMediaPlayerMediaSource::networkState):
    (WebCore::MockMediaPlayerMediaSource::readyState):
    (WebCore::MockMediaPlayerMediaSource::buffered):
    (WebCore::MockMediaPlayerMediaSource::didLoadingProgress):
    (WebCore::MockMediaPlayerMediaSource::setSize):
    (WebCore::MockMediaPlayerMediaSource::paint):
    (WebCore::MockMediaPlayerMediaSource::currentTimeDouble):
    (WebCore::MockMediaPlayerMediaSource::durationDouble):
    (WebCore::MockMediaPlayerMediaSource::seekDouble):
    (WebCore::MockMediaPlayerMediaSource::advanceCurrentTime):
    (WebCore::MockMediaPlayerMediaSource::updateDuration):
    (WebCore::MockMediaPlayerMediaSource::setReadyState):
    * platform/mock/mediasource/MockMediaPlayerMediaSource.h: Added.
    
    Add a mock implementation of MediaSourcePrivate, which uses MockSourceBuffer:
    * platform/mock/mediasource/MockMediaSourcePrivate.cpp: Added.
    (WebCore::MockMediaSourcePrivate::create):
    (WebCore::MockMediaSourcePrivate::MockMediaSourcePrivate):
    (WebCore::MockMediaSourcePrivate::~MockMediaSourcePrivate):
    (WebCore::MockMediaSourcePrivate::addSourceBuffer):
    (WebCore::MockMediaSourcePrivate::removeSourceBuffer):
    (WebCore::MockMediaSourcePrivate::duration):
    (WebCore::MockMediaSourcePrivate::setDuration):
    (WebCore::MockMediaSourcePrivate::markEndOfStream):
    (WebCore::MockMediaSourcePrivate::unmarkEndOfStream):
    (WebCore::MockMediaSourcePrivate::readyState):
    (WebCore::MockMediaSourcePrivate::setReadyState):
    (WebCore::MockMediaSourcePrivate::sourceBufferPrivateDidChangeActiveState):
    (WebCore::MockSourceBufferPrivateHasAudio):
    (WebCore::MockMediaSourcePrivate::hasAudio):
    (WebCore::MockSourceBufferPrivateHasVideo):
    (WebCore::MockMediaSourcePrivate::hasVideo):
    * platform/mock/mediasource/MockMediaSourcePrivate.h: Added.
    (WebCore::MockMediaSourcePrivate::activeSourceBuffers):
    (WebCore::MockMediaSourcePrivate::player):
    
    Add a mock implementation of SourceBufferPrivate, which uses MockBoxes to parse the
    bytestream provided by SourceBuffer:
    * platform/mock/mediasource/MockSourceBufferPrivate.cpp: Added.
    (WebCore::MockMediaSample::create):
    (WebCore::MockMediaSample::~MockMediaSample):
    (WebCore::MockMediaSample::MockMediaSample):
    (WebCore::MockMediaSample::platformSample):
    (WebCore::MockMediaDescription::create):
    (WebCore::MockMediaDescription::~MockMediaDescription):
    (WebCore::MockMediaDescription::MockMediaDescription):
    (WebCore::MockSourceBufferPrivate::create):
    (WebCore::MockSourceBufferPrivate::MockSourceBufferPrivate):
    (WebCore::MockSourceBufferPrivate::~MockSourceBufferPrivate):
    (WebCore::MockSourceBufferPrivate::setClient):
    (WebCore::MockSourceBufferPrivate::append):
    (WebCore::MockSourceBufferPrivate::didReceiveInitializationSegment):
    (WebCore::MockSourceBufferPrivate::didReceiveSample):
    (WebCore::MockSourceBufferPrivate::abort):
    (WebCore::MockSourceBufferPrivate::removedFromMediaSource):
    (WebCore::MockSourceBufferPrivate::readyState):
    (WebCore::MockSourceBufferPrivate::setReadyState):
    (WebCore::MockSourceBufferPrivate::hasVideo):
    (WebCore::MockSourceBufferPrivate::hasAudio):
    * platform/mock/mediasource/MockSourceBufferPrivate.h: Added.
    
    Create mock implementations of AudioTrackPrivate, VideoTrackPrivate, and TextTrackPrivate
    which wrap the MockTrackBox class:
    * platform/mock/mediasource/MockTracks.cpp: Added.
    * platform/mock/mediasource/MockTracks.h: Added.
    (WebCore::MockAudioTrackPrivate::create):
    (WebCore::MockAudioTrackPrivate::~MockAudioTrackPrivate):
    (WebCore::MockAudioTrackPrivate::id):
    (WebCore::MockAudioTrackPrivate::MockAudioTrackPrivate):
    (WebCore::MockTextTrackPrivate::create):
    (WebCore::MockTextTrackPrivate::~MockTextTrackPrivate):
    (WebCore::MockTextTrackPrivate::id):
    (WebCore::MockTextTrackPrivate::MockTextTrackPrivate):
    (WebCore::MockVideoTrackPrivate::create):
    (WebCore::MockVideoTrackPrivate::~MockVideoTrackPrivate):
    (WebCore::MockVideoTrackPrivate::id):
    (WebCore::MockVideoTrackPrivate::MockVideoTrackPrivate):
    
    LayoutTests:
    
    * media/media-source/media-source-addsourcebuffer-expected.txt: Added.
    * media/media-source/media-source-addsourcebuffer.html: Added.
    * media/media-source/media-source-append-buffer-expected.txt: Added.
    * media/media-source/media-source-append-buffer.html: Added.
    * media/media-source/media-source-canplaythrough-expected.txt: Added.
    * media/media-source/media-source-canplaythrough.html: Added.
    * media/media-source/media-source-closed-expected.txt: Added.
    * media/media-source/media-source-closed.html: Added.
    * media/media-source/media-source-play-expected.txt: Added.
    * media/media-source/media-source-play.html: Added.
    * media/media-source/mock-media-source.js: Added.
    * media/video-test.js:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@158853 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    a74247b8