// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CAST_STREAMING_ENCODED_FRAME_H_ #define CAST_STREAMING_ENCODED_FRAME_H_ #include #include #include #include "absl/types/span.h" #include "cast/streaming/frame_id.h" #include "cast/streaming/rtp_time.h" #include "platform/api/time.h" #include "platform/base/macros.h" namespace openscreen { namespace cast { // A combination of metadata and data for one encoded frame. This can contain // audio data or video data or other. struct EncodedFrame { enum Dependency : int8_t { // "null" value, used to indicate whether |dependency| has been set. UNKNOWN_DEPENDENCY, // Not decodable without the reference frame indicated by // |referenced_frame_id|. DEPENDS_ON_ANOTHER, // Independently decodable. INDEPENDENTLY_DECODABLE, // Independently decodable, and no future frames will depend on any frames // before this one. KEY_FRAME, }; EncodedFrame(); ~EncodedFrame(); EncodedFrame(EncodedFrame&&) noexcept; EncodedFrame& operator=(EncodedFrame&&); // Copies all members except |data| to |dest|. Does not modify |dest->data|. void CopyMetadataTo(EncodedFrame* dest) const; // This frame's dependency relationship with respect to other frames. Dependency dependency = UNKNOWN_DEPENDENCY; // The label associated with this frame. Implies an ordering relative to // other frames in the same stream. FrameId frame_id; // The label associated with the frame upon which this frame depends. If // this frame does not require any other frame in order to become decodable // (e.g., key frames), |referenced_frame_id| must equal |frame_id|. FrameId referenced_frame_id; // The stream timestamp, on the timeline of the signal data. For example, RTP // timestamps for audio are usually defined as the total number of audio // samples encoded in all prior frames. A playback system uses this value to // detect gaps in the stream, and otherwise stretch the signal to gradually // re-align towards playout targets when too much drift has occurred (see // |reference_time|, below). RtpTimeTicks rtp_timestamp; // The common reference clock timestamp for this frame. Over a sequence of // frames, this time value is expected to drift with respect to the elapsed // time implied by the RTP timestamps; and this may not necessarily increment // with precise regularity. // // This value originates from a sender, and is the time at which the frame was // captured/recorded. In the receiver context, this value is the computed // target playout time, which is used for guiding the timing of presentation // (see |rtp_timestamp|, above). It is also meant to be used to synchronize // the presentation of multiple streams (e.g., audio and video), commonly // known as "lip-sync." It is NOT meant to be a mandatory/exact playout time. Clock::time_point reference_time; // Playout delay for this and all future frames. Used by the Adaptive // Playout delay extension. Non-positive values means no change. std::chrono::milliseconds new_playout_delay{}; // Pointer to a buffer containing the encoded signal data for the frame. In // the sender context, this points to the data to be sent, and nothing will be // mutated. In the receiver context, this is set to the region of a // client-provided buffer that was populated. absl::Span data; OSP_DISALLOW_COPY_AND_ASSIGN(EncodedFrame); }; } // namespace cast } // namespace openscreen #endif // CAST_STREAMING_ENCODED_FRAME_H_