GPUImageVideoCamera(GPUImageStillCamera)でsampleBufferの向きを正しくする

2016-11-8 GPUImageStillCameraにも対応

#そもそも
GPUImageVideoCameraなどで各フレームで画像処理する時は**- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer**メソッドに処理を書くが、そこで取得されるsampleBufferが横向きになる。
そのあと顔検出して目とか鼻とか口とかの座標を取得する処理が非常にやりづらい。
いちいち回転させるのも手間。
もとから縦向きでミラーも聞いてちゃんと信号がきてよ！
ということで、そのやりかた。

#ダメなソース
・以下のようにやっても画像の向きが正しく取れない

```objc

-(void)setupCamera{
//GPUImageVideoCameraかGPUImageStillCamera選んでね
GPUImageStillCamera *gpuCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:_devicePosition];
  //GPUImageVideoCamera *gpuCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:_devicePosition];
  gpuCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
  gpuCamera.horizontallyMirrorFrontFacingCamera = YES;
  gpuCamera.horizontallyMirrorRearFacingCamera = NO;
  gpuCamera.delegate = self;
}



//delegateメソッド,各フレームにおける処理
- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer {
  CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
  CIImage* ciimage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments];
  CFRelease(attachments);

  // ciimage <--------------------- 横向きで取得されちゃったよ
}
```

#修正したソース
・なんかこうやったらうまくいった

```objc

-(void)setupCamera{
//GPUImageVideoCameraかGPUImageStillCamera選んでね
GPUImageStillCamera *gpuCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:_devicePosition];
  //GPUImageVideoCamera *gpuCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:_devicePosition];
  //  gpuCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
  //  gpuCamera.horizontallyMirrorFrontFacingCamera = YES;
  //  gpuCamera.horizontallyMirrorRearFacingCamera = NO;
  gpuCamera.delegate = self;
  
  
   //----------------ここから--------------
  // カメラの向きとかを設定する
  //gpuCamera.outputImageOrientationで向きを指定すると
  //- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBufferで正しい向きがとれない
  AVCaptureSession *session = gpuCamera.captureSession;
  [session beginConfiguration];
  {
    for(AVCaptureOutput *output in session.outputs){
      for(AVCaptureConnection *connection in output.connections){
        if(connection.isVideoOrientationSupported){
          for(AVCaptureInputPort *port in connection.inputPorts){
            if([port.mediaType isEqual:AVMediaTypeVideo]){
              connection.videoOrientation = AVCaptureVideoOrientationPortrait;
              connection.videoMirrored = _devicePosition == AVCaptureDevicePositionFront;
            }
          }
        }
      }
    }
  }
  [session commitConfiguration];
   //----------------ここまで--------------
}


//delegateメソッド,各フレームにおける処理
- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer {
  CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
  CIImage* ciimage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments];
  CFRelease(attachments);

  // ciimage <--------------------- 縦向きでミラーも効いたよ！！！
}
```

・表示、撮影、保存など今のところ問題なし