webrtc_m130/modules/rtp_rtcp/include/rtp_header_extension_map.h
Tommi 1f38a38b6f Add ability to set rtp header extensions without recreating streams.
Setting the rtp header extensions on the packet delivery thread
(currently worker, soon to be network), is now possible without
taking the hit of deleting and recreating the receive stream (and
rtp receiver and related state).

Bug: webrtc:11993
Change-Id: I9bbe306844a25d85d79cd216092ead66eaf68960
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/223741
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Tommi <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34953}
2021-09-08 13:39:36 +00:00

76 lines
2.4 KiB
C++

/*
* 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.
*/
#ifndef MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_EXTENSION_MAP_H_
#define MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_EXTENSION_MAP_H_
#include <stdint.h>
#include <string>
#include "api/array_view.h"
#include "api/rtp_parameters.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "rtc_base/checks.h"
namespace webrtc {
class RtpHeaderExtensionMap {
public:
static constexpr RTPExtensionType kInvalidType = kRtpExtensionNone;
static constexpr int kInvalidId = 0;
RtpHeaderExtensionMap();
explicit RtpHeaderExtensionMap(bool extmap_allow_mixed);
explicit RtpHeaderExtensionMap(rtc::ArrayView<const RtpExtension> extensions);
void Reset(rtc::ArrayView<const RtpExtension> extensions);
template <typename Extension>
bool Register(int id) {
return Register(id, Extension::kId, Extension::kUri);
}
bool RegisterByType(int id, RTPExtensionType type);
bool RegisterByUri(int id, absl::string_view uri);
bool IsRegistered(RTPExtensionType type) const {
return GetId(type) != kInvalidId;
}
// Return kInvalidType if not found.
RTPExtensionType GetType(int id) const;
// Return kInvalidId if not found.
uint8_t GetId(RTPExtensionType type) const {
RTC_DCHECK_GT(type, kRtpExtensionNone);
RTC_DCHECK_LT(type, kRtpExtensionNumberOfExtensions);
return ids_[type];
}
int32_t Deregister(RTPExtensionType type);
void Deregister(absl::string_view uri);
// Corresponds to the SDP attribute extmap-allow-mixed, see RFC8285.
// Set to true if it's allowed to mix one- and two-byte RTP header extensions
// in the same stream.
bool ExtmapAllowMixed() const { return extmap_allow_mixed_; }
void SetExtmapAllowMixed(bool extmap_allow_mixed) {
extmap_allow_mixed_ = extmap_allow_mixed;
}
private:
bool Register(int id, RTPExtensionType type, const char* uri);
uint8_t ids_[kRtpExtensionNumberOfExtensions];
bool extmap_allow_mixed_;
};
} // namespace webrtc
#endif // MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_EXTENSION_MAP_H_