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

Unified Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc

Issue 1739273002: [Draft] RtpPacket sketched. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase to use landed version of rtp::Packet Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
index d617f10dad815124be0ad782ec58b83dd1e97a2a..e0e290f71d549f1fd3d5cb758fc041345f24d663 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -24,11 +24,12 @@
#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h"
#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
+#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
namespace webrtc {
enum { REDForFECHeaderLength = 1 };
-RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender)
+RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSender* rtpSender)
: _rtpSender(*rtpSender),
_videoType(kRtpVideoGeneric),
_retransmissionSettings(kRetransmitBaseLayer),
@@ -84,17 +85,16 @@ RtpUtility::Payload* RTPSenderVideo::CreateVideoPayload(
return payload;
}
-void RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
- const size_t payload_length,
- const size_t rtp_header_length,
- uint16_t seq_num,
- const uint32_t capture_timestamp,
- int64_t capture_time_ms,
+void RTPSenderVideo::SendVideoPacket(std::unique_ptr<RtpPacketToSend> packet,
StorageType storage) {
- if (_rtpSender.SendToNetwork(data_buffer, payload_length, rtp_header_length,
- capture_time_ms, storage,
- RtpPacketSender::kLowPriority) == 0) {
- _videoBitrate.Update(payload_length + rtp_header_length);
+ size_t packet_size = packet->size();
+ size_t payload_size = packet->payload_size();
+ uint16_t seq_num = packet->SequenceNumber();
+ uint32_t capture_timestamp = packet->Timestamp();
+ int64_t capture_time_ms = packet->capture_time_ms();
+ if (_rtpSender.SendToNetwork(std::move(packet), payload_size, capture_time_ms,
+ storage, RtpPacketSender::kLowPriority) == 0) {
+ _videoBitrate.Update(packet_size);
TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
"Video::PacketNormal", "timestamp", capture_timestamp,
"seqnum", seq_num);
@@ -103,14 +103,13 @@ void RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer,
}
}
-void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer,
- const size_t payload_length,
- const size_t rtp_header_length,
- uint16_t media_seq_num,
- const uint32_t capture_timestamp,
- int64_t capture_time_ms,
- StorageType media_packet_storage,
- bool protect) {
+void RTPSenderVideo::SendVideoPacketAsRed(
+ std::unique_ptr<RtpPacketToSend> packet,
+ StorageType media_packet_storage,
+ bool protect) {
+ uint16_t media_seq_num = packet->SequenceNumber();
+ uint32_t capture_timestamp = packet->Timestamp();
+ int64_t capture_time_ms = packet->capture_time_ms();
rtc::scoped_ptr<RedPacket> red_packet;
std::vector<RedPacket*> fec_packets;
StorageType fec_storage = kDontRetransmit;
@@ -119,10 +118,11 @@ void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer,
// Only protect while creating RED and FEC packets, not when sending.
rtc::CritScope cs(&crit_);
red_packet.reset(producer_fec_.BuildRedPacket(
- data_buffer, payload_length, rtp_header_length, red_payload_type_));
+ packet->data(), packet->payload_size(), packet->headers_size(),
+ red_payload_type_));
if (protect) {
- producer_fec_.AddRtpPacketAndGenerateFec(data_buffer, payload_length,
- rtp_header_length);
+ producer_fec_.AddRtpPacketAndGenerateFec(
+ packet->data(), packet->payload_size(), packet->headers_size());
}
uint16_t num_fec_packets = producer_fec_.NumAvailableFecPackets();
if (num_fec_packets > 0) {
@@ -130,16 +130,18 @@ void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer,
_rtpSender.AllocateSequenceNumber(num_fec_packets);
fec_packets = producer_fec_.GetFecPackets(
red_payload_type_, fec_payload_type_, next_fec_sequence_number,
- rtp_header_length);
+ packet->headers_size());
RTC_DCHECK_EQ(num_fec_packets, fec_packets.size());
if (_retransmissionSettings & kRetransmitFECPackets)
fec_storage = kAllowRetransmission;
}
}
- if (_rtpSender.SendToNetwork(
- red_packet->data(), red_packet->length() - rtp_header_length,
- rtp_header_length, capture_time_ms, media_packet_storage,
- RtpPacketSender::kLowPriority) == 0) {
+ std::unique_ptr<RtpPacketToSend> rtp_packet = _rtpSender.CreatePacket();
+ rtp_packet->Parse(red_packet->data(), red_packet->length());
+ size_t red_payload_size = rtp_packet->size() - packet->headers_size();
+ if (_rtpSender.SendToNetwork(std::move(rtp_packet), red_payload_size,
+ capture_time_ms, media_packet_storage,
+ RtpPacketSender::kLowPriority) == 0) {
_videoBitrate.Update(red_packet->length());
TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
"Video::PacketRed", "timestamp", capture_timestamp,
@@ -148,10 +150,12 @@ void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer,
LOG(LS_WARNING) << "Failed to send RED packet " << media_seq_num;
}
for (RedPacket* fec_packet : fec_packets) {
- if (_rtpSender.SendToNetwork(
- fec_packet->data(), fec_packet->length() - rtp_header_length,
- rtp_header_length, capture_time_ms, fec_storage,
- RtpPacketSender::kLowPriority) == 0) {
+ rtp_packet = _rtpSender.CreatePacket();
+ rtp_packet->Parse(fec_packet->data(), fec_packet->length());
+ size_t fec_payload_size = rtp_packet->size() - packet->headers_size();
+ if (_rtpSender.SendToNetwork(std::move(rtp_packet), fec_payload_size,
+ capture_time_ms, fec_storage,
+ RtpPacketSender::kLowPriority) == 0) {
_fecOverheadRate.Update(fec_packet->length());
TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
"Video::PacketFec", "timestamp", capture_timestamp,
@@ -224,8 +228,17 @@ int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType,
return -1;
}
+ // Register CVO rtp header extension at the first time when we receive a frame
+ // with pending rotation.
+ RTPSenderInterface::CVOMode cvo_mode = RTPSenderInterface::kCVONone;
+ if (video_header && video_header->rotation != kVideoRotation_0) {
+ cvo_mode = _rtpSender.ActivateCVORtpHeaderExtension();
+ }
+
+ size_t max_data_payload_size = _rtpSender.MaxDataPayloadLength();
+
rtc::scoped_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create(
- videoType, _rtpSender.MaxDataPayloadLength(),
+ videoType, max_data_payload_size,
video_header ? &(video_header->codecHeader) : nullptr, frameType));
StorageType storage;
@@ -240,14 +253,6 @@ int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType,
fec_enabled = fec_enabled_;
}
- // Register CVO rtp header extension at the first time when we receive a frame
- // with pending rotation.
- RTPSenderInterface::CVOMode cvo_mode = RTPSenderInterface::kCVONone;
- if (video_header && video_header->rotation != kVideoRotation_0) {
- cvo_mode = _rtpSender.ActivateCVORtpHeaderExtension();
- }
-
- uint16_t rtp_header_length = _rtpSender.RTPHeaderLength();
size_t payload_bytes_to_send = payloadSize;
const uint8_t* data = payloadData;
@@ -262,17 +267,11 @@ int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType,
bool first = true;
bool last = false;
while (!last) {
- uint8_t dataBuffer[IP_PACKET_SIZE] = {0};
- size_t payload_bytes_in_packet = 0;
- if (!packetizer->NextPacket(&dataBuffer[rtp_header_length],
- &payload_bytes_in_packet, &last)) {
- return -1;
- }
+ std::unique_ptr<RtpPacketToSend> packet = _rtpSender.CreatePacket();
+ _rtpSender.BuildRtpHeader(packet.get(), captureTimeStamp, true);
+ packet->SetPayloadType(payloadType);
+ packet->set_capture_time_ms(capture_time_ms);
- // Write RTP header.
- // Set marker bit true if this is the last packet in frame.
- _rtpSender.BuildRTPheader(
- dataBuffer, payloadType, last, captureTimeStamp, capture_time_ms);
// According to
// http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
// ts_126114v120700p.pdf Section 7.4.5:
@@ -293,22 +292,26 @@ int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType,
// TODO(guoweis): For now, all packets sent will carry the CVO such that
// the RTP header length is consistent, although the receiver side will
// only exam the packets with marker bit set.
- size_t packetSize = payloadSize + rtp_header_length;
- RtpUtility::RtpHeaderParser rtp_parser(dataBuffer, packetSize);
- RTPHeader rtp_header;
- rtp_parser.Parse(&rtp_header);
- _rtpSender.UpdateVideoRotation(dataBuffer, packetSize, rtp_header,
- video_header->rotation);
+ packet->SetExtension<VideoOrientation>(video_header->rotation);
}
+
+ uint8_t* payload = packet->AllocatePayload(max_data_payload_size);
+ size_t payload_bytes_in_packet = 0;
+ if (!packetizer->NextPacket(payload, &payload_bytes_in_packet, &last)) {
+ return -1;
+ }
+ RTC_DCHECK_LE(payload_bytes_in_packet, max_data_payload_size);
+ packet->SetPayloadSize(payload_bytes_in_packet);
+ // Set marker bit true if this is the last packet in frame.
+ if (last) {
+ packet->SetMarker(true);
+ }
+
if (fec_enabled) {
- SendVideoPacketAsRed(dataBuffer, payload_bytes_in_packet,
- rtp_header_length, _rtpSender.SequenceNumber(),
- captureTimeStamp, capture_time_ms, storage,
+ SendVideoPacketAsRed(std::move(packet), storage,
packetizer->GetProtectionType() == kProtectedPacket);
} else {
- SendVideoPacket(dataBuffer, payload_bytes_in_packet, rtp_header_length,
- _rtpSender.SequenceNumber(), captureTimeStamp,
- capture_time_ms, storage);
+ SendVideoPacket(std::move(packet), storage);
}
if (first_frame) {
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698