00001
00002
00003 #ifndef VIDEOOUTBASE_H_
00004 #define VIDEOOUTBASE_H_
00005
00006 extern "C" {
00007 #include "frame.h"
00008 #include "filter.h"
00009 }
00010
00011 #include <qframe.h>
00012 #include <qptrqueue.h>
00013 #include <qptrlist.h>
00014 #include "videobuffers.h"
00015 #include "mythcodecid.h"
00016 #include "videoouttypes.h"
00017
00018 using namespace std;
00019
00020 class NuppelVideoPlayer;
00021 class OSD;
00022 class OSDSurface;
00023 class FilterChain;
00024 class FilterManager;
00025 class VideoDisplayProfile;
00026
00027 extern "C" {
00028 struct ImgReSampleContext;
00029 }
00030
00031 class VideoOutput
00032 {
00033 public:
00034 static VideoOutput *Create(
00035 const QString &decoder, MythCodecID codec_id,
00036 void *codec_priv,
00037 const QSize &video_dim, float video_aspect,
00038 WId win_id, const QRect &display_rect,
00039 WId embed_id);
00040
00041 VideoOutput();
00042 virtual ~VideoOutput();
00043
00044 virtual bool Init(int width, int height, float aspect,
00045 WId winid, int winx, int winy, int winw,
00046 int winh, WId embedid = 0);
00047 virtual void InitOSD(OSD *osd);
00048 virtual void SetVideoFrameRate(float);
00049
00050 virtual bool SetDeinterlacingEnabled(bool);
00051 virtual bool SetupDeinterlace(bool i, const QString& ovrf="");
00052 virtual void FallbackDeint(void);
00053 virtual void BestDeint(void);
00054 virtual bool NeedsDoubleFramerate(void) const;
00055 virtual bool IsBobDeint(void) const;
00056 virtual bool IsExtraProcessingRequired(void) const;
00057 virtual bool ApproveDeintFilter(const QString& filtername) const;
00058
00059 virtual void PrepareFrame(VideoFrame *buffer, FrameScanType) = 0;
00060 virtual void Show(FrameScanType) = 0;
00061
00062 virtual bool InputChanged(const QSize &input_size,
00063 float aspect,
00064 MythCodecID myth_codec_id,
00065 void *codec_private);
00066 virtual void VideoAspectRatioChanged(float aspect);
00067
00068 virtual void EmbedInWidget(WId wid, int x, int y, int w, int h);
00069 virtual void StopEmbedding(void);
00070 virtual void ResizeForGui(void) {;}
00071 virtual void ResizeForVideo(void) {;}
00072
00073 virtual void MoveResize(void);
00074 virtual void Zoom(ZoomDirection direction);
00075
00076 virtual void GetDrawSize(int &xoff, int &yoff, int &width, int &height);
00077 virtual void GetOSDBounds(QRect &visible, QRect &total,
00078 float &pixelAspect, float &fontScale,
00079 float themeaspect) const;
00080
00083 virtual int GetRefreshRate(void) = 0;
00084
00085 virtual void DrawSlice(VideoFrame *frame, int x, int y, int w, int h);
00086
00090 virtual void DrawUnusedRects(bool sync = true) = 0;
00091
00093 virtual float GetDisplayAspect(void) const { return display_aspect; }
00094
00097 AspectOverrideMode GetAspectOverride(void) { return aspectoverride; }
00098 void ToggleAspectOverride(
00099 AspectOverrideMode aspectOverrideMode = kAspect_Toggle);
00100
00103 AdjustFillMode GetAdjustFill(void) { return adjustfill; }
00104 void ToggleAdjustFill(AdjustFillMode adjustFillMode = kAdjustFill_Toggle);
00105
00106
00107 virtual void ProcessFrame(VideoFrame *frame, OSD *osd,
00108 FilterChain *filterList,
00109 NuppelVideoPlayer *pipPlayer) = 0;
00110
00112 void ExposeEvent(void) { needrepaint = true; }
00113
00114 PictureAttributeSupported GetSupportedPictureAttributes(void) const
00115 { return supported_attributes; }
00116 int ChangePictureAttribute(PictureAttribute, bool direction);
00117 virtual int SetPictureAttribute(PictureAttribute, int newValue);
00118 int GetPictureAttribute(PictureAttribute) const;
00119 virtual void InitPictureAttributes(void);
00120
00121 bool AllowPreviewEPG(void) { return allowpreviewepg; }
00122
00124 virtual bool hasMCAcceleration(void) const { return false; }
00127 virtual bool hasIDCTAcceleration(void) const { return false; }
00129 virtual bool hasVLDAcceleration(void) const { return false; }
00130
00132 virtual void SetFramesPlayed(long long fp) { framesPlayed = fp; };
00134 virtual long long GetFramesPlayed(void) { return framesPlayed; };
00135
00137 bool IsErrored() { return errored; }
00138
00139
00141 void SetPrebuffering(bool normal) { vbuffers.SetPrebuffering(normal); }
00143 virtual void ClearAfterSeek(void) { vbuffers.ClearAfterSeek(); }
00145 bool WaitForAvailable(uint w) { return vbuffers.WaitForAvailable(w); }
00146
00148 virtual int ValidVideoFrames(void) const
00149 { return vbuffers.ValidVideoFrames(); }
00151 int FreeVideoFrames(void) { return vbuffers.FreeVideoFrames(); }
00153 bool EnoughFreeFrames(void) { return vbuffers.EnoughFreeFrames(); }
00156 bool EnoughDecodedFrames(void) { return vbuffers.EnoughDecodedFrames(); }
00159 bool EnoughPrebufferedFrames(void) { return vbuffers.EnoughPrebufferedFrames(); }
00160
00162 bool IsEmbedding(void) { return embedding; }
00163
00171 virtual VideoFrame *GetNextFreeFrame(bool with_lock = false,
00172 bool allow_unsafe = false)
00173 { return vbuffers.GetNextFreeFrame(with_lock, allow_unsafe); }
00176 virtual void ReleaseFrame(VideoFrame *frame) { vbuffers.ReleaseFrame(frame); }
00178 virtual void DeLimboFrame(VideoFrame *frame) { vbuffers.DeLimboFrame(frame); }
00181 virtual void StartDisplayingFrame(void) { vbuffers.StartDisplayingFrame(); }
00184 virtual void DoneDisplayingFrame(void) { vbuffers.DoneDisplayingFrame(); }
00187 virtual void DiscardFrame(VideoFrame *frame) { vbuffers.DiscardFrame(frame); }
00190 virtual void DiscardFrames(bool kf) { vbuffers.DiscardFrames(kf); }
00191
00192 virtual void CheckFrameStates(void) { }
00193
00195 VideoFrame *GetLastDecodedFrame(void) { return vbuffers.GetLastDecodedFrame(); }
00196
00199 VideoFrame *GetLastShownFrame(void) { return vbuffers.GetLastShownFrame(); }
00200
00202 QString GetFrameStatus(void) const { return vbuffers.GetStatus(); }
00203
00205 virtual void UpdatePauseFrame(void) = 0;
00206
00208 void SetVideoResize(const QRect &videoRect);
00209
00210 void SetVideoScalingAllowed(bool change);
00211
00213 bool IsVideoScalingAllowed(void) { return db_scaling_allowed; }
00214
00216 virtual QRect GetPIPRect(int location, NuppelVideoPlayer *pipplayer = NULL);
00217
00218 QString GetFilters(void) const;
00219
00220 protected:
00221 void InitBuffers(int numdecode, bool extra_for_pause, int need_free,
00222 int needprebuffer_normal, int needprebuffer_small,
00223 int keepprebuffer);
00224
00225 virtual void ShowPip(VideoFrame *frame, NuppelVideoPlayer *pipplayer);
00226 virtual int DisplayOSD(VideoFrame *frame, OSD *osd, int stride = -1, int revision = -1);
00227
00228 virtual void SetPictureAttributeDBValue(
00229 PictureAttribute attributeType, int newValue);
00230 virtual QRect GetVisibleOSDBounds(float&, float&, float) const;
00231 virtual QRect GetTotalOSDBounds(void) const;
00232
00233 static void CopyFrame(VideoFrame* to, const VideoFrame* from);
00234
00235 void DoPipResize(int pipwidth, int pipheight);
00236 void ShutdownPipResize(void);
00237
00238 void ResizeVideo(VideoFrame *frame);
00239 void DoVideoResize(const QSize &inDim, const QSize &outDim);
00240 virtual void ShutdownVideoResize(void);
00241
00242 void SetVideoAspectRatio(float aspect);
00243
00244 void ApplyManualScaleAndMove(void);
00245 void ApplyDBScaleAndMove(void);
00246 void ApplyLetterboxing(void);
00247 void ApplySnapToVideoRect(void);
00248 void PrintMoveResizeDebug(void);
00249
00250 QSize db_display_dim;
00251 QPoint db_move;
00252 float db_scale_horiz;
00253 float db_scale_vert;
00254 PIPLocation db_pip_location;
00255 int db_pip_size;
00256 typedef QMap<PictureAttribute,int> PictureSettingMap;
00257 PictureSettingMap db_pict_attr;
00258 AspectOverrideMode db_aspectoverride;
00259 AdjustFillMode db_adjustfill;
00260 LetterBoxColour db_letterbox_colour;
00261 QString db_deint_filtername;
00262 bool db_use_picture_controls;
00263
00264 VideoDisplayProfile *db_vdisp_profile;
00265
00266
00267 float mz_scale_v;
00268 float mz_scale_h;
00269 QPoint mz_move;
00270
00271
00272 QSize display_dim;
00273 float display_aspect;
00274
00275
00276 QSize video_dim;
00277 QSize video_disp_dim;
00278 float video_aspect;
00279
00282 float overriden_video_aspect;
00284 AspectOverrideMode aspectoverride;
00286 AdjustFillMode adjustfill;
00287
00289 QRect video_rect;
00291 QRect display_video_rect;
00294 QRect display_visible_rect;
00297 QRect tmp_display_visible_rect;
00298
00299
00300 QSize pip_desired_display_size;
00301 QSize pip_display_size;
00302 QSize pip_video_size;
00303 unsigned char *pip_tmp_buf;
00304 ImgReSampleContext *pip_scaling_context;
00305 VideoFrame pip_tmp_image;
00306
00307
00308 bool vsz_enabled;
00309 QRect vsz_desired_display_rect;
00310 QSize vsz_display_size;
00311 QSize vsz_video_size;
00312 unsigned char *vsz_tmp_buf;
00313 ImgReSampleContext *vsz_scale_context;
00314
00315
00316 bool m_deinterlacing;
00317 QString m_deintfiltername;
00318 FilterManager *m_deintFiltMan;
00319 FilterChain *m_deintFilter;
00320 bool m_deinterlaceBeforeOSD;
00321
00323 VideoBuffers vbuffers;
00324
00325
00326 bool embedding;
00327 bool needrepaint;
00328 bool allowpreviewepg;
00329 bool errored;
00330 long long framesPlayed;
00331 bool db_scaling_allowed;
00332 PictureAttributeSupported supported_attributes;
00333
00334
00335 static const float kManualZoomMaxHorizontalZoom;
00336 static const float kManualZoomMaxVerticalZoom;
00337 static const float kManualZoomMinHorizontalZoom;
00338 static const float kManualZoomMinVerticalZoom;
00339 static const int kManualZoomMaxMove;
00340 };
00341
00342 #endif