Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Unified Diff: remoting/protocol/rtp_video_writer.cc

Issue 4925001: Packetizer/Depacketizer for RTP. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/protocol/rtp_video_reader.cc ('k') | remoting/protocol/rtp_writer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
« no previous file with comments | « remoting/protocol/rtp_video_reader.cc ('k') | remoting/protocol/rtp_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698