| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/blink/webmediaplayer_impl.h" | 5 #include "media/blink/webmediaplayer_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 void SetMetadata(bool has_audio, bool has_video) { | 134 void SetMetadata(bool has_audio, bool has_video) { |
| 135 wmpi_->SetNetworkState(blink::WebMediaPlayer::NetworkStateLoaded); | 135 wmpi_->SetNetworkState(blink::WebMediaPlayer::NetworkStateLoaded); |
| 136 wmpi_->SetReadyState(blink::WebMediaPlayer::ReadyStateHaveMetadata); | 136 wmpi_->SetReadyState(blink::WebMediaPlayer::ReadyStateHaveMetadata); |
| 137 wmpi_->pipeline_metadata_.has_audio = has_audio; | 137 wmpi_->pipeline_metadata_.has_audio = has_audio; |
| 138 wmpi_->pipeline_metadata_.has_video = has_video; | 138 wmpi_->pipeline_metadata_.has_video = has_video; |
| 139 } | 139 } |
| 140 | 140 |
| 141 WebMediaPlayerImpl::PlayState ComputePlayState() { | 141 WebMediaPlayerImpl::PlayState ComputePlayState() { |
| 142 wmpi_->is_idle_ = false; | 142 wmpi_->is_idle_ = false; |
| 143 wmpi_->must_suspend_ = false; | 143 wmpi_->must_suspend_ = false; |
| 144 return wmpi_->UpdatePlayState_ComputePlayState(false, false); | 144 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false); |
| 145 } |
| 146 |
| 147 WebMediaPlayerImpl::PlayState ComputePlayStateSuspended() { |
| 148 wmpi_->is_idle_ = false; |
| 149 wmpi_->must_suspend_ = false; |
| 150 return wmpi_->UpdatePlayState_ComputePlayState(false, true, false); |
| 145 } | 151 } |
| 146 | 152 |
| 147 WebMediaPlayerImpl::PlayState ComputeBackgroundedPlayState() { | 153 WebMediaPlayerImpl::PlayState ComputeBackgroundedPlayState() { |
| 148 wmpi_->is_idle_ = false; | 154 wmpi_->is_idle_ = false; |
| 149 wmpi_->must_suspend_ = false; | 155 wmpi_->must_suspend_ = false; |
| 150 return wmpi_->UpdatePlayState_ComputePlayState(false, true); | 156 return wmpi_->UpdatePlayState_ComputePlayState(false, false, true); |
| 151 } | 157 } |
| 152 | 158 |
| 153 WebMediaPlayerImpl::PlayState ComputeIdlePlayState() { | 159 WebMediaPlayerImpl::PlayState ComputeIdlePlayState() { |
| 154 wmpi_->is_idle_ = true; | 160 wmpi_->is_idle_ = true; |
| 155 wmpi_->must_suspend_ = false; | 161 wmpi_->must_suspend_ = false; |
| 156 return wmpi_->UpdatePlayState_ComputePlayState(false, false); | 162 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false); |
| 157 } | 163 } |
| 158 | 164 |
| 159 WebMediaPlayerImpl::PlayState ComputeMustSuspendPlayState() { | 165 WebMediaPlayerImpl::PlayState ComputeMustSuspendPlayState() { |
| 160 wmpi_->is_idle_ = false; | 166 wmpi_->is_idle_ = false; |
| 161 wmpi_->must_suspend_ = true; | 167 wmpi_->must_suspend_ = true; |
| 162 return wmpi_->UpdatePlayState_ComputePlayState(false, false); | 168 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false); |
| 163 } | 169 } |
| 164 | 170 |
| 165 // "Renderer" thread. | 171 // "Renderer" thread. |
| 166 base::MessageLoop message_loop_; | 172 base::MessageLoop message_loop_; |
| 167 | 173 |
| 168 // "Media" thread. This is necessary because WMPI destruction waits on a | 174 // "Media" thread. This is necessary because WMPI destruction waits on a |
| 169 // WaitableEvent. | 175 // WaitableEvent. |
| 170 base::Thread media_thread_; | 176 base::Thread media_thread_; |
| 171 | 177 |
| 172 // Blink state. | 178 // Blink state. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 | 240 |
| 235 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata_AudioOnly) { | 241 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata_AudioOnly) { |
| 236 WebMediaPlayerImpl::PlayState state; | 242 WebMediaPlayerImpl::PlayState state; |
| 237 SetMetadata(true, false); | 243 SetMetadata(true, false); |
| 238 | 244 |
| 239 state = ComputePlayState(); | 245 state = ComputePlayState(); |
| 240 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 246 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 241 EXPECT_FALSE(state.is_memory_reporting_enabled); | 247 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 242 EXPECT_FALSE(state.is_suspended); | 248 EXPECT_FALSE(state.is_suspended); |
| 243 | 249 |
| 244 // Background suspend is not enabled for audio-only. | 250 SetPaused(false); |
| 245 state = ComputeBackgroundedPlayState(); | 251 state = ComputeBackgroundedPlayState(); |
| 246 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 252 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 247 EXPECT_FALSE(state.is_memory_reporting_enabled); | 253 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 248 EXPECT_FALSE(state.is_suspended); | 254 EXPECT_FALSE(state.is_suspended); |
| 249 | 255 |
| 250 state = ComputeMustSuspendPlayState(); | 256 state = ComputeMustSuspendPlayState(); |
| 251 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 257 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 252 EXPECT_FALSE(state.is_memory_reporting_enabled); | 258 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 253 EXPECT_TRUE(state.is_suspended); | 259 EXPECT_TRUE(state.is_suspended); |
| 254 } | 260 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); | 318 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 313 EXPECT_TRUE(state.is_memory_reporting_enabled); | 319 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 314 EXPECT_FALSE(state.is_suspended); | 320 EXPECT_FALSE(state.is_suspended); |
| 315 | 321 |
| 316 // Audio-only stays playing in the background. | 322 // Audio-only stays playing in the background. |
| 317 state = ComputeBackgroundedPlayState(); | 323 state = ComputeBackgroundedPlayState(); |
| 318 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); | 324 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 319 EXPECT_TRUE(state.is_memory_reporting_enabled); | 325 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 320 EXPECT_FALSE(state.is_suspended); | 326 EXPECT_FALSE(state.is_suspended); |
| 321 | 327 |
| 328 // Backgrounding a paused audio only player should suspend, but keep the |
| 329 // session alive for user interactions. |
| 330 SetPaused(true); |
| 331 state = ComputeBackgroundedPlayState(); |
| 332 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| 333 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 334 EXPECT_TRUE(state.is_suspended); |
| 335 |
| 322 state = ComputeMustSuspendPlayState(); | 336 state = ComputeMustSuspendPlayState(); |
| 323 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 337 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 324 EXPECT_FALSE(state.is_memory_reporting_enabled); | 338 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 325 EXPECT_TRUE(state.is_suspended); | 339 EXPECT_TRUE(state.is_suspended); |
| 326 } | 340 } |
| 327 | 341 |
| 328 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Seek) { | 342 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Seek) { |
| 329 WebMediaPlayerImpl::PlayState state; | 343 WebMediaPlayerImpl::PlayState state; |
| 330 SetMetadata(true, true); | 344 SetMetadata(true, true); |
| 331 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); | 345 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 362 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); | 376 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); |
| 363 EXPECT_FALSE(state.is_memory_reporting_enabled); | 377 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 364 EXPECT_FALSE(state.is_suspended); | 378 EXPECT_FALSE(state.is_suspended); |
| 365 | 379 |
| 366 state = ComputeIdlePlayState(); | 380 state = ComputeIdlePlayState(); |
| 367 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); | 381 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); |
| 368 EXPECT_FALSE(state.is_memory_reporting_enabled); | 382 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 369 EXPECT_TRUE(state.is_suspended); | 383 EXPECT_TRUE(state.is_suspended); |
| 370 } | 384 } |
| 371 | 385 |
| 386 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Suspended) { |
| 387 WebMediaPlayerImpl::PlayState state; |
| 388 SetMetadata(true, true); |
| 389 |
| 390 // Suspended players should be resumed unless we have reached the appropriate |
| 391 // ready state and are not seeking. |
| 392 SetPaused(true); |
| 393 state = ComputePlayStateSuspended(); |
| 394 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 395 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 396 EXPECT_FALSE(state.is_suspended); |
| 397 |
| 398 SetPaused(false); |
| 399 state = ComputePlayStateSuspended(); |
| 400 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 401 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 402 EXPECT_FALSE(state.is_suspended); |
| 403 |
| 404 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| 405 |
| 406 // Paused players should stay suspended. |
| 407 SetPaused(true); |
| 408 state = ComputePlayStateSuspended(); |
| 409 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| 410 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 411 EXPECT_TRUE(state.is_suspended); |
| 412 |
| 413 // Playing players should resume into the playing state. |
| 414 SetPaused(false); |
| 415 state = ComputePlayStateSuspended(); |
| 416 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 417 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 418 EXPECT_FALSE(state.is_suspended); |
| 419 |
| 420 // If seeking, the previously suspended state does not matter; the player |
| 421 // should always be resumed. |
| 422 SetSeeking(true); |
| 423 |
| 424 SetPaused(true); |
| 425 state = ComputePlayStateSuspended(); |
| 426 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED_BUT_NOT_IDLE, |
| 427 state.delegate_state); |
| 428 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 429 EXPECT_FALSE(state.is_suspended); |
| 430 |
| 431 SetPaused(false); |
| 432 state = ComputePlayStateSuspended(); |
| 433 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 434 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 435 EXPECT_FALSE(state.is_suspended); |
| 436 } |
| 437 |
| 372 } // namespace media | 438 } // namespace media |
| OLD | NEW |