2012-11-22 4 views
0

스위 즐링을 필요로하지 않는 방식으로 2vuy 비평면 데이터를 GPU에 푸시하는 효율적인 방법을 아는 사람이 있습니까?YUV 텍스처 데이터를 OpenGL의 GPU에 푸시하는 가장 효율적인 프로세스는 무엇입니까?

h264 비디오 파일에서 원시 2vuy 데이터를 가져 와서 OpenGL 객체에 매핑하는 텍스처에 성공적으로로드하고 있습니다. glgProcessPixelsWithProcessor에 코드를 사용하는 데 상당한 시간이 걸리는 것으로 나타났습니다. ,

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_YCBCR_422_APPLE, 
    GL_UNSIGNED_SHORT_8_8_APPLE, data); 

애플이 GL_YCBCR_422_APPLE 자사의 OpenGL 가이드 말한다 "허용"성능 (P103)을 제공하지만, 그

참고 : 내 glTexImage2D 호출은 다음과 같은 데이터가 될 만 필요한 경우 swizzled, glgProcessPixels은 데이터가 혼란 스러울 필요가없는 것처럼 빠르지 만 합리적으로 빠르게 스윕을 수행합니다. 그러나 비 네이티브 데이터 형식은 한 번에 한 바이트 씩 변환되며 피하려면 가장 좋은 성능 비용이 발생합니다.

CPU에서 수행되는 내부 형식 변환이 있다고 가정합니다. 나는 다른 스레드에서 glgProcessPixels이 블록 메소드를 실행하고 있다는 것을 알아 차렸다.

내 경로가 가장 효율적입니까? 그렇지 않다면 무엇입니까?

+3

데스크톱 OpenGL 또는 OpenGL ES에 대해 질문합니까? –

답변

4

코드는 현재 Apple의 확장에 따라 다릅니다. 나는 내부에서 무슨 일이 일어 났는지 말할 수 없다.

그러나 내가 제안하는 것은 각 텍스처가 색상 평면 중 하나를 수신하는 정확히 하나의 채널이있는 3 개의 2D 텍스처를 만드는 것입니다. 독립적 인 텍스처를 사용하면 채도 서브 샘플링 (422)을보다 간단하게 지원할 수 있습니다.

셰이더에서는 색 공간 변환을 수행합니다. 수학을 적을 때 XYZ 같은 접촉 색상 공간을 통해 이렇게하면 출력 장치의 색상 프로파일을 고려할 수 있습니다. ICC 프로파일은 XYZ 색상 공간 좌표에서 장치 색상 공간 (RGB) 좌표로의 변환 데이터를 제공합니다.

+0

OSX CVPixelBufferRef의 기본 주소를 데이터로 전달합니다. 프레임을 성공적으로 볼 수 있습니다. 나는 가능한 한 간단하게 2vuy 버퍼를 전달하려고합니다. 나는 여러 텍스처를 고려했으며, 2vuy를 3 개의 평면으로 분할하는 것이 OSX OpenGL이 수행하는 오프라인 변환보다 빠르다 고 가정합니다. – kernelK

+0

내가 생각하는 2vuy 버퍼는 U Y0 V Y2 (또는 cb Y0 cr Y1)입니다 (Apple 웹 게시 https://developer.apple.com/quicktime/icefloe/dispatch019.html에 따라). 그래서 이론적으로는 버퍼를 반복하면서 다른 모든 바이트를 잡고 흑백 버퍼를 가질 수 있습니다. 텍스처에 데이터 소스로 전달할 수 있습니다. 옳은? – kernelK

+0

Y 데이터 버퍼를 만들고 'glTexImage2D (GL_TEXTURE_2D, 0, GL_RED, 너비, 높이, 0, GL_RED, GL_UNSIGNED_BYTE, yDATA)'로 전달했습니다. 이론적으로는 쉐이더에서 빨간색 구성 요소에 액세스 할 수 있어야하지만 모든 것이 검은 색으로 표시됩니다. – kernelK

관련 문제