2012-03-03 30 views
8

Tôi đã thử google và stackoverflow nhưng tôi không thể tìm thấy tài liệu chính thức cho các chức năng bắt đầu bằng CVOpenGLESTexture. Tôi có thể thấy họ đến từ video lõi, và tôi biết họ đã được thêm vào iOS 5 nhưng tìm kiếm tài liệu không cung cấp cho tôi bất cứ điều gì.Tài liệu chính thức cho các loại phương thức CVOpenGLESTexture ở đâu?

Tôi đang tìm thông tin về các thông số, những gì họ làm, cách sử dụng chúng, v.v. như trong các khung công tác khác của Apple.

Cho đến giờ tất cả những gì tôi có thể làm là nhấp vào lệnh để xem thông tin nhưng điều này cảm thấy siêu lạ. Hoặc là có một cách để thêm này để nó có thể được hiển thị trên sự giúp đỡ nhanh chóng trên bên phải trên xcode?

Cảm ơn và xin lỗi nếu đó là câu hỏi ngu ngốc.

PD: Hướng dẫn tham chiếu video lõi dường như không giải thích được điều này.

Trả lời

15

Thật không may, thực sự không có bất kỳ tài liệu nào về các chức năng mới này. Điều tốt nhất bạn sẽ tìm thấy ngay bây giờ là trong file CVOpenGLESTextureCache.h tiêu đề, nơi bạn sẽ thấy mô tả khái quát các thông số chức năng:

/*! 
    @function CVOpenGLESTextureCacheCreate 
    @abstract Creates a new Texture Cache. 
    @param  allocator The CFAllocatorRef to use for allocating the cache. May be NULL. 
    @param  cacheAttributes A CFDictionaryRef containing the attributes of the cache itself. May be NULL. 
    @param  eaglContext The OpenGLES 2.0 context into which the texture objects will be created. OpenGLES 1.x contexts are not supported. 
    @param  textureAttributes A CFDictionaryRef containing the attributes to be used for creating the CVOpenGLESTexture objects. May be NULL. 
    @param  cacheOut The newly created texture cache will be placed here 
    @result  Returns kCVReturnSuccess on success 
*/ 
CV_EXPORT CVReturn CVOpenGLESTextureCacheCreate(
        CFAllocatorRef allocator, 
        CFDictionaryRef cacheAttributes, 
        void *eaglContext, 
        CFDictionaryRef textureAttributes, 
        CVOpenGLESTextureCacheRef *cacheOut) __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); 

Các yếu tố khó khăn hơn là những bộ từ điển thuộc tính, mà tiếc là bạn cần để tìm các ví dụ để sử dụng các chức năng này đúng cách. Apple có các ví dụ GLCameraRippleRosyWriter hiển thị cách sử dụng đường dẫn tải lên kết cấu nhanh với định dạng màu nhập của BGRA và YUV. Apple cũng cung cấp ví dụ ChromaKey tại WWDC (có thể vẫn có thể truy cập được cùng với các video) đã chứng minh cách sử dụng các bộ đệm kết cấu này để lấy thông tin từ kết cấu OpenGL ES.

Tôi vừa tải lên kết cấu nhanh này hoạt động trong khung GPUImage của mình (mã nguồn có sẵn tại liên kết đó), vì vậy, tôi sẽ trình bày những gì tôi có thể phân tích trong số này. Trước tiên, tôi tạo bộ nhớ cache kết cấu bằng cách sử dụng mã sau:

CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache); 
if (err) 
{ 
    NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); 
} 

trong đó ngữ cảnh được gọi là EAGLCtext được định cấu hình cho OpenGL ES 2.0.

Tôi sử dụng này để giữ cho khung hình video từ camera trên thiết bị iOS trong bộ nhớ video, và tôi sử dụng đoạn mã sau để làm điều này:

CVPixelBufferLockBaseAddress(cameraFrame, 0); 

CVOpenGLESTextureRef texture = NULL; 
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); 

if (!texture || err) { 
    NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err); 
    return; 
} 

outputTexture = CVOpenGLESTextureGetName(texture); 
glBindTexture(GL_TEXTURE_2D, outputTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

// Do processing work on the texture data here 

CVPixelBufferUnlockBaseAddress(cameraFrame, 0); 

CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0); 
CFRelease(texture); 
outputTexture = 0; 

này tạo ra một CVOpenGLESTextureRef mới, đại diện cho một kết cấu OpenGL ES, từ bộ đệm kết cấu. Kết cấu này dựa trên CVImageBufferRef được máy ảnh truyền vào. Kết cấu đó sau đó được lấy từ CVOpenGLESTextureRef và các tham số thích hợp được thiết lập cho nó (có vẻ như cần thiết trong quá trình xử lý của tôi). Cuối cùng, tôi làm công việc của mình trên texture và dọn dẹp khi tôi hoàn thành.

Quá trình tải lên nhanh này tạo sự khác biệt thực sự trên thiết bị iOS. Nó đã tải lên và xử lý một khung hình duy nhất 640x480 video trên iPhone 4S từ 9,0 ms đến 1,8 ms.

Tôi cũng có heard that this works in reverse, điều này có thể cho phép thay thế glReadPixels() trong một số trường hợp nhất định, nhưng tôi chưa thử điều này.

+0

Nó thực sự là một sự xấu hổ rằng một cách hiệu quả để xử lý hình ảnh không phải là tài liệu rất tốt.Nhưng nhờ những người như bạn ít kinh nghiệm hơn, các nhà phát triển cũng có thể thử sử dụng nó. – Pochi

+0

Bạn có thể lấy bộ đệm kết cấu làm việc cho ảnh cài sẵn không? Tôi không thể tìm thấy bất kỳ thông tin nào trên 'CFDictionaryRef cacheAttributes' cho' CVOpenGLESTextureCacheCreate' – Dex

+0

@Dex - Có, tính năng này hoạt động với cài đặt trước ảnh có cùng cài đặt như tôi đã sử dụng cho khung hình video. Xem khuôn khổ được liên kết ở trên của tôi để biết mã với các tùy chọn tôi đã sử dụng. Một điều thận trọng là trên iPhone 4, máy ảnh có thể chụp các khung lớn hơn kích thước họa tiết tối đa trên thiết bị đó. Những ảnh này không thể được xử lý trực tiếp dưới dạng họa tiết, do đó, một số loại lát gạch sẽ là cần thiết để xử lý chúng. Tôi đang làm việc trên đó. –

2

Apple cuối cùng đã đăng documentation, cách đây hơn một tuần.

+1

Đó không phải là tài liệu. Đó là một người tại Apple sao chép/dán tên phương thức và thêm khoảng trống giữa các từ trường hợp lạc đà. Các bình luận mã nguồn tiêu đề thực sự hữu ích hơn điều này, IME - chúng có nhiều chi tiết hơn! – Adam

Các vấn đề liên quan