zoukankan      html  css  js  c++  java
  • iOS CMSampleBuffer deep copy

    extension CVPixelBuffer {
        func copy() -> CVPixelBuffer {
            precondition(CFGetTypeID(self) == CVPixelBufferGetTypeID(), "copy() cannot be called on a non-CVPixelBuffer")
            
            var _copy : CVPixelBuffer?
            
    //        var BytesAlignment:Int = 4
    //        let CFBytesAlignment = CFNumberCreate(kCFAllocatorDefault, .intType, &BytesAlignment)!
            let attribute:[String:Any] = [kCVPixelBufferMetalCompatibilityKey as String:kCFBooleanTrue]
    //                                      kCVPixelBufferBytesPerRowAlignmentKey as String:CFBytesAlignment
            
            CVPixelBufferCreate(
                kCFAllocatorDefault,
                CVPixelBufferGetWidth(self),
                CVPixelBufferGetHeight(self),
                CVPixelBufferGetPixelFormatType(self),
                attribute as CFDictionary,
                &_copy)
            
            guard let copy = _copy else { fatalError() }
            
            CVPixelBufferLockBaseAddress(self, CVPixelBufferLockFlags.readOnly)
            CVPixelBufferLockBaseAddress(copy, CVPixelBufferLockFlags(rawValue: 0))
            
            for plane in 0..<CVPixelBufferGetPlaneCount(self) {
                let dest = CVPixelBufferGetBaseAddressOfPlane(copy, plane)
                let source = CVPixelBufferGetBaseAddressOfPlane(self, plane)
                let height = CVPixelBufferGetHeightOfPlane(self, plane)
                let bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(self, plane)
                
                let bytesPerRowDst = CVPixelBufferGetBytesPerRowOfPlane(copy, plane)
                
                for h in 0..<height {
                    memcpy(dest?.advanced(by:h*bytesPerRowDst), source?.advanced(by:h*bytesPerRow),  bytesPerRow)
                }
            }
            
            CVPixelBufferUnlockBaseAddress(copy, CVPixelBufferLockFlags(rawValue: 0))
            CVPixelBufferUnlockBaseAddress(self, CVPixelBufferLockFlags.readOnly)
            
            
            return copy
        }
    }

    https://stackoverflow.com/questions/38335365/pulling-data-from-a-cmsamplebuffer-in-order-to-create-a-deep-copy 

    http://blog.csdn.net/fernandowei/article/details/52180840

  • 相关阅读:
    重写、隐藏基类方法(new, override)
    Java FileHandler
    JMS example
    DB Locker
    计算与所有线段都重合的线段数目
    [转载] linux内存 问题
    oracle rownum & rowid mark a good tool
    java Wget Download
    java new way to implement singleton, use enum
    HttpPut Multipart and handle https request.
  • 原文地址:https://www.cnblogs.com/mlj318/p/7478920.html
Copyright © 2011-2022 走看看