Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/media/render_media_log.h" | 5 #include "content/renderer/media/render_media_log.h" |
| 6 | 6 |
| 7 #include <sstream> | |
| 8 | |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/location.h" | 10 #include "base/location.h" |
| 9 #include "base/logging.h" | 11 #include "base/logging.h" |
| 10 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 11 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
| 12 #include "base/time/default_tick_clock.h" | 14 #include "base/time/default_tick_clock.h" |
| 13 #include "content/common/view_messages.h" | 15 #include "content/common/view_messages.h" |
| 14 #include "content/public/renderer/render_thread.h" | 16 #include "content/public/renderer/render_thread.h" |
| 15 | 17 |
| 16 namespace { | 18 namespace { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 44 void RenderMediaLog::AddEvent(scoped_ptr<media::MediaLogEvent> event) { | 46 void RenderMediaLog::AddEvent(scoped_ptr<media::MediaLogEvent> event) { |
| 45 Log(event.get()); | 47 Log(event.get()); |
| 46 | 48 |
| 47 // For enforcing delay until it's been a second since the last ipc message was | 49 // For enforcing delay until it's been a second since the last ipc message was |
| 48 // sent. | 50 // sent. |
| 49 base::TimeDelta delay_for_next_ipc_send; | 51 base::TimeDelta delay_for_next_ipc_send; |
| 50 | 52 |
| 51 { | 53 { |
| 52 base::AutoLock auto_lock(lock_); | 54 base::AutoLock auto_lock(lock_); |
| 53 | 55 |
| 54 // Keep track of the latest buffered extents properties to avoid sending | 56 switch (event->type) { |
| 55 // thousands of events over IPC. See http://crbug.com/352585 for details. | 57 case media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED: |
| 56 if (event->type == media::MediaLogEvent::BUFFERED_EXTENTS_CHANGED) | 58 // Keep track of the latest buffered extents properties to avoid sending |
| 57 last_buffered_extents_changed_event_.swap(event); | 59 // thousands of events over IPC. See http://crbug.com/352585 for |
| 58 else | 60 // details. |
| 59 queued_media_events_.push_back(*event); | 61 last_buffered_extents_changed_event_.swap(event); |
| 62 // SendQueuedMediaEvents() will enqueue the most recent event of this | |
| 63 // kind, if any, prior to sending the event batch. | |
| 64 break; | |
| 65 | |
| 66 // Hold onto the most recent PIPELINE_ERROR and MEDIA_LOG_ERROR_ENTRY for | |
| 67 // use in GetLastErrorMessage(); | |
|
watk
2016/04/04 23:47:25
nit: s/;/./
wolenetz
2016/04/05 00:23:27
Done.
| |
| 68 case media::MediaLogEvent::PIPELINE_ERROR: | |
| 69 queued_media_events_.push_back(*event); | |
| 70 last_pipeline_error_.swap(event); | |
| 71 break; | |
| 72 case media::MediaLogEvent::MEDIA_ERROR_LOG_ENTRY: | |
| 73 queued_media_events_.push_back(*event); | |
| 74 last_media_error_log_entry_.swap(event); | |
| 75 break; | |
| 76 | |
| 77 // Just enqueue all other event types for throttled transmission. | |
| 78 default: | |
| 79 queued_media_events_.push_back(*event); | |
| 80 } | |
| 60 | 81 |
| 61 if (ipc_send_pending_) | 82 if (ipc_send_pending_) |
| 62 return; | 83 return; |
| 63 | 84 |
| 64 ipc_send_pending_ = true; | 85 ipc_send_pending_ = true; |
| 65 delay_for_next_ipc_send = base::TimeDelta::FromSeconds(1) - | 86 delay_for_next_ipc_send = base::TimeDelta::FromSeconds(1) - |
| 66 (tick_clock_->NowTicks() - last_ipc_send_time_); | 87 (tick_clock_->NowTicks() - last_ipc_send_time_); |
| 67 } | 88 } |
| 68 | 89 |
| 69 if (delay_for_next_ipc_send > base::TimeDelta()) { | 90 if (delay_for_next_ipc_send > base::TimeDelta()) { |
| 70 task_runner_->PostDelayedTask( | 91 task_runner_->PostDelayedTask( |
| 71 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this), | 92 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this), |
| 72 delay_for_next_ipc_send); | 93 delay_for_next_ipc_send); |
| 73 return; | 94 return; |
| 74 } | 95 } |
| 75 | 96 |
| 76 // It's been more than a second so send ASAP. | 97 // It's been more than a second so send ASAP. |
| 77 if (task_runner_->BelongsToCurrentThread()) { | 98 if (task_runner_->BelongsToCurrentThread()) { |
| 78 SendQueuedMediaEvents(); | 99 SendQueuedMediaEvents(); |
| 79 return; | 100 return; |
| 80 } | 101 } |
| 81 task_runner_->PostTask( | 102 task_runner_->PostTask( |
| 82 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this)); | 103 FROM_HERE, base::Bind(&RenderMediaLog::SendQueuedMediaEvents, this)); |
| 83 } | 104 } |
| 84 | 105 |
| 106 std::string RenderMediaLog::GetLastErrorMessage() { | |
| 107 base::AutoLock auto_lock(lock_); | |
| 108 | |
| 109 // Return the conditional concatenation of the last pipeline error and the | |
| 110 // last media error log. | |
| 111 std::stringstream result; | |
| 112 if (last_pipeline_error_) | |
| 113 result << MediaEventToLogString(*last_pipeline_error_) | |
| 114 << (last_media_error_log_entry_ ? ", " : ""); | |
|
watk
2016/04/04 23:47:25
braces around multi-line statement
wolenetz
2016/04/05 00:23:27
Argh!! git cl format strikes again :/ Done.
| |
| 115 if (last_media_error_log_entry_) | |
| 116 result << MediaEventToLogString(*last_media_error_log_entry_); | |
| 117 return result.str(); | |
| 118 } | |
| 119 | |
| 85 void RenderMediaLog::SendQueuedMediaEvents() { | 120 void RenderMediaLog::SendQueuedMediaEvents() { |
| 86 DCHECK(task_runner_->BelongsToCurrentThread()); | 121 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 87 | 122 |
| 88 std::vector<media::MediaLogEvent> events_to_send; | 123 std::vector<media::MediaLogEvent> events_to_send; |
| 89 { | 124 { |
| 90 base::AutoLock auto_lock(lock_); | 125 base::AutoLock auto_lock(lock_); |
| 91 | 126 |
| 92 DCHECK(ipc_send_pending_); | 127 DCHECK(ipc_send_pending_); |
| 93 ipc_send_pending_ = false; | 128 ipc_send_pending_ = false; |
| 94 | 129 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 113 tick_clock_.swap(tick_clock); | 148 tick_clock_.swap(tick_clock); |
| 114 last_ipc_send_time_ = tick_clock_->NowTicks(); | 149 last_ipc_send_time_ = tick_clock_->NowTicks(); |
| 115 } | 150 } |
| 116 | 151 |
| 117 void RenderMediaLog::SetTaskRunnerForTesting( | 152 void RenderMediaLog::SetTaskRunnerForTesting( |
| 118 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { | 153 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { |
| 119 task_runner_ = task_runner; | 154 task_runner_ = task_runner; |
| 120 } | 155 } |
| 121 | 156 |
| 122 } // namespace content | 157 } // namespace content |
| OLD | NEW |