1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/peerconnection/peer_connection_util.h"
#include <cmath>
#include "base/time/time.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/timing/dom_window_performance.h"
#include "third_party/blink/renderer/core/timing/performance.h"
#include "third_party/blink/renderer/core/timing/worker_global_scope_performance.h"
#include "third_party/blink/renderer/core/workers/worker_global_scope.h"
namespace blink {
namespace {
// Time between the NTP and Unix epochs.
// unix_time = ntp_time - kNtpUnixEpochOffset
// ntp_time = unix_time + kNtpUnixEpochOffset
constexpr base::TimeDelta kNtpUnixEpochOffset =
base::Milliseconds(2208988800000);
Performance* GetPerformanceFromExecutionContext(ExecutionContext* context) {
if (auto* window = DynamicTo<LocalDOMWindow>(context)) {
return DOMWindowPerformance::performance(*window);
} else if (auto* worker = DynamicTo<WorkerGlobalScope>(context)) {
return WorkerGlobalScopePerformance::performance(*worker);
}
NOTREACHED();
}
DOMHighResTimeStamp RTCEncodedFrameTimestampFromUnixRealClock(
ExecutionContext* context,
base::TimeDelta time_since_unix_epoch) {
Performance* performance = GetPerformanceFromExecutionContext(context);
return Performance::ClampTimeResolution(
time_since_unix_epoch - base::Milliseconds(performance->timeOrigin()),
performance->CrossOriginIsolatedCapability());
}
} // namespace
DOMHighResTimeStamp RTCEncodedFrameTimestampFromTimeTicks(
ExecutionContext* context,
base::TimeTicks timestamp) {
Performance* performance = GetPerformanceFromExecutionContext(context);
return Performance::MonotonicTimeToDOMHighResTimeStamp(
performance->GetTimeOriginInternal(), timestamp,
/*allow_negative_value=*/true,
performance->CrossOriginIsolatedCapability());
}
DOMHighResTimeStamp RTCEncodedFrameTimestampFromCaptureTimeInfo(
ExecutionContext* context,
CaptureTimeInfo capture_time_info) {
switch (capture_time_info.clock_type) {
case CaptureTimeInfo::ClockType::kTimeTicks:
return RTCEncodedFrameTimestampFromTimeTicks(
context, base::TimeTicks() + capture_time_info.capture_time);
case CaptureTimeInfo::ClockType::kNtpRealClock:
base::TimeDelta time_since_unix_epoch =
capture_time_info.capture_time - kNtpUnixEpochOffset;
return RTCEncodedFrameTimestampFromUnixRealClock(context,
time_since_unix_epoch);
}
}
base::TimeDelta RTCEncodedFrameTimestampToCaptureTime(
ExecutionContext* context,
DOMHighResTimeStamp timestamp,
CaptureTimeInfo::ClockType clock_type) {
Performance* performance = GetPerformanceFromExecutionContext(context);
switch (clock_type) {
case CaptureTimeInfo::ClockType::kTimeTicks:
return (performance->GetTimeOriginInternal() +
base::Milliseconds(timestamp))
.since_origin();
case CaptureTimeInfo::ClockType::kNtpRealClock:
return kNtpUnixEpochOffset +
base::Milliseconds(performance->timeOrigin() + timestamp);
}
}
DOMHighResTimeStamp CalculateRTCEncodedFrameTimeDelta(
ExecutionContext* context,
base::TimeDelta time_delta) {
return Performance::ClampTimeResolution(
time_delta, GetPerformanceFromExecutionContext(context)
->CrossOriginIsolatedCapability());
}
double ToLinearAudioLevel(uint8_t audio_level_dbov) {
if (audio_level_dbov >= 127u) {
return 0.0;
}
return std::pow(10.0, -static_cast<double>(audio_level_dbov) / 20.0);
}
uint8_t FromLinearAudioLevel(double linear_audio_level) {
if (linear_audio_level <= 0.0) {
return 127u;
}
double audio_level_dbov = -20.0 * std::log10(linear_audio_level);
if (audio_level_dbov >= 127.0) {
return 127u;
}
if (audio_level_dbov < 0.0) {
return 0u;
}
return static_cast<uint8_t>(std::round(audio_level_dbov));
}
} // namespace blink
|