blob: fcc3b5dc8177e755bed110bc91e95c276092f8cc [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_ENCODED_FRAME_H_
12#define MODULES_VIDEO_CODING_ENCODED_FRAME_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
stefan@webrtc.orgc5300432012-10-08 07:06:53 +000014#include <vector>
15
Niels Möller4dc66c52018-10-05 14:17:58 +020016#include "api/video/encoded_image.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020017#include "common_types.h" // NOLINT(build/include)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#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"
niklase@google.com470e71d2011-07-07 08:21:25 +000021
philipel9d3ab612015-12-21 04:12:39 -080022namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000023
philipel9d3ab612015-12-21 04:12:39 -080024class VCMEncodedFrame : protected EncodedImage {
25 public:
26 VCMEncodedFrame();
Niels Möller72f52a12018-06-26 11:14:11 +020027 VCMEncodedFrame(const VCMEncodedFrame&) = delete;
niklase@google.com470e71d2011-07-07 08:21:25 +000028
philipel9d3ab612015-12-21 04:12:39 -080029 ~VCMEncodedFrame();
30 /**
Yves Gerey665174f2018-06-19 15:03:05 +020031 * Delete VideoFrame and resets members to zero
32 */
philipel9d3ab612015-12-21 04:12:39 -080033 void Free();
34 /**
Yves Gerey665174f2018-06-19 15:03:05 +020035 * Set render time in milliseconds
36 */
philipel9d3ab612015-12-21 04:12:39 -080037 void SetRenderTime(const int64_t renderTimeMs) {
38 _renderTimeMs = renderTimeMs;
39 }
niklase@google.com470e71d2011-07-07 08:21:25 +000040
philipel9d3ab612015-12-21 04:12:39 -080041 /**
Yves Gerey665174f2018-06-19 15:03:05 +020042 * Set the encoded frame size
43 */
philipel9d3ab612015-12-21 04:12:39 -080044 void SetEncodedSize(uint32_t width, uint32_t height) {
45 _encodedWidth = width;
46 _encodedHeight = height;
47 }
gnishb2a318b2017-05-10 09:21:33 -070048
49 void SetPlayoutDelay(PlayoutDelay playout_delay) {
50 playout_delay_ = playout_delay;
51 }
52
philipel9d3ab612015-12-21 04:12:39 -080053 /**
Yves Gerey665174f2018-06-19 15:03:05 +020054 * Get the encoded image
55 */
philipel9d3ab612015-12-21 04:12:39 -080056 const webrtc::EncodedImage& EncodedImage() const {
57 return static_cast<const webrtc::EncodedImage&>(*this);
58 }
59 /**
Yves Gerey665174f2018-06-19 15:03:05 +020060 * Get pointer to frame buffer
61 */
philipel9d3ab612015-12-21 04:12:39 -080062 const uint8_t* Buffer() const { return _buffer; }
63 /**
Benjamin Wright192eeec2018-10-17 17:27:25 -070064 * Get pointer to frame buffer that can be mutated.
65 */
66 uint8_t* MutableBuffer() { return _buffer; }
67 /**
Niels Möller23775882018-08-16 10:24:12 +020068 * Frame RTP timestamp (90kHz)
Yves Gerey665174f2018-06-19 15:03:05 +020069 */
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +010070 using EncodedImage::set_size;
Niels Möller23775882018-08-16 10:24:12 +020071 using EncodedImage::SetTimestamp;
Niels Möllerf0eee002018-11-28 16:31:29 +010072 using EncodedImage::size;
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +010073 using EncodedImage::Timestamp;
74
philipel9d3ab612015-12-21 04:12:39 -080075 /**
Yves Gerey665174f2018-06-19 15:03:05 +020076 * Get render time in milliseconds
77 */
philipel9d3ab612015-12-21 04:12:39 -080078 int64_t RenderTimeMs() const { return _renderTimeMs; }
79 /**
Yves Gerey665174f2018-06-19 15:03:05 +020080 * Get frame type
81 */
philipel9d3ab612015-12-21 04:12:39 -080082 webrtc::FrameType FrameType() const { return _frameType; }
83 /**
Yves Gerey665174f2018-06-19 15:03:05 +020084 * Get frame rotation
85 */
perkj414dda12016-07-04 01:45:23 -070086 VideoRotation rotation() const { return rotation_; }
philipel9d3ab612015-12-21 04:12:39 -080087 /**
ilnik00d802b2017-04-11 10:34:31 -070088 * Get video content type
89 */
90 VideoContentType contentType() const { return content_type_; }
91 /**
ilnik04f4d122017-06-19 07:18:55 -070092 * Get video timing
93 */
94 EncodedImage::Timing video_timing() const { return timing_; }
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +010095 EncodedImage::Timing* video_timing_mutable() { return &timing_; }
ilnik04f4d122017-06-19 07:18:55 -070096 /**
ilnik00d802b2017-04-11 10:34:31 -070097 * True if this frame is complete, false otherwise
98 */
philipel9d3ab612015-12-21 04:12:39 -080099 bool Complete() const { return _completeFrame; }
100 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200101 * True if there's a frame missing before this frame
102 */
philipel9d3ab612015-12-21 04:12:39 -0800103 bool MissingFrame() const { return _missingFrame; }
104 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200105 * Payload type of the encoded payload
106 */
philipel9d3ab612015-12-21 04:12:39 -0800107 uint8_t PayloadType() const { return _payloadType; }
108 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200109 * Get codec specific info.
110 * The returned pointer is only valid as long as the VCMEncodedFrame
111 * is valid. Also, VCMEncodedFrame owns the pointer and will delete
112 * the object.
113 */
philipel9d3ab612015-12-21 04:12:39 -0800114 const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; }
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +0100115 void SetCodecSpecific(const CodecSpecificInfo* codec_specific) {
116 _codecSpecificInfo = *codec_specific;
117 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000118
philipel9d3ab612015-12-21 04:12:39 -0800119 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200120 * Verifies that current allocated buffer size is larger than or equal to the
121 * input size.
122 * If the current buffer size is smaller, a new allocation is made and the old
123 * buffer data
124 * is copied to the new buffer.
125 * Buffer size is updated to minimumSize.
126 */
philipel9d3ab612015-12-21 04:12:39 -0800127 void VerifyAndAllocate(size_t minimumSize);
niklase@google.com470e71d2011-07-07 08:21:25 +0000128
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +0100129 protected:
philipel9d3ab612015-12-21 04:12:39 -0800130 void Reset();
niklase@google.com470e71d2011-07-07 08:21:25 +0000131
philipel9d3ab612015-12-21 04:12:39 -0800132 void CopyCodecSpecific(const RTPVideoHeader* header);
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000133
philipel9d3ab612015-12-21 04:12:39 -0800134 int64_t _renderTimeMs;
135 uint8_t _payloadType;
136 bool _missingFrame;
137 CodecSpecificInfo _codecSpecificInfo;
138 webrtc::VideoCodecType _codec;
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +0000139
philipel9d3ab612015-12-21 04:12:39 -0800140 // Video rotation is only set along with the last packet for each frame
141 // (same as marker bit). This |_rotation_set| is only for debugging purpose
142 // to ensure we don't set it twice for a frame.
143 bool _rotation_set;
niklase@google.com470e71d2011-07-07 08:21:25 +0000144};
145
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000146} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000147
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200148#endif // MODULES_VIDEO_CODING_ENCODED_FRAME_H_