2017-10-04 5 views
0

Je travaille en fait avec traitement d'image sur iOS10 avec iPad Pro. J'ai écrit une petite application de traitement d'image Swift3 pour tester la vitesse du traitement de l'image. Mon décodeur envoie tous les ~ 33ms (environ 30 FPS) nouveau cadre, que je dois traiter avec des filtres CoreImage d'iOS sans mise en mémoire tampon supplémentaire. Tous les ~ 33ms la fonction suivante seront appelés:Filtres GPU sur UnsafeMutableRawPointer dans iOS

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 
} 

J'ai besoin de résoudre l'un des problèmes suivants:

  • Copie CIImage img données de la mémoire brutes Retour à UnsafeMutableRawPointer tampon mémoire .
  • appliquent une certaine façon filtre d'image GPU à CVPixelBuffer pixelBuffer ou tampon UnsafeMutableRawPointer directement

Le bloc de code entre // Ouverture et // END_2 doivent être exécutés en moins de 5 ms.

Ce que je sais:

  • Le code entre // Ouverture et // END_1 fonctionne en moins de 1.3ms.

S'il vous plaît aider avec vos idées.

Meilleures salutations, Alex

Répondre

0

J'ai trouvé une solution temporaire:

1) Créer CIContext dans votre vue:

imgContext = CIContext(eaglContext: eaglContext!) 

2) Utilisez un contexte pour attirer CIImage filtré à la mémoire du pointeur :

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()) 

Cette solution fonctionne bien car elle utilise Instructions SIMD du CPU iPad. Mais l'utilisation du processeur uniquement pour l'opération de copie est trop élevée ~ 30%. Ce 30% sera ajouté à l'utilisation du processeur de votre programme.

Probablement quelqu'un a une meilleure idée de laisser le GPU écrire directement à UnsafeMutableRawPointer après CIFilter?