Ticket #8631: seek_honors_cutlist_v3.patch

File seek_honors_cutlist_v3.patch, 25.2 KB (added by Jim Stichnoth <stichnot@…>, 11 years ago)
  • themes/default-wide/osd.xml

     
    352352            <area>770,10,300,30</area>
    353353            <align>right,top</align>
    354354        </textarea>
    355         <textarea name="timedisplay" from="title">
     355        <textarea name="fulltimedisplay" from="title">
    356356            <area>10,50,1060,30</area>
    357357            <align>hcenter,bottom</align>
    358358        </textarea>
  • libs/libmythtv/deletemap.h

     
    4545    bool     IsTemporaryMark(uint64_t frame);
    4646    bool     HasTemporaryMark(void);
    4747    uint64_t GetLastFrame(uint64_t total);
     48    uint64_t TranslatePositionAbsToRel(uint64_t absPosition) {
     49        return TranslatePositionAbsToRel(m_deleteMap, absPosition);
     50    }
     51    uint64_t TranslatePositionRelToAbs(uint64_t relPosition) {
     52        return TranslatePositionRelToAbs(m_deleteMap, relPosition);
     53    }
     54    static uint64_t TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap,
     55                                              uint64_t absPosition);
     56    static uint64_t TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap,
     57                                              uint64_t relPosition);
    4858
    4959    void TrackerReset(uint64_t frame, uint64_t total);
    5060    bool TrackerWantsToJump(uint64_t frame, uint64_t total, uint64_t &to);
  • libs/libmythtv/tv_play.h

     
    419419
    420420    bool SeekHandleAction(PlayerContext *actx, const QStringList &actions,
    421421                          const bool isDVD);
    422     void DoSeek(PlayerContext*, float time, const QString &mesg);
     422    void DoSeek(PlayerContext*, float time, const QString &mesg,
     423                bool timeIsOffset, bool honorCutlist=true);
    423424    bool DoPlayerSeek(PlayerContext*, float time);
    424425    enum ArbSeekWhence {
    425426        ARBSEEK_SET = 0,
     
    427428        ARBSEEK_FORWARD,
    428429        ARBSEEK_END
    429430    };
    430     void DoArbSeek(PlayerContext*, ArbSeekWhence whence);
     431    void DoArbSeek(PlayerContext*, ArbSeekWhence whence, bool honorCutlist=true);
    431432    void NormalSpeed(PlayerContext*);
    432433    void ChangeSpeed(PlayerContext*, int direction);
    433434    void ToggleTimeStretch(PlayerContext*);
  • libs/libmythtv/mythplayer.h

     
    232232    virtual long long CalcMaxFFTime(long long ff, bool setjump = true) const;
    233233    long long CalcRWTime(long long rw) const;
    234234    virtual void calcSliderPos(osdInfo &info, bool paddedFields = false);
     235    uint64_t TranslatePositionAbsToRel(uint64_t absPosition) {
     236        return deleteMap.TranslatePositionAbsToRel(absPosition);
     237    }
     238    uint64_t TranslatePositionRelToAbs(uint64_t relPosition) {
     239        return deleteMap.TranslatePositionRelToAbs(relPosition);
     240    }
    235241
    236242    /// Non-const gets
    237243    OSD         *GetOSD(void)                 { return osd; }
     
    497503    void  JumpToProgram(void);
    498504
    499505    void calcSliderPosPriv(osdInfo &info, bool paddedFields,
    500                            int playbackLen, float secsplayed, bool islive);
     506                           int playbackLen, float secsplayed, bool islive,
     507                           bool isRaw);
    501508
    502509  protected:
    503510    DecoderBase   *decoder;
  • libs/libmythtv/mythdvdplayer.cpp

     
    343343        // DVD playing non-functional under windows for now
    344344        secsplayed = 0.0f;
    345345#endif
    346     calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
     346        calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
     347        calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, true);
    347348}
    348349
    349350void MythDVDPlayer::SeekForScreenGrab(uint64_t &number, uint64_t frameNum,
  • libs/libmythtv/tv_play.cpp

     
    548548            "Pause"), "P");
    549549    REG_KEY("TV Playback", "SEEKFFWD", QT_TRANSLATE_NOOP("MythControls",
    550550            "Fast Forward"), "Right");
     551    REG_KEY("TV Playback", "SEEKFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     552            "Fast Forward ignoring cutlist"), "");
    551553    REG_KEY("TV Playback", "SEEKRWND", QT_TRANSLATE_NOOP("MythControls",
    552554            "Rewind"), "Left");
     555    REG_KEY("TV Playback", "SEEKRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     556            "Rewind ignoring cutlist"), "");
    553557    REG_KEY("TV Playback", "ARBSEEK", QT_TRANSLATE_NOOP("MythControls",
    554558            "Arbitrary Seek"), "*");
     559    REG_KEY("TV Playback", "ARBSEEKNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     560            "Arbitrary Seek ignoring cutlist"), "");
    555561    REG_KEY("TV Playback", "CHANNELUP", QT_TRANSLATE_NOOP("MythControls",
    556562            "Channel up"), "Up");
    557563    REG_KEY("TV Playback", "CHANNELDOWN", QT_TRANSLATE_NOOP("MythControls",
     
    562568            "Switch to the previous channel"), "H");
    563569    REG_KEY("TV Playback", "JUMPFFWD", QT_TRANSLATE_NOOP("MythControls",
    564570            "Jump ahead"), "PgDown");
     571    REG_KEY("TV Playback", "JUMPFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     572            "Jump ahead ignoring cutlist"), "");
    565573    REG_KEY("TV Playback", "JUMPRWND", QT_TRANSLATE_NOOP("MythControls",
    566574            "Jump back"), "PgUp");
     575    REG_KEY("TV Playback", "JUMPRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     576            "Jump back ignoring cutlist"), "");
     577    REG_KEY("TV Playback", "INFONOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     578            "Info ignoring cutlist"), "");
    567579    REG_KEY("TV Playback", "JUMPBKMRK", QT_TRANSLATE_NOOP("MythControls",
    568580            "Jump to bookmark"), "K");
    569581    REG_KEY("TV Playback", "FFWDSTICKY", QT_TRANSLATE_NOOP("MythControls",
     
    39863998            ctx->buffer->DVD()->MoveButtonDown();
    39873999        }
    39884000        else if (has_action("LEFT", actions) ||
    3989                  has_action("SEEKRWND", actions))
     4001                 has_action("SEEKRWND", actions) ||
     4002                 has_action("SEEKRWNDNOCUTLIST", actions))
    39904003        {
    39914004            ctx->buffer->DVD()->MoveButtonLeft();
    39924005        }
    39934006        else if (has_action("RIGHT", actions) ||
    3994                  has_action("SEEKFFWD", actions))
     4007                 has_action("SEEKFFWD", actions) ||
     4008                 has_action("SEEKFFWDNOCUTLIST", actions))
    39954009        {
    39964010            ctx->buffer->DVD()->MoveButtonRight();
    39974011        }
     
    40924106            }
    40934107        }
    40944108    }
    4095     else if (has_action("JUMPRWND", actions))
     4109    else if (has_action("JUMPRWND", actions) ||
     4110             has_action("JUMPRWNDNOCUTLIST", actions))
    40964111    {
    40974112        if (isDVD)
    40984113            DVDJumpBack(ctx);
    40994114        else if (GetNumChapters(ctx) > 0)
    41004115            DoJumpChapter(ctx, -1);
    41014116        else
    4102             DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
     4117            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"),
     4118                   true, has_action("JUMPRWND", actions));
    41034119    }
    4104     else if (has_action("JUMPFFWD", actions))
     4120    else if (has_action("JUMPFFWD", actions) ||
     4121             has_action("JUMPFFWDNOCUTLIST", actions))
    41054122    {
    41064123        if (isDVD)
    41074124            DVDJumpForward(ctx);
    41084125        else if (GetNumChapters(ctx) > 0)
    41094126            DoJumpChapter(ctx, 9999);
    41104127        else
    4111             DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
     4128            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"),
     4129                   true, has_action("JUMPFFWD", actions));
    41124130    }
    41134131    else if (has_action("JUMPBKMRK", actions))
    41144132    {
    41154133        ctx->LockDeletePlayer(__FILE__, __LINE__);
    4116         long long bookmark = ctx->player->GetBookmark();
    4117         long long curloc   = ctx->player->GetFramesPlayed();
     4134        uint64_t bookmark = ctx->player->GetBookmark();
    41184135        float mult = 1.0f;
    41194136        if (ctx->last_framerate)
    41204137            mult = 1.0f / ctx->last_framerate;
    4121         long long seekloc = (long long) ((bookmark - curloc) * mult);
     4138        float seekloc = ctx->player->TranslatePositionAbsToRel(bookmark) * mult;
    41224139        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    41234140
    41244141        if (bookmark > ctx->last_framerate)
    41254142        {
    4126             DoSeek(ctx, seekloc, tr("Jump to Bookmark"));
     4143            DoSeek(ctx, seekloc, tr("Jump to Bookmark"), false);
    41274144        }
    41284145    }
    41294146    else if (has_action("JUMPSTART",actions))
    41304147    {
    4131         long long seekloc = +1;
    4132         ctx->LockDeletePlayer(__FILE__, __LINE__);
    4133         if (ctx->player && ctx->last_framerate >= 0.0001f)
    4134         {
    4135             seekloc = (int64_t) (-1.0 * ctx->player->GetFramesPlayed() /
    4136                                  ctx->last_framerate);
    4137         }
    4138         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    4139 
    4140         if (seekloc <= 0)
    4141             DoSeek(ctx, seekloc, tr("Jump to Beginning"));
     4148        DoSeek(ctx, 0, tr("Jump to Beginning"), false);
    41424149    }
    41434150    else if (has_action("CLEAROSD", actions))
    41444151    {
     
    42854292        ChangeTimeStretch(ctx, -1);
    42864293    else if (has_action("MENU", actions))
    42874294        ShowOSDMenu(ctx);
    4288     else if (has_action("INFO", actions))
     4295    else if (has_action("INFO", actions) || has_action("INFONOCUTLIST", actions))
    42894296    {
    42904297        if (HasQueuedInput())
    42914298        {
    4292             DoArbSeek(ctx, ARBSEEK_SET);
     4299            DoArbSeek(ctx, ARBSEEK_SET, !has_action("INFONOCUTLIST", actions));
    42934300        }
    42944301        else
    42954302            ToggleOSD(ctx, true);
     
    44864493        else if (GetNumChapters(ctx) > 0)
    44874494            DoJumpChapter(ctx, -1);
    44884495        else
    4489             DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
     4496            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
    44904497    }
    44914498    else if (has_action("CHANNELDOWN", actions))
    44924499    {
     
    45024509        else if (GetNumChapters(ctx) > 0)
    45034510            DoJumpChapter(ctx, 9999);
    45044511        else
    4505             DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
     4512            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true);
    45064513    }
    45074514    else if (has_action("DELETE", actions) && !islivetv)
    45084515    {
     
    47274734        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    47284735
    47294736        if (tokens[2] == "BEGINNING")
    4730             DoSeek(ctx, -fplay, tr("Jump to Beginning"));
    4731         else if (tokens[2] == "FORWARD")
    4732             DoSeek(ctx, ctx->fftime, tr("Skip Ahead"));
    4733         else if (tokens[2] == "BACKWARD")
    4734             DoSeek(ctx, -ctx->rewtime, tr("Skip Back"));
    4735         else if ((tokens[2] == "POSITION") && (tokens.size() == 4) &&
     4737            DoSeek(ctx, 0, tr("Jump to Beginning"), false);
     4738        else if (tokens[2] == "FORWARD" || tokens[2] == "FORWARDNOCUTLIST")
     4739            DoSeek(ctx, ctx->fftime, tr("Skip Ahead"), true, tokens[2] == "FORWARD");
     4740        else if (tokens[2] == "BACKWARD" || tokens[2] == "BACKWARDNOCUTLIST")
     4741            DoSeek(ctx, -ctx->rewtime, tr("Skip Back"), true, tokens[2] == "BACKWARD");
     4742        else if ((tokens[2] == "POSITION" ||
     4743                  tokens[2] == "POSITIONNOCUTLIST") &&
     4744                 (tokens.size() == 4) &&
    47364745                 (tokens[3].contains(QRegExp("^\\d+$"))) &&
    47374746                 ctx->last_framerate)
    47384747        {
    47394748            long long rel_frame = tokens[3].toInt();
    4740             rel_frame -= (long long) (fplay * (1.0 / ctx->last_framerate)),
    4741             DoSeek(ctx, rel_frame, tr("Jump To"));
     4749            DoSeek(ctx, rel_frame / ctx->last_framerate, tr("Jump To"),
     4750                   false, tokens[2] == "POSITION");
    47424751        }
    47434752    }
    47444753    else if (tokens.size() >= 3 && tokens[1] == "VOLUME")
     
    57785787                          const bool isDVD)
    57795788{
    57805789    const int kRewind = 4, kForward = 8, kSticky = 16, kSlippery = 32,
    5781               kRelative = 64, kAbsolute = 128, kWhenceMask = 3;
     5790              kRelative = 64, kAbsolute = 128, kIgnoreCutlist = 256,
     5791              kWhenceMask = 3;
    57825792    int flags = 0;
    57835793    if (has_action("SEEKFFWD", actions))
    57845794        flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative;
     5795    else if (has_action("SEEKFFWDNOCUTLIST", actions))
     5796        flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative | kIgnoreCutlist;
    57855797    else if (has_action("FFWDSTICKY", actions))
    57865798        flags = ARBSEEK_END     | kForward | kSticky   | kAbsolute;
    57875799    else if (has_action("RIGHT", actions))
    57885800        flags = ARBSEEK_FORWARD | kForward | kSticky   | kRelative;
    57895801    else if (has_action("SEEKRWND", actions))
    57905802        flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative;
     5803    else if (has_action("SEEKRWNDNOCUTLIST", actions))
     5804        flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative | kIgnoreCutlist;
    57915805    else if (has_action("RWNDSTICKY", actions))
    57925806        flags = ARBSEEK_SET     | kRewind  | kSticky   | kAbsolute;
    57935807    else if (has_action("LEFT", actions))
     
    57985812    int direction = (flags & kRewind) ? -1 : 1;
    57995813    if (HasQueuedInput())
    58005814    {
    5801         DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask));
     5815        DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask),
     5816                  !(flags & kIgnoreCutlist));
    58025817    }
    58035818    else if (actx->paused)
    58045819    {
     
    58085823                             direction * (1.001 / actx->last_framerate);
    58095824            QString message = (flags & kRewind) ? QString(tr("Rewind")) :
    58105825                                                 QString(tr("Forward"));
    5811             DoSeek(actx, time, message);
     5826            DoSeek(actx, time, message, true, !(flags & kIgnoreCutlist));
    58125827        }
    58135828    }
    58145829    else if (flags & kSticky)
     
    58195834    {
    58205835            if (smartForward)
    58215836                doSmartForward = true;
    5822             DoSeek(actx, -actx->rewtime, tr("Skip Back"));
     5837            DoSeek(actx, -actx->rewtime, tr("Skip Back"),
     5838                   true, !(flags & kIgnoreCutlist));
    58235839    }
    58245840    else
    58255841    {
    58265842        if (smartForward & doSmartForward)
    5827             DoSeek(actx, actx->rewtime, tr("Skip Ahead"));
     5843            DoSeek(actx, actx->rewtime, tr("Skip Ahead"),
     5844                   true, !(flags & kIgnoreCutlist));
    58285845        else
    5829             DoSeek(actx, actx->fftime, tr("Skip Ahead"));
     5846            DoSeek(actx, actx->fftime, tr("Skip Ahead"),
     5847                   true, !(flags & kIgnoreCutlist));
    58305848    }
    58315849    return true;
    58325850}
    58335851
    5834 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg)
     5852void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg,
     5853                bool timeIsOffset, bool honorCutlist)
    58355854{
    58365855    bool limitkeys = false;
    58375856
     
    58455864        keyRepeatTimer.start();
    58465865        NormalSpeed(ctx);
    58475866        time += StopFFRew(ctx);
     5867        float framerate = ctx->last_framerate;
     5868        uint64_t currentFrameAbs = ctx->player->GetFramesPlayed();
     5869        uint64_t currentFrameRel = honorCutlist ?
     5870            ctx->player->TranslatePositionAbsToRel(currentFrameAbs) :
     5871            currentFrameAbs;
     5872        int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) +
     5873            time * framerate + 0.5;
     5874        if (desiredFrameRel < 0)
     5875            desiredFrameRel = 0;
     5876        uint64_t desiredFrameAbs = honorCutlist ?
     5877            ctx->player->TranslatePositionRelToAbs(desiredFrameRel) :
     5878            desiredFrameRel;
     5879        time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate;
    58485880        DoPlayerSeek(ctx, time);
    58495881        UpdateOSDSeekMessage(ctx, mesg, kOSDTimeout_Med);
    58505882    }
    58515883}
    58525884
    5853 void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
     5885void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence, bool honorCutlist)
    58545886{
    58555887    bool ok = false;
    58565888    int seek = GetQueuedInputAsInt(&ok);
     
    58615893    float time = ((seek / 100) * 3600) + ((seek % 100) * 60);
    58625894
    58635895    if (whence == ARBSEEK_FORWARD)
    5864         DoSeek(ctx, time, tr("Jump Ahead"));
     5896        DoSeek(ctx, time, tr("Jump Ahead"), true, honorCutlist);
    58655897    else if (whence == ARBSEEK_REWIND)
    5866         DoSeek(ctx, -time, tr("Jump Back"));
     5898        DoSeek(ctx, -time, tr("Jump Back"), true, honorCutlist);
    58675899    else
    58685900    {
    58695901        ctx->LockDeletePlayer(__FILE__, __LINE__);
     
    58755907        if (whence == ARBSEEK_END)
    58765908            time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) /
    58775909                    ctx->last_framerate) - time;
    5878         else
    5879             time = time - (ctx->player->GetFramesPlayed() - 1) /
    5880                     ctx->last_framerate;
    58815910        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    5882         DoSeek(ctx, time, tr("Jump To"));
     5911        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist);
    58835912    }
    58845913}
    58855914
     
    68156844    {
    68166845        commited = true;
    68176846        if (HasQueuedInput())
     6847            // XXX Should the cutlist be honored?
    68186848            DoArbSeek(ctx, ARBSEEK_FORWARD);
    68196849    }
    68206850    else if (StateIsLiveTV(GetState(ctx)))
     
    1140611436        uint chapterLength = ctx->buffer->DVD()->GetChapterLength();
    1140711437        if ((titleLength == chapterLength) && chapterLength > 300)
    1140811438        {
    11409             DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
     11439            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
    1141011440        }
    1141111441        else
    1141211442        {
     
    1145111481             (currentTime < (chapterLength - (ctx->jumptime * 60))) &&
    1145211482             chapterLength > 300)
    1145311483        {
    11454             DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
     11484            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true);
    1145511485        }
    1145611486        else
    1145711487        {
  • libs/libmythtv/deletemap.cpp

     
    6666    }
    6767}
    6868
    69 /**
     69static QString createTimeString(uint64_t frame, uint64_t total,
     70                                double frame_rate, bool full_resolution)
     71{
     72    int secs   = (int)(frame / frame_rate);
     73    int frames = frame - (int)(secs * frame_rate);
     74    int totalSecs = (int)(total / frame_rate);
     75    QString timestr;
     76    if (totalSecs >= 3600)
     77        timestr = QString::number(secs / 3600) + ":";
     78    timestr += QString("%1").arg((secs / 60) % 60, 2, 10, QChar(48)) +
     79        QString(":%1").arg(secs % 60, 2, 10, QChar(48));
     80    if (full_resolution)
     81        timestr += QString(".%1").arg(frames, 2, 10, QChar(48));
     82    return timestr;
     83}
     84
     85 /**
    7086 * \brief Show and update the edit mode On Screen Display. The cut regions
    7187 *        are only refreshed if the deleteMap has been updated.
    7288 */
     
    84100    infoMap.detach();
    85101    ctx->UnlockPlayingInfo(__FILE__, __LINE__);
    86102
    87     int secs   = (int)(frame / frame_rate);
    88     int frames = frame - (int)(secs * frame_rate);
    89     QString timestr = QString::number(secs / 3600) +
    90                       QString(":%1").arg((secs / 60) % 60, 2, 10, QChar(48)) +
    91                       QString(":%1").arg(secs % 60, 2, 10, QChar(48)) +
    92                       QString(".%1").arg(frames, 2, 10, QChar(48));
    93 
    94103    QString cutmarker = " ";
    95104    if (IsInDelete(frame))
    96105        cutmarker = QObject::tr("cut");
    97106
     107    QString timestr = createTimeString(frame, total, frame_rate, true);
     108    uint64_t relTotal = TranslatePositionAbsToRel(total);
     109    QString relTimeDisplay = createTimeString(TranslatePositionAbsToRel(frame),
     110                                              relTotal, frame_rate, false);
     111    QString relLengthDisplay = createTimeString(relTotal,
     112                                                relTotal, frame_rate, false);
    98113    infoMap["timedisplay"]  = timestr;
    99114    infoMap["framedisplay"] = QString::number(frame);
    100115    infoMap["cutindicator"] = cutmarker;
    101116    infoMap["title"]        = QObject::tr("Edit");
    102117    infoMap["seekamount"]   = m_seekText;;
     118    infoMap["reltimedisplay"] = relTimeDisplay;
     119    infoMap["rellengthdisplay"] = relLengthDisplay;
     120    infoMap["fulltimedisplay"] = timestr + " (" +
     121        QObject::tr("%1 of %2").arg(relTimeDisplay).arg(relLengthDisplay) + ")";
    103122
    104123    QHash<QString,float> posMap;
    105124    posMap.insert("position", (float)((double)frame/(double)total));
     
    695714        result = it.key();
    696715    return result;
    697716}
     717
     718uint64_t DeleteMap::TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap,
     719                                              uint64_t absPosition)
     720{
     721    uint64_t subtraction = 0;
     722    uint64_t startOfCutRegion = 0;
     723    frm_dir_map_t::const_iterator i;
     724    bool withinCut = false;
     725    bool first = true;
     726    for (i = deleteMap.constBegin();
     727         i != deleteMap.constEnd() && i.key() <= absPosition;
     728         i++)
     729    {
     730        if (first)
     731            withinCut = (i.value() == MARK_CUT_END);
     732        first = false;
     733        if (i.value() == MARK_CUT_START && !withinCut)
     734        {
     735            withinCut = true;
     736            startOfCutRegion = i.key();
     737        }
     738        else if (i.value() == MARK_CUT_END && withinCut)
     739        {
     740            withinCut = false;
     741            subtraction += (i.key() - startOfCutRegion);
     742        }
     743    }
     744    if (withinCut)
     745        subtraction += (absPosition - startOfCutRegion);
     746    return absPosition - subtraction;
     747}
     748
     749uint64_t DeleteMap::TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap,
     750                                              uint64_t relPosition)
     751{
     752    uint64_t addition = 0;
     753    uint64_t startOfCutRegion = 0;
     754    frm_dir_map_t::const_iterator i;
     755    bool withinCut = false;
     756    bool first = true;
     757    for (i = deleteMap.constBegin(); i != deleteMap.constEnd(); i++)
     758    {
     759        if (first)
     760            withinCut = (i.value() == MARK_CUT_END);
     761        first = false;
     762        if (i.value() == MARK_CUT_START && !withinCut)
     763        {
     764            withinCut = true;
     765            startOfCutRegion = i.key();
     766            if (relPosition + addition <= startOfCutRegion)
     767                break;
     768        }
     769        else if (i.value() == MARK_CUT_END && withinCut)
     770        {
     771            withinCut = false;
     772            addition += (i.key() - startOfCutRegion);
     773        }
     774    }
     775    return relPosition + addition;
     776}
  • libs/libmythtv/mythplayer.cpp

     
    41684168    info.values.insert("progbefore", 0);
    41694169    info.values.insert("progafter",  0);
    41704170
    4171     int playbackLen = totalLength;
     4171    int rawPlaybackLen = totalLength;
     4172    int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate;
    41724173
    41734174    if (livetv && player_ctx->tvchain)
    41744175    {
     
    41864187        islive = true;
    41874188    }
    41884189
    4189     float secsplayed = ((float)framesPlayed / video_frame_rate);
    4190     calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
     4190    float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate);
     4191    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
     4192    float rawSecsplayed = ((float)framesPlayed / video_frame_rate);
     4193    calcSliderPosPriv(info, paddedFields, rawPlaybackLen, rawSecsplayed, islive, true);
    41914194}
    41924195
    41934196void MythPlayer::calcSliderPosPriv(osdInfo &info, bool paddedFields,
    41944197                                   int playbackLen, float secsplayed,
    4195                                    bool islive)
     4198                                   bool islive, bool isRaw)
    41964199{
     4200    QString rawPrefix = isRaw ? "raw" : "";
    41974201    playbackLen = max(playbackLen, 1);
    41984202    secsplayed  = min((float)playbackLen, max(secsplayed, 0.0f));
    41994203
    4200     info.values["position"] = (int)(1000.0f * (secsplayed / (float)playbackLen));
     4204    info.values[rawPrefix + "position"] =
     4205        (int)(1000.0f * (secsplayed / (float)playbackLen));
    42014206
    42024207    int phours = (int)secsplayed / 3600;
    42034208    int pmins = ((int)secsplayed - phours * 3600) / 60;
     
    42464251        }
    42474252    }
    42484253
    4249     info.text["description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);
    4250     info.text["playedtime"] = text1;
    4251     info.text["totaltime"] = text2;
    4252     info.text["remainingtime"] = islive ? QString() : text3;
    4253     info.text["behindtime"] = islive ? text3 : QString();
     4254    info.text[rawPrefix + "description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);
     4255    info.text[rawPrefix + "playedtime"] = text1;
     4256    info.text[rawPrefix + "totaltime"] = text2;
     4257    info.text[rawPrefix + "remainingtime"] = islive ? QString() : text3;
     4258    info.text[rawPrefix + "behindtime"] = islive ? text3 : QString();
    42544259}
    42554260
    42564261int MythPlayer::GetNumChapters()
  • libs/libmythtv/osd.cpp

     
    313313            found = true;
    314314        }
    315315    }
     316    if (map.contains("rawposition"))
     317    {
     318        MythUIProgressBar *bar = dynamic_cast<MythUIProgressBar *> (win->GetChild("rawposition"));
     319        if (bar)
     320        {
     321            bar->SetVisible(true);
     322            bar->SetStart(0);
     323            bar->SetTotal(1000);
     324            bar->SetUsed(map.value("rawposition"));
     325            found = true;
     326        }
     327    }
    316328
    317329    if (found)
    318330        SetExpiry(window, timeout);