Revert "Measure wall clock time of capture and encode processing."

This reverts commit 8039cdbe48.

Reason for revert: remove functionality after measurement complete

Original change's description:
> Measure wall clock time of capture and encode processing.
>
> (NOTE: This and dependent CLs will be reverted in a few days after
> data collection from the field is complete.)
>
> This change introduces a new task queue concept, Voucher. They
> are associated with a currently running task tree. Whenever
> tasks are posted, the current voucher is inherited and set as
> current in the new task.
>
> The voucher exists for as long as there are direct and indirect
> tasks running that descend from the task where the voucher was
> created.
>
> Vouchers aggregate application-specific attachments, which perform
> logic unrelated to Voucher progression. This particular change adds
> an attachment that measures time from capture to all encode operations
> complete, and places it into the WebRTC.Video.CaptureToSendTimeMs UMA.
>
> An accompanying Chrome change crrev.com/c/4992282 ensures survival of
> vouchers across certain Mojo IPC.
>
> Bug: chromium:1498378
> Change-Id: I2a27800a4e5504f219d8b9d33c56a48904cf6dde
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/325400
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Commit-Queue: Markus Handell <handellm@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#41061}

Bug: chromium:1498378
Change-Id: I9503575fbc52f1946ca26fc3c17b623ea75cd3c5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/327023
Commit-Queue: Markus Handell <handellm@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#41135}
This commit is contained in:
Markus Handell 2023-11-10 18:18:19 +00:00 committed by WebRTC LUCI CQ
parent 0cb9b28e5b
commit 9c69c4625b
8 changed files with 3 additions and 233 deletions

View file

@ -20,7 +20,6 @@ rtc_library("task_queue") {
"..:location", "..:location",
"../../rtc_base:checks", "../../rtc_base:checks",
"../../rtc_base:macromagic", "../../rtc_base:macromagic",
"../../rtc_base:voucher",
"../../rtc_base/system:rtc_export", "../../rtc_base/system:rtc_export",
"../units:time_delta", "../units:time_delta",
] ]

View file

