| 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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 void SetMetadata(bool has_audio, bool has_video) { | 137 void SetMetadata(bool has_audio, bool has_video) { |
| 138 wmpi_->SetNetworkState(blink::WebMediaPlayer::NetworkStateLoaded); | 138 wmpi_->SetNetworkState(blink::WebMediaPlayer::NetworkStateLoaded); |
| 139 wmpi_->SetReadyState(blink::WebMediaPlayer::ReadyStateHaveMetadata); | 139 wmpi_->SetReadyState(blink::WebMediaPlayer::ReadyStateHaveMetadata); |
| 140 wmpi_->pipeline_metadata_.has_audio = has_audio; | 140 wmpi_->pipeline_metadata_.has_audio = has_audio; |
| 141 wmpi_->pipeline_metadata_.has_video = has_video; | 141 wmpi_->pipeline_metadata_.has_video = has_video; |
| 142 } | 142 } |
| 143 | 143 |
| 144 WebMediaPlayerImpl::PlayState ComputePlayState() { | 144 WebMediaPlayerImpl::PlayState ComputePlayState() { |
| 145 wmpi_->is_idle_ = false; | 145 wmpi_->is_idle_ = false; |
| 146 wmpi_->must_suspend_ = false; | 146 wmpi_->must_suspend_ = false; |
| 147 return wmpi_->UpdatePlayState_ComputePlayState(false, false); | 147 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false); |
| 148 } |
| 149 |
| 150 WebMediaPlayerImpl::PlayState ComputePlayStateSuspended() { |
| 151 wmpi_->is_idle_ = false; |
| 152 wmpi_->must_suspend_ = false; |
| 153 return wmpi_->UpdatePlayState_ComputePlayState(false, true, false); |
| 148 } | 154 } |
| 149 | 155 |
| 150 WebMediaPlayerImpl::PlayState ComputeBackgroundedPlayState() { | 156 WebMediaPlayerImpl::PlayState ComputeBackgroundedPlayState() { |
| 151 wmpi_->is_idle_ = false; | 157 wmpi_->is_idle_ = false; |
| 152 wmpi_->must_suspend_ = false; | 158 wmpi_->must_suspend_ = false; |
| 153 return wmpi_->UpdatePlayState_ComputePlayState(false, true); | 159 return wmpi_->UpdatePlayState_ComputePlayState(false, false, true); |
| 154 } | 160 } |
| 155 | 161 |
| 156 WebMediaPlayerImpl::PlayState ComputeIdlePlayState() { | 162 WebMediaPlayerImpl::PlayState ComputeIdlePlayState() { |
| 157 wmpi_->is_idle_ = true; | 163 wmpi_->is_idle_ = true; |
| 158 wmpi_->must_suspend_ = false; | 164 wmpi_->must_suspend_ = false; |
| 159 return wmpi_->UpdatePlayState_ComputePlayState(false, false); | 165 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false); |
| 160 } | 166 } |
| 161 | 167 |
| 162 WebMediaPlayerImpl::PlayState ComputeMustSuspendPlayState() { | 168 WebMediaPlayerImpl::PlayState ComputeMustSuspendPlayState() { |
| 163 wmpi_->is_idle_ = false; | 169 wmpi_->is_idle_ = false; |
| 164 wmpi_->must_suspend_ = true; | 170 wmpi_->must_suspend_ = true; |
| 165 return wmpi_->UpdatePlayState_ComputePlayState(false, false); | 171 return wmpi_->UpdatePlayState_ComputePlayState(false, false, false); |
| 166 } | 172 } |
| 167 | 173 |
| 168 // "Renderer" thread. | 174 // "Renderer" thread. |
| 169 base::MessageLoop message_loop_; | 175 base::MessageLoop message_loop_; |
| 170 | 176 |
| 171 // "Media" thread. This is necessary because WMPI destruction waits on a | 177 // "Media" thread. This is necessary because WMPI destruction waits on a |
| 172 // WaitableEvent. | 178 // WaitableEvent. |
| 173 base::Thread media_thread_; | 179 base::Thread media_thread_; |
| 174 | 180 |
| 175 // Blink state. | 181 // Blink state. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 | 244 |
| 239 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata_AudioOnly) { | 245 TEST_F(WebMediaPlayerImplTest, ComputePlayState_AfterMetadata_AudioOnly) { |
| 240 WebMediaPlayerImpl::PlayState state; | 246 WebMediaPlayerImpl::PlayState state; |
| 241 SetMetadata(true, false); | 247 SetMetadata(true, false); |
| 242 | 248 |
| 243 state = ComputePlayState(); | 249 state = ComputePlayState(); |
| 244 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 250 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 245 EXPECT_FALSE(state.is_memory_reporting_enabled); | 251 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 246 EXPECT_FALSE(state.is_suspended); | 252 EXPECT_FALSE(state.is_suspended); |
| 247 | 253 |
| 248 // Background suspend is not enabled for audio-only. | 254 SetPaused(false); |
| 249 state = ComputeBackgroundedPlayState(); | 255 state = ComputeBackgroundedPlayState(); |
| 250 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 256 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 251 EXPECT_FALSE(state.is_memory_reporting_enabled); | 257 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 252 EXPECT_FALSE(state.is_suspended); | 258 EXPECT_FALSE(state.is_suspended); |
| 253 | 259 |
| 254 state = ComputeMustSuspendPlayState(); | 260 state = ComputeMustSuspendPlayState(); |
| 255 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 261 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 256 EXPECT_FALSE(state.is_memory_reporting_enabled); | 262 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 257 EXPECT_TRUE(state.is_suspended); | 263 EXPECT_TRUE(state.is_suspended); |
| 258 } | 264 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); | 322 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 317 EXPECT_TRUE(state.is_memory_reporting_enabled); | 323 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 318 EXPECT_FALSE(state.is_suspended); | 324 EXPECT_FALSE(state.is_suspended); |
| 319 | 325 |
| 320 // Audio-only stays playing in the background. | 326 // Audio-only stays playing in the background. |
| 321 state = ComputeBackgroundedPlayState(); | 327 state = ComputeBackgroundedPlayState(); |
| 322 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); | 328 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 323 EXPECT_TRUE(state.is_memory_reporting_enabled); | 329 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 324 EXPECT_FALSE(state.is_suspended); | 330 EXPECT_FALSE(state.is_suspended); |
| 325 | 331 |
| 332 // Backgrounding a paused audio only player should suspend, but keep the |
| 333 // session alive for user interactions. |
| 334 SetPaused(true); |
| 335 state = ComputeBackgroundedPlayState(); |
| 336 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| 337 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 338 EXPECT_TRUE(state.is_suspended); |
| 339 |
| 326 state = ComputeMustSuspendPlayState(); | 340 state = ComputeMustSuspendPlayState(); |
| 327 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); | 341 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 328 EXPECT_FALSE(state.is_memory_reporting_enabled); | 342 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 329 EXPECT_TRUE(state.is_suspended); | 343 EXPECT_TRUE(state.is_suspended); |
| 330 } | 344 } |
| 331 | 345 |
| 332 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Seek) { | 346 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Paused_Seek) { |
| 333 WebMediaPlayerImpl::PlayState state; | 347 WebMediaPlayerImpl::PlayState state; |
| 334 SetMetadata(true, true); | 348 SetMetadata(true, true); |
| 335 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); | 349 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 366 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); | 380 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); |
| 367 EXPECT_FALSE(state.is_memory_reporting_enabled); | 381 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 368 EXPECT_FALSE(state.is_suspended); | 382 EXPECT_FALSE(state.is_suspended); |
| 369 | 383 |
| 370 state = ComputeIdlePlayState(); | 384 state = ComputeIdlePlayState(); |
| 371 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); | 385 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::ENDED, state.delegate_state); |
| 372 EXPECT_FALSE(state.is_memory_reporting_enabled); | 386 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 373 EXPECT_TRUE(state.is_suspended); | 387 EXPECT_TRUE(state.is_suspended); |
| 374 } | 388 } |
| 375 | 389 |
| 390 TEST_F(WebMediaPlayerImplTest, ComputePlayState_Suspended) { |
| 391 WebMediaPlayerImpl::PlayState state; |
| 392 SetMetadata(true, true); |
| 393 |
| 394 // Suspended players should be resumed unless we have reached the appropriate |
| 395 // ready state and are not seeking. |
| 396 SetPaused(true); |
| 397 state = ComputePlayStateSuspended(); |
| 398 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 399 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 400 EXPECT_FALSE(state.is_suspended); |
| 401 |
| 402 SetPaused(false); |
| 403 state = ComputePlayStateSuspended(); |
| 404 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state); |
| 405 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 406 EXPECT_FALSE(state.is_suspended); |
| 407 |
| 408 SetReadyState(blink::WebMediaPlayer::ReadyStateHaveFutureData); |
| 409 |
| 410 // Paused players should stay suspended. |
| 411 SetPaused(true); |
| 412 state = ComputePlayStateSuspended(); |
| 413 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED, state.delegate_state); |
| 414 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 415 EXPECT_TRUE(state.is_suspended); |
| 416 |
| 417 // Playing players should resume into the playing state. |
| 418 SetPaused(false); |
| 419 state = ComputePlayStateSuspended(); |
| 420 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 421 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 422 EXPECT_FALSE(state.is_suspended); |
| 423 |
| 424 // If seeking, the previously suspended state does not matter; the player |
| 425 // should always be resumed. |
| 426 SetSeeking(true); |
| 427 |
| 428 SetPaused(true); |
| 429 state = ComputePlayStateSuspended(); |
| 430 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PAUSED_BUT_NOT_IDLE, |
| 431 state.delegate_state); |
| 432 EXPECT_FALSE(state.is_memory_reporting_enabled); |
| 433 EXPECT_FALSE(state.is_suspended); |
| 434 |
| 435 SetPaused(false); |
| 436 state = ComputePlayStateSuspended(); |
| 437 EXPECT_EQ(WebMediaPlayerImpl::DelegateState::PLAYING, state.delegate_state); |
| 438 EXPECT_TRUE(state.is_memory_reporting_enabled); |
| 439 EXPECT_FALSE(state.is_suspended); |
| 440 } |
| 441 |
| 376 } // namespace media | 442 } // namespace media |
| OLD | NEW |