|  | /* | 
|  | *  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 |