@ -14,7 +14,6 @@
#include "absl/functional/any_invocable.h" #include "absl/functional/any_invocable.h"
#include "api/units/time_delta.h" #include "api/units/time_delta.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "rtc_base/voucher.h"
#if defined(ABSL_HAVE_THREAD_LOCAL) #if defined(ABSL_HAVE_THREAD_LOCAL)
@ -29,23 +28,6 @@ TaskQueueBase* TaskQueueBase::Current() {
return current; return current;
} }
void TaskQueueBase::PostTask(absl::AnyInvocable<void() &&> task,
const Location& location) {
PostTaskInternal(std::move(task), PostTaskTraits{}, location);
}
void TaskQueueBase::PostTaskInternal(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& traits,
const Location& location) {
auto current = Voucher::Current();
PostTaskImpl(
[task = std::move(task), current = std::move(current)]() mutable {
Voucher::ScopedSetter setter(std::move(current));
std::move(task)();
},
traits, location);
}
TaskQueueBase::CurrentTaskQueueSetter::CurrentTaskQueueSetter( TaskQueueBase::CurrentTaskQueueSetter::CurrentTaskQueueSetter(
TaskQueueBase* task_queue) TaskQueueBase* task_queue)
: previous_(current) { : previous_(current) {

View file

@ -64,7 +64,9 @@ class RTC_LOCKABLE RTC_EXPORT TaskQueueBase {
// //
// May be called on any thread or task queue, including this task queue. // May be called on any thread or task queue, including this task queue.
void PostTask(absl::AnyInvocable<void() &&> task, void PostTask(absl::AnyInvocable<void() &&> task,
const Location& location = Location::Current()); const Location& location = Location::Current()) {
PostTaskImpl(std::move(task), PostTaskTraits{}, location);
}
// Prefer PostDelayedTask() over PostDelayedHighPrecisionTask() whenever // Prefer PostDelayedTask() over PostDelayedHighPrecisionTask() whenever
// possible. // possible.
@ -185,11 +187,6 @@ class RTC_LOCKABLE RTC_EXPORT TaskQueueBase {
// Users of the TaskQueue should call Delete instead of directly deleting // Users of the TaskQueue should call Delete instead of directly deleting
// this object. // this object.
virtual ~TaskQueueBase() = default; virtual ~TaskQueueBase() = default;
private:
void PostTaskInternal(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& traits,
const Location& location);
}; };
struct TaskQueueDeleter { struct TaskQueueDeleter {

View file

@ -1453,21 +1453,6 @@ rtc_library("crc32") {
absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
} }
rtc_library("voucher") {
sources = [
"voucher.cc",
"voucher.h",
]
deps = [
":macromagic",
":refcount",
"../api:make_ref_counted",
"synchronization:mutex",
"system:rtc_export",
]
absl_deps = [ "//third_party/abseil-cpp/absl/container:inlined_vector" ]
}
rtc_library("stream") { rtc_library("stream") {
visibility = [ "*" ] visibility = [ "*" ]
sources = [ sources = [

View file

@ -1,80 +0,0 @@
/*
* Copyright 2023 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.
*/
#include "rtc_base/voucher.h"
#include <memory>
#include <utility>
#include "api/make_ref_counted.h"
namespace webrtc {
namespace {
rtc::FinalRefCountedObject<Voucher>*& CurrentVoucherStorage() {
static thread_local rtc::FinalRefCountedObject<Voucher>* storage = nullptr;
return storage;
}
} // namespace
Voucher::ScopedSetter::ScopedSetter(Ptr voucher)
: old_current_(Voucher::Current()) {
Voucher::SetCurrent(std::move(voucher));
}
Voucher::ScopedSetter::~ScopedSetter() {
Voucher::SetCurrent(std::move(old_current_));
}
Voucher::Attachment::Id Voucher::Attachment::GetNextId() {
static std::atomic<Voucher::Attachment::Id> current_id = 0;
auto id = current_id.fetch_add(1);
RTC_CHECK(id < Voucher::kAttachmentCapacity);
return id;
}
Voucher::Ptr Voucher::CurrentOrCreateForCurrentTask() {
auto& storage = CurrentVoucherStorage();
Voucher::Ptr result(storage);
if (!result) {
result = rtc::make_ref_counted<Voucher>();
storage = result.get();
storage->AddRef();
}
return result;
}
Voucher::Ptr Voucher::Current() {
auto& storage = CurrentVoucherStorage();
Voucher::Ptr result(storage);
return result;
}
Voucher::Voucher() : attachments_(Voucher::kAttachmentCapacity) {}
void Voucher::SetCurrent(Voucher::Ptr value) {
auto& storage = CurrentVoucherStorage();
if (value.get() != storage) {
if (storage) {
storage->Release();
}
storage = value.release();
}
}
void Voucher::SetAttachment(Attachment::Id id,
std::unique_ptr<Attachment> attachment) {
RTC_CHECK(id < kAttachmentCapacity);
MutexLock lock(&mu_);
attachments_[id] = std::move(attachment);
}
} // namespace webrtc

View file

@ -1,78 +0,0 @@
/*
* Copyright 2023 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 RTC_BASE_VOUCHER_H_
#define RTC_BASE_VOUCHER_H_
#include <memory>
#include "absl/container/inlined_vector.h"
#include "rtc_base/ref_counted_object.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/system/rtc_export.h"
namespace webrtc {
// A voucher is associated with a currently running task tree. Whenever tasks
// are posted, the current voucher is inherited and set as current in the new
// task. The voucher exists for as long as there are direct and indirect
// tasks running that descend from the task where the voucher was created.
class RTC_EXPORT Voucher {
public:
static constexpr size_t kAttachmentCapacity = 4;
using Ptr = rtc::scoped_refptr<rtc::FinalRefCountedObject<Voucher>>;
// Vouchers aggregate attachments, which are application-specific attachments
// that have logic unrelated to the mechanics of Voucher progression.
class Attachment {
public:
using Id = size_t;
// Attachments should call this function one to get an ID to use with
// SetAttachment.
static Attachment::Id GetNextId();
virtual ~Attachment() = default;
};
// Scoped setter that saves the current voucher on stack and instates a new
// one, until the scope exits.
class ScopedSetter {
public:
explicit ScopedSetter(Ptr voucher);
~ScopedSetter();
private:
Ptr old_current_;
};
static Ptr Current();
static Ptr CurrentOrCreateForCurrentTask();
// For Attachments: stores an attachment into a voucher. If one is already
// present, it gets replaced.
void SetAttachment(Attachment::Id id, std::unique_ptr<Attachment> attachment);
private:
friend class rtc::FinalRefCountedObject<webrtc::Voucher>;
Voucher();
friend class ScopedSetter;
static void SetCurrent(Ptr ptr);
Mutex mu_;
absl::InlinedVector<std::unique_ptr<Attachment>, kAttachmentCapacity>
attachments_ RTC_GUARDED_BY(&mu_);
};
} // namespace webrtc
#endif // RTC_BASE_VOUCHER_H_

View file

@ -448,7 +448,6 @@ rtc_library("video_stream_encoder_impl") {
"../rtc_base:safe_conversions", "../rtc_base:safe_conversions",
"../rtc_base:stringutils", "../rtc_base:stringutils",
"../rtc_base:timeutils", "../rtc_base:timeutils",
"../rtc_base:voucher",
"../rtc_base/experiments:balanced_degradation_settings", "../rtc_base/experiments:balanced_degradation_settings",
"../rtc_base/experiments:encoder_info_settings", "../rtc_base/experiments:encoder_info_settings",
"../rtc_base/experiments:field_trial_parser", "../rtc_base/experiments:field_trial_parser",

View file

@ -49,9 +49,7 @@
#include "rtc_base/strings/string_builder.h" #include "rtc_base/strings/string_builder.h"
#include "rtc_base/system/no_unique_address.h" #include "rtc_base/system/no_unique_address.h"
#include "rtc_base/thread_annotations.h" #include "rtc_base/thread_annotations.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/trace_event.h" #include "rtc_base/trace_event.h"
#include "rtc_base/voucher.h"
#include "system_wrappers/include/metrics.h" #include "system_wrappers/include/metrics.h"
#include "video/adaptation/video_stream_encoder_resource_manager.h" #include "video/adaptation/video_stream_encoder_resource_manager.h"
#include "video/alignment_adjuster.h" #include "video/alignment_adjuster.h"
@ -85,35 +83,6 @@ constexpr int kMaxAnimationPixels = 1280 * 720;
constexpr int kDefaultMinScreenSharebps = 1200000; constexpr int kDefaultMinScreenSharebps = 1200000;
// This voucher attachment measures the time from a passed capture reference
// time to the time when the voucher is destroyed.
class CaptureProcessingDurationMeasurement : public Voucher::Attachment {
public:
static void AttachToCurrentVoucher(Timestamp capture_reference_time) {
static const Voucher::Attachment::Id kCaptureToEncodeAttachmentId =
Voucher::Attachment::GetNextId();
auto voucher = Voucher::CurrentOrCreateForCurrentTask();
voucher->SetAttachment(
kCaptureToEncodeAttachmentId,
std::make_unique<CaptureProcessingDurationMeasurement>(
capture_reference_time));
}
explicit CaptureProcessingDurationMeasurement(
Timestamp capture_reference_time)
: capture_reference_time_(capture_reference_time) {}
~CaptureProcessingDurationMeasurement() override {
auto duration =
Clock::GetRealTimeClock()->CurrentTime() - capture_reference_time_;
TRACE_EVENT1("webrtc", "CaptureProcessingDurationMeasurement", "duration",
duration.us());
RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.CaptureToSendTimeMs",
duration.ms());
}
private:
const Timestamp capture_reference_time_;
};
int GetNumSpatialLayers(const VideoCodec& codec) { int GetNumSpatialLayers(const VideoCodec& codec) {
if (codec.codecType == kVideoCodecVP9) { if (codec.codecType == kVideoCodecVP9) {
return codec.VP9().numberOfSpatialLayers; return codec.VP9().numberOfSpatialLayers;
@ -2065,9 +2034,6 @@ void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame,
frame_encode_metadata_writer_.OnEncodeStarted(out_frame); frame_encode_metadata_writer_.OnEncodeStarted(out_frame);
CaptureProcessingDurationMeasurement::AttachToCurrentVoucher(
out_frame.reference_time().value_or(clock_->CurrentTime()));
const int32_t encode_status = encoder_->Encode(out_frame, &next_frame_types_); const int32_t encode_status = encoder_->Encode(out_frame, &next_frame_types_);
was_encode_called_since_last_initialization_ = true; was_encode_called_since_last_initialization_ = true;