Index: remoting/protocol/rtp_video_writer.cc |
diff --git a/remoting/protocol/rtp_video_writer.cc b/remoting/protocol/rtp_video_writer.cc |
index 1aefbe86c254ebc6ac156fadb18b8e45e1a496d3..146752c1143be0172b924c6d2622fb8087a8c865 100644 |
--- a/remoting/protocol/rtp_video_writer.cc |
+++ b/remoting/protocol/rtp_video_writer.cc |
@@ -13,6 +13,10 @@ |
namespace remoting { |
namespace protocol { |
+namespace { |
+const int kMtu = 1200; |
+} // namespace |
+ |
RtpVideoWriter::RtpVideoWriter() { } |
RtpVideoWriter::~RtpVideoWriter() { } |
@@ -22,17 +26,65 @@ void RtpVideoWriter::Init(protocol::Session* session) { |
} |
void RtpVideoWriter::SendPacket(const VideoPacket& packet) { |
+ CHECK(packet.format().encoding() == VideoPacketFormat::ENCODING_VP8) |
+ << "Only VP8 is supported in RTP."; |
+ |
CompoundBuffer payload; |
+ // TODO(sergeyu): This copy would not be necessary CompoundBuffer was used |
+ // inside of VideoPacket. |
payload.AppendCopyOf(packet.data().data(), packet.data().size()); |
- rtp_writer_.SendPacket(payload, packet.timestamp()); |
+ Vp8Descriptor vp8_desriptor; |
+ // TODO(sergeyu): Add a flag in VideoPacket that indicates whether this is a |
+ // key frame or not. |
+ vp8_desriptor.non_reference_frame = false; |
+ vp8_desriptor.picture_id = kuint32max; |
+ |
+ int position = 0; |
+ while (position < payload.total_bytes()) { |
+ int size = std::min(kMtu, payload.total_bytes() - position); |
+ |
+ // Frame beginning flag is set only for the first packet in the first |
+ // partition. |
+ vp8_desriptor.frame_beginning = |
+ (packet.flags() & VideoPacket::FIRST_PACKET) != 0 && position == 0; |
+ |
+ // Marker bit is set only for the last packet in the last partition. |
+ bool marker = (position + size) == payload.total_bytes() && |
+ (packet.flags() & VideoPacket::LAST_PACKET) != 0; |
+ |
+ // Set fragmentation flag appropriately. |
+ if (position == 0) { |
+ if (size == payload.total_bytes()) { |
+ vp8_desriptor.fragmentation_info = Vp8Descriptor::NOT_FRAGMENTED; |
+ } else { |
+ vp8_desriptor.fragmentation_info = Vp8Descriptor::FIRST_FRAGMENT; |
+ } |
+ } else { |
+ if (position + size == payload.total_bytes()) { |
+ vp8_desriptor.fragmentation_info = Vp8Descriptor::LAST_FRAGMENT; |
+ } else { |
+ vp8_desriptor.fragmentation_info = Vp8Descriptor::MIDDLE_FRAGMENT; |
+ } |
+ } |
+ |
+ // Create CompoundBuffer for the chunk. |
+ CompoundBuffer chunk; |
+ chunk.CopyFrom(payload, position, position + size); |
+ |
+ // And send it. |
+ rtp_writer_.SendPacket(packet.timestamp(), marker, vp8_desriptor, chunk); |
+ |
+ position += size; |
+ } |
+ |
+ DCHECK_EQ(position, payload.total_bytes()); |
} |
int RtpVideoWriter::GetPendingPackets() { |
return rtp_writer_.GetPendingPackets(); |
} |
- |
void RtpVideoWriter::Close() { |
rtp_writer_.Close(); |
} |