ZLMediaKit/webrtc/RtpExt.h

138 lines
3.8 KiB
C++
Raw Normal View History

2021-05-07 11:19:12 +08:00
/*
2021-05-06 16:25:18 +08:00
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
*
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
*
* Use of this source code is governed by MIT license that can be found in the
* 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"
using namespace std;
using namespace mediakit;
2021-05-07 12:00:26 +08:00
enum class RtpExtType : uint8_t {
padding = 0,
ssrc_audio_level = 1,
abs_send_time = 2,
transport_cc = 3,
sdes_mid = 4,
sdes_rtp_stream_id = 5,
sdes_repaired_rtp_stream_id = 6,
video_timing = 7,
color_space = 8,
2021-05-07 17:47:53 +08:00
//for firefox
csrc_audio_level = 9,
//svc ?
framemarking = 10,
2021-05-07 12:00:26 +08:00
video_content_type = 11,
playout_delay = 12,
video_orientation = 13,
toffset = 14,
reserved = 15,
2021-05-07 17:47:53 +08:00
// e2e ?
2021-05-07 18:33:45 +08:00
encrypt = reserved
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>
2021-05-08 10:32:08 +08:00
friend void appendExt(map<uint8_t, RtpExt> &ret, uint8_t *ptr, const uint8_t *end);
2021-05-07 18:33:45 +08:00
2021-05-07 12:00:26 +08:00
~RtpExt() = default;
2021-05-07 14:56:01 +08:00
2021-05-08 10:32:08 +08:00
static map<uint8_t/*id*/, RtpExt/*data*/> getExtValue(const RtpHeader *header);
2021-05-07 14:01:24 +08:00
static RtpExtType getExtType(const string &url);
static const 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;
2021-05-07 14:56:01 +08:00
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;
2021-05-13 01:29:55 +08:00
string getSdesMid() const;
2021-05-07 17:47:53 +08:00
string getRtpStreamId() const;
string getRepairedRtpStreamId() const;
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-05-07 18:33:45 +08:00
private:
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;
const char& operator[](size_t pos) const;
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>;
2021-06-25 16:57:38 +08:00
using OnGetRtp = function<void(uint8_t pt, uint32_t ssrc, const string &rid)>;
2021-06-25 15:31:13 +08:00
RtpExtContext(const RtcMedia &media);
~RtpExtContext() = default;
2021-06-25 16:57:38 +08:00
void setOnGetRtp(OnGetRtp cb);
2021-06-25 15:31:13 +08:00
string getRid(uint32_t ssrc) const;
void changeRtpExtId(const RtpHeader *header, bool is_recv, string *rid_ptr = nullptr);
private:
2021-06-25 16:57:38 +08:00
void onGetRtp(uint8_t pt, uint32_t ssrc, const string &rid);
private:
OnGetRtp _cb;
2021-06-25 15:31:13 +08:00
//发送rtp时需要修改rtp ext id
map<RtpExtType, uint8_t> _rtp_ext_type_to_id;
//接收rtp时需要修改rtp ext id
unordered_map<uint8_t, RtpExtType> _rtp_ext_id_to_type;
//ssrc --> rid
unordered_map<uint32_t/*simulcast ssrc*/, string/*rid*/> _ssrc_to_rid;
};
2021-05-06 16:25:18 +08:00
#endif //ZLMEDIAKIT_RTPEXT_H