Changeset 245296 in webkit


Ignore:
Timestamp:
May 14, 2019 12:30:19 PM (5 years ago)
Author:
youenn@apple.com
Message:

getUserMedia capture changes on iOS after homing out
https://bugs.webkit.org/show_bug.cgi?id=197707

Reviewed by Eric Carlson.

In case of muting an AVVideoCaptureSource on iOS, the session is cleared.
We need to store the preset information, to setup the new session on unnmuting correctly.
Manually tested.

  • platform/mediastream/mac/AVVideoCaptureSource.h:
  • platform/mediastream/mac/AVVideoCaptureSource.mm:

(WebCore::AVVideoCaptureSource::setSizeAndFrameRateWithPreset):
(WebCore::AVVideoCaptureSource::setSessionSizeAndFrameRate):
(WebCore::AVVideoCaptureSource::setupCaptureSession):

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r245295 r245296  
     12019-05-14  Youenn Fablet  <youenn@apple.com>
     2
     3        getUserMedia capture changes on iOS after homing out
     4        https://bugs.webkit.org/show_bug.cgi?id=197707
     5
     6        Reviewed by Eric Carlson.
     7
     8        In case of muting an AVVideoCaptureSource on iOS, the session is cleared.
     9        We need to store the preset information, to setup the new session on unnmuting correctly.
     10        Manually tested.
     11
     12        * platform/mediastream/mac/AVVideoCaptureSource.h:
     13        * platform/mediastream/mac/AVVideoCaptureSource.mm:
     14        (WebCore::AVVideoCaptureSource::setSizeAndFrameRateWithPreset):
     15        (WebCore::AVVideoCaptureSource::setSessionSizeAndFrameRate):
     16        (WebCore::AVVideoCaptureSource::setupCaptureSession):
     17
    1182019-05-14  Oriol Brufau  <obrufau@igalia.com>
    219
  • trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp

    r243033 r245296  
    367367        return;
    368368
    369     setSizeAndFrameRateWithPreset(match->requestedSize, match->requestedFrameRate, match->encodingPreset);
     369    setFrameRateWithPreset(match->requestedFrameRate, match->encodingPreset);
    370370
    371371    if (!match->requestedSize.isEmpty())
  • trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.h

    r244704 r245296  
    5252    virtual void generatePresets() = 0;
    5353    virtual bool prefersPreset(VideoPreset&) { return true; }
    54     virtual void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) { };
     54    virtual void setFrameRateWithPreset(double, RefPtr<VideoPreset>) { };
    5555    virtual bool canResizeVideoFrames() const { return false; }
    5656    bool shouldUsePreset(VideoPreset& current, VideoPreset& candidate);
  • trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h

    r243033 r245296  
    9292    bool interrupted() const final;
    9393
    94     void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) final;
     94    void setFrameRateWithPreset(double, RefPtr<VideoPreset>) final;
    9595    bool prefersPreset(VideoPreset&) final;
    9696    void generatePresets() final;
    9797    bool canResizeVideoFrames() const final { return true; }
    9898
     99    void setSessionSizeAndFrameRate();
    99100    bool setPreset(NSString*);
    100101    void computeSampleRotation();
     
    128129    RetainPtr<AVCaptureSession> m_session;
    129130    RetainPtr<AVCaptureDevice> m_device;
    130     RefPtr<VideoPreset> m_pendingPreset;
    131131
    132132    Lock m_presetMutex;
    133133    RefPtr<AVVideoPreset> m_currentPreset;
    134     IntSize m_pendingSize;
    135     double m_pendingFrameRate;
     134    IntSize m_currentSize;
     135    double m_currentFrameRate;
    136136    InterruptionReason m_interruption { InterruptionReason::None };
    137137    int m_framesToDropAtStartup { 0 };
  • trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm

    r245217 r245296  
    284284}
    285285
    286 void AVVideoCaptureSource::setSizeAndFrameRateWithPreset(IntSize requestedSize, double requestedFrameRate, RefPtr<VideoPreset> preset)
    287 {
    288     ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, SizeAndFrameRate { requestedSize.width(), requestedSize.height(), requestedFrameRate });
     286void AVVideoCaptureSource::setFrameRateWithPreset(double requestedFrameRate, RefPtr<VideoPreset> preset)
     287{
     288    ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, SizeAndFrameRate { preset->size.width(), preset->size.height(), requestedFrameRate });
    289289
    290290    auto* avPreset = preset ? downcast<AVVideoPreset>(preset.get()) : nullptr;
    291 
    292     if (!m_session) {
    293         m_pendingPreset = avPreset;
    294         m_pendingSize = requestedSize;
    295         m_pendingFrameRate = requestedFrameRate;
    296         return;
    297     }
    298 
    299     m_pendingPreset = nullptr;
    300     m_pendingFrameRate = 0;
    301 
     291    m_currentPreset = avPreset;
     292    m_currentFrameRate = requestedFrameRate;
     293
     294    setSessionSizeAndFrameRate();
     295}
     296
     297void AVVideoCaptureSource::setSessionSizeAndFrameRate()
     298{
     299    if (!m_session)
     300        return;
     301
     302    auto* avPreset = m_currentPreset.get();
    302303    if (!avPreset)
    303304        return;
     
    309310    @try {
    310311        if ([device() lockForConfiguration:&error]) {
    311             if (!m_currentPreset || ![m_currentPreset->format.get() isEqual:avPreset->format.get()]) {
    312                 [device() setActiveFormat:avPreset->format.get()];
     312            ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "setting preset to ", m_currentSize);
     313            [device() setActiveFormat:avPreset->format.get()];
    313314
    314315#if PLATFORM(MAC)
    315                 auto settingsDictionary = @{
    316                     (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(avVideoCapturePixelBufferFormat()),
    317                     (__bridge NSString *)kCVPixelBufferWidthKey: @(avPreset->size.width()),
    318                     (__bridge NSString *)kCVPixelBufferHeightKey: @(avPreset->size.height()),
    319                     (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ }
    320                 };
    321                 [m_videoOutput setVideoSettings:settingsDictionary];
    322 #endif
    323             }
    324             auto* frameRateRange = frameDurationForFrameRate(requestedFrameRate);
     316            auto settingsDictionary = @{
     317                (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(avVideoCapturePixelBufferFormat()),
     318                (__bridge NSString *)kCVPixelBufferWidthKey: @(avPreset->size.width()),
     319                (__bridge NSString *)kCVPixelBufferHeightKey: @(avPreset->size.height()),
     320                (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ }
     321            };
     322            [m_videoOutput setVideoSettings:settingsDictionary];
     323#endif
     324
     325            auto* frameRateRange = frameDurationForFrameRate(m_currentFrameRate);
    325326            ASSERT(frameRateRange);
    326327            if (!frameRateRange)
    327328                return;
    328329
    329             requestedFrameRate = clampTo(requestedFrameRate, frameRateRange.minFrameRate, frameRateRange.maxFrameRate);
    330 
    331             ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "setting frame rate to ", requestedFrameRate);
    332             [device() setActiveVideoMinFrameDuration: CMTimeMake(1, requestedFrameRate)];
    333             [device() setActiveVideoMaxFrameDuration: CMTimeMake(1, requestedFrameRate)];
     330            m_currentFrameRate = clampTo(m_currentFrameRate, frameRateRange.minFrameRate, frameRateRange.maxFrameRate);
     331
     332            ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "setting frame rate to ", m_currentFrameRate);
     333            [device() setActiveVideoMinFrameDuration: CMTimeMake(1, m_currentFrameRate)];
     334            [device() setActiveVideoMaxFrameDuration: CMTimeMake(1, m_currentFrameRate)];
    334335
    335336            [device() unlockForConfiguration];
     
    340341    }
    341342    [m_session commitConfiguration];
    342 
    343     m_currentPreset = avPreset;
    344343
    345344    ERROR_LOG_IF(error && loggerPtr(), LOGIDENTIFIER, [[error localizedDescription] UTF8String]);
     
    449448    [session() addOutput:m_videoOutput.get()];
    450449
    451     if (m_pendingPreset || m_pendingFrameRate)
    452         setSizeAndFrameRateWithPreset(m_pendingSize, m_pendingFrameRate, m_pendingPreset);
     450    setSessionSizeAndFrameRate();
    453451
    454452    m_sensorOrientation = sensorOrientationFromVideoOutput(m_videoOutput.get());
  • trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp

    r242308 r245296  
    182182}
    183183
    184 void MockRealtimeVideoSource::setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset> preset)
    185 {
    186     m_preset = preset;
     184void MockRealtimeVideoSource::setFrameRateWithPreset(double, RefPtr<VideoPreset> preset)
     185{
     186    m_preset = WTFMove(preset);
    187187    if (preset)
    188188        setIntrinsicSize(preset->size);
  • trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h

    r239840 r245296  
    7272    bool supportsSizeAndFrameRate(Optional<int> width, Optional<int> height, Optional<double>) final;
    7373    void setSizeAndFrameRate(Optional<int> width, Optional<int> height, Optional<double>) final;
    74     void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) final;
     74    void setFrameRateWithPreset(double, RefPtr<VideoPreset>) final;
    7575    IntSize captureSize() const;
    7676
Note: See TracChangeset for help on using the changeset viewer.