| 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.h" | 5 #include "chromecast/media/cma/ipc/media_message.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "chromecast/media/cma/ipc/media_memory_chunk.h" | 11 #include "chromecast/media/cma/ipc/media_memory_chunk.h" |
| 11 | 12 |
| 12 namespace chromecast { | 13 namespace chromecast { |
| 13 namespace media { | 14 namespace media { |
| 14 | 15 |
| 15 // static | 16 // static |
| 16 scoped_ptr<MediaMessage> MediaMessage::CreateDummyMessage(uint32_t type) { | 17 scoped_ptr<MediaMessage> MediaMessage::CreateDummyMessage(uint32_t type) { |
| 17 return scoped_ptr<MediaMessage>( | 18 return scoped_ptr<MediaMessage>( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 28 // Make the message size a multiple of the alignment | 29 // Make the message size a multiple of the alignment |
| 29 // so that if we have proper alignment for array of messages. | 30 // so that if we have proper alignment for array of messages. |
| 30 size_t end_alignment = msg_size % ALIGNOF(SerializedMsg); | 31 size_t end_alignment = msg_size % ALIGNOF(SerializedMsg); |
| 31 if (end_alignment != 0) | 32 if (end_alignment != 0) |
| 32 msg_size += ALIGNOF(SerializedMsg) - end_alignment; | 33 msg_size += ALIGNOF(SerializedMsg) - end_alignment; |
| 33 | 34 |
| 34 scoped_ptr<MediaMemoryChunk> memory(memory_allocator.Run(msg_size)); | 35 scoped_ptr<MediaMemoryChunk> memory(memory_allocator.Run(msg_size)); |
| 35 if (!memory) | 36 if (!memory) |
| 36 return scoped_ptr<MediaMessage>(); | 37 return scoped_ptr<MediaMessage>(); |
| 37 | 38 |
| 38 return scoped_ptr<MediaMessage>(new MediaMessage(type, memory.Pass())); | 39 return scoped_ptr<MediaMessage>(new MediaMessage(type, std::move(memory))); |
| 39 } | 40 } |
| 40 | 41 |
| 41 // static | 42 // static |
| 42 scoped_ptr<MediaMessage> MediaMessage::CreateMessage( | 43 scoped_ptr<MediaMessage> MediaMessage::CreateMessage( |
| 43 uint32_t type, | 44 uint32_t type, |
| 44 scoped_ptr<MediaMemoryChunk> memory) { | 45 scoped_ptr<MediaMemoryChunk> memory) { |
| 45 return scoped_ptr<MediaMessage>(new MediaMessage(type, memory.Pass())); | 46 return scoped_ptr<MediaMessage>(new MediaMessage(type, std::move(memory))); |
| 46 } | 47 } |
| 47 | 48 |
| 48 // static | 49 // static |
| 49 scoped_ptr<MediaMessage> MediaMessage::MapMessage( | 50 scoped_ptr<MediaMessage> MediaMessage::MapMessage( |
| 50 scoped_ptr<MediaMemoryChunk> memory) { | 51 scoped_ptr<MediaMemoryChunk> memory) { |
| 51 return scoped_ptr<MediaMessage>(new MediaMessage(memory.Pass())); | 52 return scoped_ptr<MediaMessage>(new MediaMessage(std::move(memory))); |
| 52 } | 53 } |
| 53 | 54 |
| 54 MediaMessage::MediaMessage(uint32_t type, size_t msg_size) | 55 MediaMessage::MediaMessage(uint32_t type, size_t msg_size) |
| 55 : is_dummy_msg_(true), | 56 : is_dummy_msg_(true), |
| 56 cached_header_(&cached_msg_.header), | 57 cached_header_(&cached_msg_.header), |
| 57 msg_(&cached_msg_), | 58 msg_(&cached_msg_), |
| 58 msg_read_only_(&cached_msg_), | 59 msg_read_only_(&cached_msg_), |
| 59 rd_offset_(0) { | 60 rd_offset_(0) { |
| 60 cached_header_->size = msg_size; | 61 cached_header_->size = msg_size; |
| 61 cached_header_->type = type; | 62 cached_header_->type = type; |
| 62 cached_header_->content_size = 0; | 63 cached_header_->content_size = 0; |
| 63 } | 64 } |
| 64 | 65 |
| 65 MediaMessage::MediaMessage(uint32_t type, scoped_ptr<MediaMemoryChunk> memory) | 66 MediaMessage::MediaMessage(uint32_t type, scoped_ptr<MediaMemoryChunk> memory) |
| 66 : is_dummy_msg_(false), | 67 : is_dummy_msg_(false), |
| 67 cached_header_(&cached_msg_.header), | 68 cached_header_(&cached_msg_.header), |
| 68 msg_(static_cast<SerializedMsg*>(memory->data())), | 69 msg_(static_cast<SerializedMsg*>(memory->data())), |
| 69 msg_read_only_(msg_), | 70 msg_read_only_(msg_), |
| 70 mem_(memory.Pass()), | 71 mem_(std::move(memory)), |
| 71 rd_offset_(0) { | 72 rd_offset_(0) { |
| 72 CHECK(mem_->valid()); | 73 CHECK(mem_->valid()); |
| 73 CHECK_GE(mem_->size(), minimum_msg_size()); | 74 CHECK_GE(mem_->size(), minimum_msg_size()); |
| 74 | 75 |
| 75 // Check memory alignment: | 76 // Check memory alignment: |
| 76 // needed to cast properly |msg_dst| to a SerializedMsg. | 77 // needed to cast properly |msg_dst| to a SerializedMsg. |
| 77 CHECK_EQ( | 78 CHECK_EQ( |
| 78 reinterpret_cast<uintptr_t>(mem_->data()) % ALIGNOF(SerializedMsg), 0u); | 79 reinterpret_cast<uintptr_t>(mem_->data()) % ALIGNOF(SerializedMsg), 0u); |
| 79 | 80 |
| 80 // Make sure that |mem_->data()| + |mem_->size()| is also aligned correctly. | 81 // Make sure that |mem_->data()| + |mem_->size()| is also aligned correctly. |
| 81 // This is needed if we append a second serialized message next to this one. | 82 // This is needed if we append a second serialized message next to this one. |
| 82 // The second serialized message must be aligned correctly. | 83 // The second serialized message must be aligned correctly. |
| 83 // It is similar to what a compiler is doing for arrays of structures. | 84 // It is similar to what a compiler is doing for arrays of structures. |
| 84 CHECK_EQ(mem_->size() % ALIGNOF(SerializedMsg), 0u); | 85 CHECK_EQ(mem_->size() % ALIGNOF(SerializedMsg), 0u); |
| 85 | 86 |
| 86 cached_header_->size = mem_->size(); | 87 cached_header_->size = mem_->size(); |
| 87 cached_header_->type = type; | 88 cached_header_->type = type; |
| 88 cached_header_->content_size = 0; | 89 cached_header_->content_size = 0; |
| 89 msg_->header = *cached_header_; | 90 msg_->header = *cached_header_; |
| 90 } | 91 } |
| 91 | 92 |
| 92 MediaMessage::MediaMessage(scoped_ptr<MediaMemoryChunk> memory) | 93 MediaMessage::MediaMessage(scoped_ptr<MediaMemoryChunk> memory) |
| 93 : is_dummy_msg_(false), | 94 : is_dummy_msg_(false), |
| 94 cached_header_(&cached_msg_.header), | 95 cached_header_(&cached_msg_.header), |
| 95 msg_(NULL), | 96 msg_(NULL), |
| 96 msg_read_only_(static_cast<SerializedMsg*>(memory->data())), | 97 msg_read_only_(static_cast<SerializedMsg*>(memory->data())), |
| 97 mem_(memory.Pass()), | 98 mem_(std::move(memory)), |
| 98 rd_offset_(0) { | 99 rd_offset_(0) { |
| 99 CHECK(mem_->valid()); | 100 CHECK(mem_->valid()); |
| 100 | 101 |
| 101 // Check memory alignment. | 102 // Check memory alignment. |
| 102 CHECK_EQ( | 103 CHECK_EQ( |
| 103 reinterpret_cast<uintptr_t>(mem_->data()) % ALIGNOF(SerializedMsg), 0u); | 104 reinterpret_cast<uintptr_t>(mem_->data()) % ALIGNOF(SerializedMsg), 0u); |
| 104 | 105 |
| 105 // Cache the message header which cannot be modified while reading. | 106 // Cache the message header which cannot be modified while reading. |
| 106 CHECK_GE(mem_->size(), minimum_msg_size()); | 107 CHECK_GE(mem_->size(), minimum_msg_size()); |
| 107 *cached_header_ = msg_read_only_->header; | 108 *cached_header_ = msg_read_only_->header; |
| 108 CHECK_GE(cached_header_->size, minimum_msg_size()); | 109 CHECK_GE(cached_header_->size, minimum_msg_size()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 rd_offset_ += size; | 188 rd_offset_ += size; |
| 188 return rd_ptr; | 189 return rd_ptr; |
| 189 } | 190 } |
| 190 | 191 |
| 191 const void* MediaMessage::GetBuffer(size_t size) { | 192 const void* MediaMessage::GetBuffer(size_t size) { |
| 192 return GetWritableBuffer(size); | 193 return GetWritableBuffer(size); |
| 193 } | 194 } |
| 194 | 195 |
| 195 } // namespace media | 196 } // namespace media |
| 196 } // namespace chromecast | 197 } // namespace chromecast |
| OLD | NEW |