Как отобразить данные формата YUV без преобразования RGB в OpenGL ES? - PullRequest
3 голосов
/ 16 декабря 2011

Я изучаю OpenGL ES для iOS. Интересно, что данные формата YUV могут отображаться без преобразования RGB. В большинстве, данные yuv должны конвертировать RGB для отображения. Но процесс конвертирования очень медленный, тогда это не отображается гладко. Итак, я хотел бы попытаться отобразить данные YUV без преобразования в RGB. Является ли это возможным? Если возможно, что я могу сделать? Пожалуйста, позвольте мне дать совет.

Ответы [ 3 ]

5 голосов
/ 18 февраля 2012

Вы можете сделать это очень легко, используя шейдеры OpenGL ES 2.0. Я использую эту технику для своего суперскоростного приложения для iOS-камеры SnappyCam . Фрагментный шейдер будет выполнять умножение матриц, чтобы перенести вас с YCbCr ("YUV") на RGB. Вы можете использовать каждый канал {Y, Cb, Cr} в отдельной текстуре GL_LUMINANCE или комбинировать текстуры {Cb, Cr} вместе, используя текстуру GL_LUMINANCE_ALPHA, если ваши данные цветности уже чередуются (Apple называет это двухплоскостным форматом).

См. Мой соответствующий ответ на вопрос YUV to RGBA на Apple A4, использовать шейдеры или NEON? здесь, в StackOverflow.

Вы также можете сделать это, используя конвейер фиксированной визуализации ES 1.1, но я не пробовал. Я хотел бы взглянуть на функции смешивания текстур, например, приведено на этой вики-странице OpenGL Combiners.

5 голосов
/ 08 февраля 2012

Я думаю, что в OpenGL ES невозможно отобразить данные YUV без преобразования в данные RGB.

1 голос
/ 28 октября 2015

Если вы ищете решение для IOS, приложения для iPhone, то есть решение для этого.

Это способ конвертации CMSampleBufferRef в UIImage , когда тип пикселя видео установлен в kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

-(UIImage *) imageFromSamplePlanerPixelBuffer:(CMSampleBufferRef) sampleBuffer{

    @autoreleasepool {
        // Get a CMSampleBuffer's Core Video image buffer for the media data
        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        // Lock the base address of the pixel buffer
        CVPixelBufferLockBaseAddress(imageBuffer, 0);

        // Get the number of bytes per row for the plane pixel buffer
        void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);

        // Get the number of bytes per row for the plane pixel buffer
        size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
        // Get the pixel buffer width and height
        size_t width = CVPixelBufferGetWidth(imageBuffer);
        size_t height = CVPixelBufferGetHeight(imageBuffer);

        // Create a device-dependent gray color space
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

        // Create a bitmap graphics context with the sample buffer data
        CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
                                                     bytesPerRow, colorSpace, kCGImageAlphaNone);
        // Create a Quartz image from the pixel data in the bitmap graphics context
        CGImageRef quartzImage = CGBitmapContextCreateImage(context);
        // Unlock the pixel buffer
        CVPixelBufferUnlockBaseAddress(imageBuffer,0);

        // Free up the context and color space
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);

        // Create an image object from the Quartz image
        UIImage *image = [UIImage imageWithCGImage:quartzImage];

        // Release the Quartz image
        CGImageRelease(quartzImage);

        return (image);
    }
}
youищут мобильные устройства, тогда я могу предоставить другие.
...