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

Side by Side Diff: media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.cc

Issue 388663003: Cast: Reshuffle files under media/cast (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: missing includes Created 6 years, 5 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h"
6
7 #include "base/big_endian.h"
8 #include "base/logging.h"
9 #include "media/cast/transport/pacing/paced_sender.h"
10
11 namespace media {
12 namespace cast {
13 namespace transport {
14
15 static const uint16 kCommonRtpHeaderLength = 12;
16 static const uint16 kCastRtpHeaderLength = 7;
17 static const uint8 kCastKeyFrameBitMask = 0x80;
18 static const uint8 kCastReferenceFrameIdBitMask = 0x40;
19 static const uint8 kRtpMarkerBitMask = 0x80;
20
21 RtpPacketizerConfig::RtpPacketizerConfig()
22 : payload_type(-1),
23 max_payload_length(kMaxIpPacketSize - 28), // Default is IP-v4/UDP.
24 sequence_number(0),
25 ssrc(0) {}
26
27 RtpPacketizerConfig::~RtpPacketizerConfig() {}
28
29 RtpPacketizer::RtpPacketizer(PacedSender* const transport,
30 PacketStorage* packet_storage,
31 RtpPacketizerConfig rtp_packetizer_config)
32 : config_(rtp_packetizer_config),
33 transport_(transport),
34 packet_storage_(packet_storage),
35 sequence_number_(config_.sequence_number),
36 rtp_timestamp_(0),
37 packet_id_(0),
38 send_packet_count_(0),
39 send_octet_count_(0) {
40 DCHECK(transport) << "Invalid argument";
41 }
42
43 RtpPacketizer::~RtpPacketizer() {}
44
45 uint16 RtpPacketizer::NextSequenceNumber() {
46 ++sequence_number_;
47 return sequence_number_ - 1;
48 }
49
50 void RtpPacketizer::SendFrameAsPackets(const EncodedFrame& frame) {
51 uint16 rtp_header_length = kCommonRtpHeaderLength + kCastRtpHeaderLength;
52 uint16 max_length = config_.max_payload_length - rtp_header_length - 1;
53 rtp_timestamp_ = frame.rtp_timestamp;
54
55 // Split the payload evenly (round number up).
56 size_t num_packets = (frame.data.size() + max_length) / max_length;
57 size_t payload_length = (frame.data.size() + num_packets) / num_packets;
58 DCHECK_LE(payload_length, max_length) << "Invalid argument";
59
60 SendPacketVector packets;
61
62 size_t remaining_size = frame.data.size();
63 std::string::const_iterator data_iter = frame.data.begin();
64 while (remaining_size > 0) {
65 PacketRef packet(new base::RefCountedData<Packet>);
66
67 if (remaining_size < payload_length) {
68 payload_length = remaining_size;
69 }
70 remaining_size -= payload_length;
71 BuildCommonRTPheader(
72 &packet->data, remaining_size == 0, frame.rtp_timestamp);
73
74 // Build Cast header.
75 // TODO(miu): Should we always set the ref frame bit and the ref_frame_id?
76 DCHECK_NE(frame.dependency, EncodedFrame::UNKNOWN_DEPENDENCY);
77 packet->data.push_back(
78 ((frame.dependency == EncodedFrame::KEY) ? kCastKeyFrameBitMask : 0) |
79 kCastReferenceFrameIdBitMask);
80 packet->data.push_back(static_cast<uint8>(frame.frame_id));
81 size_t start_size = packet->data.size();
82 packet->data.resize(start_size + 4);
83 base::BigEndianWriter big_endian_writer(
84 reinterpret_cast<char*>(&(packet->data[start_size])), 4);
85 big_endian_writer.WriteU16(packet_id_);
86 big_endian_writer.WriteU16(static_cast<uint16>(num_packets - 1));
87 packet->data.push_back(static_cast<uint8>(frame.referenced_frame_id));
88
89 // Copy payload data.
90 packet->data.insert(packet->data.end(),
91 data_iter,
92 data_iter + payload_length);
93 data_iter += payload_length;
94
95 const PacketKey key =
96 PacedPacketSender::MakePacketKey(frame.reference_time,
97 config_.ssrc,
98 packet_id_++);
99 packets.push_back(make_pair(key, packet));
100
101 // Update stats.
102 ++send_packet_count_;
103 send_octet_count_ += payload_length;
104 }
105 DCHECK(packet_id_ == num_packets) << "Invalid state";
106
107 packet_storage_->StoreFrame(frame.frame_id, packets);
108
109 // Send to network.
110 transport_->SendPackets(packets);
111
112 // Prepare for next frame.
113 packet_id_ = 0;
114 }
115
116 void RtpPacketizer::BuildCommonRTPheader(Packet* packet,
117 bool marker_bit,
118 uint32 time_stamp) {
119 packet->push_back(0x80);
120 packet->push_back(static_cast<uint8>(config_.payload_type) |
121 (marker_bit ? kRtpMarkerBitMask : 0));
122 size_t start_size = packet->size();
123 packet->resize(start_size + 10);
124 base::BigEndianWriter big_endian_writer(
125 reinterpret_cast<char*>(&((*packet)[start_size])), 10);
126 big_endian_writer.WriteU16(sequence_number_);
127 big_endian_writer.WriteU32(time_stamp);
128 big_endian_writer.WriteU32(config_.ssrc);
129 ++sequence_number_;
130 }
131
132 } // namespace transport
133 } // namespace cast
134 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698