diff options
Diffstat (limited to 'third_party/libwebrtc/modules/video_coding/encoded_frame.cc')
-rw-r--r-- | third_party/libwebrtc/modules/video_coding/encoded_frame.cc | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/third_party/libwebrtc/modules/video_coding/encoded_frame.cc b/third_party/libwebrtc/modules/video_coding/encoded_frame.cc new file mode 100644 index 0000000000..637a20cfc9 --- /dev/null +++ b/third_party/libwebrtc/modules/video_coding/encoded_frame.cc @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "modules/video_coding/encoded_frame.h" + +#include <string.h> + +#include "absl/types/variant.h" +#include "api/video/video_timing.h" +#include "modules/video_coding/codecs/interface/common_constants.h" +#include "modules/video_coding/codecs/vp8/include/vp8_globals.h" +#include "modules/video_coding/codecs/vp9/include/vp9_globals.h" + +namespace webrtc { + +VCMEncodedFrame::VCMEncodedFrame() + : webrtc::EncodedImage(), + _renderTimeMs(-1), + _payloadType(0), + _missingFrame(false), + _codec(kVideoCodecGeneric) { + _codecSpecificInfo.codecType = kVideoCodecGeneric; +} + +VCMEncodedFrame::VCMEncodedFrame(const VCMEncodedFrame&) = default; + +VCMEncodedFrame::~VCMEncodedFrame() { + Reset(); +} + +void VCMEncodedFrame::Reset() { + SetTimestamp(0); + SetSpatialIndex(absl::nullopt); + _renderTimeMs = -1; + _payloadType = 0; + _frameType = VideoFrameType::kVideoFrameDelta; + _encodedWidth = 0; + _encodedHeight = 0; + _missingFrame = false; + set_size(0); + _codecSpecificInfo.codecType = kVideoCodecGeneric; + _codec = kVideoCodecGeneric; + rotation_ = kVideoRotation_0; + content_type_ = VideoContentType::UNSPECIFIED; + timing_.flags = VideoSendTiming::kInvalid; +} + +void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) { + if (header) { + switch (header->codec) { + case kVideoCodecVP8: { + const auto& vp8_header = + absl::get<RTPVideoHeaderVP8>(header->video_type_header); + if (_codecSpecificInfo.codecType != kVideoCodecVP8) { + // This is the first packet for this frame. + _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0; + _codecSpecificInfo.codecSpecific.VP8.layerSync = false; + _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1; + _codecSpecificInfo.codecType = kVideoCodecVP8; + } + _codecSpecificInfo.codecSpecific.VP8.nonReference = + vp8_header.nonReference; + if (vp8_header.temporalIdx != kNoTemporalIdx) { + _codecSpecificInfo.codecSpecific.VP8.temporalIdx = + vp8_header.temporalIdx; + _codecSpecificInfo.codecSpecific.VP8.layerSync = vp8_header.layerSync; + } + if (vp8_header.keyIdx != kNoKeyIdx) { + _codecSpecificInfo.codecSpecific.VP8.keyIdx = vp8_header.keyIdx; + } + break; + } + case kVideoCodecVP9: { + const auto& vp9_header = + absl::get<RTPVideoHeaderVP9>(header->video_type_header); + if (_codecSpecificInfo.codecType != kVideoCodecVP9) { + // This is the first packet for this frame. + _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0; + _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0; + _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false; + _codecSpecificInfo.codecType = kVideoCodecVP9; + } + _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted = + vp9_header.inter_pic_predicted; + _codecSpecificInfo.codecSpecific.VP9.flexible_mode = + vp9_header.flexible_mode; + _codecSpecificInfo.codecSpecific.VP9.num_ref_pics = + vp9_header.num_ref_pics; + for (uint8_t r = 0; r < vp9_header.num_ref_pics; ++r) { + _codecSpecificInfo.codecSpecific.VP9.p_diff[r] = + vp9_header.pid_diff[r]; + } + _codecSpecificInfo.codecSpecific.VP9.ss_data_available = + vp9_header.ss_data_available; + if (vp9_header.temporal_idx != kNoTemporalIdx) { + _codecSpecificInfo.codecSpecific.VP9.temporal_idx = + vp9_header.temporal_idx; + _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch = + vp9_header.temporal_up_switch; + } + if (vp9_header.spatial_idx != kNoSpatialIdx) { + _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = + vp9_header.inter_layer_predicted; + SetSpatialIndex(vp9_header.spatial_idx); + } + if (vp9_header.gof_idx != kNoGofIdx) { + _codecSpecificInfo.codecSpecific.VP9.gof_idx = vp9_header.gof_idx; + } + if (vp9_header.ss_data_available) { + _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers = + vp9_header.num_spatial_layers; + _codecSpecificInfo.codecSpecific.VP9 + .spatial_layer_resolution_present = + vp9_header.spatial_layer_resolution_present; + if (vp9_header.spatial_layer_resolution_present) { + for (size_t i = 0; i < vp9_header.num_spatial_layers; ++i) { + _codecSpecificInfo.codecSpecific.VP9.width[i] = + vp9_header.width[i]; + _codecSpecificInfo.codecSpecific.VP9.height[i] = + vp9_header.height[i]; + } + } + _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9( + vp9_header.gof); + } + break; + } + case kVideoCodecH264: { + _codecSpecificInfo.codecType = kVideoCodecH264; + break; + } + case kVideoCodecAV1: { + _codecSpecificInfo.codecType = kVideoCodecAV1; + break; + } + default: { + _codecSpecificInfo.codecType = kVideoCodecGeneric; + break; + } + } + } +} + +} // namespace webrtc |