feat_add_streaming-protocol_registry_to_multibuffer_data_source.patch 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Paul Frazee <[email protected]>
  3. Date: Sat, 6 Jun 2020 10:30:45 -0500
  4. Subject: feat: add streaming-protocol registry to multibuffer_data_source
  5. blink::WebMediaPlayerImpl - which provides the <video> and <audio> behaviors - needs to know
  6. whether a data source will stream or fully buffer the response. It determines this behavior
  7. with MultibufferDataSource::AssumeFullyBuffered() which has http/s hardwired. An incorrect
  8. determination will cause the video/audio to fail playing.
  9. This patch adds a list of "streaming protocols" to the MultibufferDataSource in order to allow
  10. other protocols to register their streaming behavior. MultibufferDataSource::AssumeFullyBuffered()
  11. then refers to the list so that it can correctly determine the data source's settings.
  12. diff --git a/third_party/blink/public/platform/media/multi_buffer_data_source.h b/third_party/blink/public/platform/media/multi_buffer_data_source.h
  13. index 3a116703a77ef03715c8e3afca77b90205b32d63..e2bfe736c76d2c35ab5a0533b7569d86b22422f6 100644
  14. --- a/third_party/blink/public/platform/media/multi_buffer_data_source.h
  15. +++ b/third_party/blink/public/platform/media/multi_buffer_data_source.h
  16. @@ -33,6 +33,8 @@ namespace blink {
  17. class BufferedDataSourceHost;
  18. class MultiBufferReader;
  19. +void BLINK_PLATFORM_EXPORT AddStreamingScheme(const char* new_scheme);
  20. +
  21. // A data source capable of loading URLs and buffering the data using an
  22. // in-memory sliding window.
  23. //
  24. diff --git a/third_party/blink/renderer/platform/media/multi_buffer_data_source.cc b/third_party/blink/renderer/platform/media/multi_buffer_data_source.cc
  25. index 4b37d8de877ad9ff94f11152eefb01117d1afe66..7db4a9c407d18279603c16b3b58f2456cc1e86fa 100644
  26. --- a/third_party/blink/renderer/platform/media/multi_buffer_data_source.cc
  27. +++ b/third_party/blink/renderer/platform/media/multi_buffer_data_source.cc
  28. @@ -9,9 +9,11 @@
  29. #include "base/bind.h"
  30. #include "base/callback_helpers.h"
  31. #include "base/location.h"
  32. +#include "base/no_destructor.h"
  33. #include "base/numerics/ranges.h"
  34. #include "base/numerics/safe_conversions.h"
  35. #include "base/single_thread_task_runner.h"
  36. +#include "base/strings/string_util.h"
  37. #include "media/base/media_log.h"
  38. #include "net/base/net_errors.h"
  39. #include "third_party/blink/public/platform/media/buffered_data_source_host_impl.h"
  40. @@ -60,8 +62,20 @@ const int kUpdateBufferSizeFrequency = 32;
  41. // How long to we delay a seek after a read?
  42. constexpr base::TimeDelta kSeekDelay = base::TimeDelta::FromMilliseconds(20);
  43. +std::vector<std::string>* GetStreamingSchemes() {
  44. + static base::NoDestructor<std::vector<std::string>> streaming_schemes({
  45. + url::kHttpsScheme,
  46. + url::kHttpScheme
  47. + });
  48. + return streaming_schemes.get();
  49. +}
  50. +
  51. } // namespace
  52. +void AddStreamingScheme(const char* new_scheme) {
  53. + GetStreamingSchemes()->push_back(new_scheme);
  54. +}
  55. +
  56. class MultiBufferDataSource::ReadOperation {
  57. public:
  58. ReadOperation() = delete;
  59. @@ -153,7 +167,14 @@ bool MultiBufferDataSource::media_has_played() const {
  60. bool MultiBufferDataSource::AssumeFullyBuffered() const {
  61. DCHECK(url_data_);
  62. - return !url_data_->url().SchemeIsHTTPOrHTTPS();
  63. +
  64. + const std::string scheme = url_data_->url().scheme();
  65. + for (const std::string& streaming_scheme : *GetStreamingSchemes()) {
  66. + if (base::LowerCaseEqualsASCII(scheme, streaming_scheme)) {
  67. + return false;
  68. + }
  69. + }
  70. + return true;
  71. }
  72. void MultiBufferDataSource::SetReader(MultiBufferReader* reader) {