OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chromecast/media/cma/ipc/media_message_fifo.h" | 5 #include "chromecast/media/cma/ipc/media_message_fifo.h" |
6 | 6 |
| 7 #include <utility> |
| 8 |
7 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
8 #include "base/bind.h" | 10 #include "base/bind.h" |
9 #include "base/location.h" | 11 #include "base/location.h" |
10 #include "base/logging.h" | 12 #include "base/logging.h" |
11 #include "base/macros.h" | 13 #include "base/macros.h" |
12 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
13 #include "base/thread_task_runner_handle.h" | 15 #include "base/thread_task_runner_handle.h" |
14 #include "chromecast/media/cma/base/cma_logging.h" | 16 #include "chromecast/media/cma/base/cma_logging.h" |
15 #include "chromecast/media/cma/ipc/media_memory_chunk.h" | 17 #include "chromecast/media/cma/ipc/media_memory_chunk.h" |
16 #include "chromecast/media/cma/ipc/media_message.h" | 18 #include "chromecast/media/cma/ipc/media_message.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 flag_ = scoped_refptr<MediaMessageFlag>(); | 98 flag_ = scoped_refptr<MediaMessageFlag>(); |
97 if (!release_msg_cb_.is_null()) { | 99 if (!release_msg_cb_.is_null()) { |
98 if (task_runner_->BelongsToCurrentThread()) { | 100 if (task_runner_->BelongsToCurrentThread()) { |
99 release_msg_cb_.Run(); | 101 release_msg_cb_.Run(); |
100 } else { | 102 } else { |
101 task_runner_->PostTask(FROM_HERE, release_msg_cb_); | 103 task_runner_->PostTask(FROM_HERE, release_msg_cb_); |
102 } | 104 } |
103 } | 105 } |
104 } | 106 } |
105 | 107 |
106 MediaMessageFifo::MediaMessageFifo( | 108 MediaMessageFifo::MediaMessageFifo(scoped_ptr<MediaMemoryChunk> mem, bool init) |
107 scoped_ptr<MediaMemoryChunk> mem, bool init) | 109 : mem_(std::move(mem)), weak_factory_(this) { |
108 : mem_(mem.Pass()), | |
109 weak_factory_(this) { | |
110 CHECK_EQ(reinterpret_cast<uintptr_t>(mem_->data()) % ALIGNOF(Descriptor), | 110 CHECK_EQ(reinterpret_cast<uintptr_t>(mem_->data()) % ALIGNOF(Descriptor), |
111 0u); | 111 0u); |
112 CHECK_GE(mem_->size(), sizeof(Descriptor)); | 112 CHECK_GE(mem_->size(), sizeof(Descriptor)); |
113 Descriptor* desc = static_cast<Descriptor*>(mem_->data()); | 113 Descriptor* desc = static_cast<Descriptor*>(mem_->data()); |
114 base_ = static_cast<void*>(&desc->first_item); | 114 base_ = static_cast<void*>(&desc->first_item); |
115 | 115 |
116 // TODO(damienv): remove cast when atomic size_t is defined in Chrome. | 116 // TODO(damienv): remove cast when atomic size_t is defined in Chrome. |
117 // Currently, the sign differs. | 117 // Currently, the sign differs. |
118 rd_offset_ = reinterpret_cast<AtomicSize*>(&(desc->rd_offset)); | 118 rd_offset_ = reinterpret_cast<AtomicSize*>(&(desc->rd_offset)); |
119 wr_offset_ = reinterpret_cast<AtomicSize*>(&(desc->wr_offset)); | 119 wr_offset_ = reinterpret_cast<AtomicSize*>(&(desc->wr_offset)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 return scoped_ptr<MediaMemoryChunk>(); | 183 return scoped_ptr<MediaMemoryChunk>(); |
184 wr_offset = 0; | 184 wr_offset = 0; |
185 CommitInternalWrite(wr_offset); | 185 CommitInternalWrite(wr_offset); |
186 | 186 |
187 } else if (trailing_byte_count < size_to_reserve) { | 187 } else if (trailing_byte_count < size_to_reserve) { |
188 // At this point, we know we have at least the space to write a message. | 188 // At this point, we know we have at least the space to write a message. |
189 // However, to avoid splitting a message, a padding message is needed. | 189 // However, to avoid splitting a message, a padding message is needed. |
190 scoped_ptr<MediaMemoryChunk> mem( | 190 scoped_ptr<MediaMemoryChunk> mem( |
191 ReserveMemoryNoCheck(trailing_byte_count)); | 191 ReserveMemoryNoCheck(trailing_byte_count)); |
192 scoped_ptr<MediaMessage> padding_message( | 192 scoped_ptr<MediaMessage> padding_message( |
193 MediaMessage::CreateMessage(PaddingMediaMsg, mem.Pass())); | 193 MediaMessage::CreateMessage(PaddingMediaMsg, std::move(mem))); |
194 } | 194 } |
195 | 195 |
196 // Recalculate the free size and exit if not enough free space. | 196 // Recalculate the free size and exit if not enough free space. |
197 wr_offset = internal_wr_offset(); | 197 wr_offset = internal_wr_offset(); |
198 allocated_size = (size_ + wr_offset - rd_offset) % size_; | 198 allocated_size = (size_ + wr_offset - rd_offset) % size_; |
199 free_size = size_ - 1 - allocated_size; | 199 free_size = size_ - 1 - allocated_size; |
200 if (free_size < size_to_reserve) | 200 if (free_size < size_to_reserve) |
201 return scoped_ptr<MediaMemoryChunk>(); | 201 return scoped_ptr<MediaMemoryChunk>(); |
202 | 202 |
203 return ReserveMemoryNoCheck(size_to_reserve); | 203 return ReserveMemoryNoCheck(size_to_reserve); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 // from being overwritten. | 238 // from being overwritten. |
239 // The serialized structure starts at offset |rd_offset|. | 239 // The serialized structure starts at offset |rd_offset|. |
240 scoped_refptr<MediaMessageFlag> rd_flag(new MediaMessageFlag(rd_offset)); | 240 scoped_refptr<MediaMessageFlag> rd_flag(new MediaMessageFlag(rd_offset)); |
241 rd_flags_.push_back(rd_flag); | 241 rd_flags_.push_back(rd_flag); |
242 scoped_ptr<MediaMemoryChunk> mem( | 242 scoped_ptr<MediaMemoryChunk> mem( |
243 new FifoOwnedMemory( | 243 new FifoOwnedMemory( |
244 msg_src, max_msg_size, rd_flag, | 244 msg_src, max_msg_size, rd_flag, |
245 base::Bind(&MediaMessageFifo::OnRdMemoryReleased, weak_this_))); | 245 base::Bind(&MediaMessageFifo::OnRdMemoryReleased, weak_this_))); |
246 | 246 |
247 // Create the message which wraps its the serialized structure. | 247 // Create the message which wraps its the serialized structure. |
248 scoped_ptr<MediaMessage> message(MediaMessage::MapMessage(mem.Pass())); | 248 scoped_ptr<MediaMessage> message(MediaMessage::MapMessage(std::move(mem))); |
249 CHECK(message); | 249 CHECK(message); |
250 | 250 |
251 // Update the internal read pointer. | 251 // Update the internal read pointer. |
252 rd_offset = (rd_offset + message->size()) % size_; | 252 rd_offset = (rd_offset + message->size()) % size_; |
253 CommitInternalRead(rd_offset); | 253 CommitInternalRead(rd_offset); |
254 | 254 |
255 return message.Pass(); | 255 return message; |
256 } | 256 } |
257 | 257 |
258 void MediaMessageFifo::Flush() { | 258 void MediaMessageFifo::Flush() { |
259 DCHECK(thread_checker_.CalledOnValidThread()); | 259 DCHECK(thread_checker_.CalledOnValidThread()); |
260 | 260 |
261 size_t wr_offset = current_wr_offset(); | 261 size_t wr_offset = current_wr_offset(); |
262 | 262 |
263 // Invalidate every memory region before flushing. | 263 // Invalidate every memory region before flushing. |
264 while (!rd_flags_.empty()) { | 264 while (!rd_flags_.empty()) { |
265 CMALOG(kLogControl) << "Invalidate flag"; | 265 CMALOG(kLogControl) << "Invalidate flag"; |
(...skipping 17 matching lines...) Expand all Loading... |
283 wr_flags_.push_back(wr_flag); | 283 wr_flags_.push_back(wr_flag); |
284 scoped_ptr<MediaMemoryChunk> mem( | 284 scoped_ptr<MediaMemoryChunk> mem( |
285 new FifoOwnedMemory( | 285 new FifoOwnedMemory( |
286 msg_start, size_to_reserve, wr_flag, | 286 msg_start, size_to_reserve, wr_flag, |
287 base::Bind(&MediaMessageFifo::OnWrMemoryReleased, weak_this_))); | 287 base::Bind(&MediaMessageFifo::OnWrMemoryReleased, weak_this_))); |
288 | 288 |
289 // Update the internal write pointer. | 289 // Update the internal write pointer. |
290 wr_offset = (wr_offset + size_to_reserve) % size_; | 290 wr_offset = (wr_offset + size_to_reserve) % size_; |
291 CommitInternalWrite(wr_offset); | 291 CommitInternalWrite(wr_offset); |
292 | 292 |
293 return mem.Pass(); | 293 return mem; |
294 } | 294 } |
295 | 295 |
296 void MediaMessageFifo::OnWrMemoryReleased() { | 296 void MediaMessageFifo::OnWrMemoryReleased() { |
297 DCHECK(thread_checker_.CalledOnValidThread()); | 297 DCHECK(thread_checker_.CalledOnValidThread()); |
298 | 298 |
299 if (wr_flags_.empty()) { | 299 if (wr_flags_.empty()) { |
300 // Sanity check: when there is no protected memory area, | 300 // Sanity check: when there is no protected memory area, |
301 // the external write offset has no reason to be different from | 301 // the external write offset has no reason to be different from |
302 // the internal write offset. | 302 // the internal write offset. |
303 DCHECK_EQ(current_wr_offset(), internal_wr_offset()); | 303 DCHECK_EQ(current_wr_offset(), internal_wr_offset()); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 void MediaMessageFifo::CommitInternalRead(size_t new_rd_offset) { | 396 void MediaMessageFifo::CommitInternalRead(size_t new_rd_offset) { |
397 internal_rd_offset_ = new_rd_offset; | 397 internal_rd_offset_ = new_rd_offset; |
398 } | 398 } |
399 | 399 |
400 void MediaMessageFifo::CommitInternalWrite(size_t new_wr_offset) { | 400 void MediaMessageFifo::CommitInternalWrite(size_t new_wr_offset) { |
401 internal_wr_offset_ = new_wr_offset; | 401 internal_wr_offset_ = new_wr_offset; |
402 } | 402 } |
403 | 403 |
404 } // namespace media | 404 } // namespace media |
405 } // namespace chromecast | 405 } // namespace chromecast |
OLD | NEW |