summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/api/video_codecs/video_codec.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/libwebrtc/api/video_codecs/video_codec.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/third_party/libwebrtc/api/video_codecs/video_codec.h b/third_party/libwebrtc/api/video_codecs/video_codec.h
new file mode 100644
index 0000000000..10bceda0d2
--- /dev/null
+++ b/third_party/libwebrtc/api/video_codecs/video_codec.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2018 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.
+ */
+
+#ifndef API_VIDEO_CODECS_VIDEO_CODEC_H_
+#define API_VIDEO_CODECS_VIDEO_CODEC_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+
+#include "absl/strings/string_view.h"
+#include "api/video/video_bitrate_allocation.h"
+#include "api/video/video_codec_type.h"
+#include "api/video_codecs/scalability_mode.h"
+#include "api/video_codecs/simulcast_stream.h"
+#include "api/video_codecs/spatial_layer.h"
+#include "rtc_base/system/rtc_export.h"
+
+namespace webrtc {
+
+// The VideoCodec class represents an old defacto-apis, which we're migrating
+// away from slowly.
+
+// Video codec
+enum class VideoCodecComplexity {
+ kComplexityLow = -1,
+ kComplexityNormal = 0,
+ kComplexityHigh = 1,
+ kComplexityHigher = 2,
+ kComplexityMax = 3
+};
+
+// VP8 specific
+struct VideoCodecVP8 {
+ bool operator==(const VideoCodecVP8& other) const;
+ bool operator!=(const VideoCodecVP8& other) const {
+ return !(*this == other);
+ }
+ // Temporary utility method for transition deleting numberOfTemporalLayers
+ // setting (replaced by ScalabilityMode).
+ void SetNumberOfTemporalLayers(unsigned char n) {
+ numberOfTemporalLayers = n;
+ }
+ unsigned char numberOfTemporalLayers;
+ bool denoisingOn;
+ bool automaticResizeOn;
+ int keyFrameInterval;
+};
+
+enum class InterLayerPredMode : int {
+ kOff = 0, // Inter-layer prediction is disabled.
+ kOn = 1, // Inter-layer prediction is enabled.
+ kOnKeyPic = 2 // Inter-layer prediction is enabled but limited to key frames.
+};
+
+// VP9 specific.
+struct VideoCodecVP9 {
+ bool operator==(const VideoCodecVP9& other) const;
+ bool operator!=(const VideoCodecVP9& other) const {
+ return !(*this == other);
+ }
+ // Temporary utility method for transition deleting numberOfTemporalLayers
+ // setting (replaced by ScalabilityMode).
+ void SetNumberOfTemporalLayers(unsigned char n) {
+ numberOfTemporalLayers = n;
+ }
+ unsigned char numberOfTemporalLayers;
+ bool denoisingOn;
+ int keyFrameInterval;
+ bool adaptiveQpMode;
+ bool automaticResizeOn;
+ unsigned char numberOfSpatialLayers;
+ bool flexibleMode;
+ InterLayerPredMode interLayerPred;
+};
+
+// H264 specific.
+struct VideoCodecH264 {
+ bool operator==(const VideoCodecH264& other) const;
+ bool operator!=(const VideoCodecH264& other) const {
+ return !(*this == other);
+ }
+ // Temporary utility method for transition deleting numberOfTemporalLayers
+ // setting (replaced by ScalabilityMode).
+ void SetNumberOfTemporalLayers(unsigned char n) {
+ numberOfTemporalLayers = n;
+ }
+ int keyFrameInterval;
+ uint8_t numberOfTemporalLayers;
+};
+
+// Translates from name of codec to codec type and vice versa.
+RTC_EXPORT const char* CodecTypeToPayloadString(VideoCodecType type);
+RTC_EXPORT VideoCodecType PayloadStringToCodecType(const std::string& name);
+
+union VideoCodecUnion {
+ VideoCodecVP8 VP8;
+ VideoCodecVP9 VP9;
+ VideoCodecH264 H264;
+};
+
+enum class VideoCodecMode { kRealtimeVideo, kScreensharing };
+
+// Common video codec properties
+class RTC_EXPORT VideoCodec {
+ public:
+ VideoCodec();
+
+ // Scalability mode as described in
+ // https://www.w3.org/TR/webrtc-svc/#scalabilitymodes*
+ absl::optional<ScalabilityMode> GetScalabilityMode() const {
+ return scalability_mode_;
+ }
+ void SetScalabilityMode(ScalabilityMode scalability_mode) {
+ scalability_mode_ = scalability_mode;
+ }
+ void UnsetScalabilityMode() { scalability_mode_ = absl::nullopt; }
+
+ VideoCodecComplexity GetVideoEncoderComplexity() const;
+ void SetVideoEncoderComplexity(VideoCodecComplexity complexity_setting);
+
+ bool GetFrameDropEnabled() const;
+ void SetFrameDropEnabled(bool enabled);
+
+ // Public variables. TODO(hta): Make them private with accessors.
+ VideoCodecType codecType;
+
+ // TODO(nisse): Change to int, for consistency.
+ uint16_t width;
+ uint16_t height;
+
+ unsigned int startBitrate; // kilobits/sec.
+ unsigned int maxBitrate; // kilobits/sec.
+ unsigned int minBitrate; // kilobits/sec.
+
+ uint32_t maxFramerate;
+
+ // This enables/disables encoding and sending when there aren't multiple
+ // simulcast streams,by allocating 0 bitrate if inactive.
+ bool active;
+
+ unsigned int qpMax;
+ unsigned char numberOfSimulcastStreams;
+ SimulcastStream simulcastStream[kMaxSimulcastStreams];
+ SpatialLayer spatialLayers[kMaxSpatialLayers];
+
+ VideoCodecMode mode;
+ bool expect_encode_from_texture;
+
+ // Timing frames configuration. There is delay of delay_ms between two
+ // consequent timing frames, excluding outliers. Frame is always made a
+ // timing frame if it's at least outlier_ratio in percent of "ideal" average
+ // frame given bitrate and framerate, i.e. if it's bigger than
+ // |outlier_ratio / 100.0 * bitrate_bps / fps| in bits. This way, timing
+ // frames will not be sent too often usually. Yet large frames will always
+ // have timing information for debug purposes because they are more likely to
+ // cause extra delays.
+ struct TimingFrameTriggerThresholds {
+ int64_t delay_ms;
+ uint16_t outlier_ratio_percent;
+ } timing_frame_thresholds;
+
+ // Legacy Google conference mode flag for simulcast screenshare
+ bool legacy_conference_mode;
+
+ bool operator==(const VideoCodec& other) const = delete;
+ bool operator!=(const VideoCodec& other) const = delete;
+
+ // Accessors for codec specific information.
+ // There is a const version of each that returns a reference,
+ // and a non-const version that returns a pointer, in order
+ // to allow modification of the parameters.
+ VideoCodecVP8* VP8();
+ const VideoCodecVP8& VP8() const;
+ VideoCodecVP9* VP9();
+ const VideoCodecVP9& VP9() const;
+ VideoCodecH264* H264();
+ const VideoCodecH264& H264() const;
+
+ private:
+ // TODO(hta): Consider replacing the union with a pointer type.
+ // This will allow removing the VideoCodec* types from this file.
+ VideoCodecUnion codec_specific_;
+ absl::optional<ScalabilityMode> scalability_mode_;
+ // 'complexity_' indicates the CPU capability of the client. It's used to
+ // determine encoder CPU complexity (e.g., cpu_used for VP8, VP9. and AV1).
+ VideoCodecComplexity complexity_;
+ bool frame_drop_enabled_ = false;
+};
+
+} // namespace webrtc
+#endif // API_VIDEO_CODECS_VIDEO_CODEC_H_