Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

YUV2 unter Firemonkey

  Alt 1. Dez 2017, 13:10
Hi,

ich bekomme hier mittels Stream Rohdaten im YUY2 Format umwandelt. Da der Durchsatz relativ hoch ist, wollte ich die Darstellung mittels Pixelshader realisieren. Mein Ziel ist Android und iOS, unter Windows bzw. MacOS nutze ich für die Darstellung ein reines OpenGL Fenster. Dort mache ich das via:

Delphi-Quellcode:
vertexShaderString = 'attribute vec4 position;' + sLineBreak +
    'attribute vec2 texcoord;' + sLineBreak +
    'uniform mat4 modelViewProjectionMatrix;' + sLineBreak +
    'varying vec2 v_texcoord;' + sLineBreak + 'void main()' + sLineBreak + '{' +
    sLineBreak + ' gl_Position = modelViewProjectionMatrix * position;' +
    sLineBreak + ' v_texcoord = texcoord.xy;' + sLineBreak +
    ' gl_FrontColor = gl_Color;' + sLineBreak + '}';

  fragmentShaderString = 'varying vec2 v_texcoord;' + sLineBreak +
    'uniform sampler2D s_texture_y;' + sLineBreak +
    'uniform sampler2D s_texture_u;' + sLineBreak +
    'uniform sampler2D s_texture_v;' + sLineBreak + 'void main() ' + sLineBreak
    + '{' + sLineBreak + ' float y = texture2D(s_texture_y, v_texcoord).r;' +
    sLineBreak + ' float u = texture2D(s_texture_u, v_texcoord).r - 0.5;' +
    sLineBreak + ' float v = texture2D(s_texture_v, v_texcoord).r - 0.5;' +
    sLineBreak + ' float r = y + 1.402 * v;' + sLineBreak +
    ' float g = y - 0.344 * u - 0.714 * v;' + sLineBreak +
    ' float b = y + 1.772 * u;' + sLineBreak +
    ' gl_FragColor = vec4(r,g,b,1.0) * gl_Color;' + sLineBreak + '}';

...

    glUseProgram(FProgram);
    glUniformMatrix4fv(FuniformMatrix, 1, GLboolean(0), @FModelviewProj);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, Texture.Handle);

    glUniform1i(FUniformSamplers[0], 0);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, Texture.UHandle);
    glUniform1i(FUniformSamplers[1], 1);

    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, Texture.VHandle);
    glUniform1i(FUniformSamplers[2], 2);
Ich habe schon versucht einen Filter zu schreiben, aber ich scheitere daran dass Firemonkey außer RGBA Bitmaps ja überhaupt nichts erlaubt. Jetzt den Code wild zu patchen widerstrebt mir, denn das bei jedem Update machen zu müssen. Da wird man doch blöde.

Hat jemand vielleicht eine Idee?
  Mit Zitat antworten Zitat