mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
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:
parent
e6b3f48a06
commit
bdf30c871f
2 changed files with 39 additions and 18 deletions
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue