Ticket #5643: mythtv_refresh_rate_auto_pickv3-trunk.patch

File mythtv_refresh_rate_auto_pickv3-trunk.patch, 18.0 KB (added by henrik.sorensen@…, 12 years ago)
  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    650650            GetDecoder()->GetVideoCodecID(),
    651651            GetDecoder()->GetVideoCodecPrivate(),
    652652            video_disp_dim, video_aspect,
    653             widget->winId(), display_rect, 0 /*embedid*/);
     653            widget->winId(), display_rect, (video_frame_rate * play_speed),
     654            0 /*embedid*/);
    654655
    655656        if (!videoOutput)
    656657        {
     
    665666        videoOutput->SetVideoScalingAllowed(db_scale);
    666667
    667668        // We need to tell it this for automatic deinterlacer settings
    668         videoOutput->SetVideoFrameRate(video_frame_rate * play_speed);
     669        videoOutput->SetVideoFrameRate(video_frame_rate * play_speed);
    669670
    670671        if (videoOutput->hasMCAcceleration() && !decode_extra_audio)
    671672        {
  • libs/libmythtv/videoout_d3d.cpp

     
    451451
    452452bool VideoOutputD3D::Init(int width, int height, float aspect,
    453453                          WId winid, int winx, int winy, int winw,
    454                           int winh, WId embedid)
     454                          int winh, float video_prate, WId embedid)
    455455{
    456456    VERBOSE(VB_PLAYBACK, LOC +
    457457            "Init w=" << width << " h=" << height);
     
    462462                  kPrebufferFramesNormal, kPrebufferFramesSmall,
    463463                  kKeepPrebuffer);
    464464
    465     VideoOutput::Init(width, height, aspect, winid,
    466                       winx, winy, winw, winh, embedid);
     465    VideoOutput::Init(width, height, aspect, winid, winx,
     466                      winy, winw, winh, video_prate, embedid);
    467467
    468468    m_hWnd = winid;
    469469
  • libs/libmythtv/videoout_quartz.cpp

     
    13341334}
    13351335
    13361336bool VideoOutputQuartz::Init(int width, int height, float aspect,
    1337                              WId winid, int winx, int winy,
    1338                              int winw, int winh, WId embedid)
     1337                             WId winid, int winx, int winy, int winw,
     1338                             int winh, float video_prate, WId embedid)
    13391339{
    13401340    VERBOSE(VB_PLAYBACK, LOC +
    13411341            QString("Init(WxH %1x%2, aspect=%3, winid=%4\n\t\t\t"
     
    13571357    vbuffers.Init(kNumBuffers, true, kNeedFreeFrames,
    13581358                  kPrebufferFramesNormal, kPrebufferFramesSmall,
    13591359                  kKeepPrebuffer);
    1360     VideoOutput::Init(width, height, aspect, winid,
    1361                       winx, winy, winw, winh, embedid);
     1360    VideoOutput::Init(width, height, aspect, winid, winx,
     1361                      winy, winw, winh, video_prate, embedid);
    13621362
    13631363    data->srcWidth  = video_dim.width();
    13641364    data->srcHeight = video_dim.height();
     
    15081508
    15091509void VideoOutputQuartz::SetVideoFrameRate(float playback_fps)
    15101510{
     1511    video_prate = playback_fps;
    15111512    VERBOSE(VB_PLAYBACK, "SetVideoFrameRate("<<playback_fps<<")");
    15121513}
    15131514
  • libs/libmythtv/videoout_dx.h

     
    2121   ~VideoOutputDX();
    2222
    2323    bool Init(int width, int height, float aspect, WId winid,
    24               int winx, int winy, int winw, int winh, WId embedid = 0);
     24              int winx, int winy, int winw, int winh,
     25              float video_prate, WId embedid = 0);
    2526    void PrepareFrame(VideoFrame *buffer, FrameScanType);
    2627    void Show(FrameScanType );
    2728
  • libs/libmythtv/videoout_directfb.cpp

     
    354354
    355355bool VideoOutputDirectfb::Init(int width, int height, float aspect, WId winid,
    356356                               int winx, int winy, int winw, int winh,
    357                                WId embedid)
     357                               float video_prate, WId embedid)
    358358{
    359359    // Hack to avoid embedded video output...
    360360    if ((winw < 320) || (winh < 240))
     
    647647                           display_visible_rect.y(),
    648648                           display_visible_rect.width(),
    649649                           display_visible_rect.height(),
    650                            embedid))
     650                           video_prate, embedid))
    651651    {
    652652        return false;
    653653    }
  • libs/libmythtv/videoout_d3d.h

     
    2020   ~VideoOutputD3D();
    2121
    2222    bool Init(int width, int height, float aspect, WId winid,
    23               int winx, int winy, int winw, int winh, WId embedid = 0);
     23              int winx, int winy, int winw, int winh,
     24              float video_prate, WId embedid = 0);
    2425
    2526    bool InitD3D();
    2627    void UnInitD3D();
  • libs/libmythtv/videoout_ivtv.h

     
    1616   ~VideoOutputIvtv();
    1717
    1818    bool Init(int width, int height, float aspect, WId winid,
    19               int winx, int winy, int winw, int winh, WId embedid = 0);
     19              int winx, int winy, int winw, int winh,
     20              float video_prate, WId embedid = 0);
    2021    void PrepareFrame(VideoFrame *buffer, FrameScanType);
    2122    void Show(FrameScanType );
    2223
  • libs/libmythtv/videoout_null.cpp

     
    116116
    117117bool VideoOutputNull::Init(int width, int height, float aspect,
    118118                           WId winid, int winx, int winy, int winw,
    119                            int winh, WId embedid)
     119                           int winh, float video_prate, WId embedid)
    120120{
    121121    if ((width <= 0) || (height <= 0))
    122122        return false;
    123123
    124124    QMutexLocker locker(&global_lock);
    125125
    126     VideoOutput::Init(width, height, aspect, winid,
    127                       winx, winy, winw, winh, embedid);
     126    VideoOutput::Init(width, height, aspect, winid, winx,
     127                      winy, winw, winh, video_prate, embedid);
    128128
    129129    vbuffers.Init(kNumBuffers, true, kNeedFreeFrames,
    130130                  kPrebufferFramesNormal, kPrebufferFramesSmall,
  • libs/libmythtv/videooutbase.cpp

     
    6767        void          *codec_priv,
    6868        const QSize   &video_dim, float        video_aspect,
    6969        WId            win_id,    const QRect &display_rect,
    70         WId            embed_id)
     70        float video_prate,        WId            embed_id)
    7171{
    7272    (void) codec_priv;
    7373
     
    169169
    170170        if (vo)
    171171        {
     172            vo->video_prate = video_prate;
    172173            if (vo->Init(
    173174                    video_dim.width(), video_dim.height(), video_aspect,
    174175                    win_id, display_rect.x(), display_rect.y(),
    175                     display_rect.width(), display_rect.height(), embed_id))
     176                    display_rect.width(), display_rect.height(),
     177                    video_prate, embed_id))
    176178            {
    177179                return vo;
    178180            }
     
    184186        renderer = VideoDisplayProfile::GetBestVideoRenderer(renderers);
    185187    }
    186188
     189
     190
    187191    VERBOSE(VB_IMPORTANT, LOC_ERR +
    188192            "Not compiled with any useable video output method.");
    189193
     
    370374 * \return true if successful, false otherwise.
    371375 */
    372376bool VideoOutput::Init(int width, int height, float aspect, WId winid,
    373                        int winx, int winy, int winw, int winh, WId embedid)
     377                       int winx, int winy, int winw, int winh,
     378                       float video_prate, WId embedid)
    374379{
    375380    (void)winid;
    376381    (void)embedid;
     
    415420
    416421void VideoOutput::SetVideoFrameRate(float playback_fps)
    417422{
     423    video_prate = playback_fps;
    418424    if (db_vdisp_profile)
    419425        db_vdisp_profile->SetOutput(playback_fps);
    420426}
  • libs/libmythtv/videoout_directfb.h

     
    1414    ~VideoOutputDirectfb();
    1515
    1616    bool Init(int width, int height, float aspect, WId winid,
    17               int winx, int winy, int winw, int winh, WId embedid = 0);
     17              int winx, int winy, int winw, int winh,
     18              float video_prate, WId embedid = 0);
    1819
    1920    void ProcessFrame(VideoFrame *frame, OSD *osd,
    2021                      FilterChain *filterList,
  • libs/libmythtv/videoout_xv.h

     
    6060   ~VideoOutputXv();
    6161
    6262    bool Init(int width, int height, float aspect, WId winid,
    63               int winx, int winy, int winw, int winh, WId embedid = 0);
     63              int winx, int winy, int winw, int winh,
     64              float video_prate, WId embedid = 0);
    6465
    6566    bool SetDeinterlacingEnabled(bool);
    6667    bool SetupDeinterlace(bool interlaced, const QString& ovrf="");
  • libs/libmythtv/videoout_xv.cpp

     
    426426    if ((width == 1920 || width == 1440) && height == 1088)
    427427        height = 1080; // ATSC 1920x1080
    428428
    429     if (display_res && display_res->SwitchToVideo(width, height))
    430     {
     429    if (display_res && display_res->SwitchToVideo(width, height,
     430                                                  (short) roundf(video_prate)))
     431        {
    431432        // Switching to custom display resolution succeeded
    432433        // Make a note of the new size
    433434        display_dim = QSize(display_res->GetPhysicalWidth(),
     
    15981599}
    15991600
    16001601/**
    1601  * \fn VideoOutputXv::Init(int,int,float,WId,int,int,int,int,WId)
     1602 * \fn VideoOutputXv::Init(int,int,float,WId,int,int,int,int,float,WId)
    16021603 * Initializes class for video output.
    16031604 *
    16041605 * \return success or failure.
    16051606 */
    16061607bool VideoOutputXv::Init(
    1607     int width, int height, float aspect,
    1608     WId winid, int winx, int winy, int winw, int winh, WId embedid)
     1608    int width, int height, float aspect, WId winid, int winx,
     1609    int winy, int winw, int winh, float video_prate, WId embedid)
    16091610{
    16101611    needrepaint = true;
    16111612
     
    16621663    // Basic setup
    16631664    VideoOutput::Init(width, height, aspect,
    16641665                      winid, winx, winy, winw, winh,
    1665                       embedid);
     1666                      video_prate, embedid);
    16661667
    16671668    // Set resolution/measurements (check XRandR, Xinerama, config settings)
    16681669    InitDisplayMeasurements(width, height);
  • libs/libmythtv/videooutbase.h

     
    4040        void          *codec_priv,
    4141        const QSize   &video_dim, float        video_aspect,
    4242        WId            win_id,    const QRect &display_rect,
    43         WId            embed_id);
     43        float video_prate,        WId            embed_id);
    4444
    4545    VideoOutput();
    4646    virtual ~VideoOutput();
    4747
    4848    virtual bool Init(int width, int height, float aspect,
    4949                      WId winid, int winx, int winy, int winw,
    50                       int winh, WId embedid = 0);
     50                      int winh, float video_prate, WId embedid = 0);
    5151    virtual void InitOSD(OSD *osd);
    5252    virtual void SetVideoFrameRate(float);
    5353
     
    282282    QSize   video_dim;        ///< Pixel dimensions of video buffer
    283283    QSize   video_disp_dim;   ///< Pixel dimensions of video display area
    284284    float   video_aspect;     ///< Physical aspect ratio of video
     285    float   video_prate;  ///< Playback frame rate of video
    285286
    286287    /// Normally this is the same as videoAspect, but may not be
    287288    /// if the user has toggled the aspect override mode.
  • libs/libmythtv/videoout_ivtv.cpp

     
    405405
    406406bool VideoOutputIvtv::Init(int width, int height, float aspect,
    407407                           WId winid, int winx, int winy, int winw,
    408                            int winh, WId embedid)
     408                           int winh, float video_prate, WId embedid)
    409409{
    410410    VERBOSE(VB_PLAYBACK, LOC + "Init() -- begin");
    411411
     
    416416    videoDevice = gContext->GetSetting("PVR350VideoDev");
    417417
    418418    VideoOutput::Init(width, height, aspect, winid, winx, winy, winw, winh,
    419                       embedid);
     419                      video_prate, embedid);
    420420
    421421    osdbufsize = video_dim.width() * video_dim.height() * 4;
    422422
  • libs/libmythtv/videoout_quartz.h

     
    1313   ~VideoOutputQuartz();
    1414
    1515    bool Init(int width, int height, float aspect, WId winid,
    16               int winx, int winy, int winw, int winh, WId embedid = 0);
     16              int winx, int winy, int winw, int winh,
     17              float video_prate, WId embedid = 0);
    1718    void SetVideoFrameRate(float playback_fps);
    1819    void PrepareFrame(VideoFrame *buffer, FrameScanType t);
    1920    void Show(FrameScanType);
  • libs/libmythtv/videoout_dx.cpp

     
    158158}
    159159
    160160bool VideoOutputDX::Init(int width, int height, float aspect,
    161                            WId winid, int winx, int winy, int winw,
    162                            int winh, WId embedid)
     161                         WId winid, int winx, int winy, int winw,
     162                         int winh, float video_prate, WId embedid)
    163163{
    164164    db_vdisp_profile->SetVideoRenderer("directx");
    165165
    166166    vbuffers.Init(kNumBuffers, true, kNeedFreeFrames,
    167167                  kPrebufferFramesNormal, kPrebufferFramesSmall,
    168168                  kKeepPrebuffer);
    169     VideoOutput::Init(width, height, aspect, winid,
    170                       winx, winy, winw, winh, embedid);
     169    VideoOutput::Init(width, height, aspect, winid, winx,
     170                      winy, winw, winh, video_prate, embedid);
    171171
    172172    wnd = winid;
    173173
  • libs/libmythtv/videoout_null.h

     
    1212   ~VideoOutputNull();
    1313
    1414    bool Init(int width, int height, float aspect, WId winid,
    15               int winx, int winy, int winw, int winh, WId embedid = 0);
     15              int winx, int winy, int winw, int winh,
     16              float video_prate, WId embedid = 0);
    1617
    1718    bool SetupDeinterlace(bool, const QString &ovrf = "")
    1819        { (void)ovrf; return false; } // we don't deinterlace in null output..
  • libs/libmythui/DisplayRes.cpp

     
    4040    // Initialize GUI mode
    4141    mode[GUI].Init();
    4242    tW = tH = 0;
    43     GetMythDB()->GetResolutionSetting("GuiVidMode", tW, tH);
     43    GetMythDB()->GetResolutionSetting("GuiVidMode", tW, tH, tAspect, tRate);
    4444    GetDisplaySize(tW_mm, tH_mm);
    4545    GetMythDB()->GetResolutionSetting("DisplaySize", tW_mm, tH_mm);
    46     mode[GUI] = DisplayResScreen(tW, tH, tW_mm, tH_mm, -1.0, 0);
     46    mode[GUI] = DisplayResScreen(tW, tH, tW_mm, tH_mm, -1.0, tRate);
    4747
    4848
    4949    // Initialize default VIDEO mode
     
    9090    tmode next_mode = VIDEO; // default VIDEO mode
    9191    DisplayResScreen next = mode[next_mode];
    9292
     93    // If requested refresh rate is 0, attempt to match video fps
     94    if (next.RefreshRate() == 0)
     95        next.AddRefreshRate(irate);
     96
    9397    // try to find video override mode
    9498    uint key = DisplayResScreen::CalcKey(iwidth, iheight, irate);
    9599    DisplayResMapCIt it = in_size_to_output_mode.find(key);
     
    133137    // need to change video mode?
    134138    short target_rate = 0;
    135139    DisplayResScreen::FindBestMatch(GetVideoModes(), next, target_rate);
    136     bool chg = !(next == last) || !(last.RefreshRate() == target_rate);
     140    // If GuiVidModeRefreshRate is 0, assume any refresh rate is good enough.
     141    bool chg = !(next == last) || (next.RefreshRate() !=0 && !(last.RefreshRate() == target_rate));
    137142
    138143    VERBOSE(VB_PLAYBACK, QString("Trying %1x%2 %3 Hz")
    139144            .arg(next.Width()).arg(next.Height()).arg(target_rate));
  • libs/libmythui/DisplayResScreen.cpp

     
    9090        if (dsr[i].Width()==d.Width() && dsr[i].Height()==d.Height())
    9191        {
    9292            const vector<short>& rates = dsr[i].RefreshRates();
    93             if (rates.size())
     93            if (rates.size() && d.RefreshRate() != 0)
    9494            {
    95                 vector<short>::const_iterator it =
    96                     find(rates.begin(), rates.end(), d.RefreshRate());
    97                 target_rate = (it == rates.end()) ? *(--rates.end()) : *it;
    98                 return i;
     95                for (uint j=0; j < rates.size(); ++j)
     96                {
     97                    // Multiple of target_rate will do
     98                    if (rates[j] % d.RefreshRate() == 0)
     99                    {
     100                        target_rate = rates[j];
     101                        return i;
     102                    }
     103                }
     104                target_rate = rates[rates.size() - 1];
    99105            }
     106            return i;
    100107        }
    101108    }
    102109    return -1;