Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  RTCStatsReport.h

  Sprache: C
 

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */


#ifndef RTCStatsReport_h_
#define RTCStatsReport_h_

#include "api/units/timestamp.h"  // webrtc::Timestamp
#include "js/RootingAPI.h"        // JS::Rooted
#include "js/Value.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/MozPromise.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/dom/AutoEntryScript.h"
#include "mozilla/dom/RTCStatsReportBinding.h"  // RTCStatsCollection
#include "mozilla/dom/ToJSValue.h"
#include "nsCOMPtr.h"
#include "nsContentUtils.h"
#include "nsIGlobalObject.h"
#include "nsPIDOMWindow.h"  // nsPIDOMWindowInner
#include "nsWrapperCache.h"
#include "prtime.h"  // PR_Now

namespace mozilla {

extern TimeStamp WebrtcSystemTimeBase();

namespace dom {

/**
 * Keeps the state needed to convert RTCStatsTimestamps.
 */

struct RTCStatsTimestampState {
  RTCStatsTimestampState(uint64_t aRandomTimelineSeed,
                         const TimeStamp& aStartDomRealtime,
                         webrtc::Timestamp aStartRealtime,
                         RTPCallerType aRTPCallerType,
                         DOMHighResTimeStamp aStartWallClockRaw);

  RTCStatsTimestampState(const RTCStatsTimestampState&) = default;

  // These members are sampled when a non-copy constructor is called.

  // Performance's random timeline seed.
  const uint64_t mRandomTimelineSeed;
  // TimeStamp::Now() when the members were sampled. This is equivalent to time
  // 0 in DomRealtime.
  const TimeStamp mStartDomRealtime;
  // WebrtcSystemTime() when the members were sampled. This represents the same
  // point in time as mStartDomRealtime, but as a webrtc timestamp.
  const webrtc::Timestamp mStartRealtime;
  // Performance's RTPCallerType.
  const RTPCallerType mRTPCallerType;
  // Performance.timeOrigin for mStartDomRealtime when the members were sampled.
  const DOMHighResTimeStamp mStartWallClockRaw;
};

/**
 * Classes that facilitate creating timestamps for webrtc stats by mimicking
 * dom::Performance, as well as getting and converting timestamps for libwebrtc
 * and our integration with it.
 *
 * They use the same clock to avoid drift and inconsistencies, base on
 * mozilla::TimeStamp, and convert to and from these time bases:
 * - Moz        : Monotonic, unspecified (but constant) and inaccessible epoch,
 *                as implemented by mozilla::TimeStamp
 * - Realtime   : Monotonic, unspecified (but constant) epoch.
 * - 1Jan1970   : Monotonic, unix epoch (00:00:00 UTC on 1 January 1970).
 * - Ntp        : Monotonic, ntp epoch (00:00:00 UTC on 1 January 1900).
 * - DomRealtime: Monotonic, performance.timeOrigin epoch. Corresponds to
 *                performance.now().
 * - DomNoTimeOrigin: Like DomRealtime but in milliseconds. Has reduced
 *                precision.
 * - Dom        : Like 1Jan1970 but in milliseconds, as the timestamps by
 *                webrtc-pc. Corresponds to Performance.timeOrigin +
 *                Performance.now(). Has reduced precision.
 * - WallClock  : Non-monotonic, unix epoch. Not used here since it is
 *                non-monotonic and cannot be correlated to the other time
 *                bases.
 */

class RTCStatsTimestampMaker;
class RTCStatsTimestamp {
 public:
  TimeStamp ToMozTime() const;
  webrtc::Timestamp ToRealtime() const;
  webrtc::Timestamp To1Jan1970() const;
  webrtc::Timestamp ToNtp() const;
  webrtc::Timestamp ToDomRealtime() const;
  DOMHighResTimeStamp ToDomNoTimeOrigin() const;
  DOMHighResTimeStamp ToDom() const;

  static RTCStatsTimestamp FromMozTime(const RTCStatsTimestampMaker& aMaker,
                                       TimeStamp aMozTime);
  static RTCStatsTimestamp FromRealtime(const RTCStatsTimestampMaker& aMaker,
                                        webrtc::Timestamp aRealtime);
  static RTCStatsTimestamp From1Jan1970(const RTCStatsTimestampMaker& aMaker,
                                        webrtc::Timestamp aRealtime);
  static RTCStatsTimestamp FromNtp(const RTCStatsTimestampMaker& aMaker,
                                   webrtc::Timestamp aRealtime);
  static RTCStatsTimestamp FromDomRealtime(const RTCStatsTimestampMaker& aMaker,
                                           webrtc::Timestamp aDomRealtime);
  // There is on purpose no conversion functions from DOMHighResTimeStamp
  // because of the loss in precision of a floating point to integer conversion.

