Chromium Code Reviews| Index: media/base/android/media_codec_player.cc |
| diff --git a/media/base/android/media_codec_player.cc b/media/base/android/media_codec_player.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5e7b6b536ec7f23c6b723bb5afa7e46cdb9cb6f5 |
| --- /dev/null |
| +++ b/media/base/android/media_codec_player.cc |
| @@ -0,0 +1,213 @@ |
| +#include "media/base/android/media_codec_player.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/lazy_instance.h" |
| +#include "base/logging.h" |
| + |
| +#define POST_TO_MEDIA_THREAD(closure) \ |
|
xhwang
2015/05/06 17:42:44
This doesn't always "post". How about POST_TO_MEDI
Tima Vaisburd
2015/05/08 07:30:54
I tried to make it better. Please see the comments
|
| + do { \ |
| + if (!GetMediaTaskRunner()->BelongsToCurrentThread()) { \ |
| + GetMediaTaskRunner()->PostTask(FROM_HERE, closure); \ |
| + return; \ |
| + } \ |
| + } while(0) |
| + |
| + |
| +namespace media { |
| + |
| +class MediaThread : public base::Thread { |
| + public: |
| + MediaThread() : base::Thread("BrowserMediaThread") { |
| + Start(); |
| + } |
| +}; |
| + |
| +// Create media thread |
| +base::LazyInstance<MediaThread>::Leaky |
| + g_media_thread = LAZY_INSTANCE_INITIALIZER; |
| + |
| + |
| +scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner() { |
| + return g_media_thread.Pointer()->task_runner(); |
| +} |
| + |
| +// MediaCodecPlayer implementation. |
| + |
| +MediaCodecPlayer::MediaCodecPlayer( |
| + int player_id, |
| + MediaPlayerManager* manager, |
| + const RequestMediaResourcesCB& request_media_resources_cb, |
| + scoped_ptr<DemuxerAndroid> demuxer, |
| + const GURL& frame_url) |
| + : MediaPlayerAndroid(player_id, |
| + manager, |
| + request_media_resources_cb, |
| + frame_url), |
| + ui_task_runner_(base::MessageLoopProxy::current()), |
| + demuxer_(demuxer.Pass()), |
| + weak_factory_(this) { |
| + // UI thread |
| + DVLOG(1) << "MediaCodecPlayer::MediaCodecPlayer: player_id:" << player_id; |
| + |
| + weak_this_ = weak_factory_.GetWeakPtr(); |
| + |
| + // Finish initializaton on Media thread |
| + GetMediaTaskRunner()->PostTask( |
| + FROM_HERE, base::Bind(&MediaCodecPlayer::Initialize, weak_this_)); |
| +} |
| + |
| +MediaCodecPlayer::~MediaCodecPlayer() |
| +{ |
| + // Media thread |
| + DVLOG(1) << "MediaCodecPlayer::~MediaCodecPlayer"; |
| +} |
| + |
| +void MediaCodecPlayer::Initialize() { |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__; |
| + |
| + demuxer_->Initialize(this); |
| +} |
| + |
| +// MediaPlayerAndroid implementation. |
| + |
| +void MediaCodecPlayer::DeleteOnCorrectThread() { |
| + DVLOG(1) << __FUNCTION__; |
| + |
| + if (ui_task_runner_->BelongsToCurrentThread()) { |
| + DetachListener(); |
| + DestroyListener(); |
| + } |
| + |
| + if (GetMediaTaskRunner()->BelongsToCurrentThread()) |
| + delete this; |
| + else |
| + GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this); |
| +} |
| + |
| +void MediaCodecPlayer::SetVideoSurface(gfx::ScopedJavaSurface surface) { |
|
xhwang
2015/05/06 17:42:44
Use NOTIMPLEMENTED() in these functions.
Tima Vaisburd
2015/05/08 07:30:54
Done.
|
| + POST_TO_MEDIA_THREAD( |
|
xhwang
2015/05/06 17:42:44
I don't find this macro very readable, maybe becau
Tima Vaisburd
2015/05/08 07:30:54
Yes. I pulled the base::Bind into the macro, and u
|
| + base::Bind(&MediaCodecPlayer::SetVideoSurface, weak_this_, |
| + base::Passed(&surface))); |
| + |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__; |
| +} |
| + |
| +void MediaCodecPlayer::Start() { |
| + if (ui_task_runner_->BelongsToCurrentThread()) |
| + AttachListener(NULL); |
|
xhwang
2015/05/06 17:42:44
Seems to worth a comment.
Tima Vaisburd
2015/05/08 07:30:54
A closer look at the AttachListener/DetachListener
|
| + |
| + POST_TO_MEDIA_THREAD(base::Bind(&MediaCodecPlayer::Start, weak_this_)); |
| + |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__; |
| +} |
| + |
| +void MediaCodecPlayer::Pause(bool is_media_related_action) { |
| + POST_TO_MEDIA_THREAD( |
| + base::Bind(&MediaCodecPlayer::Pause, weak_this_, |
| + is_media_related_action)); |
| + |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__; |
| +} |
| + |
| +void MediaCodecPlayer::SeekTo(base::TimeDelta timestamp) { |
| + POST_TO_MEDIA_THREAD( |
| + base::Bind(&MediaCodecPlayer::SeekTo, weak_this_, timestamp)); |
| + |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__ << " " << timestamp; |
| +} |
| + |
| +void MediaCodecPlayer::Release() { |
| + POST_TO_MEDIA_THREAD(base::Bind(&MediaCodecPlayer::Release, weak_this_)); |
| + |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__; |
| +} |
| + |
| +void MediaCodecPlayer::SetVolume(double volume) { |
| + POST_TO_MEDIA_THREAD( |
| + base::Bind(&MediaCodecPlayer::SetVolume, weak_this_, volume)); |
| + |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__ << " " << volume; |
| +} |
| + |
| +int MediaCodecPlayer::GetVideoWidth() { |
| + // UI thread |
|
xhwang
2015/05/06 17:42:44
Here and below, DCHECK it's called on the correct
Tima Vaisburd
2015/05/08 07:30:54
Done.
|
| + return 320; |
| +} |
| + |
| +int MediaCodecPlayer::GetVideoHeight() { |
| + // UI thread |
| + return 240; |
| +} |
| + |
| +base::TimeDelta MediaCodecPlayer::GetCurrentTime() { |
| + // UI thread, Media thread |
| + return base::TimeDelta(); |
| +} |
| + |
| +base::TimeDelta MediaCodecPlayer::GetDuration() { |
| + // UI thread |
| + return base::TimeDelta(); |
| +} |
| + |
| +bool MediaCodecPlayer::IsPlaying() { |
| + // UI thread |
| + return false; |
| +} |
| + |
| +bool MediaCodecPlayer::CanPause() { |
| + // UI thread |
| + return false; |
| +} |
| + |
| +bool MediaCodecPlayer::CanSeekForward() { |
| + // UI thread |
| + return false; |
| +} |
| + |
| +bool MediaCodecPlayer::CanSeekBackward() { |
| + // UI thread |
| + return false; |
| +} |
| + |
| +bool MediaCodecPlayer::IsPlayerReady() { |
| + // UI thread |
| + DVLOG(1) << __FUNCTION__; |
| + return true; |
| +} |
| + |
| +void MediaCodecPlayer::SetCdm(BrowserCdm* cdm) { |
| + DVLOG(1) << __FUNCTION__; |
| +} |
| + |
| +// Callbacks from Demuxer. |
| + |
| +void MediaCodecPlayer::OnDemuxerConfigsAvailable( |
| + const DemuxerConfigs& configs) { |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__; |
| +} |
| + |
| +void MediaCodecPlayer::OnDemuxerDataAvailable(const DemuxerData& data) { |
| + // Media thread |
| +} |
| + |
| +void MediaCodecPlayer::OnDemuxerSeekDone( |
| + base::TimeDelta actual_browser_seek_time) { |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__ << " actual_time:" << actual_browser_seek_time; |
| +} |
| + |
| +void MediaCodecPlayer::OnDemuxerDurationChanged( |
| + base::TimeDelta duration) { |
| + // Media thread |
| + DVLOG(1) << __FUNCTION__ << " duration:" << duration; |
| +} |
| + |
| +} // namespace media |