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 "modules/video_coding/encoded_frame.h" 18 19 namespace webrtc { 20 namespace video_coding { 21 22 // NOTE: This class is still under development and may change without notice. 23 struct VideoLayerFrameId { 24 // TODO(philipel): The default ctor is currently used internaly, but have a 25 // look if we can remove it. VideoLayerFrameIdVideoLayerFrameId26 VideoLayerFrameId() : picture_id(-1), spatial_layer(0) {} VideoLayerFrameIdVideoLayerFrameId27 VideoLayerFrameId(int64_t picture_id, uint8_t spatial_layer) 28 : picture_id(picture_id), spatial_layer(spatial_layer) {} 29 30 bool operator==(const VideoLayerFrameId& rhs) const { 31 return picture_id == rhs.picture_id && spatial_layer == rhs.spatial_layer; 32 } 33 34 bool operator!=(const VideoLayerFrameId& rhs) const { 35 return !(*this == rhs); 36 } 37 38 bool operator<(const VideoLayerFrameId& rhs) const { 39 if (picture_id == rhs.picture_id) 40 return spatial_layer < rhs.spatial_layer; 41 return picture_id < rhs.picture_id; 42 } 43 44 bool operator<=(const VideoLayerFrameId& rhs) const { return !(rhs < *this); } 45 bool operator>(const VideoLayerFrameId& rhs) const { return rhs < *this; } 46 bool operator>=(const VideoLayerFrameId& rhs) const { return rhs <= *this; } 47 48 int64_t picture_id; 49 uint8_t spatial_layer; 50 }; 51 52 // TODO(philipel): Remove webrtc::VCMEncodedFrame inheritance. 53 // TODO(philipel): Move transport specific info out of EncodedFrame. 54 // NOTE: This class is still under development and may change without notice. 55 class EncodedFrame : public webrtc::VCMEncodedFrame { 56 public: 57 static const uint8_t kMaxFrameReferences = 5; 58 59 EncodedFrame() = default; 60 EncodedFrame(const EncodedFrame&) = default; ~EncodedFrame()61 virtual ~EncodedFrame() {} 62 63 // When this frame was received. 64 virtual int64_t ReceivedTime() const = 0; 65 66 // When this frame should be rendered. 67 virtual int64_t RenderTime() const = 0; 68 69 // This information is currently needed by the timing calculation class. 70 // TODO(philipel): Remove this function when a new timing class has 71 // been implemented. 72 virtual bool delayed_by_retransmission() const; 73 is_keyframe()74 bool is_keyframe() const { return num_references == 0; } 75 76 VideoLayerFrameId id; 77 78 // TODO(philipel): Add simple modify/access functions to prevent adding too 79 // many |references|. 80 size_t num_references = 0; 81 int64_t references[kMaxFrameReferences]; 82 bool inter_layer_predicted = false; 83 // Is this subframe the last one in the superframe (In RTP stream that would 84 // mean that the last packet has a marker bit set). 85 bool is_last_spatial_layer = true; 86 }; 87 88 } // namespace video_coding 89 } // namespace webrtc 90 91 #endif // API_VIDEO_ENCODED_FRAME_H_ 92