xref: /aosp_15_r20/external/openscreen/cast/streaming/encoded_frame.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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