Ensure VideoRtpReplayer use new PacketReceiver::DeliverRtp packet.

Receivers no longer need to set extensions in the configuration. That field will be removed in a follow up.

Tested with:
video_loopback --rtp_dump_name="./my.rtpdump" --duration=10
video_replay --input_file=./my.rtpdump

Bug: webrtc:14795
Change-Id: I952cd487cb2f3be8be01a90f6a2312f1fef5d93e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/290995
Auto-Submit: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39136}
This commit is contained in:
Per K 2023-01-18 09:49:28 +01:00 committed by WebRTC LUCI CQ
parent e6b3f48a06
commit bdf30c871f
2 changed files with 39 additions and 18 deletions

View File

@ -247,10 +247,12 @@ if (!is_component_build) {
sources = [ "video_replay.cc" ]
deps = [
"../api:field_trials",
"../api:rtp_parameters",
"../api/rtc_event_log",
"../api/task_queue:default_task_queue_factory",
"../api/test/video:function_video_factory",
"../api/transport:field_trial_based_config",
"../api/units:timestamp",
"../api/video:video_frame",
"../api/video_codecs:video_codecs_api",
"../call",

View File

@ -17,16 +17,20 @@
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "api/field_trials.h"
#include "api/media_types.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/test/video/function_video_decoder_factory.h"
#include "api/transport/field_trial_based_config.h"
#include "api/units/timestamp.h"
#include "api/video/video_codec_type.h"
#include "api/video_codecs/video_decoder.h"
#include "call/call.h"
#include "common_video/libyuv/include/webrtc_libyuv.h"
#include "media/engine/internal_decoder_factory.h"
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
#include "modules/rtp_rtcp/source/rtp_packet.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_util.h"
#include "modules/video_coding/utility/ivf_file_writer.h"
#include "rtc_base/checks.h"
@ -401,15 +405,6 @@ std::unique_ptr<StreamState> ConfigureFromFlags(
stream_state->flexfec_streams.push_back(flexfec_stream);
}
if (absl::GetFlag(FLAGS_transmission_offset_id) != -1) {
receive_config.rtp.extensions.push_back(
RtpExtension(RtpExtension::kTimestampOffsetUri,
absl::GetFlag(FLAGS_transmission_offset_id)));
}
if (absl::GetFlag(FLAGS_abs_send_time_id) != -1) {
receive_config.rtp.extensions.push_back(RtpExtension(
RtpExtension::kAbsSendTimeUri, absl::GetFlag(FLAGS_abs_send_time_id)));
}
receive_config.renderer = stream_state->sinks.back().get();
// Setup the receiving stream
@ -554,12 +549,24 @@ class RtpReplayer final {
private:
void ReplayPackets() {
enum class Result { kOk, kUnknownSsrc, kParsingFailed };
int64_t replay_start_ms = -1;
int num_packets = 0;
std::map<uint32_t, int> unknown_packets;
rtc::Event event(/*manual_reset=*/false, /*initially_signalled=*/false);
uint32_t start_timestamp = absl::GetFlag(FLAGS_start_timestamp);
uint32_t stop_timestamp = absl::GetFlag(FLAGS_stop_timestamp);
RtpHeaderExtensionMap extensions;
if (absl::GetFlag(FLAGS_transmission_offset_id) != -1) {
extensions.RegisterByUri(absl::GetFlag(FLAGS_transmission_offset_id),
RtpExtension::kTimestampOffsetUri);
}
if (absl::GetFlag(FLAGS_abs_send_time_id) != -1) {
extensions.RegisterByUri(absl::GetFlag(FLAGS_abs_send_time_id),
RtpExtension::kAbsSendTimeUri);
}
while (true) {
int64_t now_ms = CurrentTimeMs();
if (replay_start_ms == -1) {
@ -592,27 +599,39 @@ class RtpReplayer final {
SleepOrAdvanceTime(deliver_in_ms);
++num_packets;
PacketReceiver::DeliveryStatus result = PacketReceiver::DELIVERY_OK;
Result result = Result::kOk;
worker_thread_->PostTask([&]() {
MediaType media_type =
IsRtcpPacket(packet_buffer) ? MediaType::ANY : MediaType::VIDEO;
result = call_->Receiver()->DeliverPacket(media_type,
std::move(packet_buffer),
/* packet_time_us */ -1);
if (IsRtcpPacket(packet_buffer)) {
call_->Receiver()->DeliverRtcpPacket(std::move(packet_buffer));
}
RtpPacketReceived received_packet(&extensions,
Timestamp::Millis(CurrentTimeMs()));
if (!received_packet.Parse(std::move(packet_buffer))) {
result = Result::kParsingFailed;
return;
}
call_->Receiver()->DeliverRtpPacket(
MediaType::VIDEO, received_packet,
[&result](const RtpPacketReceived& parsed_packet) -> bool {
result = Result::kUnknownSsrc;
// No point in trying to demux again.
return false;
});
event.Set();
});
event.Wait(/*give_up_after=*/TimeDelta::Seconds(10));
switch (result) {
case PacketReceiver::DELIVERY_OK:
case Result::kOk:
break;
case PacketReceiver::DELIVERY_UNKNOWN_SSRC: {
case Result::kUnknownSsrc: {
if (unknown_packets[header.Ssrc()] == 0)
fprintf(stderr, "Unknown SSRC: %u!\n", header.Ssrc());
++unknown_packets[header.Ssrc()];
break;
}
case PacketReceiver::DELIVERY_PACKET_ERROR: {
case Result::kParsingFailed: {
fprintf(stderr,
"Packet error, corrupt packets or incorrect setup?\n");
fprintf(stderr, "Packet len=%zu pt=%u seq=%u ts=%u ssrc=0x%8x\n",