Ticket #8631: seek_honors_cutlist_v4.patch

File seek_honors_cutlist_v4.patch, 25.6 KB (added by Jim Stichnoth <stichnot@…>, 10 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

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

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

     
    344344    virtual long long CalcMaxFFTime(long long ff, bool setjump = true) const;
    345345    long long CalcRWTime(long long rw) const;
    346346    virtual void calcSliderPos(osdInfo &info, bool paddedFields = false);
     347    uint64_t TranslatePositionAbsToRel(uint64_t absPosition) {
     348        return deleteMap.TranslatePositionAbsToRel(absPosition);
     349    }
     350    uint64_t TranslatePositionRelToAbs(uint64_t relPosition) {
     351        return deleteMap.TranslatePositionRelToAbs(relPosition);
     352    }
    347353
    348354    // Commercial stuff
    349355    void SetAutoCommercialSkip(CommSkipMode autoskip)
     
    521527    void  JumpToProgram(void);
    522528
    523529    void calcSliderPosPriv(osdInfo &info, bool paddedFields,
    524                            int playbackLen, float secsplayed, bool islive);
     530                           int playbackLen, float secsplayed, bool islive,
     531                           bool isRaw);
    525532
    526533  protected:
    527534    DecoderBase   *decoder;
  • libs/libmythtv/mythdvdplayer.cpp

     
    432432    // DVD playing non-functional under windows for now
    433433    secsplayed = 0.0f;
    434434#endif
    435     calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
     435        calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
     436        calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, true);
    436437}
    437438
    438439void MythDVDPlayer::SeekForScreenGrab(uint64_t &number, uint64_t frameNum,
  • libs/libmythtv/tv_play.cpp

     
    549549            "Pause"), "P");
    550550    REG_KEY("TV Playback", "SEEKFFWD", QT_TRANSLATE_NOOP("MythControls",
    551551            "Fast Forward"), "Right");
     552    REG_KEY("TV Playback", "SEEKFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     553            "Fast Forward ignoring cutlist"), "");
    552554    REG_KEY("TV Playback", "SEEKRWND", QT_TRANSLATE_NOOP("MythControls",
    553555            "Rewind"), "Left");
     556    REG_KEY("TV Playback", "SEEKRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     557            "Rewind ignoring cutlist"), "");
    554558    REG_KEY("TV Playback", "ARBSEEK", QT_TRANSLATE_NOOP("MythControls",
    555559            "Arbitrary Seek"), "*");
     560    REG_KEY("TV Playback", "ARBSEEKNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     561            "Arbitrary Seek ignoring cutlist"), "");
    556562    REG_KEY("TV Playback", "CHANNELUP", QT_TRANSLATE_NOOP("MythControls",
    557563            "Channel up"), "Up");
    558564    REG_KEY("TV Playback", "CHANNELDOWN", QT_TRANSLATE_NOOP("MythControls",
     
    563569            "Switch to the previous channel"), "H");
    564570    REG_KEY("TV Playback", "JUMPFFWD", QT_TRANSLATE_NOOP("MythControls",
    565571            "Jump ahead"), "PgDown");
     572    REG_KEY("TV Playback", "JUMPFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     573            "Jump ahead ignoring cutlist"), "");
    566574    REG_KEY("TV Playback", "JUMPRWND", QT_TRANSLATE_NOOP("MythControls",
    567575            "Jump back"), "PgUp");
     576    REG_KEY("TV Playback", "JUMPRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     577            "Jump back ignoring cutlist"), "");
     578    REG_KEY("TV Playback", "INFONOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
     579            "Info ignoring cutlist"), "");
    568580    REG_KEY("TV Playback", "JUMPBKMRK", QT_TRANSLATE_NOOP("MythControls",
    569581            "Jump to bookmark"), "K");
    570582    REG_KEY("TV Playback", "FFWDSTICKY", QT_TRANSLATE_NOOP("MythControls",
     
    39974009            ctx->buffer->DVD()->MoveButtonDown();
    39984010        }
    39994011        else if (has_action("LEFT", actions) ||
    4000                  has_action("SEEKRWND", actions))
     4012                 has_action("SEEKRWND", actions) ||
     4013                 has_action("SEEKRWNDNOCUTLIST", actions))
    40014014        {
    40024015            ctx->buffer->DVD()->MoveButtonLeft();
    40034016        }
    40044017        else if (has_action("RIGHT", actions) ||
    4005                  has_action("SEEKFFWD", actions))
     4018                 has_action("SEEKFFWD", actions) ||
     4019                 has_action("SEEKFFWDNOCUTLIST", actions))
    40064020        {
    40074021            ctx->buffer->DVD()->MoveButtonRight();
    40084022        }
     
    41894203            }
    41904204        }
    41914205    }
    4192     else if (has_action("JUMPRWND", actions))
     4206    else if (has_action("JUMPRWND", actions) ||
     4207             has_action("JUMPRWNDNOCUTLIST", actions))
    41934208    {
    41944209        if (isDVD)
    41954210            DVDJumpBack(ctx);
    41964211        else if (GetNumChapters(ctx) > 0)
    41974212            DoJumpChapter(ctx, -1);
    41984213        else
    4199             DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
     4214            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"),
     4215                   true, has_action("JUMPRWND", actions));
    42004216    }
    4201     else if (has_action("JUMPFFWD", actions))
     4217    else if (has_action("JUMPFFWD", actions) ||
     4218             has_action("JUMPFFWDNOCUTLIST", actions))
    42024219    {
    42034220        if (isDVD)
    42044221            DVDJumpForward(ctx);
    42054222        else if (GetNumChapters(ctx) > 0)
    42064223            DoJumpChapter(ctx, 9999);
    42074224        else
    4208             DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
     4225            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"),
     4226                   true, has_action("JUMPFFWD", actions));
    42094227    }
    42104228    else if (has_action("JUMPBKMRK", actions))
    42114229    {
    42124230        ctx->LockDeletePlayer(__FILE__, __LINE__);
    4213         long long bookmark = ctx->player->GetBookmark();
    4214         long long curloc   = ctx->player->GetFramesPlayed();
     4231        uint64_t bookmark = ctx->player->GetBookmark();
    42154232        float mult = 1.0f;
    42164233        if (ctx->last_framerate)
    42174234            mult = 1.0f / ctx->last_framerate;
    4218         long long seekloc = (long long) ((bookmark - curloc) * mult);
     4235        float seekloc = ctx->player->TranslatePositionAbsToRel(bookmark) * mult;
    42194236        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    42204237
    42214238        if (bookmark > ctx->last_framerate)
    42224239        {
    4223             DoSeek(ctx, seekloc, tr("Jump to Bookmark"));
     4240            DoSeek(ctx, seekloc, tr("Jump to Bookmark"), false);
    42244241        }
    42254242    }
    42264243    else if (has_action("JUMPSTART",actions))
    42274244    {
    4228         long long seekloc = +1;
    4229         ctx->LockDeletePlayer(__FILE__, __LINE__);
    4230         if (ctx->player && ctx->last_framerate >= 0.0001f)
    4231         {
    4232             seekloc = (int64_t) (-1.0 * ctx->player->GetFramesPlayed() /
    4233                                  ctx->last_framerate);
    4234         }
    4235         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    4236 
    4237         if (seekloc <= 0)
    4238             DoSeek(ctx, seekloc, tr("Jump to Beginning"));
     4245        DoSeek(ctx, 0, tr("Jump to Beginning"), false);
    42394246    }
    42404247    else if (has_action("CLEAROSD", actions))
    42414248    {
     
    43824389        ChangeTimeStretch(ctx, -1);
    43834390    else if (has_action("MENU", actions))
    43844391        ShowOSDMenu(ctx);
    4385     else if (has_action("INFO", actions))
     4392    else if (has_action("INFO", actions) || has_action("INFONOCUTLIST", actions))
    43864393    {
    43874394        if (HasQueuedInput())
    43884395        {
    4389             DoArbSeek(ctx, ARBSEEK_SET);
     4396            DoArbSeek(ctx, ARBSEEK_SET, !has_action("INFONOCUTLIST", actions));
    43904397        }
    43914398        else
    43924399            ToggleOSD(ctx, true);
     
    45854592        else if (GetNumChapters(ctx) > 0)
    45864593            DoJumpChapter(ctx, -1);
    45874594        else
    4588             DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
     4595            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
    45894596    }
    45904597    else if (has_action("CHANNELDOWN", actions))
    45914598    {
     
    46014608        else if (GetNumChapters(ctx) > 0)
    46024609            DoJumpChapter(ctx, 9999);
    46034610        else
    4604             DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
     4611            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true);
    46054612    }
    46064613    else if (has_action("DELETE", actions) && !islivetv)
    46074614    {
     
    48264833        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    48274834
    48284835        if (tokens[2] == "BEGINNING")
    4829             DoSeek(ctx, -fplay, tr("Jump to Beginning"));
    4830         else if (tokens[2] == "FORWARD")
    4831             DoSeek(ctx, ctx->fftime, tr("Skip Ahead"));
    4832         else if (tokens[2] == "BACKWARD")
    4833             DoSeek(ctx, -ctx->rewtime, tr("Skip Back"));
    4834         else if ((tokens[2] == "POSITION") && (tokens.size() == 4) &&
     4836            DoSeek(ctx, 0, tr("Jump to Beginning"), false);
     4837        else if (tokens[2] == "FORWARD" || tokens[2] == "FORWARDNOCUTLIST")
     4838            DoSeek(ctx, ctx->fftime, tr("Skip Ahead"), true, tokens[2] == "FORWARD");
     4839        else if (tokens[2] == "BACKWARD" || tokens[2] == "BACKWARDNOCUTLIST")
     4840            DoSeek(ctx, -ctx->rewtime, tr("Skip Back"), true, tokens[2] == "BACKWARD");
     4841        else if ((tokens[2] == "POSITION" ||
     4842                  tokens[2] == "POSITIONNOCUTLIST") &&
     4843                 (tokens.size() == 4) &&
    48354844                 (tokens[3].contains(QRegExp("^\\d+$"))) &&
    48364845                 ctx->last_framerate)
    48374846        {
    48384847            long long rel_frame = tokens[3].toInt();
    4839             rel_frame -= (long long) (fplay * (1.0 / ctx->last_framerate)),
    4840             DoSeek(ctx, rel_frame, tr("Jump To"));
     4848            DoSeek(ctx, rel_frame / ctx->last_framerate, tr("Jump To"),
     4849                   false, tokens[2] == "POSITION");
    48414850        }
    48424851    }
    48434852    else if (tokens.size() >= 3 && tokens[1] == "VOLUME")
     
    58715880                          const bool isDVD)
    58725881{
    58735882    const int kRewind = 4, kForward = 8, kSticky = 16, kSlippery = 32,
    5874               kRelative = 64, kAbsolute = 128, kWhenceMask = 3;
     5883              kRelative = 64, kAbsolute = 128, kIgnoreCutlist = 256,
     5884              kWhenceMask = 3;
    58755885    int flags = 0;
    58765886    if (has_action("SEEKFFWD", actions))
    58775887        flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative;
     5888    else if (has_action("SEEKFFWDNOCUTLIST", actions))
     5889        flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative | kIgnoreCutlist;
    58785890    else if (has_action("FFWDSTICKY", actions))
    58795891        flags = ARBSEEK_END     | kForward | kSticky   | kAbsolute;
    58805892    else if (has_action("RIGHT", actions))
    58815893        flags = ARBSEEK_FORWARD | kForward | kSticky   | kRelative;
    58825894    else if (has_action("SEEKRWND", actions))
    58835895        flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative;
     5896    else if (has_action("SEEKRWNDNOCUTLIST", actions))
     5897        flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative | kIgnoreCutlist;
    58845898    else if (has_action("RWNDSTICKY", actions))
    58855899        flags = ARBSEEK_SET     | kRewind  | kSticky   | kAbsolute;
    58865900    else if (has_action("LEFT", actions))
     
    58915905    int direction = (flags & kRewind) ? -1 : 1;
    58925906    if (HasQueuedInput())
    58935907    {
    5894         DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask));
     5908        DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask),
     5909                  !(flags & kIgnoreCutlist));
    58955910    }
    58965911    else if (actx->paused)
    58975912    {
     
    59015916                             direction * (1.001 / actx->last_framerate);
    59025917            QString message = (flags & kRewind) ? QString(tr("Rewind")) :
    59035918                                                 QString(tr("Forward"));
    5904             DoSeek(actx, time, message);
     5919            DoSeek(actx, time, message, true, !(flags & kIgnoreCutlist));
    59055920        }
    59065921    }
    59075922    else if (flags & kSticky)
     
    59125927    {
    59135928            if (smartForward)
    59145929                doSmartForward = true;
    5915             DoSeek(actx, -actx->rewtime, tr("Skip Back"));
     5930            DoSeek(actx, -actx->rewtime, tr("Skip Back"),
     5931                   true, !(flags & kIgnoreCutlist));
    59165932    }
    59175933    else
    59185934    {
    59195935        if (smartForward & doSmartForward)
    5920             DoSeek(actx, actx->rewtime, tr("Skip Ahead"));
     5936            DoSeek(actx, actx->rewtime, tr("Skip Ahead"),
     5937                   true, !(flags & kIgnoreCutlist));
    59215938        else
    5922             DoSeek(actx, actx->fftime, tr("Skip Ahead"));
     5939            DoSeek(actx, actx->fftime, tr("Skip Ahead"),
     5940                   true, !(flags & kIgnoreCutlist));
    59235941    }
    59245942    return true;
    59255943}
    59265944
    5927 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg)
     5945void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg,
     5946                bool timeIsOffset, bool honorCutlist)
    59285947{
    59295948    bool limitkeys = false;
    59305949
     
    59385957        keyRepeatTimer.start();
    59395958        NormalSpeed(ctx);
    59405959        time += StopFFRew(ctx);
     5960        float framerate = ctx->last_framerate;
     5961        uint64_t currentFrameAbs = ctx->player->GetFramesPlayed();
     5962        uint64_t currentFrameRel = honorCutlist ?
     5963            ctx->player->TranslatePositionAbsToRel(currentFrameAbs) :
     5964            currentFrameAbs;
     5965        int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) +
     5966            time * framerate + 0.5;
     5967        if (desiredFrameRel < 0)
     5968            desiredFrameRel = 0;
     5969        uint64_t desiredFrameAbs = honorCutlist ?
     5970            ctx->player->TranslatePositionRelToAbs(desiredFrameRel) :
     5971            desiredFrameRel;
     5972        time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate;
    59415973        DoPlayerSeek(ctx, time);
    59425974        UpdateOSDSeekMessage(ctx, mesg, kOSDTimeout_Med);
    59435975    }
    59445976}
    59455977
    5946 void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
     5978void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence, bool honorCutlist)
    59475979{
    59485980    bool ok = false;
    59495981    int seek = GetQueuedInputAsInt(&ok);
     
    59545986    float time = ((seek / 100) * 3600) + ((seek % 100) * 60);
    59555987
    59565988    if (whence == ARBSEEK_FORWARD)
    5957         DoSeek(ctx, time, tr("Jump Ahead"));
     5989        DoSeek(ctx, time, tr("Jump Ahead"), true, honorCutlist);
    59585990    else if (whence == ARBSEEK_REWIND)
    5959         DoSeek(ctx, -time, tr("Jump Back"));
     5991        DoSeek(ctx, -time, tr("Jump Back"), true, honorCutlist);
    59605992    else
    59615993    {
    59625994        ctx->LockDeletePlayer(__FILE__, __LINE__);
     
    59686000        if (whence == ARBSEEK_END)
    59696001            time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) /
    59706002                    ctx->last_framerate) - time;
    5971         else
    5972             time = time - (ctx->player->GetFramesPlayed() - 1) /
    5973                     ctx->last_framerate;
    59746003        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
    5975         DoSeek(ctx, time, tr("Jump To"));
     6004        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist);
    59766005    }
    59776006}
    59786007
     
    69086937    {
    69096938        commited = true;
    69106939        if (HasQueuedInput())
     6940            // XXX Should the cutlist be honored?
    69116941            DoArbSeek(ctx, ARBSEEK_FORWARD);
    69126942    }
    69136943    else if (StateIsLiveTV(GetState(ctx)))
     
    1150111531        uint chapterLength = ctx->buffer->DVD()->GetChapterLength();
    1150211532        if ((titleLength == chapterLength) && chapterLength > 300)
    1150311533        {
    11504             DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
     11534            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
    1150511535        }
    1150611536        else
    1150711537        {
     
    1154811578             (currentTime < (chapterLength - (ctx->jumptime * 60))) &&
    1154911579             chapterLength > 300)
    1155011580        {
    11551             DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
     11581            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true);
    1155211582        }
    1155311583        else
    1155411584        {
  • 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));
     
    721740
    722741    return currentMap == savedMap;
    723742}
     743
     744uint64_t DeleteMap::TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap,
     745                                              uint64_t absPosition)
     746{
     747    uint64_t subtraction = 0;
     748    uint64_t startOfCutRegion = 0;
     749    frm_dir_map_t::const_iterator i;
     750    bool withinCut = false;
     751    bool first = true;
     752    for (i = deleteMap.constBegin();
     753         i != deleteMap.constEnd() && i.key() <= absPosition;
     754         i++)
     755    {
     756        if (first)
     757            withinCut = (i.value() == MARK_CUT_END);
     758        first = false;
     759        if (i.value() == MARK_CUT_START && !withinCut)
     760        {
     761            withinCut = true;
     762            startOfCutRegion = i.key();
     763        }
     764        else if (i.value() == MARK_CUT_END && withinCut)
     765        {
     766            withinCut = false;
     767            subtraction += (i.key() - startOfCutRegion);
     768        }
     769    }
     770    if (withinCut)
     771        subtraction += (absPosition - startOfCutRegion);
     772    return absPosition - subtraction;
     773}
     774
     775uint64_t DeleteMap::TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap,
     776                                              uint64_t relPosition)
     777{
     778    uint64_t addition = 0;
     779    uint64_t startOfCutRegion = 0;
     780    frm_dir_map_t::const_iterator i;
     781    bool withinCut = false;
     782    bool first = true;
     783    for (i = deleteMap.constBegin(); i != deleteMap.constEnd(); i++)
     784    {
     785        if (first)
     786            withinCut = (i.value() == MARK_CUT_END);
     787        first = false;
     788        if (i.value() == MARK_CUT_START && !withinCut)
     789        {
     790            withinCut = true;
     791            startOfCutRegion = i.key();
     792            if (relPosition + addition <= startOfCutRegion)
     793                break;
     794        }
     795        else if (i.value() == MARK_CUT_END && withinCut)
     796        {
     797            withinCut = false;
     798            addition += (i.key() - startOfCutRegion);
     799        }
     800    }
     801    return relPosition + addition;
     802}
  • libs/libmythtv/mythplayer.cpp

     
    42824282    info.values.insert("progbefore", 0);
    42834283    info.values.insert("progafter",  0);
    42844284
    4285     int playbackLen = (totalDuration > 0) ? totalDuration : totalLength;
     4285    int rawPlaybackLen = (totalDuration > 0) ? totalDuration : totalLength;
     4286    // XXX- Note that the translated playbackLen uses the frame count
     4287    // with respect to a fixed frame rate, rather than the ffmpeg
     4288    // display timecode.
     4289    int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate;
    42864290       
    42874291    if (livetv && player_ctx->tvchain)
    42884292    {
     
    43004304        islive = true;
    43014305    }
    43024306
    4303     float secsplayed = (float)(disp_timecode / 1000.f);
    4304     calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
     4307    // XXX- Note that the translated secsplayed uses the frame number
     4308    // with respect to a fixed frame rate, rather than the ffmpeg
     4309    // display timecode.
     4310    float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate);
     4311    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
     4312    float rawSecsplayed = (float)(disp_timecode / 1000.f);
     4313    calcSliderPosPriv(info, paddedFields, rawPlaybackLen, rawSecsplayed, islive, true);
    43054314}
    43064315
    43074316void MythPlayer::calcSliderPosPriv(osdInfo &info, bool paddedFields,
    43084317                                   int playbackLen, float secsplayed,
    4309                                    bool islive)
     4318                                   bool islive, bool isRaw)
    43104319{
     4320    QString rawPrefix = isRaw ? "raw" : "";
    43114321    playbackLen = max(playbackLen, 1);
    43124322    secsplayed  = min((float)playbackLen, max(secsplayed, 0.0f));
    43134323
    4314     info.values["position"] = (int)(1000.0f * (secsplayed / (float)playbackLen));
     4324    info.values[rawPrefix + "position"] =
     4325        (int)(1000.0f * (secsplayed / (float)playbackLen));
    43154326
    43164327    int phours = (int)secsplayed / 3600;
    43174328    int pmins = ((int)secsplayed - phours * 3600) / 60;
     
    43604371        }
    43614372    }
    43624373
    4363     info.text["description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);
    4364     info.text["playedtime"] = text1;
    4365     info.text["totaltime"] = text2;
    4366     info.text["remainingtime"] = islive ? QString() : text3;
    4367     info.text["behindtime"] = islive ? text3 : QString();
     4374    info.text[rawPrefix + "description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);
     4375    info.text[rawPrefix + "playedtime"] = text1;
     4376    info.text[rawPrefix + "totaltime"] = text2;
     4377    info.text[rawPrefix + "remainingtime"] = islive ? QString() : text3;
     4378    info.text[rawPrefix + "behindtime"] = islive ? text3 : QString();
    43684379}
    43694380
    43704381int MythPlayer::GetNumChapters()
  • libs/libmythtv/osd.cpp

     
    335335            found = true;
    336336        }
    337337    }
     338    if (map.contains("rawposition"))
     339    {
     340        MythUIProgressBar *bar = dynamic_cast<MythUIProgressBar *> (win->GetChild("rawposition"));
     341        if (bar)
     342        {
     343            bar->SetVisible(true);
     344            bar->SetStart(0);
     345            bar->SetTotal(1000);
     346            bar->SetUsed(map.value("rawposition"));
     347            found = true;
     348        }
     349    }
    338350
    339351    if (found)
    340352        SetExpiry(window, timeout);