// the time stamp of the buffered data.
const base::TimeDelta kMinWaitTimeForPlayback = base::Milliseconds(500);
+// The delay time to check buffering and decide operations.
+const base::TimeDelta kOperationDecisionDelay = base::Milliseconds(500);
+
player_buffer_size_t GetMaxAudioBufferSize() {
return kPlayerAudioBufferSize;
}
GetBufferQueue(DemuxerStream::AUDIO).clear();
sink_ = nullptr;
+ StopOperationForDataTimer();
+
if (GetPlayerState() == ESPLUSPLAYER_STATE_NONE) {
LOG(ERROR) << "(" << static_cast<void*>(this) << ") " << __func__
<< " Release called on invalid state : "
if (!is_media_related_action)
is_paused_ = true;
+ // To decide operation is not needed in pause.
+ StopOperationForDataTimer();
+
LOG(INFO) << "(" << static_cast<void*>(this) << ") " << __func__
<< " is_buffering : " << is_buffering_
<< " is_media_action : " << is_media_related_action;
if (!ReadFromBufferQueue(type))
return;
- PerformOperationForData();
-
// Avoid unnecessary or redundant read requests.
if (!ShouldFeed(type) || ReadRequested(type) || IsEos(type) ||
(is_prepared_ && is_paused_ && !is_seeking_)) {
return;
}
+ // If the playing statue is expected,
+ // keep running a timer to decide play or pause with data.
+ if (!is_paused_) {
+ StartOperationForDataTimer();
+ }
+
SetReadRequested(type, true);
uint32_t buffer_read_count = 1;
// TODO: Set correct buffer read count.
return OperationForData::NONE;
}
+void MediaPlayerESPlusPlayer::StartOperationForDataTimer() {
+ if (!operation_for_data_timer_.IsRunning()) {
+ operation_for_data_timer_.Start(
+ FROM_HERE, kOperationDecisionDelay, this,
+ &MediaPlayerESPlusPlayer::PerformOperationForData);
+ }
+}
+
+void MediaPlayerESPlusPlayer::StopOperationForDataTimer() {
+ if (operation_for_data_timer_.IsRunning()) {
+ operation_for_data_timer_.Stop();
+ }
+}
+
void MediaPlayerESPlusPlayer::OnReadyToPrepare(
const esplusplayer_stream_type stream_type) {
if (!task_runner_->BelongsToCurrentThread()) {
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
+#include "base/timer/timer.h"
#include "media/base/buffering_state.h"
#include "media/base/demuxer_stream.h"
#include "media/base/video_renderer_sink.h"
void PerformOperationForData();
OperationForData GetOperationForData();
+ void StartOperationForDataTimer();
+ void StopOperationForDataTimer();
ElementryStream& GetElementryStream(DemuxerStream::Type type);
const ElementryStream& GetElementryStream(DemuxerStream::Type type) const;
std::array<ElementryStream, kElementryStreamCount> elementry_stream_;
std::unique_ptr<BufferObserver> buffer_observer_;
+ base::RepeatingTimer operation_for_data_timer_;
+
base::WeakPtrFactory<MediaPlayerESPlusPlayer> weak_factory_{this};
};