Skip to content

Commit

Permalink
Better handle frame rate changes during fast-forward/rewind.
Browse files Browse the repository at this point in the history
If the frame rate changes while fast-forwarding or rewinding, the
frame interval is set incorrectly and the skip values is not changed.
This leads to very erratic behavior when such a transition is hit.
Fix the problem, updating the frame interval and skip values
appropriately when the frame rate changes.
  • Loading branch information
gigem committed Sep 28, 2011
1 parent 909b444 commit 9f871f6
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 11 deletions.
2 changes: 1 addition & 1 deletion mythtv/libs/libmythbase/mythversion.h
Expand Up @@ -12,7 +12,7 @@
/// Update this whenever the plug-in API changes.
/// Including changes in the libmythbase, libmyth, libmythtv, libmythav* and
/// libmythui class methods used by plug-ins.
#define MYTH_BINARY_VERSION "0.25.20110923-1"
#define MYTH_BINARY_VERSION "0.25.20110928-1"

/** \brief Increment this whenever the MythTV network protocol changes.
*
Expand Down
37 changes: 27 additions & 10 deletions mythtv/libs/libmythtv/mythplayer.cpp
Expand Up @@ -820,9 +820,18 @@ void MythPlayer::SetVideoParams(int width, int height, double fps,
if (fps > 0.0f && fps < 121.0f)
{
video_frame_rate = fps;
float temp_speed = (play_speed == 0.0f) ?
audio.GetStretchFactor() : play_speed;
SetFrameInterval(kScan_Progressive, 1.0 / (video_frame_rate * temp_speed));
if (ffrew_skip != 0 && ffrew_skip != 1)
{
UpdateFFRewSkip();
videosync->setFrameInterval(frame_interval);
}
else
{
float temp_speed = (play_speed == 0.0f) ?
audio.GetStretchFactor() : play_speed;
SetFrameInterval(kScan_Progressive,
1.0 / (video_frame_rate * temp_speed));
}
}

if (videoOutput)
Expand Down Expand Up @@ -3207,15 +3216,12 @@ uint64_t MythPlayer::GetBookmark(void)
return bookmark;
}

void MythPlayer::ChangeSpeed(void)
bool MythPlayer::UpdateFFRewSkip(void)
{
float last_speed = play_speed;
play_speed = next_play_speed;
normal_speed = next_normal_speed;

float temp_speed = (play_speed == 0.0) ? audio.GetStretchFactor() : play_speed;

bool skip_changed;

float temp_speed = (play_speed == 0.0) ?
audio.GetStretchFactor() : play_speed;
if (play_speed >= 0.0f && play_speed <= 3.0f)
{
skip_changed = (ffrew_skip != 1);
Expand All @@ -3242,6 +3248,17 @@ void MythPlayer::ChangeSpeed(void)
ffrew_skip = play_speed < 0.0f ? -ffrew_skip : ffrew_skip;
ffrew_adjust = 0;
}

return skip_changed;
}

void MythPlayer::ChangeSpeed(void)
{
float last_speed = play_speed;
play_speed = next_play_speed;
normal_speed = next_normal_speed;

bool skip_changed = UpdateFFRewSkip();
videosync->setFrameInterval(frame_interval);

if (skip_changed && videoOutput)
Expand Down
1 change: 1 addition & 0 deletions mythtv/libs/libmythtv/mythplayer.h
Expand Up @@ -491,6 +491,7 @@ class MTV_PUBLIC MythPlayer
bool DecoderGetFrame(DecodeType, bool unsafe = false);

// These actually execute commands requested by public members
bool UpdateFFRewSkip(void);
virtual void ChangeSpeed(void);
bool DoFastForward(uint64_t frames, bool override_seeks = false,
bool seeks_wanted = false);
Expand Down

0 comments on commit 9f871f6

Please sign in to comment.