跨平台的视频渲染的解决方案可用SDL,OpenGL等进行渲染,下面介绍在MACOS下OpenGL的渲染方式:
#ifndef MacRender_h
#define MacRender_h
#define GL_SILENCE_DEPRECATION
#include <OpenGL/gl.h>
#import <Cocoa/Cocoa.h>
class MacRenderGL
{
public:
enum IMAGE_TYPE {
IMAGE_TYPE_RGB = 1,
IMAGE_TYPE_YUV = 2
};
explicit MacRenderGL(IMAGE_TYPE type = IMAGE_TYPE_YUV);
~MacRenderGL() override;
bool init(HWND hwnd);
virtual void loadYuv(const uint8_t* Y, const uint8_t* U, const uint8_t* V, int width, int height);
virtual void loadRGB(const uint8_t *data, int width, int height);
virtual void setDisplayMode(RENDER_MODE mode);
virtual void setMirror(bool useMirror);
virtual void setIsLocalRender(bool bLocal);
void clean() override;
private:
IMAGE_TYPE imageType_;
RENDER_MODE renderMode_;
bool bInit_;
uint8_t *buffer_;
GLuint texture_;
size_t width_,height_,bufffer_size_;
int windowWidth,windowHeight;
NSOpenGLContext *context_;
NSView * nsview_;
void ResizeViewport(size_t width,size_t height);
void ResizeVideo(size_t width,size_t height);
void Yuv420toRgb32(const uint8_t* srcY, const uint8_t* srcU,
const uint8_t* srcV,int width,int height,uint8_t* RGB32);
bool useMirror_;
};
MacRenderGL::MacRenderGL(IMAGE_TYPE type):imageType_(type),renderMode_(RENDER_MODE_NORM),
bInit_(false),buffer_(nullptr),texture_(0),width_(0),height_(0),bufffer_size_(0),windowWidth(0),
windowHeight(0),nsview_(nullptr),useMirror_(true){
}
MacRenderGL::~MacRenderGL() {
if(!bInit_)
return;
bInit_ = false;
delete [] buffer_;
buffer_ = nullptr;
//glDeleteTextures(1,&texture_);
}
bool MacRenderGL::init(HWND hwnd) {
if(bInit_)
return false;
nsview_ = (__bridge NSView *) hwnd;
NSRect Rect = nsview_.frame;//[nsview_ visibleRect];
windowWidth = Rect.size.width;
windowHeight = Rect.size