最近在Android平台下开发播放器,移植ffmpeg到android平台,在视频显示的时候,由于无法使用硬件特性(Video Overlap),从而使用swscale作resize,但测试发现速度太慢,根本无法实时.后来尝试使用OpenGL来提高显示速度,速度确实很快,但在真机测试时发现
使用glTexImage2D
创建纹理出错,模拟器没问题,经过测试和查找资料,原来width和height必须是2的N次幂:2,4, 8, 16, 32, 64, 128, 256, 512,1024,是合法的,宽高可以是
2x4, 16x128等等.因为是OpenGL新手,所以花费了很多时间,特此记录一下.
解决非2的N次幂的解决办法是:
1.首先根据width和height计算出最大的纹理width和height,我写了一个函数:
int suggestTexSize(int size)
{
int texSize = 1;
while(true)
{
texSize <<= 1;
if(texSize >= size)
break ;
}
return texSize;
}
int texWidth = suggestTexSize(720);
int texHeight = suggestTexSize(480);
2.创建纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texWidth , texHeight , 0, GL_RGB,
GL_UNSIGNED_SHORT_5_6_5, NULL);
3.计算贴图坐标
const GLfloat glX = ((double)720)/((double)texWidth);
const GLfloat glY = ((double)480)/((double)texHeight);
mVertices[0][0] = -0x10000;
// left
mVertices[0][1] =
0x10000;
// top
mVertices[1][0] = -0x10000;
// left
mVertices[1][1] = -0x10000;
// bottom
mVertices[2][0] =
0x10000;
// right
mVertices[2][1] =
0x10000;
// top
mVertices[3][0] =
0x10000;
// right
mVertices[3][1] = -0x10000;
// bottom
mTexCoords[0][0] = glX;
// right
mTexCoords[0][1] = 0.0f;
// bottom
mTexCoords[1][0] = glX;
// right
mTexCoords[1][1] = glY;
// top
mTexCoords[2][0] = 0.0f;
// left
mTexCoords[2][1] = 0.0f;
// bottom
mTexCoords[3][0] = 0.0f;
// left
mTexCoords[3][1] = glY;
// top
4.更改纹理数据:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 720, 480, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pPixel);
解决非2的N次幂的解决办法是:
1.首先根据width和height计算出最大的纹理width和height,我写了一个函数:
int suggestTexSize(int size)
{
}
int texWidth = suggestTexSize(720);
int texHeight = suggestTexSize(480);
2.创建纹理
3.计算贴图坐标
4.更改纹理数据:
这样就解决了.