CCD 카메라에서 캡처 한 YUV 프레임으로이 작업을 수행했습니다. 유감스럽게도 다양한 YUV 형식이 있습니다. Apple이 GL_YCBCR_422_APPLE
텍스처 형식으로 사용하는 것이 기술적으로 2VUY422라고 생각합니다.2VUY422에 IIDC 파이어 와이어 카메라에 의해 생성 된 YUV422 프레임에서 이미지를 변환하려면, 나는 다음과 같은 사용했습니다하십시오 YUV 비디오 소스의 효율적인 표시를위한
void yuv422_2vuy422(const unsigned char *theYUVFrame, unsigned char *the422Frame, const unsigned int width, const unsigned int height)
{
int i =0, j=0;
unsigned int numPixels = width * height;
unsigned int totalNumberOfPasses = numPixels * 2;
register unsigned int y0, y1, y2, y3, u0, u2, v0, v2;
while (i < (totalNumberOfPasses))
{
u0 = theYUVFrame[i++]-128;
y0 = theYUVFrame[i++];
v0 = theYUVFrame[i++]-128;
y1 = theYUVFrame[i++];
u2 = theYUVFrame[i++]-128;
y2 = theYUVFrame[i++];
v2 = theYUVFrame[i++]-128;
y3 = theYUVFrame[i++];
// U0 Y0 V0 Y1 U2 Y2 V2 Y3
// Remap the values to 2VUY (YUYS?) (Y422) colorspace for OpenGL
// Y0 U Y1 V Y2 U Y3 V
// IIDC cameras are full-range y=[0..255], u,v=[-127..+127], where display is "video range" (y=[16..240], u,v=[16..236])
the422Frame[j++] = ((y0 * 240)/255 + 16);
the422Frame[j++] = ((u0 * 236)/255 + 128);
the422Frame[j++] = ((y1 * 240)/255 + 16);
the422Frame[j++] = ((v0 * 236)/255 + 128);
the422Frame[j++] = ((y2 * 240)/255 + 16);
the422Frame[j++] = ((u2 * 236)/255 + 128);
the422Frame[j++] = ((y3 * 240)/255 + 16);
the422Frame[j++] = ((v2 * 236)/255 + 128);
}
}
, 당신은 당신이 할 수있는, Apple's client storage extension을 사용하실 수 있습니다 다음과 같은 것을 사용하여 설정 :이 수
glEnable(GL_TEXTURE_RECTANGLE_EXT);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1);
glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, videoImageWidth * videoImageHeight * 2, videoTexture);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , GL_STORAGE_SHARED_APPLE);
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, videoImageWidth, videoImageHeight, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, videoTexture);
신속하게 화면에 표시되는 각 프레임 전에 클라이언트 측 비디오 질감에 저장된 데이터를 변경합니다.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glViewport(0, 0, [self frame].size.width, [self frame].size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
NSRect bounds = NSRectFromCGRect([self bounds]);
glOrtho((GLfloat)NSMinX(bounds), (GLfloat)NSMaxX(bounds), (GLfloat)NSMinY(bounds), (GLfloat)NSMaxY(bounds), -1.0, 1.0);
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1);
glTexSubImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, videoImageWidth, videoImageHeight, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, videoTexture);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, videoImageHeight);
glTexCoord2f(0.0f, videoImageHeight);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(videoImageWidth, videoImageHeight);
glVertex2f(videoImageWidth, 0.0f);
glTexCoord2f(videoImageWidth, 0.0f);
glVertex2f(videoImageWidth, videoImageHeight);
glEnd();
덕분에 많은 정보 아담 내가 정말 감사에 대한 :
당신은 다음과 같은 코드를 사용할 수 있습니다, 그리려면. 이제 하드 디스크에서 원시 데이터 파일을 추출하는 방법을 알려주시겠습니까? NSOpenPanel에 익숙하지만 데이터 파일 경로를 추출하는 데 사용할 수 있습니다. 그러나 파일 경로를 사용하고 YUV 파일을 응용 프로그램에로드하는 방법은 무엇입니까? – ReachConnection파일에 픽셀 만 포함되었다고 가정하면 NSData 또는 NSFileHandle을 사용하고 모든 것을 읽을 수 있습니다. 파일에 크기 정보와 같은 메타 데이터가 포함되어 있으면 표준 C 포인터 및/또는 구조 연산자를 사용하여 해석해야합니다. –
이 대답은 잘못되었습니다. MacOS 10.2 이상부터 모든 Apple 시스템은 YUV 데이터를 직접로드하고 표시 할 수있는 OpenGL 확장을 지원합니다. 자세한 내용은 "GL_YCBCR_422_APPLE"을 (를) 검색하십시오. 데이터가 어딘가에 (소프트웨어 드라이버, 하드웨어의 GPU 등) 변환되는지 여부는이 확장 프로그램을 사용할 때 귀하의 비즈니스가 아닙니다. (GPU가 변환 할 때, 나를 믿으십시오.) 이상 1000 % 이상) – Mecki