Ticket #5643: mythtv_refresh_rate_auto_pickv3-trunk.patch

File mythtv_refresh_rate_auto_pickv3-trunk.patch, 18.0 KB (added by henrik.sorensen@…, 4 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;