| /* |
| * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #import "AVCaptureSession+DevicePosition.h" |
| |
| BOOL CFStringContainsString(CFStringRef theString, CFStringRef stringToFind) { |
| return CFStringFindWithOptions(theString, |
| stringToFind, |
| CFRangeMake(0, CFStringGetLength(theString)), |
| kCFCompareCaseInsensitive, |
| nil); |
| } |
| |
| @implementation AVCaptureSession (DevicePosition) |
| |
| + (AVCaptureDevicePosition)devicePositionForSampleBuffer:(CMSampleBufferRef)sampleBuffer { |
| // Check the image's EXIF for the camera the image came from. |
| AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionUnspecified; |
| CFDictionaryRef attachments = CMCopyDictionaryOfAttachments( |
| kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); |
| if (attachments) { |
| int size = CFDictionaryGetCount(attachments); |
| if (size > 0) { |
| CFDictionaryRef cfExifDictVal = nil; |
| if (CFDictionaryGetValueIfPresent( |
| attachments, (const void *)CFSTR("{Exif}"), (const void **)&cfExifDictVal)) { |
| CFStringRef cfLensModelStrVal; |
| if (CFDictionaryGetValueIfPresent(cfExifDictVal, |
| (const void *)CFSTR("LensModel"), |
| (const void **)&cfLensModelStrVal)) { |
| if (CFStringContainsString(cfLensModelStrVal, CFSTR("front"))) { |
| cameraPosition = AVCaptureDevicePositionFront; |
| } else if (CFStringContainsString(cfLensModelStrVal, CFSTR("back"))) { |
| cameraPosition = AVCaptureDevicePositionBack; |
| } |
| } |
| } |
| } |
| CFRelease(attachments); |
| } |
| return cameraPosition; |
| } |
| |
| @end |