//
// opengl_render.h
// ~~~~~~~~~~~~~~~
//
// Copyright (c) 2011 Jack (jack.wgm@gmail.com)
//

#ifndef __OPENGL_RENDER_H__
#define __OPENGL_RENDER_H__

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

#include "video_render.h"

class opengl_render
	: public video_render
{
public:
	opengl_render();
	virtual ~opengl_render();

public:
	// 鍒濆render.
	virtual bool init_render(void* ctx, int w, int h, int pix_fmt);

	// 娓叉煋涓€甯?
	virtual bool render_one_frame(AVFrame* data, int pix_fmt);

	// 璋冩暣澶у皬.
	virtual void re_size(int width, int height);

	// 璁剧疆瀹介珮姣?
	virtual void aspect_ratio(int srcw, int srch, bool enable_aspect);

	// 鎾ら攢render.
	virtual void destory_render();

private:
	bool InitGL(GLvoid);
	GLvoid KillGLWindow(GLvoid);

private:
	// 绐楀彛鐫€鑹叉弿杩拌〃鍙ユ焺.
	HGLRC m_hglrc;

	// 淇濆瓨绐楀彛鍙ユ焺.
	HWND m_hwnd;

	// OpenGL娓叉煋鎻忚堪琛ㄥ彞鏌?
	HDC m_hdc;

	// 杞崲棰滆壊YUV鍒癛GB鐨勪笂涓嬫枃鎸囬拡.
	SwsContext* m_swsctx;

	// 褰撳墠甯х殑RGB缂撳啿.
	uint8_t* m_framebuffer;

	// 褰撳墠娓叉煋绾圭悊.
	GLuint m_texture;

	// 瑙嗛瀹?
	int m_image_width;

	// 瑙嗛楂?
	int m_image_height;

	// 鏄惁鍚敤瀹介珮姣?
	bool m_keep_aspect;

	// 瀹介珮姣?
	float m_window_aspect;

	// 鏈€鍚庝綅缃弬鏁?
	RECT m_last_rect_client;

	// 褰撳墠瀹?
	int m_current_width;

	// 褰撳墠楂?
	int m_current_height;
};

#endif // __OPENGL_RENDER_H__