GPUImage считывает видео в формате ITU_R_601_4, не поддерживая результаты FastTextureUpload в буфере разделенного изображения - PullRequest
0 голосов
/ 30 мая 2019

Мой проект использует платформу GPUImage для обработки видео.Поскольку я использую несколько кадровых буферов для обработки изображения, я обнаружил, что GPUImageContext supportFastTextureUpload потребляет гораздо больше памяти, чем не использует его.(В видео 720p 15s, SupportFastTextureUpload потребляет до 500M, а не только 200M.)Он не может правильно обрабатывать различные форматы видео.

Дорожка актива с CVImageBufferYCbCrMatrix ITU_R_709_2 в порядке.

Дорожка актива с CVImageBufferYCbCrMatrix ITU_R_601_4 -> результирующее изображение разрывается.

*дорожка с formatName 'avc1' -> результат разрывается.

supportFastTextureUpload может обрабатывать их правильно, но я не могу избежать давления памяти.

Почему supportFastTextureUpload = false не может правильно прочитать другой видеокадр?

Или как решить проблему с памятью supportFastTextureUpload = true.


, если SupportFastTextureUploadустановлено в true.GPUImage использует CVOpenGLESTextureCacheCreateTextureFromImage для выделения двух текстур (luminanceTexture и chrominanceTexture), затем использует convertYUVToRGBOutput для их отрисовки в буфере кадра.

, если для SupportFastTextureUpload задано значение false.GPUImage fetchFramebuffer из кэша буфера кадров и привязка видеокадра непосредственно к текстуре буфера кадров.

//key codes of supportsFastTextureUpload set to true:

glActiveTexture(GL_TEXTURE4);

CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE, bufferWidth, bufferHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &luminanceTextureRef);

luminanceTexture = CVOpenGLESTextureGetName(luminanceTextureRef);

glBindTexture(GL_TEXTURE_2D, luminanceTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glActiveTexture(GL_TEXTURE5);

CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, [[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], movieFrame, NULL, GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, bufferWidth/2, bufferHeight/2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &chrominanceTextureRef);

chrominanceTexture = CVOpenGLESTextureGetName(chrominanceTextureRef);

glBindTexture(GL_TEXTURE_2D, chrominanceTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

[self convertYUVToRGBOutput];




//key codes of supportsFastTextureUpload set to false:
outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:CGSizeMake(bufferWidth, bufferHeight) textureOptions:self.outputTextureOptions onlyTexture:YES];

glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]);
// Using BGRA extension to pull in video frame data directly
glTexImage2D(GL_TEXTURE_2D,
                 0,
                 self.outputTextureOptions.internalFormat,
                 bufferWidth,
                 bufferHeight,
                 0,
                 self.outputTextureOptions.format,
                 self.outputTextureOptions.type,
                 CVPixelBufferGetBaseAddress(movieFrame));
...