2020-03-13 12:35:07 +00:00
|
|
|
/**
|
|
|
|
* The MIT License (MIT)
|
|
|
|
*
|
|
|
|
* Copyright (c) 2013-2020 Winlin
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
|
|
* the Software without restriction, including without limitation the rights to
|
|
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
|
|
* subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
|
|
* copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SRS_KERNEL_RTP_HPP
|
|
|
|
#define SRS_KERNEL_RTP_HPP
|
|
|
|
|
|
|
|
#include <srs_core.hpp>
|
|
|
|
|
2020-04-11 15:57:04 +00:00
|
|
|
#include <srs_kernel_buffer.hpp>
|
|
|
|
#include <srs_kernel_codec.hpp>
|
|
|
|
|
2020-03-13 12:35:07 +00:00
|
|
|
#include <string>
|
|
|
|
|
2020-04-08 06:45:26 +00:00
|
|
|
const int kRtpHeaderFixedSize = 12;
|
|
|
|
const uint8_t kRtpMarker = 0x80;
|
|
|
|
|
2020-04-11 15:57:04 +00:00
|
|
|
// H.264 nalu header type mask.
|
|
|
|
const uint8_t kNalTypeMask = 0x1F;
|
|
|
|
|
2020-04-08 06:45:26 +00:00
|
|
|
class SrsBuffer;
|
2020-04-16 06:28:59 +00:00
|
|
|
class SrsRtpRawPayload;
|
2020-04-16 06:51:36 +00:00
|
|
|
class SrsRtpFUAPayload;
|
2020-04-08 06:45:26 +00:00
|
|
|
|
|
|
|
class SrsRtpHeader
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
bool padding;
|
|
|
|
bool extension;
|
|
|
|
uint8_t cc;
|
|
|
|
bool marker;
|
|
|
|
uint8_t payload_type;
|
|
|
|
uint16_t sequence;
|
|
|
|
int64_t timestamp;
|
|
|
|
uint32_t ssrc;
|
|
|
|
uint32_t csrc[15];
|
|
|
|
uint16_t extension_length;
|
|
|
|
// TODO:extension field.
|
|
|
|
public:
|
|
|
|
SrsRtpHeader();
|
|
|
|
virtual ~SrsRtpHeader();
|
2020-04-16 05:13:02 +00:00
|
|
|
void reset();
|
2020-04-08 06:45:26 +00:00
|
|
|
public:
|
|
|
|
srs_error_t decode(SrsBuffer* stream);
|
|
|
|
srs_error_t encode(SrsBuffer* stream);
|
|
|
|
public:
|
|
|
|
size_t header_size();
|
|
|
|
public:
|
|
|
|
void set_marker(bool marker);
|
|
|
|
bool get_marker() const { return marker; }
|
|
|
|
void set_payload_type(uint8_t payload_type);
|
|
|
|
uint8_t get_payload_type() const { return payload_type; }
|
|
|
|
void set_sequence(uint16_t sequence);
|
|
|
|
uint16_t get_sequence() const { return sequence; }
|
|
|
|
void set_timestamp(int64_t timestamp);
|
|
|
|
int64_t get_timestamp() const { return timestamp; }
|
|
|
|
void set_ssrc(uint32_t ssrc);
|
|
|
|
uint32_t get_ssrc() const { return ssrc; }
|
2020-04-13 05:44:55 +00:00
|
|
|
void set_padding(bool v) { padding = v; }
|
2020-04-08 06:45:26 +00:00
|
|
|
};
|
2020-03-18 00:45:20 +00:00
|
|
|
|
2020-04-11 14:54:44 +00:00
|
|
|
class SrsRtpPacket2
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
SrsRtpHeader rtp_header;
|
2020-04-11 15:57:04 +00:00
|
|
|
ISrsEncoder* payload;
|
2020-04-13 05:44:55 +00:00
|
|
|
int padding;
|
2020-04-16 06:28:59 +00:00
|
|
|
private:
|
|
|
|
SrsRtpRawPayload* cache_raw;
|
2020-04-16 06:51:36 +00:00
|
|
|
SrsRtpFUAPayload* cache_fua;
|
2020-04-11 15:57:04 +00:00
|
|
|
public:
|
|
|
|
SrsRtpPacket2();
|
|
|
|
virtual ~SrsRtpPacket2();
|
|
|
|
public:
|
2020-04-13 05:44:55 +00:00
|
|
|
// Append size of bytes as padding.
|
2020-04-15 14:46:06 +00:00
|
|
|
void set_padding(int size);
|
|
|
|
// Reset RTP packet.
|
|
|
|
void reset();
|
2020-04-16 06:28:59 +00:00
|
|
|
// Reuse the cached raw message as payload.
|
|
|
|
SrsRtpRawPayload* reuse_raw();
|
2020-04-16 06:51:36 +00:00
|
|
|
// Reuse the cached fua message as payload.
|
|
|
|
SrsRtpFUAPayload* reuse_fua();
|
2020-04-13 05:44:55 +00:00
|
|
|
// interface ISrsEncoder
|
|
|
|
public:
|
|
|
|
virtual int nb_bytes();
|
2020-04-11 15:57:04 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer* buf);
|
|
|
|
};
|
|
|
|
|
2020-04-13 11:23:17 +00:00
|
|
|
// Single payload data.
|
2020-04-11 15:57:04 +00:00
|
|
|
class SrsRtpRawPayload : public ISrsEncoder
|
|
|
|
{
|
|
|
|
public:
|
2020-04-11 14:54:44 +00:00
|
|
|
// @remark We only refer to the memory, user must free it.
|
|
|
|
char* payload;
|
|
|
|
int nn_payload;
|
|
|
|
public:
|
2020-04-11 15:57:04 +00:00
|
|
|
SrsRtpRawPayload();
|
|
|
|
virtual ~SrsRtpRawPayload();
|
|
|
|
// interface ISrsEncoder
|
|
|
|
public:
|
|
|
|
virtual int nb_bytes();
|
|
|
|
virtual srs_error_t encode(SrsBuffer* buf);
|
|
|
|
};
|
|
|
|
|
2020-04-13 11:23:17 +00:00
|
|
|
// Multiple NALUs, automatically insert 001 between NALUs.
|
|
|
|
class SrsRtpRawNALUs : public ISrsEncoder
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
std::vector<SrsSample*> nalus;
|
|
|
|
int nn_bytes;
|
|
|
|
int cursor;
|
|
|
|
public:
|
|
|
|
SrsRtpRawNALUs();
|
|
|
|
virtual ~SrsRtpRawNALUs();
|
|
|
|
public:
|
|
|
|
void push_back(SrsSample* sample);
|
|
|
|
public:
|
|
|
|
uint8_t skip_first_byte();
|
|
|
|
srs_error_t read_samples(std::vector<SrsSample*>& samples, int size);
|
|
|
|
// interface ISrsEncoder
|
|
|
|
public:
|
|
|
|
virtual int nb_bytes();
|
|
|
|
virtual srs_error_t encode(SrsBuffer* buf);
|
|
|
|
};
|
|
|
|
|
|
|
|
// STAP-A, for multiple NALUs.
|
2020-04-11 15:57:04 +00:00
|
|
|
class SrsRtpSTAPPayload : public ISrsEncoder
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// The NRI in NALU type.
|
|
|
|
SrsAvcNaluType nri;
|
|
|
|
// The NALU samples.
|
|
|
|
// @remark We only refer to the memory, user must free its bytes.
|
2020-04-11 17:05:11 +00:00
|
|
|
std::vector<SrsSample*> nalus;
|
2020-04-11 15:57:04 +00:00
|
|
|
public:
|
|
|
|
SrsRtpSTAPPayload();
|
|
|
|
virtual ~SrsRtpSTAPPayload();
|
|
|
|
// interface ISrsEncoder
|
2020-04-11 17:01:39 +00:00
|
|
|
public:
|
|
|
|
virtual int nb_bytes();
|
|
|
|
virtual srs_error_t encode(SrsBuffer* buf);
|
|
|
|
};
|
|
|
|
|
2020-04-13 11:23:17 +00:00
|
|
|
// FU-A, for one NALU with multiple fragments.
|
2020-04-11 17:01:39 +00:00
|
|
|
class SrsRtpFUAPayload : public ISrsEncoder
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// The NRI in NALU type.
|
|
|
|
SrsAvcNaluType nri;
|
|
|
|
// The FUA header.
|
|
|
|
bool start;
|
|
|
|
bool end;
|
|
|
|
SrsAvcNaluType nalu_type;
|
|
|
|
// The NALU samples.
|
|
|
|
// @remark We only refer to the memory, user must free its bytes.
|
|
|
|
std::vector<SrsSample*> nalus;
|
|
|
|
public:
|
|
|
|
SrsRtpFUAPayload();
|
|
|
|
virtual ~SrsRtpFUAPayload();
|
2020-04-16 06:51:36 +00:00
|
|
|
public:
|
|
|
|
void reset();
|
2020-04-11 17:01:39 +00:00
|
|
|
// interface ISrsEncoder
|
2020-04-11 14:54:44 +00:00
|
|
|
public:
|
2020-04-11 15:57:04 +00:00
|
|
|
virtual int nb_bytes();
|
|
|
|
virtual srs_error_t encode(SrsBuffer* buf);
|
2020-04-11 14:54:44 +00:00
|
|
|
};
|
|
|
|
|
2020-03-13 12:35:07 +00:00
|
|
|
class SrsRtpSharedPacket
|
|
|
|
{
|
|
|
|
private:
|
2020-04-08 06:45:26 +00:00
|
|
|
class SrsRtpSharedPacketPayload
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Rtp packet buffer, include rtp header and payload.
|
|
|
|
char* payload;
|
|
|
|
int size;
|
|
|
|
int shared_count;
|
|
|
|
public:
|
|
|
|
SrsRtpSharedPacketPayload();
|
|
|
|
virtual ~SrsRtpSharedPacketPayload();
|
|
|
|
};
|
2020-03-13 12:35:07 +00:00
|
|
|
private:
|
2020-04-08 06:45:26 +00:00
|
|
|
SrsRtpSharedPacketPayload* payload_ptr;
|
2020-03-13 12:35:07 +00:00
|
|
|
public:
|
2020-04-08 06:45:26 +00:00
|
|
|
SrsRtpHeader rtp_header;
|
|
|
|
char* payload;
|
|
|
|
int size;
|
2020-03-13 12:35:07 +00:00
|
|
|
public:
|
|
|
|
SrsRtpSharedPacket();
|
|
|
|
virtual ~SrsRtpSharedPacket();
|
|
|
|
public:
|
2020-04-08 06:45:26 +00:00
|
|
|
srs_error_t create(int64_t timestamp, uint16_t sequence, uint32_t ssrc, uint16_t payload_type, char* payload, int size);
|
2020-03-13 12:35:07 +00:00
|
|
|
SrsRtpSharedPacket* copy();
|
2020-04-08 06:45:26 +00:00
|
|
|
// Interface to modify rtp header
|
2020-03-18 00:45:20 +00:00
|
|
|
public:
|
2020-04-08 06:45:26 +00:00
|
|
|
srs_error_t modify_rtp_header_marker(bool marker);
|
|
|
|
srs_error_t modify_rtp_header_ssrc(uint32_t ssrc);
|
|
|
|
srs_error_t modify_rtp_header_payload_type(uint8_t payload_type);
|
2020-03-13 12:35:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|