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
22namespace webrtc {
23
24class 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