1*3f982cf4SFabien Sanglard // Copyright 2021 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 // Resolutions and dimensions (resolutions with a frame rate) are used 6*3f982cf4SFabien Sanglard // extensively throughout cast streaming. Since their serialization to and 7*3f982cf4SFabien Sanglard // from JSON is stable and standard, we have a single place definition for 8*3f982cf4SFabien Sanglard // these for use both in our public APIs and private messages. 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_RESOLUTION_H_ 11*3f982cf4SFabien Sanglard #define CAST_STREAMING_RESOLUTION_H_ 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard #include "absl/types/optional.h" 14*3f982cf4SFabien Sanglard #include "json/value.h" 15*3f982cf4SFabien Sanglard #include "util/simple_fraction.h" 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard namespace openscreen { 18*3f982cf4SFabien Sanglard namespace cast { 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard // A resolution in pixels. 21*3f982cf4SFabien Sanglard struct Resolution { 22*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, Resolution* out); 23*3f982cf4SFabien Sanglard bool IsValid() const; 24*3f982cf4SFabien Sanglard Json::Value ToJson() const; 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard // Returns true if both |width| and |height| of this instance are greater than 27*3f982cf4SFabien Sanglard // or equal to that of |other|. 28*3f982cf4SFabien Sanglard bool IsSupersetOf(const Resolution& other) const; 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard bool operator==(const Resolution& other) const; 31*3f982cf4SFabien Sanglard bool operator!=(const Resolution& other) const; 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard // Width and height in pixels. 34*3f982cf4SFabien Sanglard int width = 0; 35*3f982cf4SFabien Sanglard int height = 0; 36*3f982cf4SFabien Sanglard }; 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien Sanglard // A resolution in pixels and a frame rate. 39*3f982cf4SFabien Sanglard struct Dimensions { 40*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, Dimensions* out); 41*3f982cf4SFabien Sanglard bool IsValid() const; 42*3f982cf4SFabien Sanglard Json::Value ToJson() const; 43*3f982cf4SFabien Sanglard 44*3f982cf4SFabien Sanglard // Returns true if all properties of this instance are greater than or equal 45*3f982cf4SFabien Sanglard // to those of |other|. 46*3f982cf4SFabien Sanglard bool IsSupersetOf(const Dimensions& other) const; 47*3f982cf4SFabien Sanglard 48*3f982cf4SFabien Sanglard bool operator==(const Dimensions& other) const; 49*3f982cf4SFabien Sanglard bool operator!=(const Dimensions& other) const; 50*3f982cf4SFabien Sanglard 51*3f982cf4SFabien Sanglard // Get just the width and height fields (for comparisons). ToResolutionDimensions52*3f982cf4SFabien Sanglard constexpr Resolution ToResolution() const { return {width, height}; } 53*3f982cf4SFabien Sanglard 54*3f982cf4SFabien Sanglard // The effective bit rate is the width * height * frame rate. effective_bit_rateDimensions55*3f982cf4SFabien Sanglard constexpr int effective_bit_rate() const { 56*3f982cf4SFabien Sanglard return width * height * static_cast<double>(frame_rate); 57*3f982cf4SFabien Sanglard } 58*3f982cf4SFabien Sanglard 59*3f982cf4SFabien Sanglard // Width and height in pixels. 60*3f982cf4SFabien Sanglard int width = 0; 61*3f982cf4SFabien Sanglard int height = 0; 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard // |frame_rate| is the maximum maintainable frame rate. 64*3f982cf4SFabien Sanglard SimpleFraction frame_rate{0, 1}; 65*3f982cf4SFabien Sanglard }; 66*3f982cf4SFabien Sanglard 67*3f982cf4SFabien Sanglard } // namespace cast 68*3f982cf4SFabien Sanglard } // namespace openscreen 69*3f982cf4SFabien Sanglard 70*3f982cf4SFabien Sanglard #endif // CAST_STREAMING_RESOLUTION_H_ 71