YV12 sang RGB - Điều gì sai với thuật toán của tôi?


8

Tôi đang cố gắng chuyển đổi YV12 sang RGB bằng cách sử dụng trình đổ bóng đoạn sau:

precision mediump float;
uniform sampler2D tex0, tex1, tex2;
varying vec2 v_texCoord;

void main(void) {
    float r, g, b, y, u, v;
    y = texture2D(tex0, v_texCoord).x;
    u = texture2D(tex1, v_texCoord).x;
    v = texture2D(tex2, v_texCoord).x;

    y = 1.1643 * (y - 0.0625);
    u = u - 0.5;
    v = v - 0.5;

    r = y + 1.5958 * v;
    g = y - 0.39173 * u - 0.81290 * v;
    b = y + 2.017 * u;

    gl_FragColor = vec4(r, g, b, 1.0);
}

Dưới đây là hình ảnh gốc theo sau là hình ảnh được chuyển đổi. Dựa trên đầu ra, bạn có thể xác định nơi tôi có thể tìm để xác định điều gì gây ra giải mã không đúng?

Nguồn Hình ảnh giải mã


Như đã nói bởi những người trả lời đầu tiên, chắc chắn có vấn đề với số lượng byte trên mỗi dòng. Tôi tự hỏi một điều khác. YV12 đã ghép các kênh U và V. Làm thế nào để bạn quản lý thay đổi kích thước này với shader của bạn? Các kích thước của kết cấu của bạn là gì? Bạn có để OpenGL xử lý việc này không?
Stéphane Péchard

Trong vòng rút thăm, dữ liệu hình ảnh được đưa cho tôi trong một mảng 3 phần tử trong đó thứ tự luôn là YUV (bất kể YV12 hay YUV420p, v.v.). Tôi sử dụng toàn bộ chiều rộng / chiều cao cho phần tử Y và dịch chuyển chiều rộng / chiều cao sang phải 1 (chia cho 2) cho các phần tử UV. Những kết cấu này sau đó được liên kết với shader xử lý phần còn lại. Kích thước họa tiết mà tôi đã làm việc thường là 1280x720.
Lỗi 454

Câu trả lời:


5

Hình ảnh đầu ra có các dòng thay đổi so với các dòng khác, thường là do khoảng cách [byte] không chính xác giữa các dòng (sải chân). Nghĩa là, phép toán chuyển đổi màu có lẽ đúng, tuy nhiên bạn đang lấy pixel nguồn từ vị trí sai và / hoặc đặt pixel đầu ra vào sai vị trí.

Vì lý do hiệu suất, hình ảnh YV12 có thể sử dụng các bước mở rộng trong phần cứng để tạo thuận lợi cho hiệu suất. Ví dụ: hình ảnh 320x240 YV12 có thể có sải chân 512 và điều này có nghĩa là bộ đệm dữ liệu là không gian dữ liệu 512x240 (512x240 byte cho Y, tiếp theo là hai mảng 256x120 cho V và U) trong đó hình ảnh tải trọng ở bên trái và ở đó là phần đệm vô hình bên phải.


Tôi thấy rằng tôi không kế toán cho bước tiến. Tôi sẽ thực hiện điều này khi tôi có thể và cập nhật câu hỏi một khi tôi có thể xác minh xem đây có thực sự là vấn đề không.
Lỗi 454

Cuối cùng, sải chân là câu trả lời. Đó là điều duy nhất tôi thay đổi và bây giờ mọi thứ đều hoạt động. Mắt tuyệt vời!
Lỗi 454

1

Tôi không biết gì về lập trình shader mảnh, nhưng với tôi có vẻ như kích thước từ của đầu vào và đầu ra khác nhau. Và đối với tôi có vẻ như, bạn không chú ý đến việc giải nén và đóng gói lại các byte YV12 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.