您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
11. XTexture和GLVideoView的线程安全和清理函数编写~1
发布时间:2021-06-13 19:50:01编辑:雪饮阅读()
同樣的爲了實現綫程安全,這次輪到XTexture和GLVideoView了。
#include "XTexture.h"
#include "XLog.h"
void GLVideoView::SetRender(void *win)
{
view = win;
}
void GLVideoView::Close()
{
mux.lock();
if(txt)
{
txt->Drop();
txt = 0;
}
mux.unlock();
}
void GLVideoView::Render(XData data)
{
if(!view) return;
if(!txt)
{
txt = XTexture::Create();
txt->Init(view,(XTextureType)data.format);
}
txt->Draw(data.datas,data.width,data.height);
}
然後cpp/XTexture.cpp中實現是差不多的:
同樣的在cpp/XTexture.h中聲明:
沒有問題呢
#define XPLAY_GLVIDEOVIEW_H
#include "XData.h"
#include "IVideoView.h"
class XTexture;
class GLVideoView: public IVideoView {
public:
virtual void SetRender(void *win);
virtual void Render(XData data);
virtual void Close();
protected:
void *view = 0;
XTexture *txt = 0;
std::mutex mux;
};
#endif //XPLAY_GLVIDEOVIEW_H
#include "XLog.h"
#include "XEGL.h"
#include "XShader.h"
class CXTexture:public XTexture
{
public:
XShader sh;
XTextureType type;
std::mutex mux;
virtual void Drop()
{
mux.lock();
XEGL::Get()->Close();
sh.Close();
mux.unlock();
delete this;
}
virtual bool Init(void *win,XTextureType type)
{
mux.lock();
XEGL::Get()->Close();
sh.Close();
this->type = type;
if(!win)
{
mux.unlock();
XLOGE("XTexture Init failed win is NULL");
return false;
}
if(!XEGL::Get()->Init(win))
{
mux.unlock();
return false;
}
sh.Init((XShaderType)type);
mux.unlock();
return true;
}
virtual void Draw(unsigned char *data[],int width,int height)
{
mux.lock();
sh.GetTexture(0,width,height,data[0]); // Y
if(type == XTEXTURE_YUV420P)
{
sh.GetTexture(1,width/2,height/2,data[1]); // U
sh.GetTexture(2,width/2,height/2,data[2]); // V
}
else
{
sh.GetTexture(1,width/2,height/2,data[1], true); // UV
}
sh.Draw();
XEGL::Get()->Draw();
mux.unlock();
}
};
XTexture *XTexture::Create()
{
return new CXTexture();
}
#define XPLAY_XTEXTURE_H
enum XTextureType
{
XTEXTURE_YUV420P = 0, // Y 4 u 1 v 1
XTEXTURE_NV12 = 25, // Y4 uv1
XTEXTURE_NV21 = 26 // Y4 vu1
};
class XTexture
{
public:
static XTexture *Create();
virtual bool Init(void *win,XTextureType type=XTEXTURE_YUV420P) = 0;
virtual void Draw(unsigned char *data[],int width,int height) = 0;
virtual void Drop() = 0;
virtual ~XTexture(){};
protected:
XTexture(){};
};
#endif //XPLAY_XTEXTURE_H
关键字词:XTexture