Title: [240000] trunk/Source/WebCore
Revision
240000
Author
[email protected]
Date
2019-01-15 13:21:02 -0800 (Tue, 15 Jan 2019)

Log Message

Correctly handle rotation for local video playback
https://bugs.webkit.org/show_bug.cgi?id=193412

Reviewed by Eric Carlson.

Update AVVideoCaptureSource to compute the size given to settings after rotating the sample.
This ensures computing the size of video elements appropriately.
Also makes sure to notify observers of size change whenever rotation happens as settings() call will provide a different size.
Covered by manual testing as we do not have yet emulation of local capture with rotation.

* platform/mediastream/RealtimeMediaSource.cpp:
(WebCore::RealtimeMediaSource::setIntrinsicSize):
* platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::AVVideoCaptureSource::settings):
(WebCore::AVVideoCaptureSource::computeSampleRotation):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (239999 => 240000)


--- trunk/Source/WebCore/ChangeLog	2019-01-15 21:16:49 UTC (rev 239999)
+++ trunk/Source/WebCore/ChangeLog	2019-01-15 21:21:02 UTC (rev 240000)
@@ -1,3 +1,21 @@
+2019-01-15  Youenn Fablet  <[email protected]>
+
+        Correctly handle rotation for local video playback
+        https://bugs.webkit.org/show_bug.cgi?id=193412
+
+        Reviewed by Eric Carlson.
+
+        Update AVVideoCaptureSource to compute the size given to settings after rotating the sample.
+        This ensures computing the size of video elements appropriately.
+        Also makes sure to notify observers of size change whenever rotation happens as settings() call will provide a different size.
+        Covered by manual testing as we do not have yet emulation of local capture with rotation.
+
+        * platform/mediastream/RealtimeMediaSource.cpp:
+        (WebCore::RealtimeMediaSource::setIntrinsicSize):
+        * platform/mediastream/mac/AVVideoCaptureSource.mm:
+        (WebCore::AVVideoCaptureSource::settings):
+        (WebCore::AVVideoCaptureSource::computeSampleRotation):
+
 2019-01-15  Chris Dumez  <[email protected]>
 
         Regression(PSON) View becomes blank after click a cross-site download link

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (239999 => 240000)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2019-01-15 21:16:49 UTC (rev 239999)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2019-01-15 21:21:02 UTC (rev 240000)
@@ -890,9 +890,10 @@
     if (m_intrinsicSize == size)
         return;
 
+    auto currentSize = this->size();
     m_intrinsicSize = size;
 
-    if (m_intrinsicSize != m_size)
+    if (currentSize != this->size())
         notifySettingsDidChangeObservers({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height });
 }
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm (239999 => 240000)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2019-01-15 21:16:49 UTC (rev 239999)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2019-01-15 21:21:02 UTC (rev 240000)
@@ -260,7 +260,11 @@
         settings.setFacingMode(RealtimeMediaSourceSettings::Unknown);
 
     settings.setFrameRate(frameRate());
-    auto& size = this->size();
+
+    auto size = this->size();
+    if (m_sampleRotation == MediaSample::VideoRotation::Left || m_sampleRotation == MediaSample::VideoRotation::Right)
+        size = size.transposedSize();
+    
     settings.setWidth(size.width());
     settings.setHeight(size.height());
     settings.setDeviceId(hashedId());
@@ -501,25 +505,31 @@
 void AVVideoCaptureSource::computeSampleRotation()
 {
     bool frontCamera = [device() position] == AVCaptureDevicePositionFront;
+    MediaSample::VideoRotation sampleRotation;
     switch (m_sensorOrientation - m_deviceOrientation) {
     case 0:
-        m_sampleRotation = MediaSample::VideoRotation::None;
+        sampleRotation = MediaSample::VideoRotation::None;
         break;
     case 180:
     case -180:
-        m_sampleRotation = MediaSample::VideoRotation::UpsideDown;
+        sampleRotation = MediaSample::VideoRotation::UpsideDown;
         break;
     case 90:
-        m_sampleRotation = frontCamera ? MediaSample::VideoRotation::Left : MediaSample::VideoRotation::Right;
+        sampleRotation = frontCamera ? MediaSample::VideoRotation::Left : MediaSample::VideoRotation::Right;
         break;
     case -90:
     case -270:
-        m_sampleRotation = frontCamera ? MediaSample::VideoRotation::Right : MediaSample::VideoRotation::Left;
+        sampleRotation = frontCamera ? MediaSample::VideoRotation::Right : MediaSample::VideoRotation::Left;
         break;
     default:
         ASSERT_NOT_REACHED();
-        m_sampleRotation = MediaSample::VideoRotation::None;
+        sampleRotation = MediaSample::VideoRotation::None;
     }
+    if (sampleRotation == m_sampleRotation)
+        return;
+
+    m_sampleRotation = sampleRotation;
+    notifySettingsDidChangeObservers({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height });
 }
 
 void AVVideoCaptureSource::processNewFrame(Ref<MediaSample>&& sample)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to