1.if buffer overflow && paused by buffering logic, should resume to play, or mmplayer buffer won't be consumed
it maybe casue player can not be resumed forever
2.fix spelling error
Migrate from
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/312095/
Change-Id: Ia3975bdbaa565b11e230b54bb829f9a87525adf5
Signed-off-by: peng1xiao <peng1.xiao@samsung.com>
kBufferEos,
};
+struct AppBufferStatus {
+ BufferStatus audio_status;
+ BufferStatus video_status;
+};
+
// An interface for processing media buffering-related callback from player.
class BufferObserver {
public:
// The buffering may have completed to 100% during the seek - in which case
// we need to kick the player and send the correct events by calling
// HandleBufferingStatus(100).
- if (is_buffering_compeleted_ && is_paused_ == false) {
+ if (is_buffering_completed_ && is_paused_ == false) {
LOG_ID(INFO, player_id_) << "Seek completed:buffering complete, not paused";
if (MediaPlayerBridgeCapi::GetPlayerState() == PLAYER_STATE_PAUSED) {
HandleBufferingStatus(100);
if (percent == 100) {
LOG_ID(INFO, player_id_)
<< "(" << static_cast<void*>(this) << ") buffering completed";
- is_buffering_compeleted_ = true;
+ is_buffering_completed_ = true;
- // If seeking, return after setting the is_buffering_compeleted_ flag, so
+ // If seeking, return after setting the is_buffering_completed_ flag, so
// that in SeekCompleteUpdate we can trigger player_start() as required.
if (is_seeking_) {
LOG_ID(INFO, player_id_) << "Seeking, return";
return;
}
- if (is_buffering_compeleted_ && blink::IsHbbTV())
+ if (is_buffering_completed_ && blink::IsHbbTV())
UpdatePreferAudio();
if (!is_file_url_)
player_id_, blink::WebMediaPlayer::kReadyStateHaveEnoughData);
MediaPlayerBridgeCapi::OnNetworkStateChange(
player_id_, blink::WebMediaPlayer::kNetworkStateLoaded);
- } else if (is_buffering_compeleted_) {
- is_buffering_compeleted_ = false;
+ } else if (is_buffering_completed_) {
+ is_buffering_completed_ = false;
- // If seeking, return after setting the is_buffering_compeleted_ flag, so
+ // If seeking, return after setting the is_buffering_completed_ flag, so
// that in SeekCompleteUpdate we can trigger player_start() as required.
if (is_seeking_) {
LOG_ID(INFO, player_id_) << "Seeking, return";
int prefer_audio_adaptionset_idx_{-1};
int last_prefer_audio_adaptionset_idx_{-1};
bool parental_rating_pass_{false};
- bool is_buffering_compeleted_{false};
+ bool is_buffering_completed_{false};
bool audio_preloading_set_{false};
bool player_started_{false};
bool is_resuming_{false};
return;
}
+ if (type == media::DemuxerStream::Type::AUDIO)
+ buffer_status_.audio_status = status;
+ else if (type == media::DemuxerStream::Type::VIDEO)
+ buffer_status_.video_status = status;
+
switch (status) {
case kBufferUnderrun:
case kBufferMinThreshold:
base::TimeDelta current_position = GetCurrentTime();
if (is_paused_by_buffering_) {
+ // there is a case: video push is slower than audio
+ // audio is playing and current_time is audio time, and video is undecoded
+ // in buffer chromium check that push_pts is close to current_time and pause
+ // but video undecoded is much and report overflow, then shouldfeed=false
+ // finally state is pause&shouldfeed=false
+ // as this case current time is only audio time, we can't resume play by
+ // check conditoin: cur_end - official_playback_position_ >=
+ // kMiniWaitTimeForPlayBack MM suggestion: when receive overflow, call play
+ // to AV sync
+ bool need_overflow_play = false;
+ if (buffer_status_.audio_status == kBufferOverflow ||
+ buffer_status_.video_status == kBufferOverflow) {
+ LOG(INFO) << "neeed_overflow_play";
+ need_overflow_play = true;
+ }
// Get the end position of pushed data.
base::TimeDelta pushed_end_position =
std::min(has_video_media_type
base::TimeDelta time_diff = pushed_end_position - current_position;
// If data has been pushed enough (>= kMinWaitTimeForPlayback)
- if (time_diff >= kMinWaitTimeForPlayback) {
+ if (time_diff >= kMinWaitTimeForPlayback || need_overflow_play) {
LOG_ID(INFO, player_id_) << __func__ << " Data is enough to play,";
return OperationForData::PLAY;
}
base::RepeatingTimer operation_for_data_timer_;
+ AppBufferStatus buffer_status_{kBufferNone, kBufferNone};
+
base::WeakPtrFactory<MediaPlayerESPlusPlayer> weak_factory_{this};
};