Ticket #8631: seek_honors_cutlist.patch

File seek_honors_cutlist.patch, 8.6 KB (added by Jim Stichnoth <stichnot@…>, 11 years ago)
  • libs/libmythtv/deletemap.h

     
    4444    bool     IsInDelete(uint64_t frame);
    4545    uint64_t GetNearestMark(uint64_t frame, uint64_t total, bool right);
    4646    uint64_t GetLastFrame(uint64_t total);
     47    uint64_t TranslatePositionAbsToRel(uint64_t absPosition);
     48    uint64_t TranslatePositionRelToAbs(uint64_t relPosition);
    4749
    4850    void TrackerReset(uint64_t frame, uint64_t total);
    4951    bool TrackerWantsToJump(uint64_t frame, uint64_t total, uint64_t &to);
  • libs/libmythtv/NuppelVideoPlayer.cpp

     
    39683968    info.values.insert("progbefore", 0);
    39693969    info.values.insert("progafter",  0);
    39703970
    3971     int playbackLen = totalLength;
     3971    int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate;
    39723972
    39733973    if (livetv && player_ctx->tvchain)
    39743974    {
     
    39863986        islive = true;
    39873987    }
    39883988
    3989     float secsplayed = ((float)framesPlayed / video_frame_rate);
     3989    float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate);
    39903990    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
    39913991}
    39923992
  • libs/libmythtv/tv_play.h

     
    416416
    417417    bool SeekHandleAction(PlayerContext *actx, const QStringList &actions,
    418418                          const bool isDVD);
    419     void DoSeek(PlayerContext*, float time, const QString &mesg);
     419    void DoSeek(PlayerContext*, float time, const QString &mesg,
     420                bool timeIsOffset=true);
    420421    bool DoNVPSeek(PlayerContext*, float time);
    421422    enum ArbSeekWhence {
    422423        ARBSEEK_SET = 0,
  • libs/libmythtv/NuppelVideoPlayer.h

     
    233233    virtual long long CalcMaxFFTime(long long ff, bool setjump = true) const;
    234234    long long CalcRWTime(long long rw) const;
    235235    virtual void calcSliderPos(osdInfo &info, bool paddedFields = false);
     236    uint64_t TranslatePositionAbsToRel(uint64_t absPosition) {
     237        return deleteMap.TranslatePositionAbsToRel(absPosition);
     238    }
     239    uint64_t TranslatePositionRelToAbs(uint64_t relPosition) {
     240        return deleteMap.TranslatePositionRelToAbs(relPosition);
     241    }
    236242
    237243    /// Non-const gets
    238244    OSD         *GetOSD(void)                 { return osd; }
  • libs/libmythtv/tv_play.cpp

     
    39833983    else if (has_action("JUMPBKMRK", actions))
    39843984    {
    39853985        ctx->LockDeleteNVP(__FILE__, __LINE__);
    3986         long long bookmark = ctx->nvp->GetBookmark();
    3987         long long curloc   = ctx->nvp->GetFramesPlayed();
     3986        uint64_t bookmark = ctx->nvp->GetBookmark();
    39883987        float mult = 1.0f;
    39893988        if (ctx->last_framerate)
    39903989            mult = 1.0f / ctx->last_framerate;
    3991         long long seekloc = (long long) ((bookmark - curloc) * mult);
     3990        float seekloc = ctx->nvp->TranslatePositionAbsToRel(bookmark) * mult;
    39923991        ctx->UnlockDeleteNVP(__FILE__, __LINE__);
    39933992
    39943993        if (bookmark > ctx->last_framerate)
    39953994        {
    3996             DoSeek(ctx, seekloc, tr("Jump to Bookmark"));
     3995            DoSeek(ctx, seekloc, tr("Jump to Bookmark"), false);
    39973996        }
    39983997    }
    39993998    else if (has_action("JUMPSTART",actions))
    40003999    {
    4001         long long seekloc = +1;
    4002         ctx->LockDeleteNVP(__FILE__, __LINE__);
    4003         if (ctx->nvp && ctx->last_framerate >= 0.0001f)
    4004         {
    4005             seekloc = (int64_t) (-1.0 * ctx->nvp->GetFramesPlayed() /
    4006                                  ctx->last_framerate);
    4007         }
    4008         ctx->UnlockDeleteNVP(__FILE__, __LINE__);
    4009 
    4010         if (seekloc <= 0)
    4011             DoSeek(ctx, seekloc, tr("Jump to Beginning"));
     4000        DoSeek(ctx, 0, tr("Jump to Beginning"), false);
    40124001    }
    40134002    else if (has_action("CLEAROSD", actions))
    40144003    {
     
    45914580        ctx->UnlockDeleteNVP(__FILE__, __LINE__);
    45924581
    45934582        if (tokens[2] == "BEGINNING")
    4594             DoSeek(ctx, -fplay, tr("Jump to Beginning"));
     4583            DoSeek(ctx, 0, tr("Jump to Beginning"), false);
    45954584        else if (tokens[2] == "FORWARD")
    45964585            DoSeek(ctx, ctx->fftime, tr("Skip Ahead"));
    45974586        else if (tokens[2] == "BACKWARD")
     
    46014590                 ctx->last_framerate)
    46024591        {
    46034592            long long rel_frame = tokens[3].toInt();
    4604             rel_frame -= (long long) (fplay * (1.0 / ctx->last_framerate)),
    4605             DoSeek(ctx, rel_frame, tr("Jump To"));
     4593            DoSeek(ctx, rel_frame / ctx->last_framerate, tr("Jump To"), false);
    46064594        }
    46074595    }
    46084596    else if (tokens.size() >= 3 && tokens[1] == "QUERY")
     
    56375625    return true;
    56385626}
    56395627
    5640 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg)
     5628void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg,
     5629                bool timeIsOffset)
    56415630{
    56425631    bool limitkeys = false;
    56435632
     
    56515640        keyRepeatTimer.start();
    56525641        NormalSpeed(ctx);
    56535642        time += StopFFRew(ctx);
     5643        float framerate = ctx->last_framerate;
     5644        uint64_t currentFrameAbs = ctx->nvp->GetFramesPlayed();
     5645        uint64_t currentFrameRel =
     5646            ctx->nvp->TranslatePositionAbsToRel(currentFrameAbs);
     5647        int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) +
     5648            time * framerate + 0.5;
     5649        if (desiredFrameRel < 0)
     5650            desiredFrameRel = 0;
     5651        uint64_t desiredFrameAbs =
     5652            ctx->nvp->TranslatePositionRelToAbs(desiredFrameRel);
     5653        time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate;
    56545654        DoNVPSeek(ctx, time);
    56555655        UpdateOSDSeekMessage(ctx, mesg, true);
    56565656    }
     
    56815681        if (whence == ARBSEEK_END)
    56825682            time = (ctx->nvp->CalcMaxFFTime(LONG_MAX, false) /
    56835683                    ctx->last_framerate) - time;
    5684         else
    5685             time = time - (ctx->nvp->GetFramesPlayed() - 1) /
    5686                     ctx->last_framerate;
    56875684        ctx->UnlockDeleteNVP(__FILE__, __LINE__);
    5688         DoSeek(ctx, time, tr("Jump To"));
     5685        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET));
    56895686    }
    56905687}
    56915688
  • libs/libmythtv/deletemap.cpp

     
    505505        result = it.key();
    506506    return result;
    507507}
     508
     509uint64_t DeleteMap::TranslatePositionAbsToRel(uint64_t absPosition)
     510{
     511    uint64_t subtraction = 0;
     512    uint64_t startOfCutRegion = 0;
     513    frm_dir_map_t::const_iterator i;
     514    bool withinCut = false;
     515    bool first = true;
     516    for (i = m_deleteMap.constBegin();
     517         i != m_deleteMap.constEnd() && i.key() <= absPosition;
     518         i++)
     519    {
     520        if (first)
     521            withinCut = (i.value() == MARK_CUT_END);
     522        first = false;
     523        if (i.value() == MARK_CUT_START && !withinCut)
     524        {
     525            withinCut = true;
     526            startOfCutRegion = i.key();
     527        }
     528        else if (i.value() == MARK_CUT_END && withinCut)
     529        {
     530            withinCut = false;
     531            subtraction += (i.key() - startOfCutRegion);
     532        }
     533    }
     534    if (withinCut)
     535        subtraction += (absPosition - startOfCutRegion);
     536    return absPosition - subtraction;
     537}
     538
     539uint64_t DeleteMap::TranslatePositionRelToAbs(uint64_t relPosition)
     540{
     541    uint64_t addition = 0;
     542    uint64_t startOfCutRegion = 0;
     543    frm_dir_map_t::const_iterator i;
     544    bool withinCut = false;
     545    bool first = true;
     546    for (i = m_deleteMap.constBegin(); i != m_deleteMap.constEnd(); i++)
     547    {
     548        if (first)
     549            withinCut = (i.value() == MARK_CUT_END);
     550        first = false;
     551        if (i.value() == MARK_CUT_START && !withinCut)
     552        {
     553            withinCut = true;
     554            startOfCutRegion = i.key();
     555            if (relPosition + addition <= startOfCutRegion)
     556                break;
     557        }
     558        else if (i.value() == MARK_CUT_END && withinCut)
     559        {
     560            withinCut = false;
     561            addition += (i.key() - startOfCutRegion);
     562        }
     563    }
     564    return relPosition + addition;
     565}