2015-12-10 4 views
0

Я пытаюсь захватить выходной кадр камеры и обработать его дальше в контуре GPU. По этой причине наилучшим вариантом является сохранение кадра в качестве текстуры графического процессора. После наследования от QVideoFilterRunnable класс, полученный методом run, QVideoFrame имеет тип, который не равен QAbstractVideoBuffer::GLTextureHandle. Он равен NoHandle, и мне нужно сделать карту/размонтировать и загрузить текстуру вручную на glTexImage, что не очень удобно для производительности. Существуют ли какие-либо параметры управления, которые можно использовать для возврата имени текстуры?Qt iOS: как вернуть QVideoFrame с типом GLTextureHandle из QVideoFilterRunnable

Некоторые примечания:

  • Выглядит хорошо на Android. Возвращается кадр текстуры так это работает как шарм:

    QVideoFrame* input = ...; 
    GLuint texture = input->handle().toUInt(); 
    f->glBindTexture(GL_TEXTURE_2D, texture); 
    
  • Это возможно в общем, есть IOS функция кэша текстур:

    CVPixelBufferRef pixelBuffer = ...; 
    CVOpenGLESTextureCacheCreateTextureFromImage(..., pixelBuffer, ..., &textureRef); 
    texture = CVOpenGLESTextureGetName(textureRef); 
    

ответ

0

CVPixelBufferRef может быть создан вручную (мне нужно использовать map еще):

frame.map(QAbstractVideoBuffer::ReadOnly); 

CVPixelBufferRef x; 
CVPixelBufferCreateWithBytes(
    kCFAllocatorDefault, 
    frame.size().width(), 
    frame.size().height(), 
    kCVPixelFormatType_32BGRA, 
    frame.bits(), 
    frame.bytesPerLine(), 
    nullptr, // releaseCallback 
    nullptr, // releaseRefCon 
    nullptr, // pixelBufferAttributes 
    &x 
); 

используйте значение CVPixelBufferRef указатель для создания текстуры кэша:

CVOpenGLESTextureRef texRef; 
CVOpenGLESTextureCacheCreateTextureFromImage(
    kCFAllocatorDefault, 
    textureCache, 
    x, 
    NULL, // texture attributes 
    GL_TEXTURE_2D, 
    GL_RGBA, // opengl format 
    inputW, 
    inputH, 
    inputPixelFormat, 
    GL_UNSIGNED_BYTE, 
    0, 
    &texRef 
); 

Getting имя текстуры:

inputTexId = CVOpenGLESTextureGetName(texRef);