SetShouldFeed(DemuxerStream::AUDIO, false);
SetIsValid(DemuxerStream::AUDIO, false);
SetReadRequested(DemuxerStream::AUDIO, false);
- SetBufferingState(DemuxerStream::AUDIO, BUFFERING_HAVE_NOTHING);
SetIsEos(DemuxerStream::VIDEO, false);
SetShouldFeed(DemuxerStream::VIDEO, false);
SetIsValid(DemuxerStream::VIDEO, false);
SetReadRequested(DemuxerStream::VIDEO, false);
- SetBufferingState(DemuxerStream::VIDEO, BUFFERING_HAVE_NOTHING);
esplusplayer_set_ready_to_prepare_cb(esplayer_, nullptr, this);
esplusplayer_set_prepare_async_done_cb(esplayer_, nullptr, this);
buffer_observer_->ResetBufferStatus();
buffer_observer_->ResetBufferStatusCallbacks();
+ reported_buffering_state_ = BUFFERING_HAVE_NOTHING;
+
volume_ = 1.0;
playback_rate_ = 0.0;
is_prepared_ = false;
return;
}
LOG(INFO) << "(" << static_cast<void*>(this) << ") " << __func__;
+
+ ReportBufferingStateIfNeeded(BUFFERING_HAVE_NOTHING,
+ BUFFERING_CHANGE_REASON_UNKNOWN);
+
last_frames_.get<DemuxerStream::AUDIO>().first = media::kNoTimestamp;
last_frames_.get<DemuxerStream::VIDEO>().first = media::kNoTimestamp;
SetShouldFeed(DemuxerStream::VIDEO, false);
GetBufferQueue(DemuxerStream::VIDEO).clear();
GetBufferQueue(DemuxerStream::AUDIO).clear();
- SetBufferingState(DemuxerStream::AUDIO, BUFFERING_HAVE_NOTHING);
- SetBufferingState(DemuxerStream::VIDEO, BUFFERING_HAVE_NOTHING);
buffer_observer_->ResetBufferStatus();
std::move(flush_cb).Run();
}
if (status != kBufferNone) {
- if (GetBufferingState(type) != BUFFERING_HAVE_ENOUGH) {
- SetBufferingState(type, BUFFERING_HAVE_ENOUGH);
- GetMediaPlayerClient()->OnBufferingStateChange(
- BUFFERING_HAVE_ENOUGH, BUFFERING_CHANGE_REASON_UNKNOWN);
- }
+ if (GetOperationForData() == OperationForData::PLAY)
+ ReportBufferingStateIfNeeded(BUFFERING_HAVE_ENOUGH,
+ BUFFERING_CHANGE_REASON_UNKNOWN);
} else {
- SetBufferingState(type, BUFFERING_HAVE_NOTHING);
+ ReportBufferingStateIfNeeded(BUFFERING_HAVE_NOTHING,
+ BUFFERING_CHANGE_REASON_UNKNOWN);
+ }
+}
+
+void MediaPlayerESPlusPlayer::ReportBufferingStateIfNeeded(
+ BufferingState buffering_state,
+ BufferingStateChangeReason reason) {
+ if (reported_buffering_state_ != buffering_state) {
+ LOG(INFO) << __func__ << " Report BufferingState : " << buffering_state
+ << ", reason : " << reason;
+ reported_buffering_state_ = buffering_state;
+ GetMediaPlayerClient()->OnBufferingStateChange(buffering_state, reason);
}
}
// If data has been pushed enough (>= kMinWaitTimeForPlayback)
if (time_diff >= kMinWaitTimeForPlayback) {
LOG(INFO) << __func__ << " Data is enough to play,";
+ ReportBufferingStateIfNeeded(BUFFERING_HAVE_ENOUGH,
+ BUFFERING_CHANGE_REASON_UNKNOWN);
return OperationForData::PLAY;
}
} else {
bool should_pause = false;
if (has_video_media_type &&
current_position >= last_frames_.get<DemuxerStream::VIDEO>().first) {
- SetBufferingState(DemuxerStream::VIDEO, BUFFERING_HAVE_NOTHING);
should_pause = true;
}
if (has_audio_media_type &&
current_position >= last_frames_.get<DemuxerStream::AUDIO>().first) {
- SetBufferingState(DemuxerStream::AUDIO, BUFFERING_HAVE_NOTHING);
should_pause = true;
}
LOG(INFO) << __func__ << " Not enough data to play.";
// If pushing pts smaller than current_position, should report
// BUFFERING_HAVE_NOTHING to replace BUFFERING_HAVE_ENOUGH
- GetMediaPlayerClient()->OnBufferingStateChange(
- BUFFERING_HAVE_NOTHING, BUFFERING_CHANGE_REASON_UNKNOWN);
+ ReportBufferingStateIfNeeded(BUFFERING_HAVE_NOTHING,
+ BUFFERING_CHANGE_REASON_UNKNOWN);
return OperationForData::PAUSE;
}
}
GetElementryStream(type).read_requested_ = value;
}
-BufferingState MediaPlayerESPlusPlayer::GetBufferingState(
- DemuxerStream::Type type) {
- return GetElementryStream(type).buffering_state_;
-}
-
-void MediaPlayerESPlusPlayer::SetBufferingState(DemuxerStream::Type type,
- BufferingState state) {
- GetElementryStream(type).buffering_state_ = state;
-}
-
DemuxerStream* MediaPlayerESPlusPlayer::GetDemuxerStream(
DemuxerStream::Type type) const {
return GetElementryStream(type).input_stream_;
bool is_eos_ = false;
bool should_feed_ = false;
bool read_requested_ = false;
- BufferingState buffering_state_ = BUFFERING_HAVE_NOTHING;
DemuxerStream* input_stream_ = nullptr;
base::circular_deque<scoped_refptr<DecoderBuffer>> pending_buffers_;
};
void SeekInternal(base::TimeDelta time);
void UpdateBufferedDtsDifference();
+ void ReportBufferingStateIfNeeded(BufferingState buffering_state,
+ BufferingStateChangeReason reason);
+
void PerformOperationForData();
OperationForData GetOperationForData();
void StartOperationForDataTimer();
ElementryStream& GetElementryStream(DemuxerStream::Type type);
const ElementryStream& GetElementryStream(DemuxerStream::Type type) const;
void SetReadRequested(DemuxerStream::Type type, bool value);
- BufferingState GetBufferingState(DemuxerStream::Type type);
- void SetBufferingState(DemuxerStream::Type type, BufferingState state);
DemuxerStream* GetDemuxerStream(DemuxerStream::Type type) const;
void SetDemuxerStream(DemuxerStream::Type type, DemuxerStream* stream);
Queue& GetBufferQueue(DemuxerStream::Type type);
bool should_set_playback_rate_ = false;
bool is_paused_by_buffering_ = false;
+ BufferingState reported_buffering_state_ = BUFFERING_HAVE_NOTHING;
#if defined(TIZEN_VIDEO_HOLE)
gfx::Rect viewport_rect_;