Skip to content

Commit 727cd9a

Browse files
committed
exposed extra functionality through IMFMediaEngineEx interface for approximate seeking
1 parent 23a5056 commit 727cd9a

File tree

5 files changed

+29
-14
lines changed

5 files changed

+29
-14
lines changed

samples/SimplePlayback/src/SimplePlaybackApp.cxx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class SimplePlaybackApp : public app::App
3030
AX::Video::MediaPlayer::Error _error{ AX::Video::MediaPlayer::Error::NoError };
3131

3232
bool _hardwareAccelerated{ true };
33+
bool _approximateSeeking{ true };
3334
gl::TextureRef _texture;
3435
};
3536

@@ -40,7 +41,8 @@ void SimplePlaybackApp::setup ( )
4041
uint32_t flags = 0;
4142
if ( _hardwareAccelerated ) flags |= AX::Video::MediaPlayer::HardwareAccelerated;
4243

43-
_player = AX::Video::MediaPlayer::Create ( loadFile ( CINDER_PATH "\\samples\\QuickTimeBasic\\assets\\bbb.mp4" ), flags );
44+
//_player = AX::Video::MediaPlayer::Create ( loadFile ( CINDER_PATH "\\samples\\QuickTimeBasic\\assets\\bbb.mp4" ), flags );
45+
_player = AX::Video::MediaPlayer::Create ( loadFile ( "C:\\Dev\\Experiments\\8KVideo.mp4" ), flags );
4446
_player->OnSeekStart.connect ( [=] { std::cout << "OnSeekStart\n"; } );
4547
_player->OnSeekEnd.connect ( [=] { std::cout << "OnSeekEnd\n"; } );
4648
_player->OnComplete.connect ( [=] { std::cout << "OnComplete\n"; } );
@@ -103,9 +105,10 @@ void SimplePlaybackApp::draw ( )
103105
ui::Text ( "%.2f FPS", getAverageFps ( ) );
104106
ui::Text ( "Hardware Accelerated: %s, HasAudio: %s, HasVideo : %s", _player->IsHardwareAccelerated() ? "true" : "false", _player->HasAudio ( ) ? "true" : "false", _player->HasVideo ( ) ? "true" : "false" );
105107

108+
ui::Checkbox ( "Approximate Seeking", &_approximateSeeking );
106109
if ( ui::SliderFloat ( "Seek", &percent, 0.0f, 1.0f ) )
107110
{
108-
_player->SeekToPercentage ( percent );
111+
_player->SeekToPercentage ( percent, _approximateSeeking );
109112
}
110113

111114
float rate = _player->GetPlaybackRate ( );

src/AX-MediaPlayer.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,14 @@ namespace AX
125125
return _impl->GetSize ( );
126126
}
127127

128-
void MediaPlayer::SeekToSeconds ( float seconds )
128+
void MediaPlayer::SeekToSeconds ( float seconds, bool approximate )
129129
{
130-
return _impl->SeekToSeconds ( seconds );
130+
return _impl->SeekToSeconds ( seconds, approximate );
131131
}
132132

133-
void MediaPlayer::SeekToPercentage ( float normalizedTime )
133+
void MediaPlayer::SeekToPercentage ( float normalizedTime, bool approximate )
134134
{
135-
return _impl->SeekToPercentage ( std::clamp ( normalizedTime, 0.0f, 1.0f ) );
135+
return _impl->SeekToPercentage ( std::clamp ( normalizedTime, 0.0f, 1.0f ), approximate );
136136
}
137137

138138
bool MediaPlayer::IsComplete ( ) const

src/AX-MediaPlayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ namespace AX::Video
9191
bool HasAudio ( ) const;
9292
bool HasVideo ( ) const;
9393

94-
void SeekToSeconds ( float seconds );
95-
void SeekToPercentage ( float normalizedTime );
94+
void SeekToSeconds ( float seconds, bool approximate = false );
95+
void SeekToPercentage ( float normalizedTime, bool approximate = false );
9696

9797
float GetPositionInSeconds ( ) const;
9898
float GetDurationInSeconds ( ) const;

src/Win32/AX-MediaPlayerWin32Impl.cxx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ namespace AX::Video
310310

311311
_mediaEngine->SetSource ( SafeBSTR{ actualPath } );
312312
_mediaEngine->Load ( );
313+
314+
_mediaEngine->QueryInterface ( _mediaEngineEx.GetAddressOf ( ) );
313315
}
314316
}
315317
}
@@ -532,19 +534,23 @@ namespace AX::Video
532534
return static_cast<float> ( _mediaEngine->GetCurrentTime ( ) );
533535
}
534536

535-
void MediaPlayer::Impl::SeekToSeconds ( float seconds )
537+
void MediaPlayer::Impl::SeekToSeconds ( float seconds, bool approximate )
536538
{
537-
if ( _mediaEngine )
539+
if ( _mediaEngineEx )
540+
{
541+
_mediaEngineEx->SetCurrentTimeEx ( seconds, approximate ? MF_MEDIA_ENGINE_SEEK_MODE_APPROXIMATE : MF_MEDIA_ENGINE_SEEK_MODE_NORMAL );
542+
}
543+
else if ( _mediaEngine )
538544
{
539545
_mediaEngine->SetCurrentTime ( static_cast<double> ( seconds ) );
540546
}
541547
}
542548

543-
void MediaPlayer::Impl::SeekToPercentage ( float normalizedTime )
549+
void MediaPlayer::Impl::SeekToPercentage ( float normalizedTime, bool approximate )
544550
{
545551
if ( _duration > 0.0f )
546552
{
547-
SeekToSeconds ( normalizedTime * _duration );
553+
SeekToSeconds ( normalizedTime * _duration, approximate );
548554
}
549555
}
550556

@@ -639,6 +645,11 @@ namespace AX::Video
639645
_renderPath = nullptr;
640646
_hasNewFrame.store ( false );
641647

648+
// @todo(andrew): Do I need to ::Shutdown through the Ex interface
649+
// or since it's likely just an upcasted IMFMediaEngine will the
650+
// original interface suffice?
651+
_mediaEngineEx = nullptr;
652+
642653
if ( _mediaEngine )
643654
{
644655
RunSynchronousInMTAThread ( [&]

src/Win32/AX-MediaPlayerWin32Impl.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ namespace AX::Video
103103

104104
const ci::ivec2 & GetSize ( ) const { return _size; }
105105

106-
void SeekToSeconds ( float seconds );
107-
void SeekToPercentage ( float normalizedTime );
106+
void SeekToSeconds ( float seconds, bool approximate );
107+
void SeekToPercentage ( float normalizedTime, bool approximate );
108108

109109
float GetPositionInSeconds ( ) const;
110110
float GetDurationInSeconds ( ) const { return _duration; }
@@ -131,6 +131,7 @@ namespace AX::Video
131131
ci::Surface8uRef _surface{ nullptr };
132132
RenderPathRef _renderPath;
133133
ComPtr<IMFMediaEngine> _mediaEngine{ nullptr };
134+
ComPtr<IMFMediaEngineEx> _mediaEngineEx{ nullptr };
134135
mutable std::atomic_bool _hasNewFrame{ false };
135136
};
136137
}

0 commit comments

Comments
 (0)