Ticket #8631: seek_honors_cutlist_v5.patch
File seek_honors_cutlist_v5.patch, 27.1 KB (added by , 13 years ago) |
---|
-
mythtv/libs/libmythtv/deletemap.cpp
diff --git a/mythtv/libs/libmythtv/deletemap.cpp b/mythtv/libs/libmythtv/deletemap.cpp index 7cda7ac..bc42b43 100644
a b void DeleteMap::UpdateSeekAmount(int change, double framerate) 66 66 } 67 67 } 68 68 69 /** 69 static 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 /** 70 86 * \brief Show and update the edit mode On Screen Display. The cut regions 71 87 * are only refreshed if the deleteMap has been updated. 72 88 */ … … void DeleteMap::UpdateOSD(uint64_t frame, uint64_t total, double frame_rate, 84 100 infoMap.detach(); 85 101 ctx->UnlockPlayingInfo(__FILE__, __LINE__); 86 102 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 94 103 QString cutmarker = " "; 95 104 if (IsInDelete(frame)) 96 105 cutmarker = QObject::tr("cut"); 97 106 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); 98 113 infoMap["timedisplay"] = timestr; 99 114 infoMap["framedisplay"] = QString::number(frame); 100 115 infoMap["cutindicator"] = cutmarker; 101 116 infoMap["title"] = QObject::tr("Edit"); 102 117 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) + ")"; 103 122 104 123 QHash<QString,float> posMap; 105 124 posMap.insert("position", (float)((double)frame/(double)total)); … … bool DeleteMap::IsSaved(PlayerContext *ctx) 721 740 722 741 return currentMap == savedMap; 723 742 } 743 744 uint64_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 775 uint64_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 } -
mythtv/libs/libmythtv/deletemap.h
diff --git a/mythtv/libs/libmythtv/deletemap.h b/mythtv/libs/libmythtv/deletemap.h index e6a599b..5c4c2d5 100644
a b class DeleteMap 46 46 bool IsTemporaryMark(uint64_t frame); 47 47 bool HasTemporaryMark(void); 48 48 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); 49 59 50 60 void TrackerReset(uint64_t frame, uint64_t total); 51 61 bool TrackerWantsToJump(uint64_t frame, uint64_t total, uint64_t &to); -
mythtv/libs/libmythtv/mythdvdplayer.cpp
diff --git a/mythtv/libs/libmythtv/mythdvdplayer.cpp b/mythtv/libs/libmythtv/mythdvdplayer.cpp index 49e08af..8c8724f 100644
a b void MythDVDPlayer::calcSliderPos(osdInfo &info, bool paddedFields) 437 437 // DVD playing non-functional under windows for now 438 438 secsplayed = 0.0f; 439 439 #endif 440 calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive); 440 calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false); 441 calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, true); 441 442 } 442 443 443 444 void MythDVDPlayer::SeekForScreenGrab(uint64_t &number, uint64_t frameNum, -
mythtv/libs/libmythtv/mythplayer.cpp
diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp index 198e1fa..634ebac 100644
a b void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields) 4255 4255 info.values.insert("progbefore", 0); 4256 4256 info.values.insert("progafter", 0); 4257 4257 4258 int playbackLen = (totalDuration > 0) ? totalDuration : totalLength; 4258 int rawPlaybackLen = (totalDuration > 0) ? totalDuration : totalLength; 4259 // XXX- Note that the translated playbackLen uses the frame count 4260 // with respect to a fixed frame rate, rather than the ffmpeg 4261 // display timecode. 4262 int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate; 4259 4263 4260 4264 if (livetv && player_ctx->tvchain) 4261 4265 { … … void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields) 4273 4277 islive = true; 4274 4278 } 4275 4279 4276 float secsplayed = (float)(disp_timecode / 1000.f); 4277 calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive); 4280 // XXX- Note that the translated secsplayed uses the frame number 4281 // with respect to a fixed frame rate, rather than the ffmpeg 4282 // display timecode. 4283 float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate); 4284 calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false); 4285 float rawSecsplayed = (float)(disp_timecode / 1000.f); 4286 calcSliderPosPriv(info, paddedFields, rawPlaybackLen, rawSecsplayed, islive, true); 4278 4287 } 4279 4288 4280 4289 void MythPlayer::calcSliderPosPriv(osdInfo &info, bool paddedFields, 4281 4290 int playbackLen, float secsplayed, 4282 bool islive )4291 bool islive, bool isRaw) 4283 4292 { 4293 QString rawPrefix = isRaw ? "raw" : ""; 4284 4294 playbackLen = max(playbackLen, 1); 4285 4295 secsplayed = min((float)playbackLen, max(secsplayed, 0.0f)); 4286 4296 4287 info.values["position"] = (int)(1000.0f * (secsplayed / (float)playbackLen)); 4297 info.values[rawPrefix + "position"] = 4298 (int)(1000.0f * (secsplayed / (float)playbackLen)); 4288 4299 4289 4300 int phours = (int)secsplayed / 3600; 4290 4301 int pmins = ((int)secsplayed - phours * 3600) / 60; … … void MythPlayer::calcSliderPosPriv(osdInfo &info, bool paddedFields, 4333 4344 } 4334 4345 } 4335 4346 4336 info.text[ "description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);4337 info.text[ "playedtime"] = text1;4338 info.text[ "totaltime"] = text2;4339 info.text[ "remainingtime"] = islive ? QString() : text3;4340 info.text[ "behindtime"] = islive ? text3 : QString();4347 info.text[rawPrefix + "description"] = QObject::tr("%1 of %2").arg(text1).arg(text2); 4348 info.text[rawPrefix + "playedtime"] = text1; 4349 info.text[rawPrefix + "totaltime"] = text2; 4350 info.text[rawPrefix + "remainingtime"] = islive ? QString() : text3; 4351 info.text[rawPrefix + "behindtime"] = islive ? text3 : QString(); 4341 4352 } 4342 4353 4343 4354 int MythPlayer::GetNumChapters() -
mythtv/libs/libmythtv/mythplayer.h
diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h index b776296..0b24ae0 100644
a b class MPUBLIC MythPlayer 344 344 virtual long long CalcMaxFFTime(long long ff, bool setjump = true) const; 345 345 long long CalcRWTime(long long rw) const; 346 346 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 } 347 353 348 354 // Commercial stuff 349 355 void SetAutoCommercialSkip(CommSkipMode autoskip) … … class MPUBLIC MythPlayer 521 527 void JumpToProgram(void); 522 528 523 529 void calcSliderPosPriv(osdInfo &info, bool paddedFields, 524 int playbackLen, float secsplayed, bool islive); 530 int playbackLen, float secsplayed, bool islive, 531 bool isRaw); 525 532 526 533 protected: 527 534 DecoderBase *decoder; -
mythtv/libs/libmythtv/osd.cpp
diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp index 67f7869..d60baee 100644
a b void OSD::SetValues(const QString &window, QHash<QString,int> &map, 335 335 found = true; 336 336 } 337 337 } 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 } 338 350 339 351 if (found) 340 352 SetExpiry(window, timeout); -
mythtv/libs/libmythtv/tv_play.cpp
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index d7a381c..583081c 100644
a b void TV::InitKeys(void) 539 539 "Pause"), "P"); 540 540 REG_KEY("TV Playback", "SEEKFFWD", QT_TRANSLATE_NOOP("MythControls", 541 541 "Fast Forward"), "Right"); 542 REG_KEY("TV Playback", "SEEKFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 543 "Fast Forward ignoring cutlist"), ""); 542 544 REG_KEY("TV Playback", "SEEKRWND", QT_TRANSLATE_NOOP("MythControls", 543 545 "Rewind"), "Left"); 546 REG_KEY("TV Playback", "SEEKRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 547 "Rewind ignoring cutlist"), ""); 544 548 REG_KEY("TV Playback", "ARBSEEK", QT_TRANSLATE_NOOP("MythControls", 545 549 "Arbitrary Seek"), "*"); 550 REG_KEY("TV Playback", "ARBSEEKNOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 551 "Arbitrary Seek ignoring cutlist"), ""); 546 552 REG_KEY("TV Playback", "CHANNELUP", QT_TRANSLATE_NOOP("MythControls", 547 553 "Channel up"), "Up"); 548 554 REG_KEY("TV Playback", "CHANNELDOWN", QT_TRANSLATE_NOOP("MythControls", … … void TV::InitKeys(void) 553 559 "Switch to the previous channel"), "H"); 554 560 REG_KEY("TV Playback", "JUMPFFWD", QT_TRANSLATE_NOOP("MythControls", 555 561 "Jump ahead"), "PgDown"); 562 REG_KEY("TV Playback", "JUMPFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 563 "Jump ahead ignoring cutlist"), ""); 556 564 REG_KEY("TV Playback", "JUMPRWND", QT_TRANSLATE_NOOP("MythControls", 557 565 "Jump back"), "PgUp"); 566 REG_KEY("TV Playback", "JUMPRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 567 "Jump back ignoring cutlist"), ""); 568 REG_KEY("TV Playback", "INFONOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 569 "Info ignoring cutlist"), ""); 558 570 REG_KEY("TV Playback", "JUMPBKMRK", QT_TRANSLATE_NOOP("MythControls", 559 571 "Jump to bookmark"), "K"); 560 572 REG_KEY("TV Playback", "FFWDSTICKY", QT_TRANSLATE_NOOP("MythControls", … … bool TV::DiscMenuHandleAction(PlayerContext *ctx, const QStringList &actions) 3943 3955 dvdrb->MoveButtonDown(); 3944 3956 } 3945 3957 else if (has_action("LEFT", actions) || 3946 has_action("SEEKRWND", actions)) 3958 has_action("SEEKRWND", actions) || 3959 has_action("SEEKRWNDNOCUTLIST", actions)) 3947 3960 { 3948 3961 dvdrb->MoveButtonLeft(); 3949 3962 } 3950 3963 else if (has_action("RIGHT", actions) || 3951 has_action("SEEKFFWD", actions)) 3964 has_action("SEEKFFWD", actions) || 3965 has_action("SEEKFFWDNOCUTLIST", actions)) 3952 3966 { 3953 3967 dvdrb->MoveButtonRight(); 3954 3968 } … … bool TV::ActiveHandleAction(PlayerContext *ctx, 4138 4152 } 4139 4153 } 4140 4154 } 4141 else if (has_action("JUMPRWND", actions)) 4155 else if (has_action("JUMPRWND", actions) || 4156 has_action("JUMPRWNDNOCUTLIST", actions)) 4142 4157 { 4143 4158 if (isDVD) 4144 4159 DVDJumpBack(ctx); 4145 4160 else if (GetNumChapters(ctx) > 0) 4146 4161 DoJumpChapter(ctx, -1); 4147 4162 else 4148 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back")); 4163 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), 4164 true, has_action("JUMPRWND", actions)); 4149 4165 } 4150 else if (has_action("JUMPFFWD", actions)) 4166 else if (has_action("JUMPFFWD", actions) || 4167 has_action("JUMPFFWDNOCUTLIST", actions)) 4151 4168 { 4152 4169 if (isDVD) 4153 4170 DVDJumpForward(ctx); 4154 4171 else if (GetNumChapters(ctx) > 0) 4155 4172 DoJumpChapter(ctx, 9999); 4156 4173 else 4157 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead")); 4174 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), 4175 true, has_action("JUMPFFWD", actions)); 4158 4176 } 4159 4177 else if (has_action("JUMPBKMRK", actions)) 4160 4178 { 4161 4179 ctx->LockDeletePlayer(__FILE__, __LINE__); 4162 long long bookmark = ctx->player->GetBookmark(); 4163 long long curloc = ctx->player->GetFramesPlayed(); 4180 uint64_t bookmark = ctx->player->GetBookmark(); 4164 4181 float mult = 1.0f; 4165 4182 if (ctx->last_framerate) 4166 4183 mult = 1.0f / ctx->last_framerate; 4167 long long seekloc = (long long) ((bookmark - curloc) * mult);4184 float seekloc = ctx->player->TranslatePositionAbsToRel(bookmark) * mult; 4168 4185 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 4169 4186 4170 4187 if (bookmark > ctx->last_framerate) 4171 4188 { 4172 DoSeek(ctx, seekloc, tr("Jump to Bookmark") );4189 DoSeek(ctx, seekloc, tr("Jump to Bookmark"), false); 4173 4190 } 4174 4191 } 4175 4192 else if (has_action("JUMPSTART",actions)) 4176 4193 { 4177 long long seekloc = +1; 4178 ctx->LockDeletePlayer(__FILE__, __LINE__); 4179 if (ctx->player && ctx->last_framerate >= 0.0001f) 4180 { 4181 seekloc = (int64_t) (-1.0 * ctx->player->GetFramesPlayed() / 4182 ctx->last_framerate); 4183 } 4184 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 4185 4186 if (seekloc <= 0) 4187 DoSeek(ctx, seekloc, tr("Jump to Beginning")); 4194 DoSeek(ctx, 0, tr("Jump to Beginning"), false); 4188 4195 } 4189 4196 else if (has_action("CLEAROSD", actions)) 4190 4197 { … … bool TV::ActiveHandleAction(PlayerContext *ctx, 4331 4338 ChangeTimeStretch(ctx, -1); 4332 4339 else if (has_action("MENU", actions)) 4333 4340 ShowOSDMenu(ctx); 4334 else if (has_action("INFO", actions) )4341 else if (has_action("INFO", actions) || has_action("INFONOCUTLIST", actions)) 4335 4342 { 4336 4343 if (HasQueuedInput()) 4337 4344 { 4338 DoArbSeek(ctx, ARBSEEK_SET );4345 DoArbSeek(ctx, ARBSEEK_SET, !has_action("INFONOCUTLIST", actions)); 4339 4346 } 4340 4347 else 4341 4348 ToggleOSD(ctx, true); … … bool TV::ActivePostQHandleAction(PlayerContext *ctx, 4534 4541 else if (GetNumChapters(ctx) > 0) 4535 4542 DoJumpChapter(ctx, -1); 4536 4543 else 4537 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back") );4544 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true); 4538 4545 } 4539 4546 else if (has_action("CHANNELDOWN", actions)) 4540 4547 { … … bool TV::ActivePostQHandleAction(PlayerContext *ctx, 4550 4557 else if (GetNumChapters(ctx) > 0) 4551 4558 DoJumpChapter(ctx, 9999); 4552 4559 else 4553 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead") );4560 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true); 4554 4561 } 4555 4562 else if (has_action("DELETE", actions) && !islivetv) 4556 4563 { … … void TV::ProcessNetworkControlCommand(PlayerContext *ctx, 4775 4782 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 4776 4783 4777 4784 if (tokens[2] == "BEGINNING") 4778 DoSeek(ctx, -fplay, tr("Jump to Beginning")); 4779 else if (tokens[2] == "FORWARD") 4780 DoSeek(ctx, ctx->fftime, tr("Skip Ahead")); 4781 else if (tokens[2] == "BACKWARD") 4782 DoSeek(ctx, -ctx->rewtime, tr("Skip Back")); 4783 else if ((tokens[2] == "POSITION") && (tokens.size() == 4) && 4785 DoSeek(ctx, 0, tr("Jump to Beginning"), false); 4786 else if (tokens[2] == "FORWARD" || tokens[2] == "FORWARDNOCUTLIST") 4787 DoSeek(ctx, ctx->fftime, tr("Skip Ahead"), true, tokens[2] == "FORWARD"); 4788 else if (tokens[2] == "BACKWARD" || tokens[2] == "BACKWARDNOCUTLIST") 4789 DoSeek(ctx, -ctx->rewtime, tr("Skip Back"), true, tokens[2] == "BACKWARD"); 4790 else if ((tokens[2] == "POSITION" || 4791 tokens[2] == "POSITIONNOCUTLIST") && 4792 (tokens.size() == 4) && 4784 4793 (tokens[3].contains(QRegExp("^\\d+$"))) && 4785 4794 ctx->last_framerate) 4786 4795 { 4787 4796 long long rel_frame = tokens[3].toInt(); 4788 rel_frame -= (long long) (fplay * (1.0 / ctx->last_framerate)),4789 DoSeek(ctx, rel_frame, tr("Jump To"));4797 DoSeek(ctx, rel_frame / ctx->last_framerate, tr("Jump To"), 4798 false, tokens[2] == "POSITION"); 4790 4799 } 4791 4800 } 4792 4801 else if (tokens.size() >= 3 && tokens[1] == "VOLUME") … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5806 5815 const bool isDVD) 5807 5816 { 5808 5817 const int kRewind = 4, kForward = 8, kSticky = 16, kSlippery = 32, 5809 kRelative = 64, kAbsolute = 128, kWhenceMask = 3; 5818 kRelative = 64, kAbsolute = 128, kIgnoreCutlist = 256, 5819 kWhenceMask = 3; 5810 5820 int flags = 0; 5811 5821 if (has_action("SEEKFFWD", actions)) 5812 5822 flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative; 5823 else if (has_action("SEEKFFWDNOCUTLIST", actions)) 5824 flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative | kIgnoreCutlist; 5813 5825 else if (has_action("FFWDSTICKY", actions)) 5814 5826 flags = ARBSEEK_END | kForward | kSticky | kAbsolute; 5815 5827 else if (has_action("RIGHT", actions)) 5816 5828 flags = ARBSEEK_FORWARD | kForward | kSticky | kRelative; 5817 5829 else if (has_action("SEEKRWND", actions)) 5818 5830 flags = ARBSEEK_REWIND | kRewind | kSlippery | kRelative; 5831 else if (has_action("SEEKRWNDNOCUTLIST", actions)) 5832 flags = ARBSEEK_REWIND | kRewind | kSlippery | kRelative | kIgnoreCutlist; 5819 5833 else if (has_action("RWNDSTICKY", actions)) 5820 5834 flags = ARBSEEK_SET | kRewind | kSticky | kAbsolute; 5821 5835 else if (has_action("LEFT", actions)) … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5826 5840 int direction = (flags & kRewind) ? -1 : 1; 5827 5841 if (HasQueuedInput()) 5828 5842 { 5829 DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask)); 5843 DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask), 5844 !(flags & kIgnoreCutlist)); 5830 5845 } 5831 5846 else if (actx->paused) 5832 5847 { … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5836 5851 direction * (1.001 / actx->last_framerate); 5837 5852 QString message = (flags & kRewind) ? QString(tr("Rewind")) : 5838 5853 QString(tr("Forward")); 5839 DoSeek(actx, time, message );5854 DoSeek(actx, time, message, true, !(flags & kIgnoreCutlist)); 5840 5855 } 5841 5856 } 5842 5857 else if (flags & kSticky) … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5847 5862 { 5848 5863 if (smartForward) 5849 5864 doSmartForward = true; 5850 DoSeek(actx, -actx->rewtime, tr("Skip Back")); 5865 DoSeek(actx, -actx->rewtime, tr("Skip Back"), 5866 true, !(flags & kIgnoreCutlist)); 5851 5867 } 5852 5868 else 5853 5869 { 5854 5870 if (smartForward & doSmartForward) 5855 DoSeek(actx, actx->rewtime, tr("Skip Ahead")); 5871 DoSeek(actx, actx->rewtime, tr("Skip Ahead"), 5872 true, !(flags & kIgnoreCutlist)); 5856 5873 else 5857 DoSeek(actx, actx->fftime, tr("Skip Ahead")); 5874 DoSeek(actx, actx->fftime, tr("Skip Ahead"), 5875 true, !(flags & kIgnoreCutlist)); 5858 5876 } 5859 5877 return true; 5860 5878 } 5861 5879 5862 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg) 5880 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg, 5881 bool timeIsOffset, bool honorCutlist) 5863 5882 { 5864 5883 bool limitkeys = false; 5865 5884 … … void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg) 5873 5892 keyRepeatTimer.start(); 5874 5893 NormalSpeed(ctx); 5875 5894 time += StopFFRew(ctx); 5895 float framerate = ctx->last_framerate; 5896 uint64_t currentFrameAbs = ctx->player->GetFramesPlayed(); 5897 uint64_t currentFrameRel = honorCutlist ? 5898 ctx->player->TranslatePositionAbsToRel(currentFrameAbs) : 5899 currentFrameAbs; 5900 int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) + 5901 time * framerate + 0.5; 5902 if (desiredFrameRel < 0) 5903 desiredFrameRel = 0; 5904 uint64_t desiredFrameAbs = honorCutlist ? 5905 ctx->player->TranslatePositionRelToAbs(desiredFrameRel) : 5906 desiredFrameRel; 5907 time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate; 5876 5908 DoPlayerSeek(ctx, time); 5877 5909 UpdateOSDSeekMessage(ctx, mesg, kOSDTimeout_Med); 5878 5910 } 5879 5911 } 5880 5912 5881 void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence )5913 void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence, bool honorCutlist) 5882 5914 { 5883 5915 bool ok = false; 5884 5916 int seek = GetQueuedInputAsInt(&ok); … … void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence) 5889 5921 float time = ((seek / 100) * 3600) + ((seek % 100) * 60); 5890 5922 5891 5923 if (whence == ARBSEEK_FORWARD) 5892 DoSeek(ctx, time, tr("Jump Ahead") );5924 DoSeek(ctx, time, tr("Jump Ahead"), true, honorCutlist); 5893 5925 else if (whence == ARBSEEK_REWIND) 5894 DoSeek(ctx, -time, tr("Jump Back") );5926 DoSeek(ctx, -time, tr("Jump Back"), true, honorCutlist); 5895 5927 else 5896 5928 { 5897 5929 ctx->LockDeletePlayer(__FILE__, __LINE__); … … void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence) 5903 5935 if (whence == ARBSEEK_END) 5904 5936 time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) / 5905 5937 ctx->last_framerate) - time; 5906 else5907 time = time - (ctx->player->GetFramesPlayed() - 1) /5908 ctx->last_framerate;5909 5938 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 5910 DoSeek(ctx, time, tr("Jump To") );5939 DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist); 5911 5940 } 5912 5941 } 5913 5942 … … bool TV::CommitQueuedInput(PlayerContext *ctx) 6845 6874 { 6846 6875 commited = true; 6847 6876 if (HasQueuedInput()) 6877 // XXX Should the cutlist be honored? 6848 6878 DoArbSeek(ctx, ARBSEEK_FORWARD); 6849 6879 } 6850 6880 else if (StateIsLiveTV(GetState(ctx))) … … void TV::DVDJumpBack(PlayerContext *ctx) 11437 11467 uint chapterLength = dvdrb->GetChapterLength(); 11438 11468 if ((titleLength == chapterLength) && chapterLength > 300) 11439 11469 { 11440 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back") );11470 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true); 11441 11471 } 11442 11472 else 11443 11473 { … … void TV::DVDJumpForward(PlayerContext *ctx) 11485 11515 (currentTime < (chapterLength - (ctx->jumptime * 60))) && 11486 11516 chapterLength > 300) 11487 11517 { 11488 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead") );11518 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true); 11489 11519 } 11490 11520 else 11491 11521 { -
mythtv/libs/libmythtv/tv_play.h
diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h index 9207280..783d22c 100644
a b class MPUBLIC TV : public QObject 411 411 412 412 bool SeekHandleAction(PlayerContext *actx, const QStringList &actions, 413 413 const bool isDVD); 414 void DoSeek(PlayerContext*, float time, const QString &mesg); 414 void DoSeek(PlayerContext*, float time, const QString &mesg, 415 bool timeIsOffset, bool honorCutlist=true); 415 416 bool DoPlayerSeek(PlayerContext*, float time); 416 417 enum ArbSeekWhence { 417 418 ARBSEEK_SET = 0, … … class MPUBLIC TV : public QObject 419 420 ARBSEEK_FORWARD, 420 421 ARBSEEK_END 421 422 }; 422 void DoArbSeek(PlayerContext*, ArbSeekWhence whence );423 void DoArbSeek(PlayerContext*, ArbSeekWhence whence, bool honorCutlist=true); 423 424 void NormalSpeed(PlayerContext*); 424 425 void ChangeSpeed(PlayerContext*, int direction); 425 426 void ToggleTimeStretch(PlayerContext*); -
mythtv/themes/default-wide/osd.xml
diff --git a/mythtv/themes/default-wide/osd.xml b/mythtv/themes/default-wide/osd.xml index 6f8f4f5..ce378bc 100644
a b 352 352 <area>770,10,300,30</area> 353 353 <align>right,top</align> 354 354 </textarea> 355 <textarea name=" timedisplay" from="title">355 <textarea name="fulltimedisplay" from="title"> 356 356 <area>10,50,1060,30</area> 357 357 <align>hcenter,bottom</align> 358 358 </textarea>