1/* 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#import "AVCaptureSession+DevicePosition.h" 12 13BOOL CFStringContainsString(CFStringRef theString, CFStringRef stringToFind) { 14 return CFStringFindWithOptions(theString, 15 stringToFind, 16 CFRangeMake(0, CFStringGetLength(theString)), 17 kCFCompareCaseInsensitive, 18 nil); 19} 20 21@implementation AVCaptureSession (DevicePosition) 22 23+ (AVCaptureDevicePosition)devicePositionForSampleBuffer:(CMSampleBufferRef)sampleBuffer { 24 // Check the image's EXIF for the camera the image came from. 25 AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionUnspecified; 26 CFDictionaryRef attachments = CMCopyDictionaryOfAttachments( 27 kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); 28 if (attachments) { 29 int size = CFDictionaryGetCount(attachments); 30 if (size > 0) { 31 CFDictionaryRef cfExifDictVal = nil; 32 if (CFDictionaryGetValueIfPresent( 33 attachments, (const void *)CFSTR("{Exif}"), (const void **)&cfExifDictVal)) { 34 CFStringRef cfLensModelStrVal; 35 if (CFDictionaryGetValueIfPresent(cfExifDictVal, 36 (const void *)CFSTR("LensModel"), 37 (const void **)&cfLensModelStrVal)) { 38 if (CFStringContainsString(cfLensModelStrVal, CFSTR("front"))) { 39 cameraPosition = AVCaptureDevicePositionFront; 40 } else if (CFStringContainsString(cfLensModelStrVal, CFSTR("back"))) { 41 cameraPosition = AVCaptureDevicePositionBack; 42 } 43 } 44 } 45 } 46 CFRelease(attachments); 47 } 48 return cameraPosition; 49} 50 51@end 52