Ticket #2649: videoout_opengl.2.h

File videoout_opengl.2.h, 6.8 KB (added by anonymous, 20 years ago)
Line 
1#ifndef VIDEOOUT_OPENGL_H_
2#define VIDEOOUT_OPENGL_H_
3
4#include <DisplayRes.h>
5#include "videooutbase.h"
6#include "NuppelVideoPlayer.h"
7#include "util-opengl.h"
8
9#define GL_GLEXT_PROTOTYPES
10#define GLX_GLXEXT_PROTOTYPES
11#define XMD_H 1
12#include <GL/glx.h>
13
14#include <GL/gl.h>
15#undef GLX_ARB_get_proc_address
16#include <GL/glxext.h>
17#include <GL/glext.h>
18
19class VideoOutputOpengl : public VideoOutput
20{
21 public:
22 VideoOutputOpengl();
23 ~VideoOutputOpengl();
24 bool Init(int width, int height, float aspect, WId winid,
25 int winx, int winy, int winw, int winh, WId embedid = 0);
26 void SetOffscreen(void) { render_onscreen = false; };
27 void GetOSDBounds(QRect &visible, QRect &total,
28 float &pixelAspect, float &fontScale) const;
29 void PrepareFrame(VideoFrame *buffer, FrameScanType);
30 void ShowPip(VideoFrame *frame, NuppelVideoPlayer *pipplayer);
31 QRect GetPIPRect(int location, NuppelVideoPlayer *pipplayer);
32 int DisplayOSD(VideoFrame *frame, OSD *osd,
33 int stride = -1, int revision = -1);
34 void Show(FrameScanType );
35 void MoveResize();
36 void InputChanged(int width, int height,
37 float aspect, MythCodecID codec_id);
38 void Zoom(int direction);
39 void AspectChanged(float aspect);
40 void EmbedInWidget(WId wid, int x, int y, int w, int h);
41 void StopEmbedding(void);
42 void ResizeForGui(void);
43 void ResizeForVideo(uint width, uint height);
44 void ResizeForVideo(void);
45 int GetRefreshRate(void);
46 void DrawUnusedRects(bool sync = true);
47 float GetDisplayAspect(void);
48 void UpdatePauseFrame(void);
49 void ProcessFrame(VideoFrame *frame, OSD *osd,
50 FilterChain *filterList,
51 NuppelVideoPlayer *pipPlayer);
52 int SetPictureAttribute(int attributeType, int newValue);
53 bool hasOpenGLAcceleration(void) const { return true; }
54 unsigned char* GetARGBFrame(QSize &size);
55 void ShutdownVideoResize(void);
56
57 bool SetDeinterlacingEnabled(bool);
58 bool SetupDeinterlace(bool i, const QString& ovrf="");
59
60 private:
61 void InitDisplayMeasurements(uint width, uint height);
62 bool InitSetupBuffers(void);
63 void CreateBuffers(void);
64 void CreatePauseFrame(void);
65 void DeleteBuffers(bool delete_pause_frame);
66
67 // Misc.
68 DisplayRes *display_res;
69 QMutex global_lock;
70
71 // Opengl
72 OpenglContext *gl;
73 OpenglVideo *videochain;
74 OpenglVideo *pipchain;
75 OpenglVideo *osdchain;
76
77 // General
78 bool render_onscreen;
79 bool use_colourcontrols;
80 bool gl_osd;
81 VideoFrame av_pause_frame;
82 bool actually_draw_pip;
83 bool actually_draw_osd;
84 unsigned char *argb_frame;
85
86};
87
88enum OpenglFilter
89{
90 kNOFILT = 0,
91 kYUV2RGB,
92 kYUV2RGBA,
93 kLINBLEND,
94 kKDEINT,
95 kONEFIELD,
96 kBOBDEINT,
97 kPROGLINBLEND,
98 kPROGKDEINT,
99 kPROGONEFIELD,
100 kRESIZE
101};
102
103enum DisplayBuffer
104{
105 kNoBuffer = 0, // disable filter
106 kDefaultBuffer,
107 kFrameBufferObject
108};
109
110typedef struct Filter
111{
112 GLuint fragmentProgram;
113 uint numInputs;
114 bool rotateFrameBuffers;
115 vector<GLuint> frameBuffers;
116 vector<GLuint> frameBufferTextures;
117 DisplayBuffer outputBuffer;
118};
119
120class OpenglVideo
121{
122 public:
123 OpenglVideo();
124 ~OpenglVideo();
125 bool Init(OpenglContext *glcontext, bool colour_control, bool onscreen,
126 QSize video_size, QRect visible_rect,
127 QRect video_rect, bool viewport_control, bool osd = FALSE);
128 bool ReInit(OpenglContext *gl, bool colour_control, bool onscreen,
129 QSize video_size, QRect visible_rect,
130 QRect video_rect, bool viewport_control, bool osd = FALSE);
131 void UpdateInputFrame(VideoFrame *frame);
132 void UpdateInput(unsigned char *buf, uint texture_num,
133 int format, QSize size);
134 bool AddFilter(QString filter)
135 { return AddFilter(StringToFilter(filter)); };
136 bool RemoveFilter(QString filter)
137 { return RemoveFilter(StringToFilter(filter)); };
138 bool AddDeinterlacer(QString filter);
139 void SetDeinterlacing(bool deinterlacing);
140 QString GetDeinterlacer(void)
141 { return FilterToString(GetDeintFilter()); };
142 void Show(FrameScanType scan, bool softwareDeinterlacing, long long frame);
143 void SetSoftwareDeinterlacer(QString filter)
144 { softwareDeinterlacer = filter; };
145 void SetMasterViewport(QSize size)
146 { masterViewportSize = size; };
147 QSize GetViewPort(void) { return viewportSize; };
148 void SetVideoRect(QRect rect) { videoRect = rect; };
149 QSize GetVideoSize(void) { return videoSize; };
150 void SetVideoResize(QRect *size);
151 void SetPictureAttribute(int attributeType, int newValue);
152
153 private:
154 void Cleanup(void);
155 void SetViewPort(uint width, uint height);
156 void ViewPort(uint width, uint height);
157 bool AddFilter(OpenglFilter filter);
158 bool RemoveFilter(OpenglFilter filter);
159 bool OptimiseFilters(void);
160 OpenglFilter GetDeintFilter(void);
161 bool AddFrameBuffer(GLuint *framebuffer, GLuint *texture, QSize size);
162 GLuint AddFragmentProgram(OpenglFilter name);
163 GLuint CreateVideoTexture(QSize size, QSize *tex_size, bool YUV12);
164 QString GetProgramString(OpenglFilter filter);
165 void CalculateResize(float *left, float *top,
166 float *right, float *bottom);
167 void Rotate(vector<GLuint> *target);
168 QString FilterToString(OpenglFilter filter);
169 OpenglFilter StringToFilter(QString filter);
170 void ShutDownYUV2RGB(void);
171 void SetViewPort(bool last_stage);
172 void InitOpengl(void);
173 void GetTextureSize(QSize *temp, QSize size);
174 void SetFiltering(void);
175 void SetTextureFilters(vector<GLuint> *textures, int filt);
176
177 OpenglContext *gl;
178 QSize videoSize;
179 QSize viewportSize;
180 QSize masterViewportSize;
181 QRect visibleRect;
182 QRect videoRect;
183 QRect frameBufferRect;
184 bool invertVideo;
185 QString softwareDeinterlacer;
186 bool hardwareDeinterlacing;
187 bool useColourControl;
188 bool viewportControl;
189 GLuint frameBuffer;
190 GLuint frameBufferTexture;
191 vector<GLuint> inputTextures;
192 QSize inputTextureSize;
193 map<OpenglFilter,Filter> filters;
194 long long currentFrameNum;
195 bool inputUpdated;
196
197 QSize convertSize;
198 unsigned char *convertBuf;
199
200 bool videoResize;
201 QRect videoResizeRect;
202
203 static QMap<int,float> pictureAttribs;
204};
205
206#endif
207