2017-10-04 10 views
0

実際にはiPad ProのiOS10で画像処理を行っています。 私は画像処理のスピードをテストするために小さなSwift3画像処理アプリケーションを書いています。 私のデコーダは、〜33ms(約30FPS)の新しいフレームを送信します。追加のバッファリングを行わずにiOSのCoreImageフィルタで処理する必要があります。すべての〜33msには、次の関数が呼び出されます。iOSのUnsafeMutableRawPointerのGPUフィルタ

func newFrame(_ player: MediaPlayer!, buffer: UnsafeMutableRawPointer!, 
       size: Int32, format_fourcc: UnsafeMutablePointer<Int8>!, 
       width: Int32, height: Int32, bytes_per_row: Int32, 
       pts: Int, will_show: Int32) -> Int32 { 

    if String(cString: format_fourcc) == "BGRA" && will_show == 1 { 
     // START 
     var pixelBuffer: CVPixelBuffer? = nil 
     let ret = CVPixelBufferCreateWithBytes(kCFAllocatorSystemDefault, 
               Int(width), 
               Int(height), 
               kCVPixelFormatType_32BGRA, 
               buffer, 
               Int(bytes_per_row), 
               { (releaseContext: 
                UnsafeMutableRawPointer?, 
                baseAddr: 
                UnsafeRawPointer?) ->() in 
               // Do not need to be used 
               // since created CVPixelBuffer 
               // will be destroyed 
               // in scope of this function 
               // automatically 
               }, 
               buffer, 
               nil, 
               &pixelBuffer) 
     // END_1 

     if ret != kCVReturnSuccess { 
      NSLog("New Frame: Can't create the buffer") 
      return -1 
     } 

     if let pBuff = pixelBuffer { 
      let img = CIImage(cvPixelBuffer: pBuff) 
         .applyingFilter("CIColorInvert", withInputParameters: [:]) 
     } 
     // END_2 
    } 
    return 0 
} 

私は、次のいずれかの問題を解決する必要があります。バックUnsafeMutableRawPointerバッファメモリへCIImageのIMG生のメモリデータをコピーする

  • が何らかの形で直接

//間のコードブロックは、// END_2必要性を開始CVPixelBuffer pixelBuffer又はUnsafeMutableRawPointerバッファにGPU画像フィルタを適用する5ミリ秒未満で実行します。

は、私が知っている://間のコードが1.3ms未満で// END_1の実行を開始

ご意見をお寄せください。

敬具、 アレックス

答えて

0

私は一時的な解決策が見つかりました:

1)あなたのビューでCIContextを作成します。

imgContext = CIContext(eaglContext: eaglContext!) 

2)ポインタのメモリにフィルタCIImageを描画するためにコンテキストを使用します:

imgContext.render(img, 
         toBitmap: buffer, 
         rowBytes: Int(bytes_per_row), 
         bounds: CGRect(x: 0, 
            y: 0, 
            width: Int(width), 
            height: Int(height)), 
         format: kCIFormatBGRA8, 
         colorSpace: CGColorSpaceCreateDeviceRGB()) 

このソリューションは、 iPad CPUのSIMD命令。しかし、コピー操作のCPU使用率は30%を超えています。この30%はプログラムのCPU使用率に加算されます。

おそらく誰かが、GPUがCIFilterの後にUnsafeMutableRawPointerに直接書き込む方法を知っていますか?