summaryrefslogtreecommitdiff
path: root/sys/applemedia
diff options
context:
space:
mode:
authorFlorian Zwoch <fzwoch@gmail.com>2016-08-19 19:46:24 +1000
committerAlessandro Decina <alessandro.d@gmail.com>2016-08-19 19:46:41 +1000
commit6de83e0515c334466f0e1649090c7421ea79881e (patch)
tree180f012df8f520cf10f334fc2db7290871b91545 /sys/applemedia
parentc42eb9932e9e8a1ddf959e78e9ca70c060f81e72 (diff)
avfvideosrc: account for retina displays when capturing screens
Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=770030
Diffstat (limited to 'sys/applemedia')
-rw-r--r--sys/applemedia/avfvideosrc.m20
1 files changed, 18 insertions, 2 deletions
diff --git a/sys/applemedia/avfvideosrc.m b/sys/applemedia/avfvideosrc.m
index a0cc57be0..d6e519f66 100644
--- a/sys/applemedia/avfvideosrc.m
+++ b/sys/applemedia/avfvideosrc.m
@@ -138,6 +138,7 @@ G_DEFINE_TYPE (GstAVFVideoSrc, gst_avf_video_src, GST_TYPE_PUSH_SRC);
- (GstVideoFormat)getGstVideoFormat:(NSNumber *)pixel_format;
#if !HAVE_IOS
- (CGDirectDisplayID)getDisplayIdFromDeviceIndex;
+- (float)getScaleFactorFromDeviceIndex;
#endif
- (GstCaps *)getDeviceCaps;
- (BOOL)setDeviceCaps:(GstVideoInfo *)info;
@@ -416,6 +417,20 @@ didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
displayId = [description objectForKey:@"NSScreenNumber"];
return [displayId unsignedIntegerValue];
}
+
+- (float)getScaleFactorFromDeviceIndex
+{
+ NSArray *screens = [NSScreen screens];
+
+ if (deviceIndex == DEFAULT_DEVICE_INDEX)
+ return [[NSScreen mainScreen] backingScaleFactor];
+ if (deviceIndex >= [screens count]) {
+ GST_ELEMENT_ERROR (element, RESOURCE, NOT_FOUND,
+ ("Invalid screen capture device index"), (NULL));
+ return 1.0;
+ }
+ return [[screens objectAtIndex:deviceIndex] backingScaleFactor];
+}
#endif
- (GstCaps *)getDeviceCaps
@@ -648,12 +663,13 @@ didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
if (captureScreen) {
#if !HAVE_IOS
CGRect rect = CGDisplayBounds ([self getDisplayIdFromDeviceIndex]);
+ float scale = [self getScaleFactorFromDeviceIndex];
for (NSNumber *pixel_format in pixel_formats) {
GstVideoFormat gst_format = [self getGstVideoFormat:pixel_format];
if (gst_format != GST_VIDEO_FORMAT_UNKNOWN)
gst_caps_append (result, gst_caps_new_simple ("video/x-raw",
- "width", G_TYPE_INT, (int)rect.size.width,
- "height", G_TYPE_INT, (int)rect.size.height,
+ "width", G_TYPE_INT, (int)(rect.size.width * scale),
+ "height", G_TYPE_INT, (int)(rect.size.height * scale),
"format", G_TYPE_STRING, gst_video_format_to_string (gst_format),
NULL));
}