2011-12-09 17 views
9

Tôi đang viết khung trình phát đa phương tiện cho Apple TV, sử dụng OpenGL ES và ffmpeg. Chuyển đổi sang RGBA là bắt buộc để hiển thị trên OpenGL ES, chuyển đổi mềm bằng swscale là không thể chịu được chậm, vì vậy sử dụng thông tin trên internet tôi đưa ra hai ý tưởng: sử dụng neon (như here) hoặc sử dụng shaders fragment và GL_LUMINANCE và GL_LUMINANCE_ALPHA.YUV đến RGBA trên Apple A4, tôi có nên sử dụng trình đổ bóng hoặc NEON không?

Như tôi biết hầu như không có gì về OpenGL, tùy chọn thứ hai vẫn không hoạt động :)

Bạn có thể cho tôi bất kỳ gợi ý làm thế nào để tiến hành? Cảm ơn bạn trước.

Trả lời

19

Nó chắc chắn là đáng học tập OpenGL ES2.0 shaders:

  1. Bạn có thể cân bằng tải giữa GPU và CPU (ví dụ giải mã video của khung tiếp theo trong khi GPU renders khung hiện hành).
  2. Các khung hình video cần phải đi tới GPU trong mọi trường hợp: sử dụng YCbCr giúp bạn tiết kiệm 25% băng thông bus nếu video của bạn có độ phân giải mẫu là 4: 2: 0.
  3. Bạn nhận được 4: 2: 0 chrominance up-lấy mẫu miễn phí, với phần cứng nội suy GPU. (Trình đổ bóng của bạn nên được cấu hình để sử dụng cùng tọa độ đỉnh cho cả các họa tiết YC{b,r}, trong đó kéo dài kết cấu sắc độ ra ngoài cùng một khu vực.)
  4. Khi kết cấu iOS5 đẩy YCbCr lên nhanh (không sao chép dữ liệu hoặc swizzling) với bộ nhớ cache kết cấu (xem các chức năng API CVOpenGLESTextureCache*). Bạn sẽ tiết kiệm được 1-2 bản sao dữ liệu so với NEON.

Tôi đang sử dụng các kỹ thuật này để có hiệu quả tuyệt vời in my super-fast iPhone camera app, SnappyCam.

Bạn đang đi đúng hướng để triển khai: sử dụng kết cấu GL_LUMINANCE cho YGL_LUMINANCE_ALPHA nếu số CbCr của bạn được xen kẽ. Nếu không, hãy sử dụng ba họa tiết GL_LUMINANCE nếu tất cả các thành phần YCbCr của bạn không được xen kẽ.

Tạo hai textures cho 4: 2: 0 bi-phẳng YCbCr (nơi CbCr là xen kẽ) là đơn giản:

glBindTexture(GL_TEXTURE_2D, texture_y); 
    glTexImage2D(
     GL_TEXTURE_2D, 
     0, 
     GL_LUMINANCE,  // Texture format (8bit) 
     width, 
     height, 
     0,     // No border 
     GL_LUMINANCE,  // Source format (8bit) 
     GL_UNSIGNED_BYTE, // Source data format 
     NULL 
    ); 
    glBindTexture(GL_TEXTURE_2D, texture_cbcr); 
    glTexImage2D(
     GL_TEXTURE_2D, 
     0, 
     GL_LUMINANCE_ALPHA, // Texture format (16-bit) 
     width/2, 
     height/2, 
     0,     // No border 
     GL_LUMINANCE_ALPHA, // Source format (16-bits) 
     GL_UNSIGNED_BYTE, // Source data format 
     NULL 
    ); 

nơi sau đó bạn sẽ sử dụng glTexSubImage2D() hoặc kết cấu bộ nhớ cache iOS5 để cập nhật những kết cấu.

Tôi cũng khuyên bạn nên sử dụng 2D varying kéo dài không gian tọa độ kết cấu (x: [0,1], y: [0,1]) để tránh bất kỳ kết cấu phụ thuộc nào đọc trong trình đổ bóng phân đoạn của bạn. Kết quả cuối cùng là siêu nhanh và không tải GPU theo kinh nghiệm của tôi.

+0

Cảm ơn bạn rất nhiều, tôi đã thực sự làm mọi thứ gần giống như bạn mô tả, nhưng tôi không biết về các tính năng mới trong iOS 5. Gonna hãy dùng thử. – pawlowski

+0

Cảm ơn câu trả lời của bạn. Tôi có thể tìm hiểu thêm về định dạng pixel giải mã gốc trên iOS (để đáp ứng với pt # 2) của bạn ở đâu? – fionbio

0

Chuyển đổi YUV sang RGB bằng NEON rất chậm. Sử dụng trình đổ bóng để tải xuống GPU.

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