CVOpenGLESTextureCacheCreateTextureFromImage函数导致相机采集视频数据回调卡死
在AVCaptureVideoDataOutputSampleBufferDelegate的视频回调方法中,操作OpenGL方法CVOpenGLESTextureCacheCreateTextureFromImage,导致回调方法卡死
解决方案:CFRelease(luminanceTextureRef);
CVOpenGLESTextureRef luminanceTextureRef;
CVReturn cvResult = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
sharedImageProcessingContext.m_coreVideoTextureCache,
cameraFrame,
nil,
GL_TEXTURE_2D,
GL_LUMINANCE,
GLsizei(width),
GLsizei(height),
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
0,
&luminanceTextureRef);
// 一定要记得释放
CFRelease(luminanceTextureRef);
内存泄露
排查思路
1、通过二分法注释代码找到内存泄露的代码
2、通过打印地址信息,和崩溃地址对比,是否重复释放
malloc内存为free
CG开头的Ref指针需要释放
new出来的对象,必须delete
图片倒置解决方案
参考链接:blog.csdn.net/shengdaVoll…
旋转矩阵翻转图形,不翻转纹理
GLuint rotate = glGetUniformLocation(self.myPrograme, "rotateMatrix");
float radians = 180 * 3.14159f / 180.0f;
float s = sin(radians);
float c = cos(radians);
GLfloat zRotation[16] = {
c, -s, 0, 0,
s, c, 0, 0,
0, 0, 1.0, 0,
0.0, 0, 0, 1.0
};
glUniformMatrix4fv(rotate, 1, GL_FALSE, (GLfloat *)&zRotation[0]);
// 测试代码
float radians = 180 * M_PI / 180.0;
GLfloat s = GLfloat(sin(radians));
GLfloat c = GLfloat(cosf(radians));
uniformSettings["rotateMatrix"] = PIXMatrix4x4({
c, -s, 0.0, 0.0,
s, c, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
});
修改顶点着色器,纹理坐标
attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;
void main()
{
varyTextCoord = vec2(textCoordinate.x,1.0-textCoordinate.y);
gl_Position = position;
}
直接从源纹理坐标数据修改
GLfloat attrArr[] =
{
0.5f, -0.5f, 0.0f, 1.0f, 1.0f, //右下
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, // 左上
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // 左下
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // 右上
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, // 左上
0.5f, -0.5f, 0.0f, 1.0f, 1.0f, // 右下
};
PIXFrameBuffer::lock()
void PIXFrameBuffer::lock() 未正常调用导致内存泄露