summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/api/video_codecs/vp8_frame_config.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/api/video_codecs/vp8_frame_config.h')
-rw-r--r--third_party/libwebrtc/api/video_codecs/vp8_frame_config.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/third_party/libwebrtc/api/video_codecs/vp8_frame_config.h b/third_party/libwebrtc/api/video_codecs/vp8_frame_config.h
new file mode 100644
index 0000000000..5369bf58bc
--- /dev/null
+++ b/third_party/libwebrtc/api/video_codecs/vp8_frame_config.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2019 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_VP8_FRAME_CONFIG_H_
+#define API_VIDEO_CODECS_VP8_FRAME_CONFIG_H_
+
+#include <stdint.h>
+
+namespace webrtc {
+
+// Configuration of a VP8 frame - which buffers are to be referenced
+// by it, which buffers should be updated, etc.
+struct Vp8FrameConfig {
+ static Vp8FrameConfig GetIntraFrameConfig() {
+ Vp8FrameConfig frame_config = Vp8FrameConfig(
+ BufferFlags::kUpdate, BufferFlags::kUpdate, BufferFlags::kUpdate);
+ frame_config.packetizer_temporal_idx = 0;
+ return frame_config;
+ }
+
+ enum BufferFlags : int {
+ kNone = 0,
+ kReference = 1,
+ kUpdate = 2,
+ kReferenceAndUpdate = kReference | kUpdate,
+ };
+
+ enum FreezeEntropy { kFreezeEntropy };
+
+ // Defined bit-maskable reference to the three buffers available in VP8.
+ enum class Vp8BufferReference : uint8_t {
+ kNone = 0,
+ kLast = 1,
+ kGolden = 2,
+ kAltref = 4
+ };
+
+ Vp8FrameConfig();
+
+ Vp8FrameConfig(BufferFlags last, BufferFlags golden, BufferFlags arf);
+ Vp8FrameConfig(BufferFlags last,
+ BufferFlags golden,
+ BufferFlags arf,
+ FreezeEntropy);
+
+ enum class Buffer : int { kLast = 0, kGolden = 1, kArf = 2, kCount };
+
+ bool References(Buffer buffer) const;
+
+ bool Updates(Buffer buffer) const;
+
+ bool IntraFrame() const {
+ // Intra frames do not reference any buffers, and update all buffers.
+ return last_buffer_flags == kUpdate && golden_buffer_flags == kUpdate &&
+ arf_buffer_flags == kUpdate;
+ }
+
+ bool drop_frame;
+ BufferFlags last_buffer_flags;
+ BufferFlags golden_buffer_flags;
+ BufferFlags arf_buffer_flags;
+
+ // The encoder layer ID is used to utilize the correct bitrate allocator
+ // inside the encoder. It does not control references nor determine which
+ // "actual" temporal layer this is. The packetizer temporal index determines
+ // which layer the encoded frame should be packetized into.
+ // Normally these are the same, but current temporal-layer strategies for
+ // screenshare use one bitrate allocator for all layers, but attempt to
+ // packetize / utilize references to split a stream into multiple layers,
+ // with different quantizer settings, to hit target bitrate.
+ // TODO(sprang): Screenshare layers are being reconsidered at the time of
+ // writing, we might be able to remove this distinction, and have a temporal
+ // layer imply both (the normal case).
+ int encoder_layer_id;
+ // TODO(eladalon/sprang): Move out of this class.
+ int packetizer_temporal_idx;
+
+ // TODO(eladalon/sprang): Move out of this class.
+ bool layer_sync;
+
+ bool freeze_entropy;
+
+ // Indicates in which order the encoder should search the reference buffers
+ // when doing motion prediction. Set to kNone to use unspecified order. Any
+ // buffer indicated here must not have the corresponding no_ref bit set.
+ // If all three buffers can be reference, the one not listed here should be
+ // searched last.
+ Vp8BufferReference first_reference;
+ Vp8BufferReference second_reference;
+
+ // Whether this frame is eligible for retransmission.
+ bool retransmission_allowed;
+
+ private:
+ Vp8FrameConfig(BufferFlags last,
+ BufferFlags golden,
+ BufferFlags arf,
+ bool freeze_entropy);
+};
+
+} // namespace webrtc
+
+#endif // API_VIDEO_CODECS_VP8_FRAME_CONFIG_H_