00001 #ifndef _OPENGL_VIDEO_H__
00002 #define _OPENGL_VIDEO_H__
00003
00004 #include <vector>
00005 #include <map>
00006 using namespace std;
00007
00008 #include <QRect>
00009
00010 #include "videooutbase.h"
00011 #include "videoouttypes.h"
00012 #include "mythrender_opengl.h"
00013
00014 enum OpenGLFilterType
00015 {
00016 kGLFilterNone = 0,
00017
00018
00019 kGLFilterYUV2RGB,
00020
00021
00022 kGLFilterResize,
00023 kGLFilterBicubic,
00024 };
00025
00026 enum DisplayBuffer
00027 {
00028 kDefaultBuffer,
00029 kFrameBufferObject
00030 };
00031
00032 class OpenGLFilter;
00033 typedef map<OpenGLFilterType,OpenGLFilter*> glfilt_map_t;
00034
00035 #include "util-opengl.h"
00036
00037 class OpenGLVideo
00038 {
00039 public:
00040 OpenGLVideo();
00041 ~OpenGLVideo();
00042
00043 bool Init(MythRenderOpenGL *glcontext, VideoColourSpace *colourspace,
00044 QSize videoDim, QSize videoDispDim, QRect displayVisibleRect,
00045 QRect displayVideoRect, QRect videoRect,
00046 bool viewport_control, QString options,
00047 bool hwaccel);
00048
00049 uint GetInputTexture(void) const;
00050 uint GetTextureType(void) const;
00051 void SetInputUpdated(void);
00052 void UpdateInputFrame(const VideoFrame *frame, bool soft_bob = false);
00053
00055 bool AddFilter(const QString &filter)
00056 { return AddFilter(StringToFilter(filter)); }
00057 bool RemoveFilter(const QString &filter)
00058 { return RemoveFilter(StringToFilter(filter)); }
00059
00060 bool AddDeinterlacer(const QString &deinterlacer);
00061 void SetDeinterlacing(bool deinterlacing);
00062 QString GetDeinterlacer(void) const
00063 { return hardwareDeinterlacer; };
00064 void SetSoftwareDeinterlacer(const QString &filter);
00065
00066 void PrepareFrame(bool topfieldfirst, FrameScanType scan,
00067 bool softwareDeinterlacing,
00068 long long frame, StereoscopicMode stereo,
00069 bool draw_border = false);
00070
00071 void SetMasterViewport(QSize size) { masterViewportSize = size; }
00072 QSize GetViewPort(void) const { return viewportSize; }
00073 void SetVideoRect(const QRect &dispvidrect, const QRect &vidrect)
00074 { display_video_rect = dispvidrect; video_rect = vidrect;}
00075 QSize GetVideoSize(void) const { return video_dim;}
00076
00077 private:
00078 void Teardown(void);
00079 void SetViewPort(const QSize &new_viewport_size);
00080 bool AddFilter(OpenGLFilterType filter);
00081 bool RemoveFilter(OpenGLFilterType filter);
00082 void CheckResize(bool deinterlacing, bool allow = true);
00083 bool OptimiseFilters(void);
00084 bool AddFrameBuffer(uint &framebuffer, uint &texture, QSize vid_size);
00085 uint AddFragmentProgram(OpenGLFilterType name,
00086 QString deint = QString::null,
00087 FrameScanType field = kScan_Progressive);
00088 uint CreateVideoTexture(QSize size, QSize &tex_size);
00089 QString GetProgramString(OpenGLFilterType filter,
00090 QString deint = QString::null,
00091 FrameScanType field = kScan_Progressive);
00092 void GetProgramStrings(QString &vertex, QString &fragment,
00093 OpenGLFilterType filter,
00094 QString deint = QString::null,
00095 FrameScanType field = kScan_Progressive);
00096 void CustomiseProgramString(QString &string);
00097 static QString FilterToString(OpenGLFilterType filter);
00098 static OpenGLFilterType StringToFilter(const QString &filter);
00099 QSize GetTextureSize(const QSize &size);
00100 void SetFiltering(void);
00101
00102 void RotateTextures(void);
00103 void SetTextureFilters(vector<GLuint> *textures, int filt, int clamp);
00104 void DeleteTextures(vector<GLuint> *textures);
00105 void TearDownDeinterlacer(void);
00106
00107 MythRenderOpenGL *gl_context;
00108 QSize video_disp_dim;
00109 QSize video_dim;
00110 QSize viewportSize;
00111 QSize masterViewportSize;
00112 QRect display_visible_rect;
00113 QRect display_video_rect;
00114 QRect video_rect;
00115 QRect frameBufferRect;
00116 QString softwareDeinterlacer;
00117 QString hardwareDeinterlacer;
00118 bool hardwareDeinterlacing;
00119 VideoColourSpace *colourSpace;
00120 bool viewportControl;
00121 vector<GLuint> referenceTextures;
00122 vector<GLuint> inputTextures;
00123 QSize inputTextureSize;
00124 glfilt_map_t filters;
00125 long long currentFrameNum;
00126 bool inputUpdated;
00127 int refsNeeded;
00128 bool textureRects;
00129 uint textureType;
00130 uint helperTexture;
00131 OpenGLFilterType defaultUpsize;
00132 uint gl_features;
00133 uint videoTextureType;
00134 bool preferYCBCR;
00135 };
00136 #endif // _OPENGL_VIDEO_H__