title: iOS: error in __connection_block_invoke_2: Connection interrupted
body: <p>Xcode/iOS 8/AVFoundation related error in console:</p>
  
  <pre><code>error in __connection_block_invoke_2: Connection interrupted
  </code></pre>
  
  <p>I am just adding AVCaptureVideoDataOutput to Apple's sample app 'AVCamManualUsingtheManualCaptureAPI'</p>
  
  <p>What I added was:</p>
  
  <pre><code>    // CoreImage wants BGRA pixel format
      NSDictionary *outputSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInteger:kCVPixelFormatType_32BGRA]};
  
      // create and configure video data output
      AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
      videoDataOutput.videoSettings = outputSettings;
      videoDataOutput.alwaysDiscardsLateVideoFrames = YES;
      [videoDataOutput setSampleBufferDelegate:self queue:sessionQueue];
  </code></pre>
  
  <p>Above snippet inserted in to sample project:</p>
  
  <pre><code>- (void)viewDidLoad
  {
      [super viewDidLoad];
  
      self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  
      self.recordButton.layer.cornerRadius = self.stillButton.layer.cornerRadius = self.cameraButton.layer.cornerRadius = 4;
      self.recordButton.clipsToBounds = self.stillButton.clipsToBounds = self.cameraButton.clipsToBounds = YES;
  
      // Create the AVCaptureSession
      AVCaptureSession *session = [[AVCaptureSession alloc] init];
      [self setSession:session];
  
      // Set up preview
      [[self previewView] setSession:session];
  
      // Check for device authorization
      [self checkDeviceAuthorizationStatus];
  
      // In general it is not safe to mutate an AVCaptureSession or any of its inputs, outputs, or connections from multiple threads at the same time.
      // Why not do all of this on the main queue?
      // -[AVCaptureSession startRunning] is a blocking call which can take a long time. We dispatch session setup to the sessionQueue so that the main queue isn't blocked (which keeps the UI responsive).
  
      dispatch_queue_t sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL);
      [self setSessionQueue:sessionQueue];
  
      dispatch_async(sessionQueue, ^{
          [self setBackgroundRecordingID:UIBackgroundTaskInvalid];
  
          NSError *error = nil;
  
          AVCaptureDevice *videoDevice = [AAPLCameraViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack];
          AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&amp;error];
  
          if (error)
          {
              NSLog(@"%@", error);
          }
  
          [[self session] beginConfiguration];
  
          if ([session canAddInput:videoDeviceInput])
          {
              [session addInput:videoDeviceInput];
              [self setVideoDeviceInput:videoDeviceInput];
              [self setVideoDevice:videoDeviceInput.device];
  
              dispatch_async(dispatch_get_main_queue(), ^{
                  // Why are we dispatching this to the main queue?
                  // Because AVCaptureVideoPreviewLayer is the backing layer for our preview view and UIView can only be manipulated on main thread.
                  // Note: As an exception to the above rule, it is not necessary to serialize video orientation changes on the AVCaptureVideoPreviewLayer’s connection with other session manipulation.
  
                  [[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] setVideoOrientation:(AVCaptureVideoOrientation)[self interfaceOrientation]];
              });
          }
  
          AVCaptureDevice *audioDevice = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];
          AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&amp;error];
  
          if (error)
          {
              NSLog(@"%@", error);
          }
  
          if ([session canAddInput:audioDeviceInput])
          {
              [session addInput:audioDeviceInput];
          }
  
          AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
          if ([session canAddOutput:movieFileOutput])
          {
              [session addOutput:movieFileOutput];
              AVCaptureConnection *connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
              if ([connection isVideoStabilizationSupported])
              {
                  [connection setEnablesVideoStabilizationWhenAvailable:YES];
              }
              [self setMovieFileOutput:movieFileOutput];
          }
  
          AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
          if ([session canAddOutput:stillImageOutput])
          {
              [stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}];
              [session addOutput:stillImageOutput];
              [self setStillImageOutput:stillImageOutput];
          }
              // CoreImage wants BGRA pixel format
  NSDictionary *outputSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInteger:kCVPixelFormatType_32BGRA]};
  
  // create and configure video data output
  AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
  videoDataOutput.videoSettings = outputSettings;
  videoDataOutput.alwaysDiscardsLateVideoFrames = YES;
  [videoDataOutput setSampleBufferDelegate:self queue:sessionQueue];
  
          [[self session] commitConfiguration];
  
          dispatch_async(dispatch_get_main_queue(), ^{
              [self configureManualHUD];
          });
      });
  
      self.manualHUDFocusView.hidden = YES;
      self.manualHUDExposureView.hidden = YES;
      self.manualHUDWhiteBalanceView.hidden = YES;
  }
  </code></pre>
  
  <p>I get 'error in __connection_block_invoke_2: Connection interrupted' and also... </p>
  
  <pre><code>-(void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
  </code></pre>
  
  <p>..delegate never gets called.</p>
  
  <p>All I am trying to do is modify their code to do live Core Image Filters.</p>