2011-12-16 2 views
3

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

ответ

5

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

5

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

См. Мой ответ на вопрос YUV to RGBA on Apple A4, should I use shaders or NEON? здесь, на StackOverflow.

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

1

Вы ищете решение для приложения 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); 
    } 
} 

Если вы ищете для мобильных устройств, то я могу предоставить другим в.

Смежные вопросы