1 /* 2 * Copyright (c) 2011 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 MODULES_VIDEO_CODING_ENCODED_FRAME_H_ 12 #define MODULES_VIDEO_CODING_ENCODED_FRAME_H_ 13 14 #include <vector> 15 16 #include "common_types.h" // NOLINT(build/include) 17 #include "common_video/include/video_frame.h" 18 #include "modules/include/module_common_types.h" 19 #include "modules/video_coding/include/video_codec_interface.h" 20 #include "modules/video_coding/include/video_coding_defines.h" 21 22 namespace webrtc { 23 24 class VCMEncodedFrame : protected EncodedImage { 25 public: 26 VCMEncodedFrame(); 27 explicit VCMEncodedFrame(const webrtc::EncodedImage& rhs); 28 VCMEncodedFrame(const VCMEncodedFrame& rhs); 29 30 ~VCMEncodedFrame(); 31 /** 32 * Delete VideoFrame and resets members to zero 33 */ 34 void Free(); 35 /** 36 * Set render time in milliseconds 37 */ SetRenderTime(const int64_t renderTimeMs)38 void SetRenderTime(const int64_t renderTimeMs) { 39 _renderTimeMs = renderTimeMs; 40 } 41 42 /** 43 * Set the encoded frame size 44 */ SetEncodedSize(uint32_t width,uint32_t height)45 void SetEncodedSize(uint32_t width, uint32_t height) { 46 _encodedWidth = width; 47 _encodedHeight = height; 48 } 49 SetPlayoutDelay(PlayoutDelay playout_delay)50 void SetPlayoutDelay(PlayoutDelay playout_delay) { 51 playout_delay_ = playout_delay; 52 } 53 54 /** 55 * Get the encoded image 56 */ EncodedImage()57 const webrtc::EncodedImage& EncodedImage() const { 58 return static_cast<const webrtc::EncodedImage&>(*this); 59 } 60 /** 61 * Get pointer to frame buffer 62 */ Buffer()63 const uint8_t* Buffer() const { return _buffer; } 64 /** 65 * Get frame length 66 */ Length()67 size_t Length() const { return _length; } 68 /** 69 * Get frame timestamp (90kHz) 70 */ TimeStamp()71 uint32_t TimeStamp() const { return _timeStamp; } 72 /** 73 * Get render time in milliseconds 74 */ RenderTimeMs()75 int64_t RenderTimeMs() const { return _renderTimeMs; } 76 /** 77 * Get frame type 78 */ FrameType()79 webrtc::FrameType FrameType() const { return _frameType; } 80 /** 81 * Get frame rotation 82 */ rotation()83 VideoRotation rotation() const { return rotation_; } 84 /** 85 * Get video content type 86 */ contentType()87 VideoContentType contentType() const { return content_type_; } 88 /** 89 * Get video timing 90 */ video_timing()91 EncodedImage::Timing video_timing() const { return timing_; } 92 /** 93 * True if this frame is complete, false otherwise 94 */ Complete()95 bool Complete() const { return _completeFrame; } 96 /** 97 * True if there's a frame missing before this frame 98 */ MissingFrame()99 bool MissingFrame() const { return _missingFrame; } 100 /** 101 * Payload type of the encoded payload 102 */ PayloadType()103 uint8_t PayloadType() const { return _payloadType; } 104 /** 105 * Get codec specific info. 106 * The returned pointer is only valid as long as the VCMEncodedFrame 107 * is valid. Also, VCMEncodedFrame owns the pointer and will delete 108 * the object. 109 */ CodecSpecific()110 const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; } 111 112 protected: 113 /** 114 * Verifies that current allocated buffer size is larger than or equal to the 115 * input size. 116 * If the current buffer size is smaller, a new allocation is made and the old 117 * buffer data 118 * is copied to the new buffer. 119 * Buffer size is updated to minimumSize. 120 */ 121 void VerifyAndAllocate(size_t minimumSize); 122 123 void Reset(); 124 125 void CopyCodecSpecific(const RTPVideoHeader* header); 126 127 int64_t _renderTimeMs; 128 uint8_t _payloadType; 129 bool _missingFrame; 130 CodecSpecificInfo _codecSpecificInfo; 131 webrtc::VideoCodecType _codec; 132 133 // Video rotation is only set along with the last packet for each frame 134 // (same as marker bit). This |_rotation_set| is only for debugging purpose 135 // to ensure we don't set it twice for a frame. 136 bool _rotation_set; 137 }; 138 139 } // namespace webrtc 140 141 #endif // MODULES_VIDEO_CODING_ENCODED_FRAME_H_ 142