xref: /aosp_15_r20/external/webrtc/sdk/objc/helpers/AVCaptureSession+DevicePosition.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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