Estou tentando converter YV12 em RGB usando o seguinte sombreador de fragmento:
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);
}
Abaixo está a imagem original seguida pela imagem convertida. Com base na saída, você pode determinar onde eu devo procurar para determinar o que está causando a decodificação incorreta?
image-processing
color
Erro 454
fonte
fonte
Respostas:
A imagem de saída possui linhas deslocadas uma contra a outra, o que geralmente ocorre devido à distância incorreta [byte] entre as linhas (passo). Ou seja, a matemática da conversão de cores talvez esteja correta, no entanto, você está pegando o pixel de origem da posição errada e / ou colocando o pixel de saída no lugar errado.
Por motivos de desempenho, as imagens YV12 podem estar usando avanços estendidos no hardware para facilitar o desempenho. Por exemplo, a imagem YV12 de 320x240 pode ter um passo de 512 e isso significa que o buffer de dados é um espaço de dados de 512x240 (512x240 bytes para Y, seguido por duas matrizes 256x120 para V e U) onde a imagem de carga útil à esquerda e lá é preenchimento invisível à direita.
fonte
Não sei nada sobre programação de shader fragment, mas para mim parece que o tamanho da palavra da entrada e da saída varia. E para mim, parece que você não presta atenção em descompactar e reembalar os bytes YV12 .
fonte