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