| 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 "mojo/public/cpp/environment/logging.h" | 5 #include "mojo/public/cpp/environment/logging.h" |
| 6 #include "mojo/public/cpp/utility/run_loop.h" | 6 #include "mojo/public/cpp/utility/run_loop.h" |
| 7 #include "mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.h" | 7 #include "mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.h" |
| 8 #include "mojo/services/media/common/interfaces/media_common.mojom.h" | 8 #include "mojo/services/media/common/interfaces/media_common.mojom.h" |
| 9 #include "mojo/services/media/common/interfaces/media_transport.mojom.h" | 9 #include "mojo/services/media/common/interfaces/media_transport.mojom.h" |
| 10 | 10 |
| 11 namespace mojo { | 11 namespace mojo { |
| 12 namespace media { | 12 namespace media { |
| 13 | 13 |
| 14 constexpr size_t CircularBufferMediaPipeAdapter::MappedPacket::kMaxRegions; | 14 constexpr size_t CircularBufferMediaPipeAdapter::MappedPacket::kMaxRegions; |
| 15 CircularBufferMediaPipeAdapter::MappedPacket::MappedPacket() { } | 15 CircularBufferMediaPipeAdapter::MappedPacket::MappedPacket() { } |
| 16 CircularBufferMediaPipeAdapter::MappedPacket::~MappedPacket() { | 16 CircularBufferMediaPipeAdapter::MappedPacket::~MappedPacket() { |
| 17 // If packet_ is non-null, it means that someone created a MappedPacket using | 17 // If packet_ is non-null, it means that someone created a MappedPacket using |
| 18 // CreateMediaPacket, but they never sent it, and never canceled it. | 18 // CreateMediaPacket, but they never sent it, and never canceled it. |
| 19 // | 19 // |
| 20 // TODO(johngro): Should we maintain a reference to our pipe adapter and just | 20 // TODO(johngro): Should we maintain a reference to our pipe adapter and just |
| 21 // auto cancel this packet if the user forgets? This could be Very Bad if | 21 // auto cancel this packet if the user forgets? This could be Very Bad if |
| 22 // they have created and forgotten about multiple packets. | 22 // they have created and forgotten about multiple packets. |
| 23 MOJO_DCHECK(packet_.is_null()); | 23 MOJO_DCHECK(packet_.is_null()); |
| 24 } | 24 } |
| 25 | 25 |
| 26 CircularBufferMediaPipeAdapter::PacketState::PacketState( | 26 CircularBufferMediaPipeAdapter::PacketState::PacketState( |
| 27 uint64_t post_consume_rd, | 27 uint64_t post_consume_rd, |
| 28 uint32_t seq_num, | 28 uint32_t seq_num, |
| 29 const MediaConsumer::SendPacketCallback& cbk) | 29 const MediaPacketConsumer::SendPacketCallback& cbk) |
| 30 : post_consume_rd_(post_consume_rd), | 30 : post_consume_rd_(post_consume_rd), |
| 31 seq_num_(seq_num), | 31 seq_num_(seq_num), |
| 32 cbk_(cbk) {} | 32 cbk_(cbk) {} |
| 33 CircularBufferMediaPipeAdapter::PacketState::~PacketState() { } | 33 CircularBufferMediaPipeAdapter::PacketState::~PacketState() { } |
| 34 | 34 |
| 35 CircularBufferMediaPipeAdapter::CircularBufferMediaPipeAdapter( | 35 CircularBufferMediaPipeAdapter::CircularBufferMediaPipeAdapter( |
| 36 MediaConsumerPtr pipe) | 36 MediaPacketConsumerPtr pipe) |
| 37 : pipe_(pipe.Pass()) | 37 : pipe_(pipe.Pass()) |
| 38 , thiz_(new CircularBufferMediaPipeAdapter*(this)) { | 38 , thiz_(new CircularBufferMediaPipeAdapter*(this)) { |
| 39 MOJO_DCHECK(pipe_); | 39 MOJO_DCHECK(pipe_); |
| 40 MOJO_DCHECK(RunLoop::current()); | 40 MOJO_DCHECK(RunLoop::current()); |
| 41 | 41 |
| 42 pipe_flush_cbk_ = MediaConsumer::FlushCallback( | 42 pipe_flush_cbk_ = MediaPacketConsumer::FlushCallback( |
| 43 [this] () { | 43 [this] () { |
| 44 HandleFlush(); | 44 HandleFlush(); |
| 45 }); | 45 }); |
| 46 | 46 |
| 47 pipe_.set_connection_error_handler( | 47 pipe_.set_connection_error_handler( |
| 48 [this]() { | 48 [this]() { |
| 49 Fault(MediaResult::CONNECTION_LOST); | 49 Fault(MediaResult::CONNECTION_LOST); |
| 50 }); | 50 }); |
| 51 | 51 |
| 52 std::shared_ptr<CircularBufferMediaPipeAdapter*> thiz(thiz_); | 52 std::shared_ptr<CircularBufferMediaPipeAdapter*> thiz(thiz_); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 | 235 |
| 236 // now that we have moved the write pointer, we may be signalled again. | 236 // now that we have moved the write pointer, we may be signalled again. |
| 237 // Need to re-evaluate. | 237 // Need to re-evaluate. |
| 238 UpdateSignalled(); | 238 UpdateSignalled(); |
| 239 | 239 |
| 240 return MediaResult::OK; | 240 return MediaResult::OK; |
| 241 } | 241 } |
| 242 | 242 |
| 243 MediaResult CircularBufferMediaPipeAdapter::SendMediaPacket( | 243 MediaResult CircularBufferMediaPipeAdapter::SendMediaPacket( |
| 244 MappedPacket* packet, | 244 MappedPacket* packet, |
| 245 const MediaConsumer::SendPacketCallback& cbk) { | 245 const MediaPacketConsumer::SendPacketCallback& cbk) { |
| 246 MOJO_DCHECK(packet && !packet->packet_.is_null()); | 246 MOJO_DCHECK(packet && !packet->packet_.is_null()); |
| 247 if (!packet || packet->packet_.is_null()) { | 247 if (!packet || packet->packet_.is_null()) { |
| 248 return MediaResult::INVALID_ARGUMENT; | 248 return MediaResult::INVALID_ARGUMENT; |
| 249 } | 249 } |
| 250 | 250 |
| 251 const MediaPacketPtr& p = packet->packet_; | 251 const MediaPacketPtr& p = packet->packet_; |
| 252 MOJO_DCHECK(!p->extra_payload.is_null()); | 252 MOJO_DCHECK(!p->extra_payload.is_null()); |
| 253 MOJO_DCHECK(p->extra_payload.size() <= 1u); | 253 MOJO_DCHECK(p->extra_payload.size() <= 1u); |
| 254 | 254 |
| 255 uint64_t post_consume_rd = p->extra_payload.size() | 255 uint64_t post_consume_rd = p->extra_payload.size() |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 | 288 |
| 289 MOJO_DCHECK(post_consume_rd <= buffer_size_); | 289 MOJO_DCHECK(post_consume_rd <= buffer_size_); |
| 290 if (post_consume_rd == buffer_size_) | 290 if (post_consume_rd == buffer_size_) |
| 291 post_consume_rd = 0; | 291 post_consume_rd = 0; |
| 292 | 292 |
| 293 uint32_t seq_num = seq_num_gen_++; | 293 uint32_t seq_num = seq_num_gen_++; |
| 294 in_flight_queue_.emplace_back(post_consume_rd, seq_num, cbk); | 294 in_flight_queue_.emplace_back(post_consume_rd, seq_num, cbk); |
| 295 | 295 |
| 296 pipe_->SendPacket( | 296 pipe_->SendPacket( |
| 297 packet->packet_.Pass(), | 297 packet->packet_.Pass(), |
| 298 [this, seq_num](MediaConsumer::SendResult result) { | 298 [this, seq_num](MediaPacketConsumer::SendResult result) { |
| 299 HandleSendPacket(seq_num, result); | 299 HandleSendPacket(seq_num, result); |
| 300 }); | 300 }); |
| 301 | 301 |
| 302 packet->Reset(); | 302 packet->Reset(); |
| 303 | 303 |
| 304 return MediaResult::OK; | 304 return MediaResult::OK; |
| 305 } | 305 } |
| 306 | 306 |
| 307 MediaResult CircularBufferMediaPipeAdapter::CancelMediaPacket( | 307 MediaResult CircularBufferMediaPipeAdapter::CancelMediaPacket( |
| 308 MappedPacket* packet) { | 308 MappedPacket* packet) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 337 flush_in_progress_ = true; | 337 flush_in_progress_ = true; |
| 338 flush_generation_++; | 338 flush_generation_++; |
| 339 | 339 |
| 340 pipe_->Flush(pipe_flush_cbk_); | 340 pipe_->Flush(pipe_flush_cbk_); |
| 341 | 341 |
| 342 return MediaResult::OK; | 342 return MediaResult::OK; |
| 343 } | 343 } |
| 344 | 344 |
| 345 void CircularBufferMediaPipeAdapter::HandleSendPacket( | 345 void CircularBufferMediaPipeAdapter::HandleSendPacket( |
| 346 uint32_t seq_num, | 346 uint32_t seq_num, |
| 347 MediaConsumer::SendResult result) { | 347 MediaPacketConsumer::SendResult result) { |
| 348 MediaConsumer::SendPacketCallback cbk; | 348 MediaPacketConsumer::SendPacketCallback cbk; |
| 349 | 349 |
| 350 do { | 350 do { |
| 351 // There should be at least one element in the in-flight queue, and the | 351 // There should be at least one element in the in-flight queue, and the |
| 352 // front of the queue's sequence number should match the sequence number of | 352 // front of the queue's sequence number should match the sequence number of |
| 353 // the payload being returned to us. | 353 // the payload being returned to us. |
| 354 if (!in_flight_queue_.size() || | 354 if (!in_flight_queue_.size() || |
| 355 (in_flight_queue_.front().seq_num_ != seq_num)) { | 355 (in_flight_queue_.front().seq_num_ != seq_num)) { |
| 356 Fault(MediaResult::UNKNOWN_ERROR); | 356 Fault(MediaResult::UNKNOWN_ERROR); |
| 357 break; | 357 break; |
| 358 } | 358 } |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 uint64_t CircularBufferMediaPipeAdapter::GetBufferSize() const { | 515 uint64_t CircularBufferMediaPipeAdapter::GetBufferSize() const { |
| 516 if (nullptr == buffer_) | 516 if (nullptr == buffer_) |
| 517 return 0; | 517 return 0; |
| 518 | 518 |
| 519 MOJO_DCHECK(buffer_size_); | 519 MOJO_DCHECK(buffer_size_); |
| 520 return buffer_size_ - 1; | 520 return buffer_size_ - 1; |
| 521 } | 521 } |
| 522 | 522 |
| 523 } // namespace media | 523 } // namespace media |
| 524 } // namespace mojo | 524 } // namespace mojo |
| OLD | NEW |