Ticket #12990: git-diff-master-mythplayer-20170807.patch

File git-diff-master-mythplayer-20170807.patch, 15.6 KB (added by Peter Bennett, 7 years ago)

File renamed as .patch so it can be viewed more easily

  • mythtv/libs/libmythtv/mythplayer.cpp

    diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
    index 702abc0..a7b7a74 100644
    a b const double MythPlayer::kInaccuracyNone = 0; 
    7979// By default, when seeking, snap to a keyframe if the keyframe's
    8080// distance from the target frame is less than 10% of the total seek
    8181// distance.
    82 const double MythPlayer::kInaccuracyDefault = 0.1;
     82const double MythPlayer::kInaccuracyDefault = 0.2;
    8383
    8484// Allow greater inaccuracy (50%) in the cutlist editor (unless the
    8585// editor seek distance is set to 1 frame or 1 keyframe).
    MythPlayer::MythPlayer(PlayerFlags flags) 
    202202      decoder_lock(QMutex::Recursive),
    203203      next_play_speed(1.0f),        next_normal_speed(true),
    204204      play_speed(1.0f),             normal_speed(true),
    205       frame_interval((int)(1000000.0f / 30)), m_frame_interval(0),
     205      frame_interval((int)(1000000.0f / 25)), m_frame_interval(0),
    206206      ffrew_skip(1),ffrew_adjust(0),
    207207      // Audio and video synchronization stuff
    208208      videosync(NULL),              avsync_delay(0),
    209209      avsync_adjustment(0),         avsync_avg(0),
    210210      avsync_predictor(0),          avsync_predictor_enabled(false),
    211       refreshrate(0),
     211      refreshinterval(0),
    212212      lastsync(false),              repeat_delay(0),
    213213      disp_timecode(0),             avsync_audiopaused(false),
    214214      // AVSync for Raspberry Pi digital streams
    void MythPlayer::PauseVideo(void) 
    424424    needNewPauseFrame = true;
    425425    videoPaused = true;
    426426    videoPauseLock.unlock();
     427    first_time = true;
    427428}
    428429
    429430void MythPlayer::UnpauseVideo(void)
    FrameScanType MythPlayer::detectInterlace(FrameScanType newScan, 
    666667        // isn't, we have to guess.
    667668
    668669        scan = kScan_Interlaced; // default to interlaced
    669         if (720 == video_height) // ATSC 720p
    670             scan = kScan_Progressive;
    671         else if (fps > 45) // software deinterlacing
     670        if (fps > 45) // software deinterlacing
    672671            scan = kScan_Progressive;
    673672
    674673        if (kScan_Detect != newScan)
    int MythPlayer::NextCaptionTrack(int mode) 
    17731772void MythPlayer::SetFrameInterval(FrameScanType scan, double frame_period)
    17741773{
    17751774    frame_interval = (int)(1000000.0f * frame_period + 0.5f);
     1775//    int frameDelay = m_double_framerate ? frame_interval / 2 : frame_interval;
     1776
    17761777    if (!avsync_predictor_enabled)
    17771778        avsync_predictor = 0;
    17781779    avsync_predictor_enabled = false;
    17791780
    17801781    LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("SetFrameInterval ps:%1 scan:%2")
    17811782            .arg(play_speed).arg(scan));
    1782     if (play_speed < 1 || play_speed > 2 || refreshrate <= 0)
     1783    if (play_speed < 1 || play_speed > 2 || refreshinterval <= 0)
    17831784        return;
    17841785
    17851786    avsync_predictor_enabled = ((frame_interval-(frame_interval/200)) <
    1786                                 refreshrate);
     1787                                refreshinterval);
    17871788}
    17881789
    17891790void MythPlayer::ResetAVSync(void)
    17901791{
    17911792    avsync_avg = 0;
    1792     if (!avsync_predictor_enabled || avsync_predictor >= refreshrate)
     1793    if (!avsync_predictor_enabled || avsync_predictor >= refreshinterval)
    17931794        avsync_predictor = 0;
    17941795    prevtc = 0;
    17951796    avsync_next = avsync_interval;      // Frames till next sync check
    void MythPlayer::InitAVSync(void) 
    18041805
    18051806    repeat_delay = 0;
    18061807
    1807     refreshrate = MythDisplay::GetDisplayInfo(frame_interval).Rate();
     1808    refreshinterval = MythDisplay::GetDisplayInfo(frame_interval).Rate();
    18081809
    18091810    // Number of frames over which to average time divergence
    18101811    avsync_averaging=4;
    void MythPlayer::InitAVSync(void) 
    18311832        QString msg = QString("Video timing method: %1").arg(timing_type);
    18321833        LOG(VB_GENERAL, LOG_INFO, LOC + msg);
    18331834        msg = QString("Display Refresh Rate: %1 Video Frame Rate: %2")
    1834                        .arg(1000000.0 / refreshrate, 0, 'f', 3)
     1835                       .arg(1000000.0 / refreshinterval, 0, 'f', 3)
    18351836                       .arg(1000000.0 / frame_interval, 0, 'f', 3);
    18361837        LOG(VB_PLAYBACK, LOG_INFO, LOC + msg);
    18371838
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    18651866    }
    18661867
    18671868    float diverge = 0.0f;
    1868     int frameDelay = m_double_framerate ? frame_interval / 2 : frame_interval;
    18691869    int vsync_delay_clock = 0;
    18701870    //int64_t currentaudiotime = 0;
    18711871
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    18911891        avsync_next = avsync_interval/divisor;
    18921892    }
    18931893
    1894     FrameScanType ps = m_scan;
    1895     if (kScan_Detect == m_scan || kScan_Ignore == m_scan)
    1896         ps = kScan_Progressive;
    1897 
    18981894    bool max_video_behind = diverge < -max_diverge;
    18991895    bool dropframe = false;
    19001896    QString dbg;
    19011897
     1898    dropframe = !m_double_framerate && drop_field;
     1899
    19021900    if (avsync_predictor_enabled)
    19031901    {
    19041902        avsync_predictor += frame_interval;
    1905         if (avsync_predictor >= refreshrate)
     1903        if (avsync_predictor >= refreshinterval)
    19061904        {
    1907             int refreshperiodsinframe = avsync_predictor/refreshrate;
    1908             avsync_predictor -= refreshrate * refreshperiodsinframe;
     1905            int refreshperiodsinframe = avsync_predictor/refreshinterval;
     1906            avsync_predictor -= refreshinterval * refreshperiodsinframe;
    19091907        }
    19101908        else
    19111909        {
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    19141912        }
    19151913    }
    19161914
     1915    int frameDelay = frame_interval + avsync_adjustment + repeat_delay;
     1916    frameDelay = m_double_framerate ? frameDelay / 2 : frameDelay;
     1917
    19171918    if (max_video_behind)
    19181919    {
    19191920        dropframe = true;
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    19281929        audio.Pause(false);
    19291930    }
    19301931
     1932    FrameScanType ps = m_scan;
     1933    if (kScan_Detect == m_scan || kScan_Ignore == m_scan)
     1934        ps = kScan_Progressive;
     1935
    19311936    if (!dropframe)
    19321937    {
    19331938        // PGB this was orignally in the calling methods
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    19671972            LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO,
    19681973                LOC + QString("AVSync waitforframe %1 %2")
    19691974                    .arg(avsync_adjustment).arg(m_double_framerate));
    1970             vsync_delay_clock = videosync->WaitForFrame
    1971                                 (frameDelay + avsync_adjustment + repeat_delay);
     1975            vsync_delay_clock = videosync->WaitForFrame(frameDelay);
    19721976        }
    19731977        else
    19741978        {
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    19761980            lastsync = true;
    19771981        }
    19781982        //currentaudiotime = AVSyncGetAudiotime();
    1979         LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC + "AVSync show");
     1983        // LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC + "AVSync show");
    19801984        videoOutput->Show(ps);
    19811985
    19821986        if (videoOutput->IsErrored())
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    19871991            return;
    19881992        }
    19891993
    1990         if (m_double_framerate)
     1994        if (!drop_field && m_double_framerate)
    19911995        {
    19921996            //second stage of deinterlacer processing
    19931997            ps = (kScan_Intr2ndField == ps) ?
    19941998                kScan_Interlaced : kScan_Intr2ndField;
    19951999            osdLock.lock();
     2000
    19962001            if (m_double_process && ps != kScan_Progressive)
    19972002            {
    19982003                videofiltersLock.lock();
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    20052010            osdLock.unlock();
    20062011            // Display the second field
    20072012            if (!player_ctx->IsPBP() || player_ctx->IsPrimaryPBP())
    2008                 vsync_delay_clock = videosync->WaitForFrame(frameDelay +
    2009                                                         avsync_adjustment);
     2013                vsync_delay_clock += videosync->WaitForFrame(repeat_field ? (frameDelay * 2) : frameDelay);
    20102014            videoOutput->Show(ps);
    20112015        }
    20122016
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    20192023    }
    20202024    else
    20212025    {
    2022         vsync_delay_clock = videosync->WaitForFrame(frameDelay);
     2026        vsync_delay_clock = videosync->WaitForFrame(frame_interval);
    20232027        //currentaudiotime = AVSyncGetAudiotime();
    20242028    }
    20252029
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    20492053        // must be sampled here due to Show delays
    20502054        int64_t currentaudiotime = audio.GetAudioTime();
    20512055        LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC +
    2052             QString("A/V timecodes audio %1 video %2 frameinterval %3 "
     2056            QString("A/V timecodes audio %1 video %2 framedelay %3 "
    20532057                    "avdel %4 avg %5 tcoffset %6 avp %7 avpen %8 avdc %9 "
    20542058                    "diverge %10")
    20552059                .arg(currentaudiotime)
    20562060                .arg(timecode)
    2057                 .arg(frame_interval)
     2061                .arg(frameDelay)
    20582062                .arg(timecode - currentaudiotime -
    20592063                     (int)(vsync_delay_clock*audio.GetStretchFactor()+500)/1000)
    20602064                .arg(avsync_avg)
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    20992103
    21002104            // prevents major jitter when pts resets during dvd title
    21012105            if (avsync_delay > 2000000 && limit_delay)
     2106            {
    21022107                avsync_delay = 90000;
     2108                avsync_avg = 0;
     2109            }
    21032110            avsync_avg = (avsync_delay + (avsync_avg * (avsync_averaging-1))) / avsync_averaging;
    21042111
    21052112            int avsync_used = avsync_avg;
    void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay) 
    21082115
    21092116            /* If the audio time codes and video diverge, shift
    21102117               the video by one interlaced field (1/2 frame) */
    2111             if (!lastsync)
     2118            if (true)   //(!lastsync)
    21122119            {
    2113                 if (avsync_used > refreshrate)
     2120                diverge = (float)avsync_avg / (float)refreshinterval;
     2121                // limit damage to spread any AV shift
     2122                if (diverge >  3)
     2123                    diverge = 3;
     2124                if (diverge < -3)
     2125                    diverge = -3;
     2126                // target +/- 0.5 * refreshinterval
     2127
     2128                frameDelay = m_double_framerate ? frame_interval / 2 : frame_interval;
     2129                repeat_field = false;
     2130                drop_field = false;
     2131                avsync_adjustment = refreshinterval - frameDelay;
     2132                avsync_adjustment = (refreshinterval > frameDelay) ? frameDelay : avsync_adjustment;
     2133
     2134                if (avsync_used > frameDelay)
    21142135                {
    2115                     avsync_adjustment += refreshrate;
     2136                    avsync_adjustment = 0;
     2137                    repeat_field = true;
    21162138                }
    2117                 else if (avsync_used < 0 - refreshrate)
     2139                else if (avsync_used < 0 - frameDelay)
    21182140                {
    2119                     avsync_adjustment -= refreshrate;
     2141                    // drop field or frame
     2142                    avsync_adjustment = 0;
     2143                    drop_field = true;
    21202144                }
     2145
     2146                LOG(VB_PLAYBACK | VB_TIMESTAMP, LOG_INFO, LOC +
     2147                    QString("avsync_used(us) %1  av_adj %2").arg(avsync_used).arg(avsync_adjustment));
     2148
    21212149            }
    21222150            else
    21232151                lastsync = false;
    void MythPlayer::DisplayPauseFrame(void) 
    21752203    RefreshPauseFrame();
    21762204    PreProcessNormalFrame(); // Allow interactiveTV to draw on pause frame
    21772205
     2206    // retrieve the next frame
     2207    videoOutput->StartDisplayingFrame();
     2208    VideoFrame *frame = videoOutput->GetLastShownFrame();
     2209   
     2210    FrameScanType ps = m_scan;
     2211    if (kScan_Detect == m_scan || kScan_Ignore == m_scan)
     2212        ps = kScan_Progressive;
     2213
     2214    if (m_double_process && ps != kScan_Progressive)
     2215    {
     2216        //second stage of deinterlacer processing
     2217        ps = kScan_Intr2ndField;
     2218    }     
     2219
     2220//    ps = kScan_Ignore;
     2221
    21782222    osdLock.lock();
    21792223    videofiltersLock.lock();
    2180     videoOutput->ProcessFrame(NULL, osd, videoFilters, pip_players);
     2224    videoOutput->ProcessFrame(frame, osd, videoFilters, pip_players, ps);
    21812225    videofiltersLock.unlock();
    2182     videoOutput->PrepareFrame(NULL, kScan_Ignore, osd);
     2226    videoOutput->PrepareFrame(frame, ps, osd);
    21832227    osdLock.unlock();
    2184     videoOutput->Show(kScan_Ignore);
     2228    videoOutput->Show(ps);
    21852229    videosync->Start();
    21862230}
    21872231
    void MythPlayer::DisplayNormalFrame(bool check_prebuffer) 
    23162360    AutoDeint(frame);
    23172361    detect_letter_box->SwitchTo(frame);
    23182362
    2319     FrameScanType ps = m_scan;
    2320     if (kScan_Detect == m_scan || kScan_Ignore == m_scan)
    2321         ps = kScan_Progressive;
    2322 
    23232363    AVSync(frame, 0);
    23242364    // If PiP then keep this frame for MythPlayer::GetCurrentFrame
    23252365    if (!player_ctx->IsPIP())
    void MythPlayer::VideoStart(void) 
    24442484    avsync_delay = 0;
    24452485    avsync_avg = 0;
    24462486    avsync_next = avsync_interval;      // Frames till next sync check
    2447     refreshrate = 0;
     2487    refreshinterval = 0;
    24482488    lastsync = false;
    24492489
    24502490    EnableFrameRateMonitor();
    2451     refreshrate = frame_interval;
     2491    refreshinterval = frame_interval;
    24522492
    24532493    float temp_speed = (play_speed == 0.0) ? audio.GetStretchFactor() : play_speed;
    24542494    int fr_int = (1000000.0 / video_frame_rate / temp_speed);
    void MythPlayer::ChangeSpeed(void) 
    37873827
    37883828        // If using bob deinterlace, turn on or off if we
    37893829        // changed to or from synchronous playback speed.
    3790         bool play_1 = play_speed > 0.99f && play_speed < 1.01f && normal_speed;
     3830        bool play_1 = true;   //play_speed > 0.99f && play_speed < 1.01f && normal_speed;
    37913831        bool inter  = (kScan_Interlaced   == m_scan  ||
    37923832                       kScan_Intr2ndField == m_scan);
    37933833
  • mythtv/libs/libmythtv/mythplayer.h

    diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
    index 1a23e2f..9c9fb64 100644
    a b class MTV_PUBLIC MythPlayer 
    656656    int64_t        decoderSeek;
    657657    bool           decodeOneFrame;
    658658    bool           needNewPauseFrame;
     659    bool           first_time;
    659660    mutable QMutex bufferPauseLock;
    660661    mutable QMutex videoPauseLock;
    661662    mutable QMutex pauseLock;
    class MTV_PUBLIC MythPlayer 
    809810
    810811    float      play_speed;
    811812    bool       normal_speed;
    812     int        frame_interval;///< always adjusted for play_speed
    813     int        m_frame_interval;///< used to detect changes to frame_interval
     813    int        frame_interval;   ///< always adjusted for play_speed
     814    int        m_frame_interval; ///< used to detect changes to frame_interval
    814815
    815816    int        ffrew_skip;
    816817    int        ffrew_adjust;
    class MTV_PUBLIC MythPlayer 
    822823    int        avsync_avg;
    823824    int        avsync_predictor;
    824825    bool       avsync_predictor_enabled;
    825     int        refreshrate;
     826    int        refreshinterval;  // time (us)
    826827    bool       lastsync;
    827828    bool       decode_extra_audio;
    828829    int        repeat_delay;
     830    bool       drop_field;
     831    bool       repeat_field;
    829832    int64_t    disp_timecode;
    830833    bool       avsync_audiopaused;
    831834    float      max_diverge;  // from setting PlayerMaxDiverge default 2
  • mythtv/libs/libmythtv/videoout_vdpau.cpp

    diff --git a/mythtv/libs/libmythtv/videoout_vdpau.cpp b/mythtv/libs/libmythtv/videoout_vdpau.cpp
    index 07f6e6d..fd8fa59 100644
    a b void VideoOutputVDPAU::PrepareFrame(VideoFrame *frame, FrameScanType scan, 
    505505                VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD :
    506506                VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
    507507    }
    508     else if (!frame && m_deinterlacing)
     508    else if (m_deinterlacing && !frame)
    509509    {
    510         field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
     510        field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD;
    511511    }
    512512
    513513    m_render->WaitForFlip();