blob: ebaa83b7759042e191fd178009c03d0e39ccc4fe [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgddab60b2012-04-23 14:52:15 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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#include "modules/video_coding/encoded_frame.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
13namespace webrtc {
14
15VCMEncodedFrame::VCMEncodedFrame()
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000016 : webrtc::EncodedImage(),
17 _renderTimeMs(-1),
18 _payloadType(0),
19 _missingFrame(false),
20 _codec(kVideoCodecUnknown),
guoweis@webrtc.org54d072e2015-03-17 21:54:50 +000021 _rotation_set(false) {
philipel9d3ab612015-12-21 04:12:39 -080022 _codecSpecificInfo.codecType = kVideoCodecUnknown;
niklase@google.com470e71d2011-07-07 08:21:25 +000023}
24
philipel9d3ab612015-12-21 04:12:39 -080025VCMEncodedFrame::~VCMEncodedFrame() {
26 Free();
niklase@google.com470e71d2011-07-07 08:21:25 +000027}
28
philipel9d3ab612015-12-21 04:12:39 -080029void VCMEncodedFrame::Free() {
30 Reset();
31 if (_buffer != NULL) {
32 delete[] _buffer;
33 _buffer = NULL;
34 }
niklase@google.com470e71d2011-07-07 08:21:25 +000035}
36
philipel9d3ab612015-12-21 04:12:39 -080037void VCMEncodedFrame::Reset() {
38 _renderTimeMs = -1;
39 _timeStamp = 0;
40 _payloadType = 0;
41 _frameType = kVideoFrameDelta;
42 _encodedWidth = 0;
43 _encodedHeight = 0;
44 _completeFrame = false;
45 _missingFrame = false;
46 _length = 0;
47 _codecSpecificInfo.codecType = kVideoCodecUnknown;
48 _codec = kVideoCodecUnknown;
perkj414dda12016-07-04 01:45:23 -070049 rotation_ = kVideoRotation_0;
ilnik00d802b2017-04-11 10:34:31 -070050 content_type_ = VideoContentType::UNSPECIFIED;
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +020051 timing_.flags = VideoSendTiming::kInvalid;
philipel9d3ab612015-12-21 04:12:39 -080052 _rotation_set = false;
niklase@google.com470e71d2011-07-07 08:21:25 +000053}
54
philipel9d3ab612015-12-21 04:12:39 -080055void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000056 if (header) {
57 switch (header->codec) {
Niels Möller520ca4e2018-06-04 11:14:38 +020058 case kVideoCodecVP8: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000059 if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
60 // This is the first packet for this frame.
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000061 _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
62 _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
63 _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
64 _codecSpecificInfo.codecType = kVideoCodecVP8;
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +000065 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000066 _codecSpecificInfo.codecSpecific.VP8.nonReference =
philipel5ab67a52018-07-05 12:27:04 +020067 header->vp8().nonReference;
68 if (header->vp8().temporalIdx != kNoTemporalIdx) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000069 _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
philipel5ab67a52018-07-05 12:27:04 +020070 header->vp8().temporalIdx;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000071 _codecSpecificInfo.codecSpecific.VP8.layerSync =
philipel5ab67a52018-07-05 12:27:04 +020072 header->vp8().layerSync;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000073 }
philipel5ab67a52018-07-05 12:27:04 +020074 if (header->vp8().keyIdx != kNoKeyIdx) {
75 _codecSpecificInfo.codecSpecific.VP8.keyIdx = header->vp8().keyIdx;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000076 }
77 break;
78 }
Niels Möller520ca4e2018-06-04 11:14:38 +020079 case kVideoCodecVP9: {
asaperssona9455ab2015-07-31 06:10:09 -070080 if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
81 // This is the first packet for this frame.
asaperssona9455ab2015-07-31 06:10:09 -070082 _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
83 _codecSpecificInfo.codecSpecific.VP9.spatial_idx = 0;
84 _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
85 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
asaperssona9455ab2015-07-31 06:10:09 -070086 _codecSpecificInfo.codecType = kVideoCodecVP9;
87 }
88 _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
philipel5ab67a52018-07-05 12:27:04 +020089 header->vp9().inter_pic_predicted;
asaperssona9455ab2015-07-31 06:10:09 -070090 _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
philipel5ab67a52018-07-05 12:27:04 +020091 header->vp9().flexible_mode;
philipelcfc319b2015-11-10 07:17:23 -080092 _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
philipel5ab67a52018-07-05 12:27:04 +020093 header->vp9().num_ref_pics;
94 for (uint8_t r = 0; r < header->vp9().num_ref_pics; ++r) {
philipelcfc319b2015-11-10 07:17:23 -080095 _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
philipel5ab67a52018-07-05 12:27:04 +020096 header->vp9().pid_diff[r];
philipelcfc319b2015-11-10 07:17:23 -080097 }
asaperssona9455ab2015-07-31 06:10:09 -070098 _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
philipel5ab67a52018-07-05 12:27:04 +020099 header->vp9().ss_data_available;
100 if (header->vp9().temporal_idx != kNoTemporalIdx) {
asaperssona9455ab2015-07-31 06:10:09 -0700101 _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
philipel5ab67a52018-07-05 12:27:04 +0200102 header->vp9().temporal_idx;
asaperssona9455ab2015-07-31 06:10:09 -0700103 _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
philipel5ab67a52018-07-05 12:27:04 +0200104 header->vp9().temporal_up_switch;
asaperssona9455ab2015-07-31 06:10:09 -0700105 }
philipel5ab67a52018-07-05 12:27:04 +0200106 if (header->vp9().spatial_idx != kNoSpatialIdx) {
asaperssona9455ab2015-07-31 06:10:09 -0700107 _codecSpecificInfo.codecSpecific.VP9.spatial_idx =
philipel5ab67a52018-07-05 12:27:04 +0200108 header->vp9().spatial_idx;
asaperssona9455ab2015-07-31 06:10:09 -0700109 _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
philipel5ab67a52018-07-05 12:27:04 +0200110 header->vp9().inter_layer_predicted;
asaperssona9455ab2015-07-31 06:10:09 -0700111 }
philipel5ab67a52018-07-05 12:27:04 +0200112 if (header->vp9().gof_idx != kNoGofIdx) {
113 _codecSpecificInfo.codecSpecific.VP9.gof_idx = header->vp9().gof_idx;
asaperssona9455ab2015-07-31 06:10:09 -0700114 }
philipel5ab67a52018-07-05 12:27:04 +0200115 if (header->vp9().ss_data_available) {
asaperssona9455ab2015-07-31 06:10:09 -0700116 _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
philipel5ab67a52018-07-05 12:27:04 +0200117 header->vp9().num_spatial_layers;
asaperssona9455ab2015-07-31 06:10:09 -0700118 _codecSpecificInfo.codecSpecific.VP9
119 .spatial_layer_resolution_present =
philipel5ab67a52018-07-05 12:27:04 +0200120 header->vp9().spatial_layer_resolution_present;
121 if (header->vp9().spatial_layer_resolution_present) {
122 for (size_t i = 0; i < header->vp9().num_spatial_layers; ++i) {
asaperssona9455ab2015-07-31 06:10:09 -0700123 _codecSpecificInfo.codecSpecific.VP9.width[i] =
philipel5ab67a52018-07-05 12:27:04 +0200124 header->vp9().width[i];
asaperssona9455ab2015-07-31 06:10:09 -0700125 _codecSpecificInfo.codecSpecific.VP9.height[i] =
philipel5ab67a52018-07-05 12:27:04 +0200126 header->vp9().height[i];
asaperssona9455ab2015-07-31 06:10:09 -0700127 }
128 }
129 _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
philipel5ab67a52018-07-05 12:27:04 +0200130 header->vp9().gof);
asaperssona9455ab2015-07-31 06:10:09 -0700131 }
132 break;
133 }
Niels Möller520ca4e2018-06-04 11:14:38 +0200134 case kVideoCodecH264: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000135 _codecSpecificInfo.codecType = kVideoCodecH264;
136 break;
137 }
Niels Möller520ca4e2018-06-04 11:14:38 +0200138 default: {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000139 _codecSpecificInfo.codecType = kVideoCodecUnknown;
140 break;
141 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000142 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000143 }
henrik.lundin@webrtc.org473bac82011-08-17 09:47:33 +0000144}
145
philipel9d3ab612015-12-21 04:12:39 -0800146void VCMEncodedFrame::VerifyAndAllocate(size_t minimumSize) {
147 if (minimumSize > _size) {
148 // create buffer of sufficient size
149 uint8_t* newBuffer = new uint8_t[minimumSize];
150 if (_buffer) {
151 // copy old data
152 memcpy(newBuffer, _buffer, _size);
153 delete[] _buffer;
niklase@google.com470e71d2011-07-07 08:21:25 +0000154 }
philipel9d3ab612015-12-21 04:12:39 -0800155 _buffer = newBuffer;
156 _size = minimumSize;
157 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000158}
159
pbos22993e12015-10-19 02:39:06 -0700160} // namespace webrtc