1*3f982cf4SFabien Sanglard // Copyright 2014 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_ENCODED_FRAME_H_ 6*3f982cf4SFabien Sanglard #define CAST_STREAMING_ENCODED_FRAME_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <stdint.h> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include <chrono> 11*3f982cf4SFabien Sanglard #include <vector> 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard #include "absl/types/span.h" 14*3f982cf4SFabien Sanglard #include "cast/streaming/frame_id.h" 15*3f982cf4SFabien Sanglard #include "cast/streaming/rtp_time.h" 16*3f982cf4SFabien Sanglard #include "platform/api/time.h" 17*3f982cf4SFabien Sanglard #include "platform/base/macros.h" 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard namespace openscreen { 20*3f982cf4SFabien Sanglard namespace cast { 21*3f982cf4SFabien Sanglard 22*3f982cf4SFabien Sanglard // A combination of metadata and data for one encoded frame. This can contain 23*3f982cf4SFabien Sanglard // audio data or video data or other. 24*3f982cf4SFabien Sanglard struct EncodedFrame { 25*3f982cf4SFabien Sanglard enum Dependency : int8_t { 26*3f982cf4SFabien Sanglard // "null" value, used to indicate whether |dependency| has been set. 27*3f982cf4SFabien Sanglard UNKNOWN_DEPENDENCY, 28*3f982cf4SFabien Sanglard 29*3f982cf4SFabien Sanglard // Not decodable without the reference frame indicated by 30*3f982cf4SFabien Sanglard // |referenced_frame_id|. 31*3f982cf4SFabien Sanglard DEPENDS_ON_ANOTHER, 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard // Independently decodable. 34*3f982cf4SFabien Sanglard INDEPENDENTLY_DECODABLE, 35*3f982cf4SFabien Sanglard 36*3f982cf4SFabien Sanglard // Independently decodable, and no future frames will depend on any frames 37*3f982cf4SFabien Sanglard // before this one. 38*3f982cf4SFabien Sanglard KEY_FRAME, 39*3f982cf4SFabien Sanglard }; 40*3f982cf4SFabien Sanglard 41*3f982cf4SFabien Sanglard EncodedFrame(); 42*3f982cf4SFabien Sanglard ~EncodedFrame(); 43*3f982cf4SFabien Sanglard 44*3f982cf4SFabien Sanglard EncodedFrame(EncodedFrame&&) noexcept; 45*3f982cf4SFabien Sanglard EncodedFrame& operator=(EncodedFrame&&); 46*3f982cf4SFabien Sanglard 47*3f982cf4SFabien Sanglard // Copies all members except |data| to |dest|. Does not modify |dest->data|. 48*3f982cf4SFabien Sanglard void CopyMetadataTo(EncodedFrame* dest) const; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard // This frame's dependency relationship with respect to other frames. 51*3f982cf4SFabien Sanglard Dependency dependency = UNKNOWN_DEPENDENCY; 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard // The label associated with this frame. Implies an ordering relative to 54*3f982cf4SFabien Sanglard // other frames in the same stream. 55*3f982cf4SFabien Sanglard FrameId frame_id; 56*3f982cf4SFabien Sanglard 57*3f982cf4SFabien Sanglard // The label associated with the frame upon which this frame depends. If 58*3f982cf4SFabien Sanglard // this frame does not require any other frame in order to become decodable 59*3f982cf4SFabien Sanglard // (e.g., key frames), |referenced_frame_id| must equal |frame_id|. 60*3f982cf4SFabien Sanglard FrameId referenced_frame_id; 61*3f982cf4SFabien Sanglard 62*3f982cf4SFabien Sanglard // The stream timestamp, on the timeline of the signal data. For example, RTP 63*3f982cf4SFabien Sanglard // timestamps for audio are usually defined as the total number of audio 64*3f982cf4SFabien Sanglard // samples encoded in all prior frames. A playback system uses this value to 65*3f982cf4SFabien Sanglard // detect gaps in the stream, and otherwise stretch the signal to gradually 66*3f982cf4SFabien Sanglard // re-align towards playout targets when too much drift has occurred (see 67*3f982cf4SFabien Sanglard // |reference_time|, below). 68*3f982cf4SFabien Sanglard RtpTimeTicks rtp_timestamp; 69*3f982cf4SFabien Sanglard 70*3f982cf4SFabien Sanglard // The common reference clock timestamp for this frame. Over a sequence of 71*3f982cf4SFabien Sanglard // frames, this time value is expected to drift with respect to the elapsed 72*3f982cf4SFabien Sanglard // time implied by the RTP timestamps; and this may not necessarily increment 73*3f982cf4SFabien Sanglard // with precise regularity. 74*3f982cf4SFabien Sanglard // 75*3f982cf4SFabien Sanglard // This value originates from a sender, and is the time at which the frame was 76*3f982cf4SFabien Sanglard // captured/recorded. In the receiver context, this value is the computed 77*3f982cf4SFabien Sanglard // target playout time, which is used for guiding the timing of presentation 78*3f982cf4SFabien Sanglard // (see |rtp_timestamp|, above). It is also meant to be used to synchronize 79*3f982cf4SFabien Sanglard // the presentation of multiple streams (e.g., audio and video), commonly 80*3f982cf4SFabien Sanglard // known as "lip-sync." It is NOT meant to be a mandatory/exact playout time. 81*3f982cf4SFabien Sanglard Clock::time_point reference_time; 82*3f982cf4SFabien Sanglard 83*3f982cf4SFabien Sanglard // Playout delay for this and all future frames. Used by the Adaptive 84*3f982cf4SFabien Sanglard // Playout delay extension. Non-positive values means no change. 85*3f982cf4SFabien Sanglard std::chrono::milliseconds new_playout_delay{}; 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien Sanglard // Pointer to a buffer containing the encoded signal data for the frame. In 88*3f982cf4SFabien Sanglard // the sender context, this points to the data to be sent, and nothing will be 89*3f982cf4SFabien Sanglard // mutated. In the receiver context, this is set to the region of a 90*3f982cf4SFabien Sanglard // client-provided buffer that was populated. 91*3f982cf4SFabien Sanglard absl::Span<uint8_t> data; 92*3f982cf4SFabien Sanglard 93*3f982cf4SFabien Sanglard OSP_DISALLOW_COPY_AND_ASSIGN(EncodedFrame); 94*3f982cf4SFabien Sanglard }; 95*3f982cf4SFabien Sanglard 96*3f982cf4SFabien Sanglard } // namespace cast 97*3f982cf4SFabien Sanglard } // namespace openscreen 98*3f982cf4SFabien Sanglard 99*3f982cf4SFabien Sanglard #endif // CAST_STREAMING_ENCODED_FRAME_H_ 100