2012-05-12 13 views
0

現在、私はFFMPEGを使ってビデオプレーヤーを開発しています。 私はYUV420PをShaderでRGBに変換しようとしていますが、パフォーマンスが低下するため、正常に動作することがわかります。この問題は、イメージサイズを変更しようとすると発生します。YUV to RGB by Shader on iPhone

ケース1. YUVからRGBに最適です。イメージはTexture Boundsに正確には適合しません。 たとえば、640x360ビデオを再生すると、右側(640-512)の部分が切り取られ、下側(512-360)は緑色の四角形で埋められます。

FRAME_X=512; //This is texture size 
FRAME_Y=512; 

    avpicture_fill((AVPicture *) f, [currentVideoBuffer.data mutableBytes], 
       enc->pix_fmt, 
       FRAME_X, FRAME_Y); 

    av_picture_copy((AVPicture *) f, (AVPicture *) avFrame, 
       enc->pix_fmt, 
       enc->width, enc->height); 

....

int yuvWidth= FRAME_X ; 
int yuvHeight= FRAME_Y; 
glBindTexture (GL_TEXTURE_2D, textureIdY); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 
yuvWidth, yuvHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, y_channel); 


glBindTexture (GL_TEXTURE_2D, textureIdU); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 
yuvWidth/2, yuvHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, u_channel); 

glBindTexture (GL_TEXTURE_2D, textureIdV); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 
yuvWidth/2, yuvHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, v_channel); 

ケース2.私は、テクスチャサイズに実際の画像サイズを設定すると、画像はテクスチャに正確に適合しているが、画像の色が少し奇妙です。緑色が多すぎます。

誰も私にこれのためのいくつかの手がかりを与えていますか? ありがとうございます。

答えて

3

まず、パワーが2でない2つのテクスチャに適切なラップモードを設定する必要があります。その後、

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

とシェーダをGL_LINEARするフィルタリングモードを設定してみてください。

  1. 頂点シェーダ

    attribute vec4 position; 
    attribute vec2 texcoord; 
    uniform mat4 modelViewProjectionMatrix; 
    varying vec2 v_texcoord; 
    
    void main() 
    { 
        gl_Position = modelViewProjectionMatrix * position; 
        v_texcoord = texcoord.xy; 
    } 
    
  2. セット頂点

    vertices[0] = -1.0f; // x0 
    vertices[1] = -1.0f; // y0 
    vertices[2] = 1.0f; // .. 
    vertices[3] = -1.0f; 
    vertices[4] = -1.0f; 
    vertices[5] = 1.0f; 
    vertices[6] = 1.0f; // x3 
    vertices[7] = 1.0f; // y3 
    
  3. オルト投影を使用することをお勧めし、2D画像(スプライト)のために、適切なviewProj行列をロードします。次

    GLfloat modelviewProj[16]; 
    mat4f_LoadOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, modelviewProj); 
    glUniformMatrix4fv(_uniformMatrix, 1, GL_FALSE, modelviewProj); 
    
  4. 、このような最後の、フラグメントシェーダでこの

    GLfloat texCoords[] = { 
        0.0f, 1.0f, 
        1.0f, 1.0f, 
        0.0f, 0.0f, 
        1.0f, 0.0f, 
    }; 
    
  5. のように、あなたは適切なテキストCOORDを使用していることを確認してください。

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

あなたが見てもよいですiOS上でFFmpegとOpenGLESを使用する例として私のコード:https://github.com/kolyvan/kxmovie

+0

ああ、ありがとうございます。私はちょうどあなたの答えを直前に見た。ありがとうございました。 – user1333656