| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_CAST_NET_UDP_PACKET_PIPE_H_ |
| #define MEDIA_CAST_NET_UDP_PACKET_PIPE_H_ |
| |
| #include "media/cast/net/cast_transport_defines.h" |
| #include "media/mojo/common/mojo_data_pipe_read_write.h" |
| |
| namespace media { |
| namespace cast { |
| |
| // Reads UDP packets from the mojo data pipe. Assuming the size of each UDP |
| // packet was written before the packet itself was written into the pipe. |
| class UdpPacketPipeReader { |
| public: |
| explicit UdpPacketPipeReader( |
| mojo::ScopedDataPipeConsumerHandle consumer_handle); |
| |
| UdpPacketPipeReader(const UdpPacketPipeReader&) = delete; |
| UdpPacketPipeReader& operator=(const UdpPacketPipeReader&) = delete; |
| |
| ~UdpPacketPipeReader(); |
| |
| using ReadCB = base::OnceCallback<void(std::unique_ptr<Packet>)>; |
| // Reads one UDP packet from the data pipe. This should only be called when |
| // there is no other reading in process. |
| void Read(ReadCB cb); |
| |
| private: |
| // Reads packet payload from the data pipe. |success| indicates whether the |
| // size of the packet was successfully read from the data pipe. |cb| will be |
| // called after reading is done. |
| void ReadPacketPayload(ReadCB cb, bool success); |
| |
| // Called by |data_pipe_reader_| when the reading completes. |
| void OnPacketRead(std::unique_ptr<Packet> packet, ReadCB cb, bool success); |
| |
| MojoDataPipeReader data_pipe_reader_; |
| |
| uint16_t current_packet_size_; |
| }; |
| |
| // Writes UDP packets into the data mojo pipe. The size of each packet is |
| // written before the packet itself is written into the data pipe. |
| class UdpPacketPipeWriter { |
| public: |
| explicit UdpPacketPipeWriter( |
| mojo::ScopedDataPipeProducerHandle producer_handle); |
| |
| UdpPacketPipeWriter(const UdpPacketPipeWriter&) = delete; |
| UdpPacketPipeWriter& operator=(const UdpPacketPipeWriter&) = delete; |
| |
| ~UdpPacketPipeWriter(); |
| |
| // Writes the |packet| into the mojo data pipe. |done_cb| will be |
| // called when the writing completes. This should only be called when there is |
| // no other writing in process. |
| void Write(PacketRef packet, base::OnceClosure done_cb); |
| |
| private: |
| // Writes the |packet| payload in the data pipe. |success| indicates whether |
| // the size of the packet was successfully written in the data pipe. |done_cb| |
| // will be called after writing is done. |
| void WritePacketPayload(PacketRef packet, |
| base::OnceClosure done_cb, |
| bool success); |
| |
| // Called by |data_pipe_writer_| when the writing completes. |
| void OnPacketWritten(PacketRef packet, |
| base::OnceClosure done_cb, |
| bool success); |
| |
| MojoDataPipeWriter data_pipe_writer_; |
| |
| uint16_t current_packet_size_ = 0; |
| }; |
| |
| } // namespace cast |
| } // namespace media |
| |
| #endif // MEDIA_CAST_NET_UDP_PACKET_PIPE_H_ |