为什么CVPixelBufferCreateWithPlanarBytes不执行内存释放回调?

时间:2013-12-31 00:35:19

标签: ios macos core-video

我使用CVPixelBufferCreateWithPlanarBytes创建一个缓冲区并将回调函数作为参数传递:

CVPixelBufferCreateWithPlanarBytes(NULL, imf.iWidth, imf.iHeight, pixelFormat, NULL, 0, 3, (void**)ppPlaneData, nPlaneWidth, nPlaneHeight, nPlaneBytesPerRow, LAVSinkPixelBufferReleasePlanarBytes, ppPlaneData, NULL, &buffer)

出于某种原因,在我使用CVPixelBufferRelease(缓冲区)释放缓冲区后,我的回调LAVSinkPixelBufferReleasePlanarBytes未被调用。

但是,如果我使用CVPixelBufferCreateWithBytes函数,则会正确调用不同的回调,但我想使用平面数据版本。

更大的代码段:

void LAVSinkPixelBufferReleasePlanarBytes(void* releaseRefCon, const void* dataPtr, size_t dataSize, size_t numberOfPlanes, const void* planeAddresses[])
{
  // This is never called
}

... ...

 size_t nPlaneSize[3];
 uint8_t** ppPlaneData = new uint8_t*[3];
 for (int i = 0; i < 3; i++) {
    nPlaneSize[i] = nPlaneBytesPerRow[i] * nPlaneHeight[i];
    ppPlaneData[i] = new uint8_t[nPlaneSize[i]];
    memcpy(ppPlaneData[i], ppPlaneAddress[i], nPlaneSize[i]);
 }

 if (CVPixelBufferCreateWithPlanarBytes(NULL, imf.iWidth, imf.iHeight, pixelFormat, NULL, 0, 3, (void**)ppPlaneData, nPlaneWidth, nPlaneHeight, nPlaneBytesPerRow, LAVSinkPixelBufferReleasePlanarBytes, ppPlaneData, NULL, &buffer) != kCVReturnSuccess) break;

 const BOOL result = [adaptor appendPixelBuffer:buffer withPresentationTime:timestamp];
 CVPixelBufferRelease(buffer);

我发现有人用更清晰的示例代码询问同一个问题: http://prod.lists.apple.com/archives/cocoa-dev/2013/Nov/msg00177.html

但不幸的是没有答案。

0 个答案:

没有答案