Ticket #8631: seek_honors_cutlist_v11.patch
| File seek_honors_cutlist_v11.patch, 27.8 KB (added by , 14 years ago) |
|---|
-
mythtv/libs/libmythtv/bdringbuffer.cpp
diff --git a/mythtv/libs/libmythtv/bdringbuffer.cpp b/mythtv/libs/libmythtv/bdringbuffer.cpp index 8028527..bd7fc9f 100644
a b bool BDRingBuffer::HandleAction(const QStringList &actions, int64_t pts) 199 199 PressButton(BD_VK_DOWN, pts); 200 200 } 201 201 else if (actions.contains(ACTION_LEFT) || 202 actions.contains(ACTION_SEEKRWNDNOCUTLIST) || 202 203 actions.contains(ACTION_SEEKRWND)) 203 204 { 204 205 PressButton(BD_VK_LEFT, pts); 205 206 } 206 207 else if (actions.contains(ACTION_RIGHT) || 208 actions.contains(ACTION_SEEKFFWDNOCUTLIST) || 207 209 actions.contains(ACTION_SEEKFFWD)) 208 210 { 209 211 PressButton(BD_VK_RIGHT, pts); -
mythtv/libs/libmythtv/deletemap.cpp
diff --git a/mythtv/libs/libmythtv/deletemap.cpp b/mythtv/libs/libmythtv/deletemap.cpp index 0a1ac66..955dbe3 100644
a b void DeleteMap::UpdateSeekAmount(int change, double framerate) 127 127 } 128 128 } 129 129 130 /** 130 static QString createTimeString(uint64_t frame, uint64_t total, 131 double frame_rate, bool full_resolution) 132 { 133 int secs = (int)(frame / frame_rate); 134 int frames = frame - (int)(secs * frame_rate); 135 int totalSecs = (int)(total / frame_rate); 136 QString timestr; 137 if (totalSecs >= 3600) 138 timestr = QString::number(secs / 3600) + ":"; 139 timestr += QString("%1").arg((secs / 60) % 60, 2, 10, QChar(48)) + 140 QString(":%1").arg(secs % 60, 2, 10, QChar(48)); 141 if (full_resolution) 142 timestr += QString(".%1").arg(frames, 2, 10, QChar(48)); 143 return timestr; 144 } 145 146 /** 131 147 * \brief Show and update the edit mode On Screen Display. The cut regions 132 148 * are only refreshed if the deleteMap has been updated. 133 149 */ … … void DeleteMap::UpdateOSD(uint64_t frame, uint64_t total, double frame_rate, 145 161 infoMap.detach(); 146 162 ctx->UnlockPlayingInfo(__FILE__, __LINE__); 147 163 148 int secs = (int)(frame / frame_rate);149 int frames = frame - (int)(secs * frame_rate);150 QString timestr = QString::number(secs / 3600) +151 QString(":%1").arg((secs / 60) % 60, 2, 10, QChar(48)) +152 QString(":%1").arg(secs % 60, 2, 10, QChar(48)) +153 QString(".%1").arg(frames, 2, 10, QChar(48));154 155 164 QString cutmarker = " "; 156 165 if (IsInDelete(frame)) 157 166 cutmarker = QObject::tr("cut"); 158 167 168 QString timestr = createTimeString(frame, total, frame_rate, true); 169 uint64_t relTotal = TranslatePositionAbsToRel(total); 170 QString relTimeDisplay = createTimeString(TranslatePositionAbsToRel(frame), 171 relTotal, frame_rate, false); 172 QString relLengthDisplay = createTimeString(relTotal, 173 relTotal, frame_rate, false); 159 174 infoMap["timedisplay"] = timestr; 160 175 infoMap["framedisplay"] = QString::number(frame); 161 176 infoMap["cutindicator"] = cutmarker; 162 177 infoMap["title"] = QObject::tr("Edit"); 163 178 infoMap["seekamount"] = m_seekText;; 179 infoMap["reltimedisplay"] = relTimeDisplay; 180 infoMap["rellengthdisplay"] = relLengthDisplay; 181 infoMap["fulltimedisplay"] = timestr + " (" + 182 QObject::tr("%1 of %2").arg(relTimeDisplay).arg(relLengthDisplay) + ")"; 164 183 165 184 QHash<QString,float> posMap; 166 185 posMap.insert("position", (float)((double)frame/(double)total)); … … bool DeleteMap::IsSaved(PlayerContext *ctx) 819 838 820 839 return currentMap == savedMap; 821 840 } 841 842 uint64_t DeleteMap::TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap, 843 uint64_t absPosition) 844 { 845 uint64_t subtraction = 0; 846 uint64_t startOfCutRegion = 0; 847 frm_dir_map_t::const_iterator i; 848 bool withinCut = false; 849 bool first = true; 850 for (i = deleteMap.constBegin(); 851 i != deleteMap.constEnd() && i.key() <= absPosition; 852 i++) 853 { 854 if (first) 855 withinCut = (i.value() == MARK_CUT_END); 856 first = false; 857 if (i.value() == MARK_CUT_START && !withinCut) 858 { 859 withinCut = true; 860 startOfCutRegion = i.key(); 861 } 862 else if (i.value() == MARK_CUT_END && withinCut) 863 { 864 withinCut = false; 865 subtraction += (i.key() - startOfCutRegion); 866 } 867 } 868 if (withinCut) 869 subtraction += (absPosition - startOfCutRegion); 870 return absPosition - subtraction; 871 } 872 873 uint64_t DeleteMap::TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap, 874 uint64_t relPosition) 875 { 876 uint64_t addition = 0; 877 uint64_t startOfCutRegion = 0; 878 frm_dir_map_t::const_iterator i; 879 bool withinCut = false; 880 bool first = true; 881 for (i = deleteMap.constBegin(); i != deleteMap.constEnd(); i++) 882 { 883 if (first) 884 withinCut = (i.value() == MARK_CUT_END); 885 first = false; 886 if (i.value() == MARK_CUT_START && !withinCut) 887 { 888 withinCut = true; 889 startOfCutRegion = i.key(); 890 if (relPosition + addition <= startOfCutRegion) 891 break; 892 } 893 else if (i.value() == MARK_CUT_END && withinCut) 894 { 895 withinCut = false; 896 addition += (i.key() - startOfCutRegion); 897 } 898 } 899 return relPosition + addition; 900 } -
mythtv/libs/libmythtv/deletemap.h
diff --git a/mythtv/libs/libmythtv/deletemap.h b/mythtv/libs/libmythtv/deletemap.h index 2dfa190..ffdb2d0 100644
a b class DeleteMap 59 59 bool IsTemporaryMark(uint64_t frame); 60 60 bool HasTemporaryMark(void); 61 61 uint64_t GetLastFrame(uint64_t total); 62 uint64_t TranslatePositionAbsToRel(uint64_t absPosition) { 63 return TranslatePositionAbsToRel(m_deleteMap, absPosition); 64 } 65 uint64_t TranslatePositionRelToAbs(uint64_t relPosition) { 66 return TranslatePositionRelToAbs(m_deleteMap, relPosition); 67 } 68 static uint64_t TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap, 69 uint64_t absPosition); 70 static uint64_t TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap, 71 uint64_t relPosition); 62 72 63 73 void TrackerReset(uint64_t frame, uint64_t total); 64 74 bool TrackerWantsToJump(uint64_t frame, uint64_t total, uint64_t &to); -
mythtv/libs/libmythtv/dvdringbuffer.cpp
diff --git a/mythtv/libs/libmythtv/dvdringbuffer.cpp b/mythtv/libs/libmythtv/dvdringbuffer.cpp index 318f8f8..fd20394 100644
a b bool DVDRingBuffer::HandleAction(const QStringList &actions, int64_t pts) 1143 1143 MoveButtonDown(); 1144 1144 } 1145 1145 else if (actions.contains(ACTION_LEFT) || 1146 actions.contains(ACTION_SEEKRWNDNOCUTLIST) || 1146 1147 actions.contains(ACTION_SEEKRWND)) 1147 1148 { 1148 1149 MoveButtonLeft(); 1149 1150 } 1150 1151 else if (actions.contains(ACTION_RIGHT) || 1152 actions.contains(ACTION_SEEKFFWDNOCUTLIST) || 1151 1153 actions.contains(ACTION_SEEKFFWD)) 1152 1154 { 1153 1155 MoveButtonRight(); -
mythtv/libs/libmythtv/mythplayer.cpp
diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp index 0682907..6b7151e 100644
a b void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields) 4605 4605 playbackLen = max(playbackLen, 1); 4606 4606 secsplayed = min((float)playbackLen, max(secsplayed, 0.0f)); 4607 4607 4608 info.values.insert("secondsplayed", (int)secsplayed); 4609 info.values.insert("totalseconds", playbackLen); 4610 info.values["position"] = (int)(1000.0f * (secsplayed / (float)playbackLen)); 4608 // Set the raw values, followed by the translated values. 4609 for (int i = 0; i < 2 ; ++i) 4610 { 4611 QString rawPrefix = (i == 0 ? "raw" : ""); 4612 if (i > 0) 4613 { 4614 playbackLen = deleteMap.TranslatePositionAbsToRel(playbackLen * video_frame_rate) / 4615 video_frame_rate; 4616 secsplayed = deleteMap.TranslatePositionAbsToRel(secsplayed * video_frame_rate) / 4617 video_frame_rate; 4618 } 4619 4620 info.values.insert(rawPrefix + "secondsplayed", (int)secsplayed); 4621 info.values.insert(rawPrefix + "totalseconds", playbackLen); 4622 info.values[rawPrefix + "position"] = (int)(1000.0f * (secsplayed / (float)playbackLen)); 4611 4623 4612 4624 int phours = (int)secsplayed / 3600; 4613 4625 int pmins = ((int)secsplayed - phours * 3600) / 60; … … void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields) 4656 4668 } 4657 4669 } 4658 4670 4659 info.text["description"] = QObject::tr("%1 of %2").arg(text1).arg(text2); 4660 info.text["playedtime"] = text1; 4661 info.text["totaltime"] = text2; 4662 info.text["remainingtime"] = islive ? QString() : text3; 4663 info.text["behindtime"] = islive ? text3 : QString(); 4671 info.text[rawPrefix + "description"] = QObject::tr("%1 of %2").arg(text1).arg(text2); 4672 info.text[rawPrefix + "playedtime"] = text1; 4673 info.text[rawPrefix + "totaltime"] = text2; 4674 info.text[rawPrefix + "remainingtime"] = islive ? QString() : text3; 4675 info.text[rawPrefix + "behindtime"] = islive ? text3 : QString(); 4676 } 4664 4677 } 4665 4678 4666 4679 int MythPlayer::GetNumChapters() -
mythtv/libs/libmythtv/mythplayer.h
diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h index 56ddc01..dd8a296 100644
a b class MTV_PUBLIC MythPlayer 353 353 virtual long long CalcMaxFFTime(long long ff, bool setjump = true) const; 354 354 long long CalcRWTime(long long rw) const; 355 355 virtual void calcSliderPos(osdInfo &info, bool paddedFields = false); 356 uint64_t TranslatePositionAbsToRel(uint64_t absPosition) { 357 return deleteMap.TranslatePositionAbsToRel(absPosition); 358 } 359 uint64_t TranslatePositionRelToAbs(uint64_t relPosition) { 360 return deleteMap.TranslatePositionRelToAbs(relPosition); 361 } 356 362 357 363 // Commercial stuff 358 364 void SetAutoCommercialSkip(CommSkipMode autoskip) -
mythtv/libs/libmythtv/osd.cpp
diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp index 56d6611..68ca122 100644
a b void OSD::SetValues(const QString &window, QHash<QString,int> &map, 344 344 found = true; 345 345 } 346 346 } 347 if (map.contains("rawposition")) 348 { 349 MythUIProgressBar *bar = dynamic_cast<MythUIProgressBar *> (win->GetChild("rawposition")); 350 if (bar) 351 { 352 bar->SetVisible(true); 353 bar->SetStart(0); 354 bar->SetTotal(1000); 355 bar->SetUsed(map.value("rawposition")); 356 found = true; 357 } 358 } 347 359 348 360 if (found) 349 361 SetExpiry(window, timeout); -
mythtv/libs/libmythtv/tv_actions.h
diff --git a/mythtv/libs/libmythtv/tv_actions.h b/mythtv/libs/libmythtv/tv_actions.h index 5826438..8f40f17 100644
a b 36 36 #define ACTION_JUMPFFWD "JUMPFFWD" 37 37 #define ACTION_JUMPRWND "JUMPRWND" 38 38 #define ACTION_JUMPBKMRK "JUMPBKMRK" 39 #define ACTION_SEEKRWNDNOCUTLIST "SEEKRWNDNOCUTLIST" 40 #define ACTION_SEEKFFWDNOCUTLIST "SEEKFFWDNOCUTLIST" 41 #define ACTION_JUMPRWNDNOCUTLIST "JUMPRWNDNOCUTLIST" 42 #define ACTION_JUMPFFWDNOCUTLIST "JUMPFFWDNOCUTLIST" 39 43 #define ACTION_JUMPSTART "JUMPSTART" 40 44 #define ACTION_JUMPTODVDROOTMENU "JUMPTODVDROOTMENU" 41 45 #define ACTION_JUMPTOPOPUPMENU "JUMPTOPOPUPMENU" -
mythtv/libs/libmythtv/tv_play.cpp
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index 299ca17..0576e82 100644
a b void TV::InitKeys(void) 505 505 "Pause"), "P"); 506 506 REG_KEY("TV Playback", ACTION_SEEKFFWD, QT_TRANSLATE_NOOP("MythControls", 507 507 "Fast Forward"), "Right"); 508 REG_KEY("TV Playback", ACTION_SEEKFFWDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls", 509 "Fast Forward ignoring cutlist"), ""); 508 510 REG_KEY("TV Playback", ACTION_SEEKRWND, QT_TRANSLATE_NOOP("MythControls", 509 511 "Rewind"), "Left"); 512 REG_KEY("TV Playback", ACTION_SEEKRWNDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls", 513 "Rewind ignoring cutlist"), ""); 510 514 REG_KEY("TV Playback", "ARBSEEK", QT_TRANSLATE_NOOP("MythControls", 511 515 "Arbitrary Seek"), "*"); 516 REG_KEY("TV Playback", "ARBSEEKNOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 517 "Arbitrary Seek ignoring cutlist"), ""); 512 518 REG_KEY("TV Playback", ACTION_CHANNELUP, QT_TRANSLATE_NOOP("MythControls", 513 519 "Channel up"), "Up"); 514 520 REG_KEY("TV Playback", ACTION_CHANNELDOWN, QT_TRANSLATE_NOOP("MythControls", … … void TV::InitKeys(void) 519 525 "Switch to the previous channel"), "H"); 520 526 REG_KEY("TV Playback", ACTION_JUMPFFWD, QT_TRANSLATE_NOOP("MythControls", 521 527 "Jump ahead"), "PgDown"); 528 REG_KEY("TV Playback", ACTION_JUMPFFWDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls", 529 "Jump ahead ignoring cutlist"), ""); 522 530 REG_KEY("TV Playback", ACTION_JUMPRWND, QT_TRANSLATE_NOOP("MythControls", 523 531 "Jump back"), "PgUp"); 532 REG_KEY("TV Playback", ACTION_JUMPRWNDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls", 533 "Jump back ignoring cutlist"), ""); 534 REG_KEY("TV Playback", "INFONOCUTLIST", QT_TRANSLATE_NOOP("MythControls", 535 "Info ignoring cutlist"), ""); 524 536 REG_KEY("TV Playback", ACTION_JUMPBKMRK, QT_TRANSLATE_NOOP("MythControls", 525 537 "Jump to bookmark"), "K"); 526 538 REG_KEY("TV Playback", "FFWDSTICKY", QT_TRANSLATE_NOOP("MythControls", … … bool TV::ActiveHandleAction(PlayerContext *ctx, 3990 4002 } 3991 4003 } 3992 4004 else if (has_action(ACTION_JUMPRWND, actions)) 3993 DoJumpRWND(ctx); 4005 DoJumpRWND(ctx, true); 4006 else if (has_action(ACTION_JUMPRWNDNOCUTLIST, actions)) 4007 DoJumpRWND(ctx, false); 3994 4008 else if (has_action(ACTION_JUMPFFWD, actions)) 3995 DoJumpFFWD(ctx); 4009 DoJumpFFWD(ctx, true); 4010 else if (has_action(ACTION_JUMPFFWDNOCUTLIST, actions)) 4011 DoJumpFFWD(ctx, false); 3996 4012 else if (has_action(ACTION_JUMPBKMRK, actions)) 3997 4013 { 3998 4014 ctx->LockDeletePlayer(__FILE__, __LINE__); 3999 long long bookmark = ctx->player->GetBookmark(); 4000 long long curloc = ctx->player->GetFramesPlayed(); 4015 uint64_t bookmark = ctx->player->GetBookmark(); 4001 4016 float rate = ctx->player->GetFrameRate(); 4002 long long seekloc = (long long) ((bookmark - curloc) / rate);4017 float seekloc = ctx->player->TranslatePositionAbsToRel(bookmark) / rate; 4003 4018 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 4004 4019 4005 4020 if (bookmark > rate) 4006 DoSeek(ctx, seekloc, tr("Jump to Bookmark") );4021 DoSeek(ctx, seekloc, tr("Jump to Bookmark"), false); 4007 4022 } 4008 4023 else if (has_action(ACTION_JUMPSTART,actions)) 4009 4024 { 4010 long long seekloc = +1; 4011 ctx->LockDeletePlayer(__FILE__, __LINE__); 4012 seekloc = (int64_t) (-1.0 * ctx->player->GetFramesPlayed() / 4013 ctx->player->GetFrameRate()); 4014 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 4015 4016 if (seekloc <= 0) 4017 DoSeek(ctx, seekloc, tr("Jump to Beginning")); 4025 DoSeek(ctx, 0, tr("Jump to Beginning"), false); 4018 4026 } 4019 4027 else if (has_action(ACTION_CLEAROSD, actions)) 4020 4028 { … … bool TV::ActiveHandleAction(PlayerContext *ctx, 4168 4176 ChangeTimeStretch(ctx, -1); 4169 4177 else if (has_action("MENU", actions)) 4170 4178 ShowOSDMenu(ctx); 4171 else if (has_action("INFO", actions) )4179 else if (has_action("INFO", actions) || has_action("INFONOCUTLIST", actions)) 4172 4180 { 4173 4181 if (HasQueuedInput()) 4174 4182 { 4175 DoArbSeek(ctx, ARBSEEK_SET );4183 DoArbSeek(ctx, ARBSEEK_SET, !has_action("INFONOCUTLIST", actions)); 4176 4184 } 4177 4185 else 4178 4186 ToggleOSD(ctx, true); … … bool TV::ActivePostQHandleAction(PlayerContext *ctx, const QStringList &actions) 4410 4418 ChangeChannel(ctx, CHANNEL_DIRECTION_UP); 4411 4419 } 4412 4420 else 4413 DoJumpRWND(ctx );4421 DoJumpRWND(ctx, true); 4414 4422 } 4415 4423 else if (has_action(ACTION_CHANNELDOWN, actions)) 4416 4424 { … … bool TV::ActivePostQHandleAction(PlayerContext *ctx, const QStringList &actions) 4422 4430 ChangeChannel(ctx, CHANNEL_DIRECTION_DOWN); 4423 4431 } 4424 4432 else 4425 DoJumpFFWD(ctx );4433 DoJumpFFWD(ctx, true); 4426 4434 } 4427 4435 else if (has_action("DELETE", actions) && !islivetv) 4428 4436 { … … void TV::ProcessNetworkControlCommand(PlayerContext *ctx, 4651 4659 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 4652 4660 4653 4661 if (tokens[2] == "BEGINNING") 4654 DoSeek(ctx, -fplay, tr("Jump to Beginning")); 4655 else if (tokens[2] == "FORWARD") 4656 DoSeek(ctx, ctx->fftime, tr("Skip Ahead")); 4657 else if (tokens[2] == "BACKWARD") 4658 DoSeek(ctx, -ctx->rewtime, tr("Skip Back")); 4659 else if ((tokens[2] == "POSITION") && (tokens.size() == 4) && 4662 DoSeek(ctx, 0, tr("Jump to Beginning"), false); 4663 else if (tokens[2] == "FORWARD" || tokens[2] == "FORWARDNOCUTLIST") 4664 DoSeek(ctx, ctx->fftime, tr("Skip Ahead"), true, tokens[2] == "FORWARD"); 4665 else if (tokens[2] == "BACKWARD" || tokens[2] == "BACKWARDNOCUTLIST") 4666 DoSeek(ctx, -ctx->rewtime, tr("Skip Back"), true, tokens[2] == "BACKWARD"); 4667 else if ((tokens[2] == "POSITION" || 4668 tokens[2] == "POSITIONNOCUTLIST") && 4669 (tokens.size() == 4) && 4660 4670 (tokens[3].contains(QRegExp("^\\d+$")))) 4661 4671 { 4662 4672 long long rel_frame = tokens[3].toInt(); 4663 rel_frame -= (long long) (fplay * (1.0 / 4664 ctx->player->GetFrameRate())); 4665 DoSeek(ctx, rel_frame, tr("Jump To")); 4673 DoSeek(ctx, rel_frame / ctx->player->GetFrameRate(), tr("Jump To"), 4674 false, tokens[2] == "POSITION"); 4666 4675 } 4667 4676 } 4668 4677 else if (tokens.size() >= 3 && tokens[1] == "VOLUME") … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5696 5705 const bool isDVD) 5697 5706 { 5698 5707 const int kRewind = 4, kForward = 8, kSticky = 16, kSlippery = 32, 5699 kRelative = 64, kAbsolute = 128, kWhenceMask = 3; 5708 kRelative = 64, kAbsolute = 128, kIgnoreCutlist = 256, 5709 kWhenceMask = 3; 5700 5710 int flags = 0; 5701 5711 if (has_action(ACTION_SEEKFFWD, actions)) 5702 5712 flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative; 5713 else if (has_action(ACTION_SEEKFFWDNOCUTLIST, actions)) 5714 flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative | kIgnoreCutlist; 5703 5715 else if (has_action("FFWDSTICKY", actions)) 5704 5716 flags = ARBSEEK_END | kForward | kSticky | kAbsolute; 5705 5717 else if (has_action(ACTION_RIGHT, actions)) 5706 5718 flags = ARBSEEK_FORWARD | kForward | kSticky | kRelative; 5707 5719 else if (has_action(ACTION_SEEKRWND, actions)) 5708 5720 flags = ARBSEEK_REWIND | kRewind | kSlippery | kRelative; 5721 else if (has_action(ACTION_SEEKRWNDNOCUTLIST, actions)) 5722 flags = ARBSEEK_REWIND | kRewind | kSlippery | kRelative | kIgnoreCutlist; 5709 5723 else if (has_action("RWNDSTICKY", actions)) 5710 5724 flags = ARBSEEK_SET | kRewind | kSticky | kAbsolute; 5711 5725 else if (has_action(ACTION_LEFT, actions)) … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5716 5730 int direction = (flags & kRewind) ? -1 : 1; 5717 5731 if (HasQueuedInput()) 5718 5732 { 5719 DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask)); 5733 DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask), 5734 !(flags & kIgnoreCutlist)); 5720 5735 } 5721 5736 else if (ContextIsPaused(actx, __FILE__, __LINE__)) 5722 5737 { … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5731 5746 direction * (1.001 / rate); 5732 5747 QString message = (flags & kRewind) ? QString(tr("Rewind")) : 5733 5748 QString(tr("Forward")); 5734 DoSeek(actx, time, message );5749 DoSeek(actx, time, message, true, !(flags & kIgnoreCutlist)); 5735 5750 } 5736 5751 } 5737 5752 else if (flags & kSticky) … … bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions, 5742 5757 { 5743 5758 if (smartForward) 5744 5759 doSmartForward = true; 5745 DoSeek(actx, -actx->rewtime, tr("Skip Back")); 5760 DoSeek(actx, -actx->rewtime, tr("Skip Back"), 5761 true, !(flags & kIgnoreCutlist)); 5746 5762 } 5747 5763 else 5748 5764 { 5749 5765 if (smartForward & doSmartForward) 5750 DoSeek(actx, actx->rewtime, tr("Skip Ahead")); 5766 DoSeek(actx, actx->rewtime, tr("Skip Ahead"), 5767 true, !(flags & kIgnoreCutlist)); 5751 5768 else 5752 DoSeek(actx, actx->fftime, tr("Skip Ahead")); 5769 DoSeek(actx, actx->fftime, tr("Skip Ahead"), 5770 true, !(flags & kIgnoreCutlist)); 5753 5771 } 5754 5772 return true; 5755 5773 } 5756 5774 5757 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg) 5775 void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg, 5776 bool timeIsOffset, bool honorCutlist) 5758 5777 { 5759 5778 bool limitkeys = false; 5760 5779 … … void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg) 5768 5787 keyRepeatTimer.start(); 5769 5788 NormalSpeed(ctx); 5770 5789 time += StopFFRew(ctx); 5790 float framerate = ctx->player->GetFrameRate(); 5791 uint64_t currentFrameAbs = ctx->player->GetFramesPlayed(); 5792 uint64_t currentFrameRel = honorCutlist ? 5793 ctx->player->TranslatePositionAbsToRel(currentFrameAbs) : 5794 currentFrameAbs; 5795 int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) + 5796 time * framerate + 0.5; 5797 if (desiredFrameRel < 0) 5798 desiredFrameRel = 0; 5799 uint64_t desiredFrameAbs = honorCutlist ? 5800 ctx->player->TranslatePositionRelToAbs(desiredFrameRel) : 5801 desiredFrameRel; 5802 time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate; 5771 5803 DoPlayerSeek(ctx, time); 5772 5804 UpdateOSDSeekMessage(ctx, mesg, kOSDTimeout_Med); 5773 5805 } 5774 5806 } 5775 5807 5776 void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence )5808 void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence, bool honorCutlist) 5777 5809 { 5778 5810 bool ok = false; 5779 5811 int seek = GetQueuedInputAsInt(&ok); … … void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence) 5784 5816 float time = ((seek / 100) * 3600) + ((seek % 100) * 60); 5785 5817 5786 5818 if (whence == ARBSEEK_FORWARD) 5787 DoSeek(ctx, time, tr("Jump Ahead") );5819 DoSeek(ctx, time, tr("Jump Ahead"), true, honorCutlist); 5788 5820 else if (whence == ARBSEEK_REWIND) 5789 DoSeek(ctx, -time, tr("Jump Back") );5821 DoSeek(ctx, -time, tr("Jump Back"), true, honorCutlist); 5790 5822 else 5791 5823 { 5792 5824 ctx->LockDeletePlayer(__FILE__, __LINE__); … … void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence) 5798 5830 if (whence == ARBSEEK_END) 5799 5831 time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) / 5800 5832 ctx->player->GetFrameRate()) - time; 5801 else5802 time = time - (ctx->player->GetFramesPlayed() - 1) /5803 ctx->player->GetFrameRate();5804 5833 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 5805 DoSeek(ctx, time, tr("Jump To") );5834 DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist); 5806 5835 } 5807 5836 } 5808 5837 … … bool TV::CommitQueuedInput(PlayerContext *ctx) 6728 6757 { 6729 6758 commited = true; 6730 6759 if (HasQueuedInput()) 6760 // XXX Should the cutlist be honored? 6731 6761 DoArbSeek(ctx, ARBSEEK_FORWARD); 6732 6762 } 6733 6763 else if (StateIsLiveTV(GetState(ctx))) … … void TV::OSDDialogEvent(int result, QString text, QString action) 9758 9788 SetExitPlayer(true, true); 9759 9789 } 9760 9790 else if (action == ACTION_JUMPFFWD) 9761 DoJumpFFWD(actx); 9791 DoJumpFFWD(actx, true); 9792 else if (action == ACTION_JUMPFFWDNOCUTLIST) 9793 DoJumpFFWD(actx, false); 9762 9794 else if (action == ACTION_JUMPRWND) 9763 DoJumpRWND(actx); 9795 DoJumpRWND(actx, true); 9796 else if (action == ACTION_JUMPRWNDNOCUTLIST) 9797 DoJumpRWND(actx, false); 9764 9798 else if (action.startsWith("DEINTERLACER")) 9765 9799 HandleDeinterlacer(actx, action); 9766 9800 else if (action == ACTION_TOGGLEOSDDEBUG) … … void TV::ITVRestart(PlayerContext *ctx, bool isLive) 11561 11595 ctx->UnlockDeletePlayer(__FILE__, __LINE__); 11562 11596 } 11563 11597 11564 void TV::DoJumpFFWD(PlayerContext *ctx )11598 void TV::DoJumpFFWD(PlayerContext *ctx, bool honorCutlist) 11565 11599 { 11566 11600 if (GetState(ctx) == kState_WatchingDVD) 11567 11601 DVDJumpForward(ctx); 11568 11602 else if (GetNumChapters(ctx) > 0) 11569 11603 DoJumpChapter(ctx, 9999); 11570 11604 else 11571 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead") );11605 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true, honorCutlist); 11572 11606 } 11573 11607 11574 void TV::DoJumpRWND(PlayerContext *ctx )11608 void TV::DoJumpRWND(PlayerContext *ctx, bool honorCutlist) 11575 11609 { 11576 11610 if (GetState(ctx) == kState_WatchingDVD) 11577 11611 DVDJumpBack(ctx); 11578 11612 else if (GetNumChapters(ctx) > 0) 11579 11613 DoJumpChapter(ctx, -1); 11580 11614 else 11581 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back") );11615 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true, honorCutlist); 11582 11616 } 11583 11617 11584 11618 /* \fn TV::DVDJumpBack(PlayerContext*) … … void TV::DVDJumpBack(PlayerContext *ctx) 11604 11638 uint chapterLength = dvdrb->GetChapterLength(); 11605 11639 if ((titleLength == chapterLength) && chapterLength > 300) 11606 11640 { 11607 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back") );11641 DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true); 11608 11642 } 11609 11643 else 11610 11644 { … … void TV::DVDJumpForward(PlayerContext *ctx) 11647 11681 (currentTime < (chapterLength - (ctx->jumptime * 60))) && 11648 11682 chapterLength > 300) 11649 11683 { 11650 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead") );11684 DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true); 11651 11685 } 11652 11686 else 11653 11687 { -
mythtv/libs/libmythtv/tv_play.h
diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h index bd9d176..b4a9a99 100644
a b class MTV_PUBLIC TV : public QObject 386 386 387 387 bool SeekHandleAction(PlayerContext *actx, const QStringList &actions, 388 388 const bool isDVD); 389 void DoSeek(PlayerContext*, float time, const QString &mesg); 389 void DoSeek(PlayerContext*, float time, const QString &mesg, 390 bool timeIsOffset, bool honorCutlist=true); 390 391 bool DoPlayerSeek(PlayerContext*, float time); 391 392 enum ArbSeekWhence { 392 393 ARBSEEK_SET = 0, … … class MTV_PUBLIC TV : public QObject 394 395 ARBSEEK_FORWARD, 395 396 ARBSEEK_END 396 397 }; 397 void DoArbSeek(PlayerContext*, ArbSeekWhence whence );398 void DoJumpFFWD(PlayerContext *ctx );399 void DoJumpRWND(PlayerContext *ctx );398 void DoArbSeek(PlayerContext*, ArbSeekWhence whence, bool honorCutlist=true); 399 void DoJumpFFWD(PlayerContext *ctx, bool honorCutlist); 400 void DoJumpRWND(PlayerContext *ctx, bool honorCutlist); 400 401 void NormalSpeed(PlayerContext*); 401 402 void ChangeSpeed(PlayerContext*, int direction); 402 403 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 b711a3c..6f60e2e 100644
a b 519 519 <area>770,10,300,30</area> 520 520 <align>right,top</align> 521 521 </textarea> 522 <textarea name=" timedisplay" from="title">522 <textarea name="fulltimedisplay" from="title"> 523 523 <area>10,50,1060,30</area> 524 524 <align>hcenter,bottom</align> 525 525 </textarea>
