1*3f982cf4SFabien Sanglard // Copyright 2016 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_FRAME_ID_H_ 6*3f982cf4SFabien Sanglard #define CAST_STREAMING_FRAME_ID_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <stdint.h> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include <sstream> 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglard #include "cast/streaming/expanded_value_base.h" 13*3f982cf4SFabien Sanglard 14*3f982cf4SFabien Sanglard namespace openscreen { 15*3f982cf4SFabien Sanglard namespace cast { 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard // Forward declaration (see below). 18*3f982cf4SFabien Sanglard class FrameId; 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard // Convenience operator overloads for logging. 21*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& out, const FrameId rhs); 22*3f982cf4SFabien Sanglard 23*3f982cf4SFabien Sanglard // Unique identifier for a frame in a RTP media stream. FrameIds are truncated 24*3f982cf4SFabien Sanglard // to 8-bit values in RTP and RTCP headers, and then expanded back by the other 25*3f982cf4SFabien Sanglard // endpoint when parsing the headers. 26*3f982cf4SFabien Sanglard // 27*3f982cf4SFabien Sanglard // Usage example: 28*3f982cf4SFabien Sanglard // 29*3f982cf4SFabien Sanglard // // Distance/offset math. 30*3f982cf4SFabien Sanglard // FrameId first = FrameId::first(); 31*3f982cf4SFabien Sanglard // FrameId second = first + 1; 32*3f982cf4SFabien Sanglard // FrameId third = second + 1; 33*3f982cf4SFabien Sanglard // int64_t offset = third - first; 34*3f982cf4SFabien Sanglard // FrameId fourth = second + offset; 35*3f982cf4SFabien Sanglard // 36*3f982cf4SFabien Sanglard // // Logging convenience. 37*3f982cf4SFabien Sanglard // OSP_DLOG_INFO << "The current frame is " << fourth; 38*3f982cf4SFabien Sanglard class FrameId : public ExpandedValueBase<int64_t, FrameId> { 39*3f982cf4SFabien Sanglard public: 40*3f982cf4SFabien Sanglard // The "null" FrameId constructor. Represents a FrameId field that has not 41*3f982cf4SFabien Sanglard // been set and/or a "not applicable" indicator. FrameId()42*3f982cf4SFabien Sanglard constexpr FrameId() : FrameId(std::numeric_limits<int64_t>::min()) {} 43*3f982cf4SFabien Sanglard 44*3f982cf4SFabien Sanglard // Allow copy construction and assignment. 45*3f982cf4SFabien Sanglard constexpr FrameId(const FrameId&) = default; 46*3f982cf4SFabien Sanglard constexpr FrameId& operator=(const FrameId&) = default; 47*3f982cf4SFabien Sanglard 48*3f982cf4SFabien Sanglard // Returns true if this is the special value representing null. is_null()49*3f982cf4SFabien Sanglard constexpr bool is_null() const { return *this == FrameId(); } 50*3f982cf4SFabien Sanglard 51*3f982cf4SFabien Sanglard // Distance operator. 52*3f982cf4SFabien Sanglard int64_t operator-(FrameId rhs) const { 53*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 54*3f982cf4SFabien Sanglard OSP_DCHECK(!rhs.is_null()); 55*3f982cf4SFabien Sanglard return value_ - rhs.value_; 56*3f982cf4SFabien Sanglard } 57*3f982cf4SFabien Sanglard 58*3f982cf4SFabien Sanglard // Operators to compute advancement by incremental amounts. 59*3f982cf4SFabien Sanglard FrameId operator+(int64_t rhs) const { 60*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 61*3f982cf4SFabien Sanglard return FrameId(value_ + rhs); 62*3f982cf4SFabien Sanglard } 63*3f982cf4SFabien Sanglard FrameId operator-(int64_t rhs) const { 64*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 65*3f982cf4SFabien Sanglard return FrameId(value_ - rhs); 66*3f982cf4SFabien Sanglard } 67*3f982cf4SFabien Sanglard FrameId& operator+=(int64_t rhs) { 68*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 69*3f982cf4SFabien Sanglard return (*this = (*this + rhs)); 70*3f982cf4SFabien Sanglard } 71*3f982cf4SFabien Sanglard FrameId& operator-=(int64_t rhs) { 72*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 73*3f982cf4SFabien Sanglard return (*this = (*this - rhs)); 74*3f982cf4SFabien Sanglard } 75*3f982cf4SFabien Sanglard FrameId& operator++() { 76*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 77*3f982cf4SFabien Sanglard ++value_; 78*3f982cf4SFabien Sanglard return *this; 79*3f982cf4SFabien Sanglard } 80*3f982cf4SFabien Sanglard FrameId& operator--() { 81*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 82*3f982cf4SFabien Sanglard --value_; 83*3f982cf4SFabien Sanglard return *this; 84*3f982cf4SFabien Sanglard } 85*3f982cf4SFabien Sanglard FrameId operator++(int) { 86*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 87*3f982cf4SFabien Sanglard return FrameId(value_++); 88*3f982cf4SFabien Sanglard } 89*3f982cf4SFabien Sanglard FrameId operator--(int) { 90*3f982cf4SFabien Sanglard OSP_DCHECK(!is_null()); 91*3f982cf4SFabien Sanglard return FrameId(value_--); 92*3f982cf4SFabien Sanglard } 93*3f982cf4SFabien Sanglard 94*3f982cf4SFabien Sanglard // The identifier for the first frame in a stream. first()95*3f982cf4SFabien Sanglard static constexpr FrameId first() { return FrameId(0); } 96*3f982cf4SFabien Sanglard 97*3f982cf4SFabien Sanglard // A virtual identifier, representing the frame before the first. There should 98*3f982cf4SFabien Sanglard // never actually be a frame streamed with this identifier. Instead, this is 99*3f982cf4SFabien Sanglard // used in various components to represent a "not yet seen/processed the first 100*3f982cf4SFabien Sanglard // frame" state. 101*3f982cf4SFabien Sanglard // 102*3f982cf4SFabien Sanglard // The name "leader" comes from the terminology used in tape reels, which 103*3f982cf4SFabien Sanglard // refers to the non-data-carrying segment of tape before the recording 104*3f982cf4SFabien Sanglard // begins. leader()105*3f982cf4SFabien Sanglard static constexpr FrameId leader() { return FrameId(-1); } 106*3f982cf4SFabien Sanglard 107*3f982cf4SFabien Sanglard private: 108*3f982cf4SFabien Sanglard friend class ExpandedValueBase<int64_t, FrameId>; 109*3f982cf4SFabien Sanglard friend std::ostream& operator<<(std::ostream& out, const FrameId rhs); 110*3f982cf4SFabien Sanglard FrameId(int64_t value)111*3f982cf4SFabien Sanglard constexpr explicit FrameId(int64_t value) : ExpandedValueBase(value) {} 112*3f982cf4SFabien Sanglard 113*3f982cf4SFabien Sanglard // Accessor used by ostream output function. value()114*3f982cf4SFabien Sanglard constexpr int64_t value() const { return value_; } 115*3f982cf4SFabien Sanglard }; 116*3f982cf4SFabien Sanglard 117*3f982cf4SFabien Sanglard } // namespace cast 118*3f982cf4SFabien Sanglard } // namespace openscreen 119*3f982cf4SFabien Sanglard 120*3f982cf4SFabien Sanglard #endif // CAST_STREAMING_FRAME_ID_H_ 121