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