OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_ | 5 #ifndef MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_ |
6 #define MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_ | 6 #define MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 | 322 |
323 // Inspects the current playback state and: | 323 // Inspects the current playback state and: |
324 // - notifies |delegate_|, | 324 // - notifies |delegate_|, |
325 // - toggles the memory usage reporting timer, and | 325 // - toggles the memory usage reporting timer, and |
326 // - toggles suspend/resume as necessary. | 326 // - toggles suspend/resume as necessary. |
327 // | 327 // |
328 // This method should be called any time its dependent values change. These | 328 // This method should be called any time its dependent values change. These |
329 // are: | 329 // are: |
330 // - isRemote(), | 330 // - isRemote(), |
331 // - hasVideo(), | 331 // - hasVideo(), |
332 // - delegate_->IsHidden(), | 332 // - delegate_->IsFrameHidden(), |
333 // - network_state_, ready_state_, | 333 // - network_state_, ready_state_, |
334 // - is_idle_, must_suspend_, | 334 // - is_idle_, must_suspend_, |
335 // - paused_, ended_, | 335 // - paused_, ended_, |
336 // - pending_suspend_resume_cycle_, | 336 // - pending_suspend_resume_cycle_, |
337 void UpdatePlayState(); | 337 void UpdatePlayState(); |
338 | 338 |
339 // Methods internal to UpdatePlayState(). | 339 // Methods internal to UpdatePlayState(). |
340 PlayState UpdatePlayState_ComputePlayState(bool is_remote, | 340 PlayState UpdatePlayState_ComputePlayState(bool is_remote, |
341 bool is_streaming, | 341 bool is_streaming, |
342 bool is_suspended, | 342 bool is_suspended, |
343 bool is_backgrounded); | 343 bool is_backgrounded); |
344 void SetDelegateState(DelegateState new_state, bool is_idle); | 344 void SetDelegateState(DelegateState new_state, bool is_idle); |
345 void SetMemoryReportingState(bool is_memory_reporting_enabled); | 345 void SetMemoryReportingState(bool is_memory_reporting_enabled); |
346 void SetSuspendState(bool is_suspended); | 346 void SetSuspendState(bool is_suspended); |
347 | 347 |
348 // Called at low frequency to tell external observers how much memory we're | 348 // Called at low frequency to tell external observers how much memory we're |
349 // using for video playback. Called by |memory_usage_reporting_timer_|. | 349 // using for video playback. Called by |memory_usage_reporting_timer_|. |
350 // Memory usage reporting is done in two steps, because |demuxer_| must be | 350 // Memory usage reporting is done in two steps, because |demuxer_| must be |
351 // accessed on the media thread. | 351 // accessed on the media thread. |
352 void ReportMemoryUsage(); | 352 void ReportMemoryUsage(); |
353 void FinishMemoryUsageReport(int64_t demuxer_memory_usage); | 353 void FinishMemoryUsageReport(int64_t demuxer_memory_usage); |
354 | 354 |
355 // Called during OnHidden() when we want a suspended player to enter the | 355 // Called during OnFrameHidden() when we want a suspended player to enter the |
356 // paused state after some idle timeout. | 356 // paused state after some idle timeout. |
357 void ScheduleIdlePauseTimer(); | 357 void ScheduleIdlePauseTimer(); |
358 | 358 |
359 // Returns |true| before HaveFutureData whenever there has been loading | 359 // Returns |true| before HaveFutureData whenever there has been loading |
360 // progress and we have not been resumed for at least kLoadingToIdleTimeout | 360 // progress and we have not been resumed for at least kLoadingToIdleTimeout |
361 // since then. | 361 // since then. |
362 // | 362 // |
363 // This is used to delay suspension long enough for preroll to complete, which | 363 // This is used to delay suspension long enough for preroll to complete, which |
364 // is necessay because play() will not be called before HaveFutureData (and | 364 // is necessay because play() will not be called before HaveFutureData (and |
365 // thus we think we are idle forever). | 365 // thus we think we are idle forever). |
366 bool IsPrerollAttemptNeeded(); | 366 bool IsPrerollAttemptNeeded(); |
367 | 367 |
368 void CreateWatchTimeReporter(); | 368 void CreateWatchTimeReporter(); |
369 | 369 |
370 // Returns true if the player is hidden. | 370 // Returns true if the player is in the background. |
371 bool IsHidden() const; | 371 bool IsBackgrounded() const; |
372 | 372 |
373 // Returns true if the player's source is streaming. | 373 // Returns true if the player's source is streaming. |
374 bool IsStreaming() const; | 374 bool IsStreaming() const; |
375 | 375 |
376 // Return whether |pipeline_metadata_| is compatible with an overlay. This | 376 // Return whether |pipeline_metadata_| is compatible with an overlay. This |
377 // is intended for android. | 377 // is intended for android. |
378 bool DoesOverlaySupportMetadata() const; | 378 bool DoesOverlaySupportMetadata() const; |
379 | 379 |
380 // Whether the video should be paused when hidden. Uses metadata so has | 380 // Whether the video should be paused when in the background. Uses metadata so |
381 // meaning only after the pipeline has started, otherwise returns false. | 381 // has meaning only after the pipeline has started, otherwise returns false. |
382 // Doesn't check if the video can actually be paused depending on the | 382 // Doesn't check if the video can actually be paused depending on the |
383 // pipeline's state. | 383 // pipeline's state. |
384 bool ShouldPauseVideoWhenHidden() const; | 384 bool ShouldPauseVideoWhenBackground() const; |
385 | 385 |
386 // Whether the video track should be disabled when hidden. Uses metadata so | 386 // Whether the video track should be disabled when in the background. Uses |
387 // has meaning only after the pipeline has started, otherwise returns false. | 387 // metadata so has meaning only after the pipeline has started, otherwise |
388 // Doesn't check if the video track can actually be disabled depending on the | 388 // returns false. Doesn't check if the video track can actually be disabled |
389 // pipeline's state. | 389 // depending on the pipeline's state. |
390 bool ShouldDisableVideoWhenHidden() const; | 390 bool ShouldDisableVideoWhenBackground() const; |
391 | 391 |
392 // Whether the video is suitable for background playback optimizations (either | 392 // Whether the video is suitable for background playback optimizations (either |
393 // pausing it or disabling the video track). Uses metadata so has meaning only | 393 // pausing it or disabling the video track). Uses metadata so has meaning only |
394 // after the pipeline has started, otherwise returns false. | 394 // after the pipeline has started, otherwise returns false. |
395 // The logical OR between the two methods above that is also used as their | 395 // The logical OR between the two methods above that is also used as their |
396 // common implementation. | 396 // common implementation. |
397 bool IsBackgroundOptimizationCandidate() const; | 397 bool IsBackgroundOptimizationCandidate() const; |
398 | 398 |
399 // If enabling or disabling background video optimization has been delayed, | 399 // If enabling or disabling background video optimization has been delayed, |
400 // because of the pipeline not running, seeking or resuming, this method | 400 // because of the pipeline not running, seeking or resuming, this method |
401 // needs to be called to update the optimization state. | 401 // needs to be called to update the optimization state. |
402 void UpdateBackgroundVideoOptimizationState(); | 402 void UpdateBackgroundVideoOptimizationState(); |
403 | 403 |
404 // Pauses a hidden video only player to save power if possible. | 404 // Pauses a background video only player to save power if possible. |
405 // Must be called when either of the following happens: | 405 // Must be called when either of the following happens: |
406 // - right after the video was hidden, | 406 // - right after the video was backgrounded, |
407 // - right ater the pipeline has resumed if the video is hidden. | 407 // - right ater the pipeline has resumed if the video is in the background. |
408 void PauseVideoIfNeeded(); | 408 void PauseVideoIfNeeded(); |
409 | 409 |
410 // Disables the video track to save power if possible. | 410 // Disables the video track to save power if possible. |
411 // Must be called when either of the following happens: | 411 // Must be called when either of the following happens: |
412 // - right after the video was hidden, | 412 // - right after the video was backgrounded, |
413 // - right after the pipeline has started (|seeking_| is used to detect the | 413 // - right after the pipeline has started (|seeking_| is used to detect the |
414 // when pipeline started) if the video is hidden, | 414 // when pipeline started) if the video is in the background, |
415 // - right ater the pipeline has resumed if the video is hidden. | 415 // - right ater the pipeline has resumed if the video is in the background. |
416 void DisableVideoTrackIfNeeded(); | 416 void DisableVideoTrackIfNeeded(); |
417 | 417 |
418 // Enables the video track if it was disabled before to save power. | 418 // Enables the video track if it was disabled before to save power. |
419 // Must be called when either of the following happens: | 419 // Must be called when either of the following happens: |
420 // - right after the video was shown, | 420 // - right after the video was put in the foreground, |
421 // - right before the pipeline is requested to resume | 421 // - right before the pipeline is requested to resume |
422 // (see https://crbug.com/678374), | 422 // (see https://crbug.com/678374), |
423 // - right after the pipeline has resumed if the video is not hidden. | 423 // - right after the pipeline has resumed if the video is not in the |
| 424 // background. |
424 void EnableVideoTrackIfNeeded(); | 425 void EnableVideoTrackIfNeeded(); |
425 | 426 |
426 // Overrides the pipeline statistics returned by GetPiplineStatistics() for | 427 // Overrides the pipeline statistics returned by GetPiplineStatistics() for |
427 // tests. | 428 // tests. |
428 void SetPipelineStatisticsForTest(const PipelineStatistics& stats); | 429 void SetPipelineStatisticsForTest(const PipelineStatistics& stats); |
429 | 430 |
430 // Returns the pipeline statistics or the value overridden by tests. | 431 // Returns the pipeline statistics or the value overridden by tests. |
431 PipelineStatistics GetPipelineStatistics() const; | 432 PipelineStatistics GetPipelineStatistics() const; |
432 | 433 |
433 // Overrides the pipeline media duration returned by | 434 // Overrides the pipeline media duration returned by |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 // to hang the render thread during pause(), we record the time at the same | 493 // to hang the render thread during pause(), we record the time at the same |
493 // time we pause and then return that value in currentTime(). Otherwise our | 494 // time we pause and then return that value in currentTime(). Otherwise our |
494 // clock can creep forward a little bit while the asynchronous | 495 // clock can creep forward a little bit while the asynchronous |
495 // SetPlaybackRate(0) is being executed. | 496 // SetPlaybackRate(0) is being executed. |
496 double playback_rate_; | 497 double playback_rate_; |
497 | 498 |
498 // Set while paused. |paused_time_| is only valid when |paused_| is true. | 499 // Set while paused. |paused_time_| is only valid when |paused_| is true. |
499 bool paused_; | 500 bool paused_; |
500 base::TimeDelta paused_time_; | 501 base::TimeDelta paused_time_; |
501 | 502 |
502 // Set if paused automatically when hidden and need to resume when visible. | 503 // Set if paused automatically when backgrounded and need to resume when |
503 // Reset if paused for any other reason. | 504 // foregrounded. Reset if paused for any other reason. |
504 bool paused_when_hidden_; | 505 bool paused_when_background_; |
505 | 506 |
506 // Set when starting, seeking, and resuming (all of which require a Pipeline | 507 // Set when starting, seeking, and resuming (all of which require a Pipeline |
507 // seek). |seek_time_| is only valid when |seeking_| is true. | 508 // seek). |seek_time_| is only valid when |seeking_| is true. |
508 bool seeking_; | 509 bool seeking_; |
509 base::TimeDelta seek_time_; | 510 base::TimeDelta seek_time_; |
510 | 511 |
511 // Set when doing a restart (a suspend and resume in sequence) of the pipeline | 512 // Set when doing a restart (a suspend and resume in sequence) of the pipeline |
512 // in order to destruct and reinitialize the decoders. This is separate from | 513 // in order to destruct and reinitialize the decoders. This is separate from |
513 // |pending_resume_| and |pending_suspend_| because they can be elided in | 514 // |pending_resume_| and |pending_suspend_| because they can be elided in |
514 // certain cases, whereas for a restart they must happen. | 515 // certain cases, whereas for a restart they must happen. |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 | 687 |
687 // Pipeline media duration overridden by tests. | 688 // Pipeline media duration overridden by tests. |
688 base::Optional<base::TimeDelta> pipeline_media_duration_for_test_; | 689 base::Optional<base::TimeDelta> pipeline_media_duration_for_test_; |
689 | 690 |
690 DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImpl); | 691 DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImpl); |
691 }; | 692 }; |
692 | 693 |
693 } // namespace media | 694 } // namespace media |
694 | 695 |
695 #endif // MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_ | 696 #endif // MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_ |
OLD | NEW |