blob: 84b8c71e32005378a37e8c23d6b434d8a8dd4c5f [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"
Danil Chapovalov7c067772019-10-07 12:56:24 +020017#include "modules/rtp_rtcp/source/rtp_video_header.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "modules/video_coding/include/video_codec_interface.h"
19#include "modules/video_coding/include/video_coding_defines.h"
Guido Urdanetac8958e52020-02-28 16:28:34 +010020#include "rtc_base/system/rtc_export.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
Guido Urdanetac8958e52020-02-28 16:28:34 +010024class RTC_EXPORT VCMEncodedFrame : protected EncodedImage {
philipel9d3ab612015-12-21 04:12:39 -080025 public:
26 VCMEncodedFrame();
philipel6c42d922019-06-20 11:13:03 +020027 VCMEncodedFrame(const VCMEncodedFrame&);
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 * Set render time in milliseconds
32 */
philipel9d3ab612015-12-21 04:12:39 -080033 void SetRenderTime(const int64_t renderTimeMs) {
34 _renderTimeMs = renderTimeMs;
35 }
niklase@google.com470e71d2011-07-07 08:21:25 +000036
philipel9d3ab612015-12-21 04:12:39 -080037 /**
Yves Gerey665174f2018-06-19 15:03:05 +020038 * Set the encoded frame size
39 */
philipel9d3ab612015-12-21 04:12:39 -080040 void SetEncodedSize(uint32_t width, uint32_t height) {
41 _encodedWidth = width;
42 _encodedHeight = height;
43 }
gnishb2a318b2017-05-10 09:21:33 -070044
45 void SetPlayoutDelay(PlayoutDelay playout_delay) {
46 playout_delay_ = playout_delay;
47 }
48
philipel9d3ab612015-12-21 04:12:39 -080049 /**
Yves Gerey665174f2018-06-19 15:03:05 +020050 * Get the encoded image
51 */
philipel9d3ab612015-12-21 04:12:39 -080052 const webrtc::EncodedImage& EncodedImage() const {
53 return static_cast<const webrtc::EncodedImage&>(*this);
54 }
Niels Möller9c843902019-01-11 10:21:35 +010055
Ilya Nikolaevskiy2ebf5232019-05-13 16:13:36 +020056 using EncodedImage::ColorSpace;
Niels Möller9c843902019-01-11 10:21:35 +010057 using EncodedImage::data;
Markus Handell269ac812019-12-03 14:31:45 +010058 using EncodedImage::GetEncodedData;
Minyue Li21bccae2020-03-09 13:28:43 +010059 using EncodedImage::NtpTimeMs;
Chen Xingf00bf422019-06-20 10:05:55 +020060 using EncodedImage::PacketInfos;
Markus Handell269ac812019-12-03 14:31:45 +010061 using EncodedImage::Retain;
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +010062 using EncodedImage::set_size;
Ilya Nikolaevskiy2ebf5232019-05-13 16:13:36 +020063 using EncodedImage::SetColorSpace;
Niels Möller4d504c72019-06-18 15:56:56 +020064 using EncodedImage::SetEncodedData;
Chen Xingf00bf422019-06-20 10:05:55 +020065 using EncodedImage::SetPacketInfos;
Sergey Silkin61832dd2018-12-20 14:32:14 +010066 using EncodedImage::SetSpatialIndex;
Sergey Silkin2799e632019-05-17 09:51:39 +020067 using EncodedImage::SetSpatialLayerFrameSize;
Niels Möller23775882018-08-16 10:24:12 +020068 using EncodedImage::SetTimestamp;
Niels Möllerf0eee002018-11-28 16:31:29 +010069 using EncodedImage::size;
Sergey Silkin2799e632019-05-17 09:51:39 +020070 using EncodedImage::SpatialIndex;
71 using EncodedImage::SpatialLayerFrameSize;
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +010072 using EncodedImage::Timestamp;
73
philipel9d3ab612015-12-21 04:12:39 -080074 /**
Yves Gerey665174f2018-06-19 15:03:05 +020075 * Get render time in milliseconds
76 */
philipel9d3ab612015-12-21 04:12:39 -080077 int64_t RenderTimeMs() const { return _renderTimeMs; }
78 /**
Yves Gerey665174f2018-06-19 15:03:05 +020079 * Get frame type
80 */
Niels Möller87e2d782019-03-07 10:18:23 +010081 webrtc::VideoFrameType FrameType() const { return _frameType; }
philipel9d3ab612015-12-21 04:12:39 -080082 /**
Markus Handell269ac812019-12-03 14:31:45 +010083 * Set frame type
84 */
85 void SetFrameType(webrtc::VideoFrameType frame_type) {
86 _frameType = frame_type;
87 }
88 /**
Yves Gerey665174f2018-06-19 15:03:05 +020089 * Get frame rotation
90 */
perkj414dda12016-07-04 01:45:23 -070091 VideoRotation rotation() const { return rotation_; }
philipel9d3ab612015-12-21 04:12:39 -080092 /**
ilnik00d802b2017-04-11 10:34:31 -070093 * Get video content type
94 */
95 VideoContentType contentType() const { return content_type_; }
96 /**
ilnik04f4d122017-06-19 07:18:55 -070097 * Get video timing
98 */
99 EncodedImage::Timing video_timing() const { return timing_; }
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +0100100 EncodedImage::Timing* video_timing_mutable() { return &timing_; }
ilnik04f4d122017-06-19 07:18:55 -0700101 /**
ilnik00d802b2017-04-11 10:34:31 -0700102 * True if this frame is complete, false otherwise
103 */
philipel9d3ab612015-12-21 04:12:39 -0800104 bool Complete() const { return _completeFrame; }
105 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200106 * True if there's a frame missing before this frame
107 */
philipel9d3ab612015-12-21 04:12:39 -0800108 bool MissingFrame() const { return _missingFrame; }
109 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200110 * Payload type of the encoded payload
111 */
philipel9d3ab612015-12-21 04:12:39 -0800112 uint8_t PayloadType() const { return _payloadType; }
113 /**
Yves Gerey665174f2018-06-19 15:03:05 +0200114 * Get codec specific info.
115 * The returned pointer is only valid as long as the VCMEncodedFrame
116 * is valid. Also, VCMEncodedFrame owns the pointer and will delete
117 * the object.
118 */
philipel9d3ab612015-12-21 04:12:39 -0800119 const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; }
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +0100120 void SetCodecSpecific(const CodecSpecificInfo* codec_specific) {
121 _codecSpecificInfo = *codec_specific;
122 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000123
Ilya Nikolaevskiy5546aef2018-12-04 15:54:52 +0100124 protected:
philipel9d3ab612015-12-21 04:12:39 -0800125 void Reset();
niklase@google.com470e71d2011-07-07 08:21:25 +0000126
philipel9d3ab612015-12-21 04:12:39 -0800127 void CopyCodecSpecific(const RTPVideoHeader* header);
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000128
philipel9d3ab612015-12-21 04:12:39 -0800129 int64_t _renderTimeMs;
130 uint8_t _payloadType;
131 bool _missingFrame;
132 CodecSpecificInfo _codecSpecificInfo;
133 webrtc::VideoCodecType _codec;
niklase@google.com470e71d2011-07-07 08:21:25 +0000134};
135
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000136} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000137
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200138#endif // MODULES_VIDEO_CODING_ENCODED_FRAME_H_