|
MythTV
0.26-pre
|
00001 // -*- Mode: c++ -*- 00002 00003 #ifndef VIDEOOUTBASE_H_ 00004 #define VIDEOOUTBASE_H_ 00005 00006 #include "frame.h" 00007 extern "C" { 00008 #include "filter.h" 00009 } 00010 00011 #include <QSize> 00012 #include <QRect> 00013 #include <QString> 00014 #include <QPoint> 00015 #include <QMap> 00016 #include <qwindowdefs.h> 00017 00018 #include "videobuffers.h" 00019 #include "mythcodecid.h" 00020 #include "videoouttypes.h" 00021 #include "videooutwindow.h" 00022 #include "mythdisplay.h" 00023 #include "DisplayRes.h" 00024 #include "videodisplayprofile.h" 00025 #include "videocolourspace.h" 00026 #include "visualisations/videovisual.h" 00027 00028 using namespace std; 00029 00030 class MythPainter; 00031 class MythYUVAPainter; 00032 class MythImage; 00033 class MythPlayer; 00034 class OSD; 00035 class FilterChain; 00036 class FilterManager; 00037 class AudioPlayer; 00038 class MythRender; 00039 00040 typedef QMap<MythPlayer*,PIPLocation> PIPMap; 00041 00042 extern "C" { 00043 struct ImgReSampleContext; 00044 struct SwsContext; 00045 } 00046 00047 class VideoOutput 00048 { 00049 public: 00050 static void GetRenderOptions(render_opts &opts); 00051 static VideoOutput *Create( 00052 const QString &decoder, MythCodecID codec_id, void *codec_priv, 00053 PIPState pipState, const QSize &video_dim, float video_aspect, 00054 QWidget *parentwidget, const QRect &embed_rect, float video_prate, 00055 uint playerFlags); 00056 00057 VideoOutput(); 00058 virtual ~VideoOutput(); 00059 00060 virtual bool Init(int width, int height, float aspect, 00061 WId winid, const QRect &win_rect, MythCodecID codec_id); 00062 virtual void InitOSD(OSD *osd); 00063 virtual void SetVideoFrameRate(float); 00064 virtual bool IsPreferredRenderer(QSize video_size); 00065 virtual bool SetDeinterlacingEnabled(bool); 00066 virtual bool SetupDeinterlace(bool i, const QString& ovrf=""); 00067 virtual void FallbackDeint(void); 00068 virtual void BestDeint(void); 00069 virtual bool NeedsDoubleFramerate(void) const; 00070 virtual bool IsBobDeint(void) const; 00071 virtual bool IsExtraProcessingRequired(void) const; 00072 virtual bool ApproveDeintFilter(const QString& filtername) const; 00073 void GetDeinterlacers(QStringList &deinterlacers); 00074 QString GetDeinterlacer(void); 00075 virtual void PrepareFrame(VideoFrame *buffer, FrameScanType, 00076 OSD *osd) = 0; 00077 virtual void Show(FrameScanType) = 0; 00078 00079 virtual void WindowResized(const QSize &new_size) {} 00080 00081 virtual bool InputChanged(const QSize &input_size, 00082 float aspect, 00083 MythCodecID myth_codec_id, 00084 void *codec_private, 00085 bool &aspect_changed); 00086 virtual void VideoAspectRatioChanged(float aspect); 00087 00088 virtual void ResizeDisplayWindow(const QRect&, bool); 00089 virtual void EmbedInWidget(const QRect &rect); 00090 virtual void StopEmbedding(void); 00091 virtual void ResizeForGui(void); 00092 virtual void ResizeForVideo(uint width = 0, uint height = 0); 00093 virtual void MoveResizeWindow(QRect new_rect) = 0; 00094 00095 virtual void MoveResize(void); 00096 virtual void Zoom(ZoomDirection direction); 00097 00098 virtual void GetOSDBounds(QRect &total, QRect &visible, 00099 float &visibleAspect, float &fontScale, 00100 float themeAspect) const; 00101 QRect GetMHEGBounds(void); 00102 virtual void DrawSlice(VideoFrame *frame, int x, int y, int w, int h); 00103 00107 virtual void DrawUnusedRects(bool sync = true) = 0; 00108 00110 virtual float GetDisplayAspect(void) const; 00111 00114 AspectOverrideMode GetAspectOverride(void) const; 00115 virtual void ToggleAspectOverride( 00116 AspectOverrideMode aspectOverrideMode = kAspect_Toggle); 00117 00120 AdjustFillMode GetAdjustFill(void) const; 00121 virtual void ToggleAdjustFill( 00122 AdjustFillMode adjustFillMode = kAdjustFill_Toggle); 00123 00124 // pass in null to use the pause frame, if it exists. 00125 virtual void ProcessFrame(VideoFrame *frame, OSD *osd, 00126 FilterChain *filterList, 00127 const PIPMap &pipPlayers, 00128 FrameScanType scan = kScan_Ignore) = 0; 00129 00131 void ExposeEvent(void); 00132 00133 PictureAttributeSupported GetSupportedPictureAttributes(void) 00134 { return videoColourSpace.SupportedAttributes(); } 00135 int ChangePictureAttribute(PictureAttribute, bool direction); 00136 virtual int SetPictureAttribute(PictureAttribute, int newValue); 00137 int GetPictureAttribute(PictureAttribute); 00138 virtual void InitPictureAttributes(void) { } 00139 00140 bool AllowPreviewEPG(void) const; 00141 00142 virtual bool IsPIPSupported(void) const { return false; } 00143 virtual bool IsPBPSupported(void) const { return false; } 00144 virtual bool NeedExtraAudioDecode(void) const { return false; } 00145 00147 virtual bool hasHWAcceleration(void) const { return false; } 00148 virtual void* GetDecoderContext(unsigned char* buf, uint8_t*& id) { return NULL; } 00149 00151 virtual void SetFramesPlayed(long long fp) { framesPlayed = fp; }; 00153 virtual long long GetFramesPlayed(void) { return framesPlayed; }; 00154 00156 bool IsErrored() const { return errorState != kError_None; } 00158 VideoErrorState GetError(void) const { return errorState; } 00159 // Video Buffer Management 00161 void SetPrebuffering(bool normal) { vbuffers.SetPrebuffering(normal); } 00163 virtual void ClearAfterSeek(void) { vbuffers.ClearAfterSeek(); } 00164 00166 virtual int ValidVideoFrames(void) const 00167 { return vbuffers.ValidVideoFrames(); } 00169 int FreeVideoFrames(void) { return vbuffers.FreeVideoFrames(); } 00171 bool EnoughFreeFrames(void) { return vbuffers.EnoughFreeFrames(); } 00174 bool EnoughDecodedFrames(void) { return vbuffers.EnoughDecodedFrames(); } 00177 bool EnoughPrebufferedFrames(void) { return vbuffers.EnoughPrebufferedFrames(); } 00178 00180 bool IsEmbedding(void); 00181 00185 virtual VideoFrame *GetNextFreeFrame(void) 00186 { return vbuffers.GetNextFreeFrame(); } 00189 virtual void ReleaseFrame(VideoFrame *frame) { vbuffers.ReleaseFrame(frame); } 00191 virtual void DeLimboFrame(VideoFrame *frame) { vbuffers.DeLimboFrame(frame); } 00194 virtual void StartDisplayingFrame(void) { vbuffers.StartDisplayingFrame(); } 00197 virtual void DoneDisplayingFrame(VideoFrame *frame) 00198 { vbuffers.DoneDisplayingFrame(frame); } 00201 virtual void DiscardFrame(VideoFrame *frame) { vbuffers.DiscardFrame(frame); } 00204 virtual void DiscardFrames(bool kf) { vbuffers.DiscardFrames(kf); } 00207 virtual void ClearDummyFrame(VideoFrame* frame); 00208 virtual void CheckFrameStates(void) { } 00209 00211 virtual VideoFrame *GetLastDecodedFrame(void) 00212 { return vbuffers.GetLastDecodedFrame(); } 00213 00216 virtual VideoFrame *GetLastShownFrame(void) 00217 { return vbuffers.GetLastShownFrame(); } 00218 00220 QString GetFrameStatus(void) const { return vbuffers.GetStatus(); } 00221 00223 virtual void UpdatePauseFrame(int64_t &disp_timecode) = 0; 00224 00226 void SetVideoResize(const QRect &videoRect); 00227 00228 void SetVideoScalingAllowed(bool change); 00229 00231 bool IsVideoScalingAllowed(void) const; 00232 00234 virtual QRect GetPIPRect(PIPLocation location, 00235 MythPlayer *pipplayer = NULL, 00236 bool do_pixel_adj = true) const; 00237 virtual void RemovePIP(MythPlayer *pipplayer) { } 00238 00239 virtual void SetPIPState(PIPState setting); 00240 00241 virtual QString GetOSDRenderer(void) const; 00242 virtual MythPainter *GetOSDPainter(void) { return (MythPainter*)osd_painter; } 00243 virtual bool GetScreenShot(int width = 0, int height = 0, 00244 QString filename = "") { return false; } 00245 00246 QString GetFilters(void) const; 00248 QRect GetImageRect(const QRect &rect, QRect *display = NULL); 00249 QRect GetSafeRect(void); 00250 00251 // Visualisations 00252 bool EnableVisualisation(AudioPlayer *audio, bool enable, 00253 const QString &name = QString("")); 00254 virtual bool CanVisualise(AudioPlayer *audio, MythRender *render); 00255 virtual bool SetupVisualisation(AudioPlayer *audio, MythRender *render, 00256 const QString &name); 00257 VideoVisual* GetVisualisation(void) { return m_visual; } 00258 QString GetVisualiserName(void); 00259 virtual QStringList GetVisualiserList(void); 00260 void DestroyVisualisation(void); 00261 00262 // Hue adjustment for certain vendors (mostly ATI) 00263 static int CalcHueBase(const QString &adaptor_name); 00264 00265 // 3D TV 00266 virtual bool StereoscopicModesAllowed(void) const { return false; } 00267 void SetStereoscopicMode(StereoscopicMode mode) { m_stereo = mode; } 00268 StereoscopicMode GetStereoscopicMode(void) const { return m_stereo; } 00269 00270 protected: 00271 void InitBuffers(int numdecode, bool extra_for_pause, int need_free, 00272 int needprebuffer_normal, int needprebuffer_small, 00273 int keepprebuffer); 00274 void InitDisplayMeasurements(uint width, uint height, bool resize); 00275 virtual void ShowPIPs(VideoFrame *frame, const PIPMap &pipPlayers); 00276 virtual void ShowPIP(VideoFrame *frame, 00277 MythPlayer *pipplayer, 00278 PIPLocation loc); 00279 00280 virtual bool DisplayOSD(VideoFrame *frame, OSD *osd); 00281 00282 QRect GetVisibleOSDBounds(float&, float&, float) const; 00283 QRect GetTotalOSDBounds(void) const; 00284 virtual bool hasFullScreenOSD(void) const { return false; } 00285 00286 static void CopyFrame(VideoFrame* to, const VideoFrame* from); 00287 00288 void DoPipResize(int pipwidth, int pipheight); 00289 void ShutdownPipResize(void); 00290 00291 void ResizeVideo(VideoFrame *frame); 00292 void DoVideoResize(const QSize &inDim, const QSize &outDim); 00293 virtual void ShutdownVideoResize(void); 00294 00295 VideoOutWindow window; 00296 QSize db_display_dim; 00297 VideoColourSpace videoColourSpace; 00298 AspectOverrideMode db_aspectoverride; 00299 AdjustFillMode db_adjustfill; 00300 LetterBoxColour db_letterbox_colour; 00301 QString db_deint_filtername; 00302 00303 // Video parameters 00304 MythCodecID video_codec_id; 00305 VideoDisplayProfile *db_vdisp_profile; 00306 00307 // Picture-in-Picture 00308 QSize pip_desired_display_size; 00309 QSize pip_display_size; 00310 QSize pip_video_size; 00311 unsigned char *pip_tmp_buf; 00312 unsigned char *pip_tmp_buf2; 00313 struct SwsContext *pip_scaling_context; 00314 VideoFrame pip_tmp_image; 00315 00316 // Video resizing (for ITV) 00317 bool vsz_enabled; 00318 QRect vsz_desired_display_rect; 00319 QSize vsz_display_size; 00320 QSize vsz_video_size; 00321 unsigned char *vsz_tmp_buf; 00322 struct SwsContext *vsz_scale_context; 00323 00324 // Deinterlacing 00325 bool m_deinterlacing; 00326 QString m_deintfiltername; 00327 FilterManager *m_deintFiltMan; 00328 FilterChain *m_deintFilter; 00329 bool m_deinterlaceBeforeOSD; 00330 00332 VideoBuffers vbuffers; 00333 00334 // Various state variables 00335 VideoErrorState errorState; 00336 long long framesPlayed; 00337 00338 // Custom display resolutions 00339 DisplayRes *display_res; 00340 00341 // Display information 00342 QSize monitor_sz; 00343 QSize monitor_dim; 00344 00345 // OSD painter and surface 00346 MythYUVAPainter *osd_painter; 00347 MythImage *osd_image; 00348 00349 // Visualisation 00350 VideoVisual *m_visual; 00351 00352 // 3D TV mode 00353 StereoscopicMode m_stereo; 00354 }; 00355 00356 #endif
1.7.6.1