diff options
author | Florian Zwoch <fzwoch@gmail.com> | 2016-08-19 19:46:24 +1000 |
---|---|---|
committer | Alessandro Decina <alessandro.d@gmail.com> | 2016-08-19 19:46:41 +1000 |
commit | 6de83e0515c334466f0e1649090c7421ea79881e (patch) | |
tree | 180f012df8f520cf10f334fc2db7290871b91545 | |
parent | c42eb9932e9e8a1ddf959e78e9ca70c060f81e72 (diff) |
avfvideosrc: account for retina displays when capturing screens
Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=770030
-rw-r--r-- | sys/applemedia/avfvideosrc.m | 20 |
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)); } |