| 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 |