2021-05-07 11:19:12 +08:00
|
|
|
|
/*
|
2023-12-09 16:23:51 +08:00
|
|
|
|
* Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
|
2021-05-06 16:25:18 +08:00
|
|
|
|
*
|
2023-12-09 16:23:51 +08:00
|
|
|
|
* This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
|
2021-05-06 16:25:18 +08:00
|
|
|
|
*
|
2023-12-09 16:23:51 +08:00
|
|
|
|
* Use of this source code is governed by MIT-like license that can be found in the
|
2021-05-06 16:25:18 +08:00
|
|
|
|
* LICENSE file in the root of the source tree. All contributing project authors
|
|
|
|
|
* may be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef ZLMEDIAKIT_RTPEXT_H
|
|
|
|
|
#define ZLMEDIAKIT_RTPEXT_H
|
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <map>
|
|
|
|
|
#include <string>
|
|
|
|
|
#include "Common/macros.h"
|
|
|
|
|
#include "Rtsp/Rtsp.h"
|
|
|
|
|
|
2022-09-18 21:03:05 +08:00
|
|
|
|
namespace mediakit {
|
2021-05-06 16:25:18 +08:00
|
|
|
|
|
2021-07-06 17:54:10 +08:00
|
|
|
|
#define RTP_EXT_MAP(XX) \
|
|
|
|
|
XX(ssrc_audio_level, "urn:ietf:params:rtp-hdrext:ssrc-audio-level") \
|
|
|
|
|
XX(abs_send_time, "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time") \
|
|
|
|
|
XX(transport_cc, "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01") \
|
|
|
|
|
XX(sdes_mid, "urn:ietf:params:rtp-hdrext:sdes:mid") \
|
|
|
|
|
XX(sdes_rtp_stream_id, "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id") \
|
|
|
|
|
XX(sdes_repaired_rtp_stream_id, "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id") \
|
|
|
|
|
XX(video_timing, "http://www.webrtc.org/experiments/rtp-hdrext/video-timing") \
|
|
|
|
|
XX(color_space, "http://www.webrtc.org/experiments/rtp-hdrext/color-space") \
|
|
|
|
|
XX(csrc_audio_level, "urn:ietf:params:rtp-hdrext:csrc-audio-level") \
|
|
|
|
|
XX(framemarking, "http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07") \
|
|
|
|
|
XX(video_content_type, "http://www.webrtc.org/experiments/rtp-hdrext/video-content-type") \
|
|
|
|
|
XX(playout_delay, "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay") \
|
|
|
|
|
XX(video_orientation, "urn:3gpp:video-orientation") \
|
|
|
|
|
XX(toffset, "urn:ietf:params:rtp-hdrext:toffset") \
|
2023-07-08 23:28:34 +08:00
|
|
|
|
XX(av1, "https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension") \
|
2021-07-06 17:54:10 +08:00
|
|
|
|
XX(encrypt, "urn:ietf:params:rtp-hdrext:encrypt")
|
|
|
|
|
|
2021-05-07 12:00:26 +08:00
|
|
|
|
enum class RtpExtType : uint8_t {
|
|
|
|
|
padding = 0,
|
2021-07-06 17:54:10 +08:00
|
|
|
|
#define XX(type, uri) type,
|
|
|
|
|
RTP_EXT_MAP(XX)
|
|
|
|
|
#undef XX
|
2023-07-08 23:28:34 +08:00
|
|
|
|
reserved = 15,
|
2021-05-07 12:00:26 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class RtcMedia;
|
|
|
|
|
|
2021-05-13 01:29:55 +08:00
|
|
|
|
//使用次对象的方法前需保证RtpHeader内存未释放
|
|
|
|
|
class RtpExt {
|
2021-05-06 16:25:18 +08:00
|
|
|
|
public:
|
2021-05-07 18:33:45 +08:00
|
|
|
|
template<typename Type>
|
2022-02-02 20:34:50 +08:00
|
|
|
|
friend void appendExt(std::map<uint8_t, RtpExt> &ret, uint8_t *ptr, const uint8_t *end);
|
2021-10-06 22:17:38 +08:00
|
|
|
|
friend class RtpExtContext;
|
2021-05-07 14:56:01 +08:00
|
|
|
|
|
2022-09-18 21:03:05 +08:00
|
|
|
|
static std::map<uint8_t/*id*/, RtpExt/*data*/> getExtValue(const RtpHeader *header);
|
2022-02-02 20:34:50 +08:00
|
|
|
|
static RtpExtType getExtType(const std::string &url);
|
|
|
|
|
static const std::string& getExtUrl(RtpExtType type);
|
2021-05-07 14:56:01 +08:00
|
|
|
|
static const char *getExtName(RtpExtType type);
|
2021-05-07 12:00:26 +08:00
|
|
|
|
|
2021-05-08 10:32:08 +08:00
|
|
|
|
void setType(RtpExtType type);
|
2021-05-16 21:17:55 +08:00
|
|
|
|
RtpExtType getType() const;
|
2022-02-02 20:34:50 +08:00
|
|
|
|
std::string dumpString() const;
|
2021-05-07 12:00:26 +08:00
|
|
|
|
|
2021-05-07 17:47:53 +08:00
|
|
|
|
uint8_t getAudioLevel(bool *vad) const;
|
|
|
|
|
uint32_t getAbsSendTime() const;
|
|
|
|
|
uint16_t getTransportCCSeq() const;
|
2022-02-02 20:34:50 +08:00
|
|
|
|
std::string getSdesMid() const;
|
|
|
|
|
std::string getRtpStreamId() const;
|
|
|
|
|
std::string getRepairedRtpStreamId() const;
|
2021-05-07 17:47:53 +08:00
|
|
|
|
|
|
|
|
|
void getVideoTiming(uint8_t &flags,
|
|
|
|
|
uint16_t &encode_start,
|
|
|
|
|
uint16_t &encode_finish,
|
|
|
|
|
uint16_t &packetization_complete,
|
|
|
|
|
uint16_t &last_pkt_left_pacer,
|
|
|
|
|
uint16_t &reserved_net0,
|
|
|
|
|
uint16_t &reserved_net1) const;
|
|
|
|
|
|
|
|
|
|
uint8_t getVideoContentType() const;
|
|
|
|
|
|
|
|
|
|
void getVideoOrientation(bool &camera_bit,
|
|
|
|
|
bool &flip_bit,
|
|
|
|
|
bool &first_rotation,
|
|
|
|
|
bool &second_rotation) const;
|
|
|
|
|
|
|
|
|
|
void getPlayoutDelay(uint16_t &min_delay, uint16_t &max_delay) const;
|
|
|
|
|
|
|
|
|
|
uint32_t getTransmissionOffset() const;
|
|
|
|
|
|
|
|
|
|
uint8_t getFramemarkingTID() const;
|
|
|
|
|
|
2021-05-07 18:33:45 +08:00
|
|
|
|
void setExtId(uint8_t ext_id);
|
2021-05-08 11:37:54 +08:00
|
|
|
|
void clearExt();
|
2021-10-06 22:17:38 +08:00
|
|
|
|
operator bool () const;
|
2021-05-07 18:33:45 +08:00
|
|
|
|
|
|
|
|
|
private:
|
2021-10-06 22:17:38 +08:00
|
|
|
|
RtpExt() = default;
|
2021-05-08 10:32:08 +08:00
|
|
|
|
RtpExt(void *ptr, bool one_byte_ext, const char *str, size_t size);
|
2021-05-13 01:29:55 +08:00
|
|
|
|
const char *data() const;
|
|
|
|
|
size_t size() const;
|
2021-10-06 22:10:54 +08:00
|
|
|
|
const uint8_t& operator[](size_t pos) const;
|
2021-05-13 01:29:55 +08:00
|
|
|
|
operator std::string() const;
|
2021-05-07 18:33:45 +08:00
|
|
|
|
|
2021-05-07 12:00:26 +08:00
|
|
|
|
private:
|
2021-05-13 01:29:55 +08:00
|
|
|
|
void *_ext = nullptr;
|
|
|
|
|
const char *_data;
|
|
|
|
|
size_t _size;
|
2021-05-07 18:33:45 +08:00
|
|
|
|
bool _one_byte_ext = true;
|
2021-05-08 10:32:08 +08:00
|
|
|
|
RtpExtType _type = RtpExtType::padding;
|
2021-05-06 16:25:18 +08:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-25 15:31:13 +08:00
|
|
|
|
class RtcMedia;
|
|
|
|
|
class RtpExtContext {
|
|
|
|
|
public:
|
|
|
|
|
using Ptr = std::shared_ptr<RtpExtContext>;
|
2022-02-02 20:34:50 +08:00
|
|
|
|
using OnGetRtp = std::function<void(uint8_t pt, uint32_t ssrc, const std::string &rid)>;
|
2021-06-25 16:57:38 +08:00
|
|
|
|
|
2021-06-25 15:31:13 +08:00
|
|
|
|
RtpExtContext(const RtcMedia &media);
|
|
|
|
|
|
2021-06-25 16:57:38 +08:00
|
|
|
|
void setOnGetRtp(OnGetRtp cb);
|
2022-02-02 20:34:50 +08:00
|
|
|
|
std::string getRid(uint32_t ssrc) const;
|
|
|
|
|
void setRid(uint32_t ssrc, const std::string &rid);
|
2022-09-18 21:03:05 +08:00
|
|
|
|
RtpExt changeRtpExtId(const RtpHeader *header, bool is_recv, std::string *rid_ptr = nullptr, RtpExtType type = RtpExtType::padding);
|
2021-06-25 15:31:13 +08:00
|
|
|
|
|
|
|
|
|
private:
|
2022-02-02 20:34:50 +08:00
|
|
|
|
void onGetRtp(uint8_t pt, uint32_t ssrc, const std::string &rid);
|
2021-06-25 16:57:38 +08:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
OnGetRtp _cb;
|
2021-06-25 15:31:13 +08:00
|
|
|
|
//发送rtp时需要修改rtp ext id
|
2022-02-02 20:34:50 +08:00
|
|
|
|
std::map<RtpExtType, uint8_t> _rtp_ext_type_to_id;
|
2021-06-25 15:31:13 +08:00
|
|
|
|
//接收rtp时需要修改rtp ext id
|
2022-02-02 20:34:50 +08:00
|
|
|
|
std::unordered_map<uint8_t, RtpExtType> _rtp_ext_id_to_type;
|
2021-06-25 15:31:13 +08:00
|
|
|
|
//ssrc --> rid
|
2022-02-02 20:34:50 +08:00
|
|
|
|
std::unordered_map<uint32_t/*simulcast ssrc*/, std::string/*rid*/> _ssrc_to_rid;
|
2021-06-25 15:31:13 +08:00
|
|
|
|
};
|
2021-05-06 16:25:18 +08:00
|
|
|
|
|
2022-09-18 21:03:05 +08:00
|
|
|
|
} //namespace mediakit
|
2021-05-06 16:25:18 +08:00
|
|
|
|
#endif //ZLMEDIAKIT_RTPEXT_H
|