mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

This is a reland of49734dc0fa
Patchset 2 contains a fix for the fuzzer set up. Since we now parse an RtpPacket out of the fuzzer data, the header needs to be correct, otherwise we fail before even reaching the FEC code that we actually want to test. Bug: webrtc:11340, chromium:1052323, chromium:1055974 TBR=stefan@webrtc.org Original change's description: > Reland "Refactors UlpFec and FlexFec to use a common interface." > > This is a reland of11af1d7444
> > Original change's description: > > Refactors UlpFec and FlexFec to use a common interface. > > > > The new VideoFecGenerator is now injected into RtpSenderVideo, > > and generalizes the usage. > > This also prepares for being able to genera FEC in the RTP egress > > module. > > > > Bug: webrtc:11340 > > Change-Id: I8aa873129b2fb4131eb3399ee88f6ea2747155a3 > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168347 > > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > > Reviewed-by: Sebastian Jansson <srte@webrtc.org> > > Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> > > Commit-Queue: Erik Språng <sprang@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#30515} > > Bug: webrtc:11340, chromium:1052323 > Change-Id: Id646047365f1c46cca9e6f3e8eefa5151207b4a0 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168608 > Commit-Queue: Erik Språng <sprang@webrtc.org> > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#30593} Bug: webrtc:11340, chromium:1052323 Change-Id: Ib8925f44e2edfcfeadc95c845c3bfc23822604ed Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/169222 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30724}
122 lines
4.4 KiB
C++
122 lines
4.4 KiB
C++
/*
|
|
* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
#ifndef MODULES_RTP_RTCP_SOURCE_RTP_PACKET_TO_SEND_H_
|
|
#define MODULES_RTP_RTCP_SOURCE_RTP_PACKET_TO_SEND_H_
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include <vector>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "api/array_view.h"
|
|
#include "api/video/video_timing.h"
|
|
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
|
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
|
|
#include "modules/rtp_rtcp/source/rtp_packet.h"
|
|
|
|
namespace webrtc {
|
|
// Class to hold rtp packet with metadata for sender side.
|
|
class RtpPacketToSend : public RtpPacket {
|
|
public:
|
|
// RtpPacketToSend::Type is deprecated. Use RtpPacketMediaType directly.
|
|
using Type = RtpPacketMediaType;
|
|
|
|
explicit RtpPacketToSend(const ExtensionManager* extensions);
|
|
RtpPacketToSend(const ExtensionManager* extensions, size_t capacity);
|
|
RtpPacketToSend(const RtpPacketToSend& packet);
|
|
RtpPacketToSend(RtpPacketToSend&& packet);
|
|
|
|
RtpPacketToSend& operator=(const RtpPacketToSend& packet);
|
|
RtpPacketToSend& operator=(RtpPacketToSend&& packet);
|
|
|
|
~RtpPacketToSend();
|
|
|
|
// Time in local time base as close as it can to frame capture time.
|
|
int64_t capture_time_ms() const { return capture_time_ms_; }
|
|
|
|
void set_capture_time_ms(int64_t time) { capture_time_ms_ = time; }
|
|
|
|
void set_packet_type(RtpPacketMediaType type) { packet_type_ = type; }
|
|
absl::optional<RtpPacketMediaType> packet_type() const {
|
|
return packet_type_;
|
|
}
|
|
|
|
// If this is a retransmission, indicates the sequence number of the original
|
|
// media packet that this packet represents. If RTX is used this will likely
|
|
// be different from SequenceNumber().
|
|
void set_retransmitted_sequence_number(uint16_t sequence_number) {
|
|
retransmitted_sequence_number_ = sequence_number;
|
|
}
|
|
absl::optional<uint16_t> retransmitted_sequence_number() {
|
|
return retransmitted_sequence_number_;
|
|
}
|
|
|
|
void set_allow_retransmission(bool allow_retransmission) {
|
|
allow_retransmission_ = allow_retransmission;
|
|
}
|
|
bool allow_retransmission() { return allow_retransmission_; }
|
|
|
|
// Additional data bound to the RTP packet for use in application code,
|
|
// outside of WebRTC.
|
|
rtc::ArrayView<const uint8_t> application_data() const {
|
|
return application_data_;
|
|
}
|
|
|
|
void set_application_data(rtc::ArrayView<const uint8_t> data) {
|
|
application_data_.assign(data.begin(), data.end());
|
|
}
|
|
|
|
void set_packetization_finish_time_ms(int64_t time) {
|
|
SetExtension<VideoTimingExtension>(
|
|
VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
|
|
VideoTimingExtension::kPacketizationFinishDeltaOffset);
|
|
}
|
|
|
|
void set_pacer_exit_time_ms(int64_t time) {
|
|
SetExtension<VideoTimingExtension>(
|
|
VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
|
|
VideoTimingExtension::kPacerExitDeltaOffset);
|
|
}
|
|
|
|
void set_network_time_ms(int64_t time) {
|
|
SetExtension<VideoTimingExtension>(
|
|
VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
|
|
VideoTimingExtension::kNetworkTimestampDeltaOffset);
|
|
}
|
|
|
|
void set_network2_time_ms(int64_t time) {
|
|
SetExtension<VideoTimingExtension>(
|
|
VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
|
|
VideoTimingExtension::kNetwork2TimestampDeltaOffset);
|
|
}
|
|
|
|
// Indicates if packet is the first packet of a video frame.
|
|
void set_first_packet_of_frame(bool is_first_packet) {
|
|
is_first_packet_of_frame_ = is_first_packet;
|
|
}
|
|
bool is_first_packet_of_frame() const { return is_first_packet_of_frame_; }
|
|
|
|
// Indicates if packet contains payload for a video key-frame.
|
|
void set_is_key_frame(bool is_key_frame) { is_key_frame_ = is_key_frame; }
|
|
bool is_key_frame() const { return is_key_frame_; }
|
|
|
|
private:
|
|
int64_t capture_time_ms_ = 0;
|
|
absl::optional<RtpPacketMediaType> packet_type_;
|
|
bool allow_retransmission_ = false;
|
|
absl::optional<uint16_t> retransmitted_sequence_number_;
|
|
std::vector<uint8_t> application_data_;
|
|
bool is_first_packet_of_frame_ = false;
|
|
bool is_key_frame_ = false;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
#endif // MODULES_RTP_RTCP_SOURCE_RTP_PACKET_TO_SEND_H_
|