00001
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
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
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
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
00263 static int CalcHueBase(const QString &adaptor_name);
00264
00265
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
00304 MythCodecID video_codec_id;
00305 VideoDisplayProfile *db_vdisp_profile;
00306
00307
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
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
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
00335 VideoErrorState errorState;
00336 long long framesPlayed;
00337
00338
00339 DisplayRes *display_res;
00340
00341
00342 QSize monitor_sz;
00343 QSize monitor_dim;
00344
00345
00346 MythYUVAPainter *osd_painter;
00347 MythImage *osd_image;
00348
00349
00350 VideoVisual *m_visual;
00351
00352
00353 StereoscopicMode m_stereo;
00354 };
00355
00356 #endif