MythTV  0.26-pre
videooutbase.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends