Утечка памяти при загрузке изображения в текстуру с помощью CVOpenGLESTextureCacheCreateTextureFromImage

Я отладил с помощью инструментов, но я не могу найти его:

    CVPixelBufferRef pixelBuffer;
    CVReturn err = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, IMAGE_WIDTH, IMAGE_HEIGHT, kCVPixelFormatType_32BGRA, _outputFrame.data, 4 * IMAGE_WIDTH, dataReleaseCallback, NULL, NULL, &pixelBuffer);

    if(!pixelBuffer || err) {
      NSLog(@"CVPixelBufferCreateWithBytes failed (error: %d)", err);
      return;
    }

    CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _backgroundTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGBA, IMAGE_WIDTH, IMAGE_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0, &_backgroundTextureRef);
    _backgroundTexture = CVOpenGLESTextureGetName(_backgroundTextureRef);
    [_frameLock unlock];
    glBindTexture(GL_TEXTURE_2D, _backgroundTexture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Затем в методе рисования OpenGL после вызова рисования:

...
CFRelease(_backgroundTextureRef);
_backgroundTextureRef = NULL;
CVOpenGLESTextureCacheFlush(_backgroundTextureCache, 0);

Я попытался освободить буфер пикселей вручную, но затем он не работает в обратном вызове dataReleaseCallback из CVOpenGLESTextureCacheCreateTextureFromImage с EXC_BAD_ACCESS, Я не знаю, что еще могло там протекать.

ОБНОВЛЕНИЕ:

Я закомментировал тело обратного вызова:

inline void dataReleaseCallback(void *releaseRefCon, const void *baseAddress)
{
//  free((void *)baseAddress);
}

И теперь я могу позвонить:

CVPixelBufferRelease(_pixelBuffer);

без каких-либо ошибок и утечка памяти исправлена. Возникает вопрос: какая польза от этого обратного вызова?

0 ответов

Другие вопросы по тегам