mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-05 15:30:00 +01:00
Update MediaPlayer and SourceControlWindow to utilize paused time for flag operations and manage loop status
This commit is contained in:
@@ -77,6 +77,7 @@ MediaPlayer::MediaPlayer()
|
|||||||
position_ = GST_CLOCK_TIME_NONE;
|
position_ = GST_CLOCK_TIME_NONE;
|
||||||
loop_ = LoopMode::LOOP_REWIND;
|
loop_ = LoopMode::LOOP_REWIND;
|
||||||
loop_status_ = LoopStatus::LOOP_STATUS_DEFAULT;
|
loop_status_ = LoopStatus::LOOP_STATUS_DEFAULT;
|
||||||
|
flag_status_ = LoopStatus::LOOP_STATUS_DEFAULT;
|
||||||
fading_mode_ = FadingMode::FADING_COLOR;
|
fading_mode_ = FadingMode::FADING_COLOR;
|
||||||
|
|
||||||
// start index in frame_ stack
|
// start index in frame_ stack
|
||||||
@@ -1121,6 +1122,7 @@ bool MediaPlayer::go_to(GstClockTime pos)
|
|||||||
|
|
||||||
GstClockTime jumpPts = pos;
|
GstClockTime jumpPts = pos;
|
||||||
|
|
||||||
|
// jump in a gap
|
||||||
if (timeline_.getGapAt(pos, gap)) {
|
if (timeline_.getGapAt(pos, gap)) {
|
||||||
// if in a gap, find closest seek target
|
// if in a gap, find closest seek target
|
||||||
if (gap.is_valid()) {
|
if (gap.is_valid()) {
|
||||||
@@ -1132,6 +1134,12 @@ bool MediaPlayer::go_to(GstClockTime pos)
|
|||||||
if (ABS_DIFF (position_, jumpPts) > 2 * timeline_.step() ) {
|
if (ABS_DIFF (position_, jumpPts) > 2 * timeline_.step() ) {
|
||||||
ret = true;
|
ret = true;
|
||||||
seek( jumpPts );
|
seek( jumpPts );
|
||||||
|
|
||||||
|
// timeline flags for target jump position
|
||||||
|
if (timeline_.flagTypeAt(jumpPts) == LoopStatus::LOOP_STATUS_BLACKOUT)
|
||||||
|
loop_status_ = flag_status_ = LoopStatus::LOOP_STATUS_BLACKOUT;
|
||||||
|
else
|
||||||
|
loop_status_ = flag_status_ = LoopStatus::LOOP_STATUS_DEFAULT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -2292,21 +2292,23 @@ void SourceControlWindow::RenderMediaPlayer(MediaSource *ms)
|
|||||||
// flag buttons
|
// flag buttons
|
||||||
if ( !mediaplayer_mode_ && mediaplayer_active_->timeline()->numFlags() > 0 ) {
|
if ( !mediaplayer_mode_ && mediaplayer_active_->timeline()->numFlags() > 0 ) {
|
||||||
|
|
||||||
|
GstClockTime _paused_time = mediaplayer_active_->position();
|
||||||
|
|
||||||
ImGui::SameLine(0, h_space_);
|
ImGui::SameLine(0, h_space_);
|
||||||
if( ImGuiToolkit::ButtonIcon(3, 0, "Go to next flag") ){
|
if( ImGuiToolkit::ButtonIcon(3, 0, "Go to next flag") ){
|
||||||
// find next flag and go to its midpoint
|
// find next flag and go to its midpoint
|
||||||
TimeInterval next_flag = mediaplayer_active_->timeline()->getNextFlag( mediaplayer_active_->position() );
|
TimeInterval next_flag = mediaplayer_active_->timeline()->getNextFlag( _paused_time );
|
||||||
if ( next_flag.is_valid() )
|
if ( next_flag.is_valid() )
|
||||||
mediaplayer_active_->go_to( next_flag.midpoint() );
|
mediaplayer_active_->go_to( next_flag.begin );
|
||||||
}
|
}
|
||||||
|
|
||||||
// if stopped at a flag, show flag type editor
|
// if stopped at a flag, show flag type editor
|
||||||
if (mediaplayer_active_->timeline()->isFlagged( mediaplayer_active_->position() )) {
|
if (mediaplayer_active_->timeline()->isFlagged( _paused_time )) {
|
||||||
static int current_flag = 0;
|
static int current_flag = 0;
|
||||||
current_flag = mediaplayer_active_->timeline()->flagTypeAt( mediaplayer_active_->position() );
|
current_flag = mediaplayer_active_->timeline()->flagTypeAt( _paused_time );
|
||||||
ImGui::SameLine(0, h_space_);
|
ImGui::SameLine(0, h_space_);
|
||||||
if ( ImGuiToolkit::IconMultistate(icons_flags, ¤t_flag, tooltips_flags) ){
|
if ( ImGuiToolkit::IconMultistate(icons_flags, ¤t_flag, tooltips_flags) ){
|
||||||
mediaplayer_active_->timeline()->setFlagTypeAt( mediaplayer_active_->position(), current_flag );
|
mediaplayer_active_->timeline()->setFlagTypeAt( _paused_time, current_flag );
|
||||||
oss << ": Flag type changed";
|
oss << ": Flag type changed";
|
||||||
Action::manager().store(oss.str());
|
Action::manager().store(oss.str());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user