Display YUV in OpenGL

前端 未结 3 1251
天命终不由人
天命终不由人 2021-01-31 12:01

I am having trouble displaying a raw YUV file that it is in NV12 format.

I can display a selected frame, however, it is still mainly in black and white with certain shade

相关标签:
3条回答
  • 2021-01-31 12:41

    I think you're addressing U and V values incorrectly. Rather than:

    float U = lookupTableU [uvBuffer [ ((y / 2) * (x / 2) + (x/2)) * 2  ] ]; 
    float V = lookupTableV [uvBuffer [  ((y / 2) * (x / 2) + (x/2)) * 2 + 1] ];
    

    It should be something along the lines of

    float U = lookupTableU [uvBuffer [ ((y / 2) * (YUV_WIDTH / 2) + (x/2)) * 2  ] ]; 
    float V = lookupTableV [uvBuffer [  ((y / 2) * (YUV_WIDTH / 2) + (x/2)) * 2 + 1] ];
    
    0 讨论(0)
  • 2021-01-31 12:42

    The picture looks like you have 4:1:1 format. You should change your lines to

    float U = lookupTableU [uvBuffer [ (y * (YUV_WIDTH / 4) + (x/4)) * 2 ] ]
    float V = lookupTableU [uvBuffer [ (y * (YUV_WIDTH / 4) + (x/4)) * 2 + 1] ]
    

    Maybe you can post the result to see, what else is wrong. I find it always hard to think about it. It's much easier to approach this iteratively.

    0 讨论(0)
  • 2021-01-31 12:55

    Next try :) I think you're uv buffer is not interleaved. It looks like the U values come first and then the array of V values. Changing the lines to

    unsigned int voffset = YUV_HEIGHT * YUV_WIDTH / 2;
    float U = lookupTableU [uvBuffer [ y * (YUV_WIDTH / 2) + x/2] ]; 
    float V = lookupTableV [uvBuffer [ voffset + y * (YUV_WIDTH / 2) + x/2] ];
    

    might indicate if this is really the case.

    0 讨论(0)
提交回复
热议问题