1 /* 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_VIDEO_ENCODED_FRAME_H_ 12 #define API_VIDEO_ENCODED_FRAME_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include "absl/types/optional.h" 18 #include "api/units/timestamp.h" 19 #include "modules/video_coding/encoded_frame.h" 20 21 namespace webrtc { 22 23 // TODO(philipel): Remove webrtc::VCMEncodedFrame inheritance. 24 // TODO(philipel): Move transport specific info out of EncodedFrame. 25 // NOTE: This class is still under development and may change without notice. 26 class EncodedFrame : public webrtc::VCMEncodedFrame { 27 public: 28 static const uint8_t kMaxFrameReferences = 5; 29 30 EncodedFrame() = default; 31 EncodedFrame(const EncodedFrame&) = default; ~EncodedFrame()32 virtual ~EncodedFrame() {} 33 34 // When this frame was received. 35 // TODO(bugs.webrtc.org/13756): Use Timestamp instead of int. 36 virtual int64_t ReceivedTime() const = 0; 37 // Returns a Timestamp from `ReceivedTime`, or nullopt if there is no receive 38 // time. 39 absl::optional<webrtc::Timestamp> ReceivedTimestamp() const; 40 41 // When this frame should be rendered. 42 // TODO(bugs.webrtc.org/13756): Use Timestamp instead of int. 43 virtual int64_t RenderTime() const = 0; 44 // Returns a Timestamp from `RenderTime`, or nullopt if there is no 45 // render time. 46 absl::optional<webrtc::Timestamp> RenderTimestamp() const; 47 48 // This information is currently needed by the timing calculation class. 49 // TODO(philipel): Remove this function when a new timing class has 50 // been implemented. 51 virtual bool delayed_by_retransmission() const; 52 is_keyframe()53 bool is_keyframe() const { return num_references == 0; } 54 SetId(int64_t id)55 void SetId(int64_t id) { id_ = id; } Id()56 int64_t Id() const { return id_; } 57 58 // TODO(philipel): Add simple modify/access functions to prevent adding too 59 // many `references`. 60 size_t num_references = 0; 61 int64_t references[kMaxFrameReferences]; 62 // Is this subframe the last one in the superframe (In RTP stream that would 63 // mean that the last packet has a marker bit set). 64 bool is_last_spatial_layer = true; 65 66 private: 67 // The ID of the frame is determined from RTP level information. The IDs are 68 // used to describe order and dependencies between frames. 69 int64_t id_ = -1; 70 }; 71 72 } // namespace webrtc 73 74 #endif // API_VIDEO_ENCODED_FRAME_H_ 75