title: Crash in AVCaptureSession when adding an AVCaptureDeviceInput
body: <p>I have a weird crash showing on Crashlytics when setting up a camera session. 
  The stacktrace shows that the crash occurred at the method addInput. </p>
  
  <pre><code>func setupCamSession(){
      self.captureSession = AVCaptureSession()
      self.cameraView.setSession(self.captureSession)
      self.sessionQueue = dispatch_queue_create("com.myapp.camera_queue", DISPATCH_QUEUE_SERIAL)
      self.setupResult = .Success
      switch AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo){
      case .Authorized:
          break //already we set it to success
      case .NotDetermined:
          // The user has not yet been presented with the option to grant video access.
          // We suspend the session queue to delay session setup until the access request has completed 
          dispatch_suspend(self.sessionQueue)
          AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted) -&gt; Void in
              if ( !granted ) {
                  self.setupResult = .CameraNotAuthorized
              }
              dispatch_resume(self.sessionQueue)
          })
      default:
          self.setupResult = .CameraNotAuthorized
      }
  
      dispatch_async(self.sessionQueue){
          if self.setupResult != .Success{
              return
          }
          //link input to captureSession
          guard let videoDevice = self.deviceWithMediaType(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back) else{
              AppLog("Video Device Unavailable")
              self.setupResult = .SessionConfigurationFailed
              return
          }
          var videoDeviceInput: AVCaptureDeviceInput!
          do {
              videoDeviceInput = try AVCaptureDeviceInput(device: videoDevice)
          }catch {
              AppLog("Could not create video device input")
          }
  
          /////////////////////////////////////////////////////
          self.captureSession.beginConfiguration()
  
          if self.captureSession.canAddInput(videoDeviceInput){
              self.captureSession.addInput(videoDeviceInput)
              self.videoDeviceInput = videoDeviceInput
              self.videoDevice = videoDevice
              dispatch_async(dispatch_get_main_queue()){
                  //update the cameraView layer on the main thread
                  let previewLayer : AVCaptureVideoPreviewLayer = self.cameraView.layer as! AVCaptureVideoPreviewLayer
                  previewLayer.connection.videoOrientation = AVCaptureVideoOrientation(ui:UIApplication.sharedApplication().statusBarOrientation)
              }
          }else{
              AppLog("Could not add video device input to the session")
              self.setupResult = .SessionConfigurationFailed
          }
  
          //link output to captureSession
          let stillImageOutput = AVCaptureStillImageOutput()
          if self.captureSession.canAddOutput(stillImageOutput){
              self.captureSession.addOutput(stillImageOutput)
              self.stillImageOutput = stillImageOutput
              stillImageOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
          }else{
              AppLog("Could not add still image output to the session")
              self.setupResult = .SessionConfigurationFailed
          }
  
          self.captureSession.commitConfiguration()
          /////////////////////////////////////////////////////
      }
  }
  
  func runSession(){
      dispatch_async(self.sessionQueue){
          switch self.setupResult!{
          case .Success:
              self.videoDeviceInput!.device.addObserver(self, forKeyPath: "adjustingFocus", options: NSKeyValueObservingOptions.New, context: nil)
              self.captureSession.addObserver(self, forKeyPath: "running", options: [.New], context: &amp;SessionRunningContext)
              self.captureSession.startRunning()
              self.captureSessionRunning = self.captureSession.running
              if !self.captureSessionRunning {
                  self.captureSession.removeObserver(self, forKeyPath: "running", context: &amp;SessionRunningContext)
                  self.videoDeviceInput?.device?.removeObserver(self, forKeyPath: "adjustingFocus", context: nil)
              }
         default:
         //Handle errors.
         }
    }
  func stopCaptureSession(){
      dispatch_async(self.sessionQueue){
          if self.setupResult == .Success{
              if self.captureSessionRunning{
                  self.captureSession.stopRunning()
                  self.videoDeviceInput?.device?.removeObserver(self, forKeyPath: "adjustingFocus", context: nil)
                  self.captureSession.removeObserver(self, forKeyPath: "running", context: &amp;SessionRunningContext)
              }
              self.captureSessionRunning = false
          }
      }
  }
  </code></pre>
  
  <p>The setupCamSession is called in viewDidLoad, the runSession in viewWillAppear and I have also a stopSession method in viewWillDisappear. Everything related to the camera session is dispatched on a background serial queue.</p>
  
  <p>The crash doesn't happen 100% of the time and I am unable to reproduce the crash on the device I use. 
  Thanks
   <a href="https://i.stack.imgur.com/Fd9le.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Fd9le.png" alt="This is a screenshot of the stacktrace"></a></p>