Implement PayloadUnion as variant instead of pair of optionals

Bug: None
Change-Id: I2e54f5a0561804bc59c4d4c8e35ccdaa9536b8e4
Reviewed-on: https://webrtc-review.googlesource.com/85366
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23745}
diff --git a/DEPS b/DEPS
index 18eeb92..fe28211 100644
--- a/DEPS
+++ b/DEPS
@@ -745,4 +745,5 @@
 
   # Abseil whitelist.
   "+absl/types/optional.h",
+  "+absl/types/variant.h",
 ]
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index f19b328..40f7946 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -98,6 +98,7 @@
     "../../rtc_base:rtc_base_approved",
     "../../system_wrappers",
     "//third_party/abseil-cpp/absl/types:optional",
+    "//third_party/abseil-cpp/absl/types:variant",
   ]
 }
 
diff --git a/modules/rtp_rtcp/include/rtp_rtcp_defines.cc b/modules/rtp_rtcp/include/rtp_rtcp_defines.cc
index d9b082b..ad9bd45 100644
--- a/modules/rtp_rtcp/include/rtp_rtcp_defines.cc
+++ b/modules/rtp_rtcp/include/rtp_rtcp_defines.cc
@@ -33,10 +33,8 @@
 // and thus assume trivial destructibility.
 static_assert(std::is_trivially_destructible<StreamId>::value, "");
 
-PayloadUnion::PayloadUnion(const AudioPayload& payload)
-    : audio_payload_(payload) {}
-PayloadUnion::PayloadUnion(const VideoPayload& payload)
-    : video_payload_(payload) {}
+PayloadUnion::PayloadUnion(const AudioPayload& payload) : payload_(payload) {}
+PayloadUnion::PayloadUnion(const VideoPayload& payload) : payload_(payload) {}
 PayloadUnion::PayloadUnion(const PayloadUnion&) = default;
 PayloadUnion::PayloadUnion(PayloadUnion&&) = default;
 PayloadUnion::~PayloadUnion() = default;
diff --git a/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/modules/rtp_rtcp/include/rtp_rtcp_defines.h
index d3515f6..36686a1 100644
--- a/modules/rtp_rtcp/include/rtp_rtcp_defines.h
+++ b/modules/rtp_rtcp/include/rtp_rtcp_defines.h
@@ -15,6 +15,7 @@
 #include <list>
 #include <vector>
 
+#include "absl/types/variant.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/rtp_headers.h"
 #include "common_types.h"  // NOLINT(build/include)
@@ -71,28 +72,23 @@
   PayloadUnion& operator=(const PayloadUnion&);
   PayloadUnion& operator=(PayloadUnion&&);
 
-  bool is_audio() const { return audio_payload_.has_value(); }
-  bool is_video() const { return video_payload_.has_value(); }
+  bool is_audio() const {
+    return absl::holds_alternative<AudioPayload>(payload_);
+  }
+  bool is_video() const {
+    return absl::holds_alternative<VideoPayload>(payload_);
+  }
   const AudioPayload& audio_payload() const {
-    RTC_DCHECK(audio_payload_);
-    return *audio_payload_;
+    return absl::get<AudioPayload>(payload_);
   }
   const VideoPayload& video_payload() const {
-    RTC_DCHECK(video_payload_);
-    return *video_payload_;
+    return absl::get<VideoPayload>(payload_);
   }
-  AudioPayload& audio_payload() {
-    RTC_DCHECK(audio_payload_);
-    return *audio_payload_;
-  }
-  VideoPayload& video_payload() {
-    RTC_DCHECK(video_payload_);
-    return *video_payload_;
-  }
+  AudioPayload& audio_payload() { return absl::get<AudioPayload>(payload_); }
+  VideoPayload& video_payload() { return absl::get<VideoPayload>(payload_); }
 
  private:
-  absl::optional<AudioPayload> audio_payload_;
-  absl::optional<VideoPayload> video_payload_;
+  absl::variant<AudioPayload, VideoPayload> payload_;
 };
 
 enum RTPAliveType { kRtpDead = 0, kRtpNoRtp = 1, kRtpAlive = 2 };