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   */
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   /**
50   *   Get the encoded image
51   */
EncodedImage()52   const webrtc::EncodedImage& EncodedImage() const {
53     return static_cast<const webrtc::EncodedImage&>(*this);
54   }
55   /**
56   *   Get pointer to frame buffer
57   */
Buffer()58   const uint8_t* Buffer() const { return _buffer; }
59   /**
60   *   Get frame length
61   */
Length()62   size_t Length() const { return _length; }
63   /**
64   *   Get frame timestamp (90kHz)
65   */
TimeStamp()66   uint32_t TimeStamp() const { return _timeStamp; }
67   /**
68   *   Get render time in milliseconds
69   */
RenderTimeMs()70   int64_t RenderTimeMs() const { return _renderTimeMs; }
71   /**
72   *   Get frame type
73   */
FrameType()74   webrtc::FrameType FrameType() const { return _frameType; }
75   /**
76   *   Get frame rotation
77   */
rotation()78   VideoRotation rotation() const { return _rotation; }
79   /**
80   *   True if this frame is complete, false otherwise
81   */
Complete()82   bool Complete() const { return _completeFrame; }
83   /**
84   *   True if there's a frame missing before this frame
85   */
MissingFrame()86   bool MissingFrame() const { return _missingFrame; }
87   /**
88   *   Payload type of the encoded payload
89   */
PayloadType()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   */
CodecSpecific()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