| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "base/logging.h" | 5 #include "base/logging.h" |
| 6 #include "services/media/common/media_pipe_base.h" | 6 #include "services/media/common/media_pipe_base.h" |
| 7 | 7 |
| 8 namespace mojo { | 8 namespace mojo { |
| 9 namespace media { | 9 namespace media { |
| 10 | 10 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 if (!buffer_) { | 94 if (!buffer_) { |
| 95 cbk.Run(MediaResult::BAD_STATE); | 95 cbk.Run(MediaResult::BAD_STATE); |
| 96 return; | 96 return; |
| 97 } | 97 } |
| 98 DCHECK(buffer_size_); | 98 DCHECK(buffer_size_); |
| 99 | 99 |
| 100 // The offset(s) and size(s) of this payload must to reside within the space | 100 // The offset(s) and size(s) of this payload must to reside within the space |
| 101 // of the shared buffer. If any does not, this send operation is not valid. | 101 // of the shared buffer. If any does not, this send operation is not valid. |
| 102 const MediaPacketRegionPtr* r = &packet->payload; | 102 const MediaPacketRegionPtr* r = &packet->payload; |
| 103 size_t i = 0; | 103 size_t i = 0; |
| 104 size_t extra_payload_size = |
| 105 packet->extra_payload.is_null() ? 0 : packet->extra_payload.size(); |
| 104 while (true) { | 106 while (true) { |
| 105 if ((*r).is_null()) { | 107 if ((*r).is_null()) { |
| 106 cbk.Run(MediaResult::INVALID_ARGUMENT); | 108 cbk.Run(MediaResult::INVALID_ARGUMENT); |
| 107 return; | 109 return; |
| 108 } | 110 } |
| 109 | 111 |
| 110 auto offset = (*r)->offset; | 112 auto offset = (*r)->offset; |
| 111 auto length = (*r)->length; | 113 auto length = (*r)->length; |
| 112 if ((offset > buffer_size_) || (length > (buffer_size_ - offset))) { | 114 if ((offset > buffer_size_) || (length > (buffer_size_ - offset))) { |
| 113 cbk.Run(MediaResult::INVALID_ARGUMENT); | 115 cbk.Run(MediaResult::INVALID_ARGUMENT); |
| 114 return; | 116 return; |
| 115 } | 117 } |
| 116 | 118 |
| 117 if (i >= packet->extra_payload.size()) { | 119 if (i >= extra_payload_size) { |
| 118 break; | 120 break; |
| 119 } | 121 } |
| 120 | 122 |
| 123 DCHECK(packet->extra_payload); |
| 121 r = &packet->extra_payload[i++]; | 124 r = &packet->extra_payload[i++]; |
| 122 } | 125 } |
| 123 | 126 |
| 124 // Looks good, send this packet up to the implementation layer. | 127 // Looks good, send this packet up to the implementation layer. |
| 125 MediaPacketStatePtr ptr(new MediaPacketState(packet.Pass(), cbk)); | 128 MediaPacketStatePtr ptr(new MediaPacketState(packet.Pass(), cbk)); |
| 126 OnPacketReceived(std::move(ptr)); | 129 OnPacketReceived(std::move(ptr)); |
| 127 } | 130 } |
| 128 | 131 |
| 129 void MediaPipeBase::Flush(const FlushCallback& cbk) { | 132 void MediaPipeBase::Flush(const FlushCallback& cbk) { |
| 130 // If we have not been successfully initialized, then we should not be getting | 133 // If we have not been successfully initialized, then we should not be getting |
| (...skipping 18 matching lines...) Expand all Loading... |
| 149 } | 152 } |
| 150 | 153 |
| 151 MediaPipeBase::MediaPacketState::MediaPacketState( | 154 MediaPipeBase::MediaPacketState::MediaPacketState( |
| 152 MediaPacketPtr packet, | 155 MediaPacketPtr packet, |
| 153 const SendPacketCallback& cbk) | 156 const SendPacketCallback& cbk) |
| 154 : packet_(packet.Pass()) | 157 : packet_(packet.Pass()) |
| 155 , cbk_(cbk) | 158 , cbk_(cbk) |
| 156 , result_(MediaResult::OK) { | 159 , result_(MediaResult::OK) { |
| 157 DCHECK(packet_); | 160 DCHECK(packet_); |
| 158 DCHECK(packet_->payload); | 161 DCHECK(packet_->payload); |
| 159 DCHECK(packet_->extra_payload); | |
| 160 } | 162 } |
| 161 | 163 |
| 162 MediaPipeBase::MediaPacketState::~MediaPacketState() { | 164 MediaPipeBase::MediaPacketState::~MediaPacketState() { |
| 163 cbk_.Run(result_); | 165 cbk_.Run(result_); |
| 164 } | 166 } |
| 165 | 167 |
| 166 void MediaPipeBase::MediaPacketState::SetResult(MediaResult result) { | 168 void MediaPipeBase::MediaPacketState::SetResult(MediaResult result) { |
| 167 MediaResult tmp = MediaResult::OK; | 169 MediaResult tmp = MediaResult::OK; |
| 168 result_.compare_exchange_strong(tmp, result); | 170 result_.compare_exchange_strong(tmp, result); |
| 169 } | 171 } |
| 170 | 172 |
| 171 } // namespace media | 173 } // namespace media |
| 172 } // namespace mojo | 174 } // namespace mojo |
| OLD | NEW |