 private:
  RTCStatsTimestamp(RTCStatsTimestampState aState, TimeStamp aMozTime);

  const RTCStatsTimestampState mState;
  const TimeStamp mMozTime;
};

class RTCStatsTimestampMaker {
 public:
  static RTCStatsTimestampMaker Create();
  static RTCStatsTimestampMaker Create(Performance* aPerformance);
  static RTCStatsTimestampMaker Create(nsPIDOMWindowInner* aWindow);
  static RTCStatsTimestampMaker Create(const WorkerPrivate& aWorkerPrivate);

  RTCStatsTimestamp GetNow() const;

  const RTCStatsTimestampState mState;

 protected:
  explicit RTCStatsTimestampMaker(RTCStatsTimestampState aState);
};

// TODO(bug 1588303): If we ever get move semantics for webidl dictionaries, we
// can stop wrapping these in UniquePtr, which will allow us to simplify code
// in several places.
typedef MozPromise<UniquePtr<RTCStatsCollection>, nsresult, true>
    RTCStatsPromise;

typedef MozPromise<UniquePtr<RTCStatsReportInternal>, nsresult, true>
    RTCStatsReportPromise;

class RTCStatsReport final : public nsWrapperCache {
 public:
  NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(RTCStatsReport)
  NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(RTCStatsReport)

  explicit RTCStatsReport(nsPIDOMWindowInner* aParent);

  // TODO(bug 1586109): Remove this once we no longer have to create empty
  // RTCStatsReports from JS.
  static already_AddRefed<RTCStatsReport> Constructor(
      const GlobalObject& aGlobal);

  void Incorporate(RTCStatsCollection& aStats);

  nsPIDOMWindowInner* GetParentObject() const { return mParent; }

  JSObject* WrapObject(JSContext* aCx,
                       JS::Handle<JSObject*> aGivenProto) override;

 private:
  ~RTCStatsReport() = default;
  void Set(const nsAString& aKey, JS::Handle<JSObject*> aValue,
           ErrorResult& aRv);

  template <typename T>
  nsresult SetRTCStats(Sequence<T>& aValues) {
    for (T& value : aValues) {
      nsresult rv = SetRTCStats(value);
      if (NS_FAILED(rv)) {
        return rv;
      }
    }
    return NS_OK;
  }

  // We cannot just declare this as SetRTCStats(RTCStats&), because the
  // conversion function that ToJSValue uses is non-virtual.
  template <typename T>
  nsresult SetRTCStats(T& aValue) {
    static_assert(std::is_base_of<RTCStats, T>::value,
                  "SetRTCStats is for setting RTCStats only");

    if (!aValue.mId.WasPassed()) {
      return NS_OK;
    }

    const nsString key(aValue.mId.Value());

    // Cargo-culted from dom::Promise; converts aValue to a JSObject
    AutoEntryScript aes(mParent->AsGlobal()->GetGlobalJSObject(),
                        "RTCStatsReport::SetRTCStats");
    JSContext* cx = aes.cx();
    JS::Rooted<JS::Value> val(cx);
    if (!ToJSValue(cx, std::forward<T>(aValue), &val)) {
      return NS_ERROR_FAILURE;
    }
    JS::Rooted<JSObject*> jsObject(cx, &val.toObject());

    ErrorResult rv;
    Set(key, jsObject, rv);
    return rv.StealNSResult();
  }

  nsCOMPtr<nsPIDOMWindowInner> mParent;
};

void MergeStats(UniquePtr<dom::RTCStatsCollection> aFromStats,
                dom::RTCStatsCollection* aIntoStats);

void FlattenStats(nsTArray<UniquePtr<dom::RTCStatsCollection>> aFromStats,
                  dom::RTCStatsCollection* aIntoStats);

}  // namespace dom
}  // namespace mozilla

#endif  // RTCStatsReport_h_

Messung V0.5 in Prozent
C=93 H=99 G=95

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-08-25) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002