Ticket #2649: videoout_opengl.2.h

File videoout_opengl.2.h, 6.8 KB (added by anonymous, 17 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