Ticket #5643: mythtv_refresh_rate_auto_pickv3.patch

File mythtv_refresh_rate_auto_pickv3.patch, 18.0 KB (added by henrik.sorensen@…, 12 years ago)

0.21 patch

  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    633633            GetDecoder()->GetVideoCodecID(),
    634634            GetDecoder()->GetVideoCodecPrivate(),
    635635            video_disp_dim, video_aspect,
    636             widget->winId(), display_rect, 0 /*embedid*/);
     636            widget->winId(), display_rect, (video_frame_rate * play_speed),
     637            0 /*embedid*/);
    637638
    638639        if (!videoOutput)
    639640        {
     
    648649        videoOutput->SetVideoScalingAllowed(db_scale);
    649650
    650651        // We need to tell it this for automatic deinterlacer settings
    651         videoOutput->SetVideoFrameRate(video_frame_rate * play_speed);
     652        videoOutput->SetVideoFrameRate(video_frame_rate * play_speed);
    652653
    653654        if (videoOutput->hasMCAcceleration() && !decode_extra_audio)
    654655        {
  • 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

     
    13331333}
    13341334
    13351335bool VideoOutputQuartz::Init(int width, int height, float aspect,
    1336                              WId winid, int winx, int winy,
    1337                              int winw, int winh, WId embedid)
     1336                             WId winid, int winx, int winy, int winw,
     1337                             int winh, float video_prate, WId embedid)
    13381338{
    13391339    VERBOSE(VB_PLAYBACK, LOC +
    13401340            QString("Init(WxH %1x%2, aspect=%3, winid=%4\n\t\t\t"
     
    13561356    vbuffers.Init(kNumBuffers, true, kNeedFreeFrames,
    13571357                  kPrebufferFramesNormal, kPrebufferFramesSmall,
    13581358                  kKeepPrebuffer);
    1359     VideoOutput::Init(width, height, aspect, winid,
    1360                       winx, winy, winw, winh, embedid);
     1359    VideoOutput::Init(width, height, aspect, winid, winx,
     1360                      winy, winw, winh, video_prate, embedid);
    13611361
    13621362    data->srcWidth  = video_dim.width();
    13631363    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

     
    353353
    354354bool VideoOutputDirectfb::Init(int width, int height, float aspect, WId winid,
    355355                               int winx, int winy, int winw, int winh,
    356                                WId embedid)
     356                               float video_prate, WId embedid)
    357357{
    358358    // Hack to avoid embedded video output...
    359359    if ((winw < 320) || (winh < 240))
     
    646646                           display_visible_rect.y(),
    647647                           display_visible_rect.width(),
    648648                           display_visible_rect.height(),
    649                            embedid))
     649                           video_prate, embedid))
    650650    {
    651651        return false;
    652652    }
  • 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

     
    115115
    116116bool VideoOutputNull::Init(int width, int height, float aspect,
    117117                           WId winid, int winx, int winy, int winw,
    118                            int winh, WId embedid)
     118                           int winh, float video_prate, WId embedid)
    119119{
    120120    if ((width <= 0) || (height <= 0))
    121121        return false;
    122122
    123123    QMutexLocker locker(&global_lock);
    124124
    125     VideoOutput::Init(width, height, aspect, winid,
    126                       winx, winy, winw, winh, embedid);
     125    VideoOutput::Init(width, height, aspect, winid, winx,
     126                      winy, winw, winh, video_prate, embedid);
    127127
    128128    vbuffers.Init(kNumBuffers, true, kNeedFreeFrames,
    129129                  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
     
    166166
    167167        if (vo)
    168168        {
     169            vo->video_prate = video_prate;
    169170            if (vo->Init(
    170171                    video_dim.width(), video_dim.height(), video_aspect,
    171172                    win_id, display_rect.x(), display_rect.y(),
    172                     display_rect.width(), display_rect.height(), embed_id))
     173                    display_rect.width(), display_rect.height(),
     174                    video_prate, embed_id))
    173175            {
    174176                return vo;
    175177            }
     
    181183        renderer = VideoDisplayProfile::GetBestVideoRenderer(renderers);
    182184    }
    183185
     186
     187
    184188    VERBOSE(VB_IMPORTANT, LOC_ERR +
    185189            "Not compiled with any useable video output method.");
    186190
     
    363367 * \return true if successful, false otherwise.
    364368 */
    365369bool VideoOutput::Init(int width, int height, float aspect, WId winid,
    366                        int winx, int winy, int winw, int winh, WId embedid)
     370                       int winx, int winy, int winw, int winh,
     371                       float video_prate, WId embedid)
    367372{
    368373    (void)winid;
    369374    (void)embedid;
     
    405410
    406411void VideoOutput::SetVideoFrameRate(float playback_fps)
    407412{
     413    video_prate = playback_fps;
    408414    db_vdisp_profile->SetOutput(playback_fps);
    409415}
    410416
  • 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

     
    405405    if ((width == 1920 || width == 1440) && height == 1088)
    406406        height = 1080; // ATSC 1920x1080
    407407
    408     if (display_res && display_res->SwitchToVideo(width, height))
    409     {
     408    if (display_res && display_res->SwitchToVideo(width, height,
     409                                                  (short) roundf(video_prate)))
     410        {
    410411        // Switching to custom display resolution succeeded
    411412        // Make a note of the new size
    412413        display_dim = QSize(display_res->GetPhysicalWidth(),
     
    15681569}
    15691570
    15701571/**
    1571  * \fn VideoOutputXv::Init(int,int,float,WId,int,int,int,int,WId)
     1572 * \fn VideoOutputXv::Init(int,int,float,WId,int,int,int,int,float,WId)
    15721573 * Initializes class for video output.
    15731574 *
    15741575 * \return success or failure.
    15751576 */
    15761577bool VideoOutputXv::Init(
    1577     int width, int height, float aspect,
    1578     WId winid, int winx, int winy, int winw, int winh, WId embedid)
     1578    int width, int height, float aspect, WId winid, int winx,
     1579    int winy, int winw, int winh, float video_prate, WId embedid)
    15791580{
    15801581    needrepaint = true;
    15811582
     
    16091610    // Basic setup
    16101611    VideoOutput::Init(width, height, aspect,
    16111612                      winid, winx, winy, winw, winh,
    1612                       embedid);
     1613                      video_prate, embedid);
    16131614
    16141615    // Set resolution/measurements (check XRandR, Xinerama, config settings)
    16151616    InitDisplayMeasurements(width, height);
  • libs/libmythtv/videooutbase.h

     
    3636        void          *codec_priv,
    3737        const QSize   &video_dim, float        video_aspect,
    3838        WId            win_id,    const QRect &display_rect,
    39         WId            embed_id);
     39        float video_prate,        WId            embed_id);
    4040
    4141    VideoOutput();
    4242    virtual ~VideoOutput();
    4343
    4444    virtual bool Init(int width, int height, float aspect,
    4545                      WId winid, int winx, int winy, int winw,
    46                       int winh, WId embedid = 0);
     46                      int winh, float video_prate, WId embedid = 0);
    4747    virtual void InitOSD(OSD *osd);
    4848    virtual void SetVideoFrameRate(float);
    4949
     
    276276    QSize   video_dim;        ///< Pixel dimensions of video buffer
    277277    QSize   video_disp_dim;   ///< Pixel dimensions of video display area
    278278    float   video_aspect;     ///< Physical aspect ratio of video
     279    float   video_prate;  ///< Playback frame rate of video
    279280
    280281    /// Normally this is the same as videoAspect, but may not be
    281282    /// 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/libmyth/DisplayRes.cpp

     
    3737    // Initialize GUI mode
    3838    mode[GUI].Init();
    3939    tW = tH = 0;
    40     gContext->GetResolutionSetting("GuiVidMode", tW, tH);
     40    gContext->GetResolutionSetting("GuiVidMode", tW, tH, tAspect, tRate);
    4141    GetDisplaySize(tW_mm, tH_mm);
    4242    gContext->GetResolutionSetting("DisplaySize", tW_mm, tH_mm);
    43     mode[GUI] = DisplayResScreen(tW, tH, tW_mm, tH_mm, -1.0, 0);
     43    mode[GUI] = DisplayResScreen(tW, tH, tW_mm, tH_mm, -1.0, tRate);
    4444
    4545
    4646    // Initialize default VIDEO mode
     
    8787    tmode next_mode = VIDEO; // default VIDEO mode
    8888    DisplayResScreen next = mode[next_mode];
    8989
     90    // If requested refresh rate is 0, attempt to match video fps
     91    if (next.RefreshRate() == 0)
     92        next.AddRefreshRate(irate);
     93
    9094    // try to find video override mode
    9195    uint key = DisplayResScreen::CalcKey(iwidth, iheight, irate);
    9296    DisplayResMapCIt it = in_size_to_output_mode.find(key);
     
    130134    // need to change video mode?
    131135    short target_rate = 0;
    132136    DisplayResScreen::FindBestMatch(GetVideoModes(), next, target_rate);
    133     bool chg = !(next == last) || !(last.RefreshRate() == target_rate);
     137    // If GuiVidModeRefreshRate is 0, assume any refresh rate is good enough.
     138    bool chg = !(next == last) || (next.RefreshRate() !=0 && !(last.RefreshRate() == target_rate));
    134139
    135140    VERBOSE(VB_PLAYBACK, QString("Trying %1x%2 %3 Hz")
    136141            .arg(next.Width()).arg(next.Height()).arg(target_rate));
  • libs/libmyth/DisplayResScreen.cpp

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