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