Changeset 217001 in webkit


Ignore:
Timestamp:
May 17, 2017 2:31:52 PM (7 years ago)
Author:
eric.carlson@apple.com
Message:

[MediaStream] videoWidth and videoHeight should be set when 'loadedmetadata' event fires
https://bugs.webkit.org/show_bug.cgi?id=172223
<rdar://problem/31899755>

Reviewed by Jer Noble.

Source/WebCore:

Test: fast/mediastream/get-user-media-on-loadedmetadata.html

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:

(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::currentReadyState): If a stream has
a video track, return HaveNothing until we have a sample.

  • platform/mediastream/RealtimeMediaSource.h:
  • platform/mock/MockRealtimeAudioSource.cpp:

(WebCore::MockRealtimeAudioSource::tick): Optionally delay the next sample.
(WebCore::MockRealtimeAudioSource::delaySamples):

  • platform/mock/MockRealtimeAudioSource.h:
  • platform/mock/MockRealtimeVideoSource.cpp:

(WebCore::MockRealtimeVideoSource::delaySamples):
(WebCore::MockRealtimeVideoSource::generateFrame): Optionally delay the next sample.

  • platform/mock/MockRealtimeVideoSource.h:
  • testing/Internals.cpp:

(WebCore::Internals::delayMediaStreamTrackSamples):

  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

  • fast/mediastream/get-user-media-on-loadedmetadata-expected.txt: Added.
  • fast/mediastream/get-user-media-on-loadedmetadata.html: Added.
Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r216999 r217001  
     12017-05-17  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] videoWidth and videoHeight should be set when 'loadedmetadata' event fires
     4        https://bugs.webkit.org/show_bug.cgi?id=172223
     5        <rdar://problem/31899755>
     6
     7        Reviewed by Jer Noble.
     8
     9        * fast/mediastream/get-user-media-on-loadedmetadata-expected.txt: Added.
     10        * fast/mediastream/get-user-media-on-loadedmetadata.html: Added.
     11
    1122017-05-17  Youenn Fablet  <youenn@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r216999 r217001  
     12017-05-17  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] videoWidth and videoHeight should be set when 'loadedmetadata' event fires
     4        https://bugs.webkit.org/show_bug.cgi?id=172223
     5        <rdar://problem/31899755>
     6
     7        Reviewed by Jer Noble.
     8
     9        Test: fast/mediastream/get-user-media-on-loadedmetadata.html
     10
     11        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
     12        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::currentReadyState): If a stream has
     13        a video track, return HaveNothing until we have a sample.
     14       
     15        * platform/mediastream/RealtimeMediaSource.h:
     16        * platform/mock/MockRealtimeAudioSource.cpp:
     17        (WebCore::MockRealtimeAudioSource::tick): Optionally delay the next sample.
     18        (WebCore::MockRealtimeAudioSource::delaySamples):
     19        * platform/mock/MockRealtimeAudioSource.h:
     20
     21        * platform/mock/MockRealtimeVideoSource.cpp:
     22        (WebCore::MockRealtimeVideoSource::delaySamples):
     23        (WebCore::MockRealtimeVideoSource::generateFrame): Optionally delay the next sample.
     24        * platform/mock/MockRealtimeVideoSource.h:
     25
     26        * testing/Internals.cpp:
     27        (WebCore::Internals::delayMediaStreamTrackSamples):
     28        * testing/Internals.h:
     29        * testing/Internals.idl:
     30
    1312017-05-17  Youenn Fablet  <youenn@apple.com>
    232
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h

    r216766 r217001  
    248248    MediaPlayer::NetworkState m_networkState { MediaPlayer::Empty };
    249249    MediaPlayer::ReadyState m_readyState { MediaPlayer::HaveNothing };
    250     MediaPlayer::ReadyState m_previousReadyState { MediaPlayer::HaveNothing };
    251250    FloatSize m_intrinsicSize;
    252251    float m_volume { 1 };
     
    264263    bool m_transformIsValid { false };
    265264    bool m_visible { false };
     265    bool m_haveSeenMetadata { false };
    266266
    267267#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm

    r216766 r217001  
    742742    bool allTracksAreLive = true;
    743743    for (auto& track : m_mediaStreamPrivate->tracks()) {
    744         if (!track->enabled() || track->readyState() != MediaStreamTrackPrivate::ReadyState::Live) {
     744        if (!track->enabled() || track->readyState() != MediaStreamTrackPrivate::ReadyState::Live)
    745745            allTracksAreLive = false;
    746             break;
     746
     747        if (track == m_mediaStreamPrivate->activeVideoTrack() && !m_imagePainter.mediaSample) {
     748            if (!m_haveSeenMetadata)
     749                return MediaPlayer::ReadyState::HaveNothing;
     750            allTracksAreLive = false;
    747751        }
    748 
    749         if (track == m_mediaStreamPrivate->activeVideoTrack() && !m_imagePainter.mediaSample) {
    750             allTracksAreLive = false;
    751             break;
    752         }
    753     }
    754 
    755     if (!allTracksAreLive && m_previousReadyState == MediaPlayer::ReadyState::HaveNothing)
     752    }
     753
     754    if (!allTracksAreLive && !m_haveSeenMetadata)
    756755        return MediaPlayer::ReadyState::HaveMetadata;
    757756
     
    10791078        return;
    10801079
    1081     m_previousReadyState = m_readyState;
     1080    if (readyState != MediaPlayer::ReadyState::HaveNothing)
     1081        m_haveSeenMetadata = true;
    10821082    m_readyState = readyState;
    10831083    characteristicsChanged();
  • trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h

    r216999 r217001  
    210210    virtual AudioSourceProvider* audioSourceProvider() { return nullptr; }
    211211
     212    // Testing only
     213    virtual void delaySamples(float) { };
     214
    212215protected:
    213216    RealtimeMediaSource(const String& id, Type, const String& name);
  • trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp

    r216898 r217001  
    154154
    155155    double now = monotonicallyIncreasingTime();
     156
     157    if (m_delayUntil) {
     158        if (m_delayUntil < now)
     159            return;
     160        m_delayUntil = 0;
     161    }
     162
    156163    double delta = now - m_lastRenderTime;
    157164    m_lastRenderTime = now;
     
    159166}
    160167
     168void MockRealtimeAudioSource::delaySamples(float delta)
     169{
     170    m_delayUntil = monotonicallyIncreasingTime() + delta;
     171}
     172
    161173} // namespace WebCore
    162174
  • trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h

    r216898 r217001  
    7676    bool isCaptureSource() const final { return true; }
    7777
     78    void delaySamples(float) final;
     79
    7880    RunLoop::Timer<MockRealtimeAudioSource> m_timer;
    7981    double m_startTime { NAN };
    8082    double m_lastRenderTime { NAN };
    8183    double m_elapsedTime { 0 };
     84    double m_delayUntil { 0 };
    8285};
    8386
  • trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp

    r216999 r217001  
    368368}
    369369
     370void MockRealtimeVideoSource::delaySamples(float delta)
     371{
     372    m_delayUntil = monotonicallyIncreasingTime() + delta;
     373}
     374
    370375void MockRealtimeVideoSource::generateFrame()
    371376{
     377    if (m_delayUntil) {
     378        if (m_delayUntil < monotonicallyIncreasingTime())
     379            return;
     380        m_delayUntil = 0;
     381    }
     382
    372383    ImageBuffer* buffer = imageBuffer();
    373384    if (!buffer)
  • trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h

    r216898 r217001  
    8383    void generateFrame();
    8484
     85    void delaySamples(float) override;
     86
    8587    float m_baseFontSize { 0 };
    8688    FontCascade m_timeFont;
     
    99101    double m_startTime { NAN };
    100102    double m_elapsedTime { 0 };
     103    double m_delayUntil { 0 };
    101104
    102105    unsigned m_frameNumber { 0 };
  • trunk/Source/WebCore/testing/Internals.cpp

    r216999 r217001  
    40454045}
    40464046
     4047void Internals::delayMediaStreamTrackSamples(MediaStreamTrack& track, float delay)
     4048{
     4049    track.source().delaySamples(delay);
     4050}
     4051
    40474052#endif
    40484053
  • trunk/Source/WebCore/testing/Internals.h

    r216999 r217001  
    575575    using TrackFramePromise = DOMPromiseDeferred<IDLInterface<ImageData>>;
    576576    void grabNextMediaStreamTrackFrame(TrackFramePromise&&);
     577    void delayMediaStreamTrackSamples(MediaStreamTrack&, float);
    577578#endif
    578579
  • trunk/Source/WebCore/testing/Internals.idl

    r216999 r217001  
    537537    [Conditional=MEDIA_STREAM] readonly attribute unsigned long trackVideoSampleCount;
    538538    [Conditional=MEDIA_STREAM, MayThrowException] void setMediaDeviceState(DOMString deviceID, DOMString property, boolean value);
    539 };
     539    [Conditional=MEDIA_STREAM] void delayMediaStreamTrackSamples(MediaStreamTrack track, float delay);
     540};
Note: See TracChangeset for help on using the changeset viewer.