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