mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
rtp support
This commit is contained in:
parent
2e68c375e3
commit
2f462775a0
4 changed files with 22 additions and 85 deletions
|
@ -73,83 +73,23 @@ static string dump_string_hex(const char* buf, const int nb_buf, const int& max_
|
||||||
return string(tmp_buf, len);
|
return string(tmp_buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SrsRtpRawFrame::SrsRtpRawFrame(char* buf, int len)
|
|
||||||
{
|
|
||||||
if (buf && len > 0) {
|
|
||||||
payload = new char[len];
|
|
||||||
size = len;
|
|
||||||
memcpy(payload, buf, len);
|
|
||||||
} else {
|
|
||||||
payload = NULL;
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SrsRtpRawFrame::~SrsRtpRawFrame()
|
|
||||||
{
|
|
||||||
if (payload) {
|
|
||||||
delete [] payload;
|
|
||||||
payload = NULL;
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_error_t SrsRtpRawFrame::avcc_to_annexb()
|
|
||||||
{
|
|
||||||
srs_error_t err = srs_success;
|
|
||||||
|
|
||||||
if (! (payload[0] == 0x00 && payload[1] == 0x00 && payload[2] == 0x00 && payload[3] == 0x01)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_error_t SrsRtpRawFrame::frame_to_packet()
|
|
||||||
{
|
|
||||||
srs_error_t err = srs_success;
|
|
||||||
if (payload == NULL || size <= 4) {
|
|
||||||
return srs_error_wrap(err, "invalid rtp raw frame");
|
|
||||||
}
|
|
||||||
|
|
||||||
avcc_to_annexb();
|
|
||||||
|
|
||||||
char buf[1500] = {0};
|
|
||||||
SrsBuffer* stream = new SrsBuffer(buf, sizeof(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
SrsRtpMuxer::SrsRtpMuxer()
|
SrsRtpMuxer::SrsRtpMuxer()
|
||||||
{
|
{
|
||||||
|
sequence = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtpMuxer::~SrsRtpMuxer()
|
SrsRtpMuxer::~SrsRtpMuxer()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtpMuxer::video_frame_to_packet(SrsSharedPtrMessage* shared_video, SrsFormat* format)
|
srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsFormat* format)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if (shared_video->size < 5) {
|
for (int i = 0; i < format->video->nb_samples; ++i) {
|
||||||
return srs_error_wrap(err, "invalid video size:%d", shared_video->size);
|
SrsSample sample = format->video->samples[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtpRawFrame* rtp_raw_frame = new SrsRtpRawFrame(shared_video->payload + 5, shared_video->size - 5);
|
|
||||||
SrsAutoFree(SrsRtpRawFrame, rtp_raw_frame);
|
|
||||||
|
|
||||||
rtp_raw_frame->frame_to_packet();
|
|
||||||
|
|
||||||
srs_trace("video dump=%s", dump_string_hex(shared_video->payload, shared_video->size).c_str());
|
|
||||||
|
|
||||||
//srs_avcc_to_annexb(raw, raw_len);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_error_t SrsRtpMuxer::audio_frame_to_packet(SrsSharedPtrMessage* shared_video, SrsFormat* format)
|
|
||||||
{
|
|
||||||
srs_error_t err = srs_success;
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,7 +128,7 @@ srs_error_t SrsRtp::initialize(SrsOriginHub* h, SrsRequest* r)
|
||||||
hub = h;
|
hub = h;
|
||||||
req = r;
|
req = r;
|
||||||
|
|
||||||
rtp_muxer = new SrsRtpMuxer();
|
rtp_h264_muxer = new SrsRtpMuxer();
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -255,7 +195,8 @@ srs_error_t SrsRtp::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma
|
||||||
// ignore sequence header
|
// ignore sequence header
|
||||||
srs_assert(format->audio);
|
srs_assert(format->audio);
|
||||||
|
|
||||||
return rtp_muxer->audio_frame_to_packet(audio, format);
|
// TODO: rtc no support aac
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtp::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* format)
|
srs_error_t SrsRtp::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* format)
|
||||||
|
@ -281,5 +222,5 @@ srs_error_t SrsRtp::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* forma
|
||||||
// ignore info frame,
|
// ignore info frame,
|
||||||
// @see https://github.com/ossrs/srs/issues/288#issuecomment-69863909
|
// @see https://github.com/ossrs/srs/issues/288#issuecomment-69863909
|
||||||
srs_assert(format->video);
|
srs_assert(format->video);
|
||||||
return rtp_muxer->video_frame_to_packet(video, format);
|
return rtp_h264_muxer->frame_to_packet(video, format);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,30 +35,16 @@ class SrsSharedPtrMessage;
|
||||||
class SrsRequest;
|
class SrsRequest;
|
||||||
class SrsOriginHub;
|
class SrsOriginHub;
|
||||||
|
|
||||||
class SrsRtpRawFrame
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int64_t timestamp;
|
|
||||||
char* payload;
|
|
||||||
int size;
|
|
||||||
public:
|
|
||||||
SrsRtpRawFrame(char* buf, int len);
|
|
||||||
virtual ~SrsRtpRawFrame();
|
|
||||||
public:
|
|
||||||
srs_error_t avcc_to_annexb();
|
|
||||||
srs_error_t frame_to_packet();
|
|
||||||
};
|
|
||||||
|
|
||||||
class SrsRtpMuxer
|
class SrsRtpMuxer
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
uint32_t sequence;
|
||||||
std::map<uint32_t, std::string> packet_queue;
|
std::map<uint32_t, std::string> packet_queue;
|
||||||
public:
|
public:
|
||||||
SrsRtpMuxer();
|
SrsRtpMuxer();
|
||||||
virtual ~SrsRtpMuxer();
|
virtual ~SrsRtpMuxer();
|
||||||
public:
|
public:
|
||||||
srs_error_t video_frame_to_packet(SrsSharedPtrMessage* shared_video, SrsFormat* format);
|
srs_error_t frame_to_packet(SrsSharedPtrMessage* shared_video, SrsFormat* format);
|
||||||
srs_error_t audio_frame_to_packet(SrsSharedPtrMessage* shared_video, SrsFormat* format);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class SrsRtp
|
class SrsRtp
|
||||||
|
@ -68,7 +54,7 @@ private:
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool disposable;
|
bool disposable;
|
||||||
srs_utime_t last_update_time;
|
srs_utime_t last_update_time;
|
||||||
SrsRtpMuxer* rtp_muxer;
|
SrsRtpMuxer* rtp_h264_muxer;
|
||||||
SrsOriginHub* hub;
|
SrsOriginHub* hub;
|
||||||
public:
|
public:
|
||||||
SrsRtp();
|
SrsRtp();
|
||||||
|
|
|
@ -203,6 +203,8 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload()
|
||||||
{
|
{
|
||||||
payload = NULL;
|
payload = NULL;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
rtp_fragments = NULL;
|
||||||
|
nb_rtp_fragments = 0;
|
||||||
shared_count = 0;
|
shared_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,7 +216,7 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
|
||||||
srs_freepa(payload);
|
srs_freepa(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL)
|
SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL), rtp_fragments(NULL), nb_rtp_fragments(0)
|
||||||
{
|
{
|
||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
}
|
}
|
||||||
|
@ -345,6 +347,8 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy()
|
||||||
copy->stream_id = stream_id;
|
copy->stream_id = stream_id;
|
||||||
copy->payload = ptr->payload;
|
copy->payload = ptr->payload;
|
||||||
copy->size = ptr->size;
|
copy->size = ptr->size;
|
||||||
|
copy->rtp_fragments = ptr->rtp_fragments;
|
||||||
|
copy->nb_rtp_fragments = ptr->nb_rtp_fragments;
|
||||||
|
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ class ISrsWriter;
|
||||||
class ISrsReader;
|
class ISrsReader;
|
||||||
class SrsFileReader;
|
class SrsFileReader;
|
||||||
class SrsPacket;
|
class SrsPacket;
|
||||||
|
class SrsSample;
|
||||||
|
|
||||||
#define SRS_FLV_TAG_HEADER_SIZE 11
|
#define SRS_FLV_TAG_HEADER_SIZE 11
|
||||||
#define SRS_FLV_PREVIOUS_TAG_SIZE 4
|
#define SRS_FLV_PREVIOUS_TAG_SIZE 4
|
||||||
|
@ -285,6 +286,9 @@ public:
|
||||||
// @remark, not all message payload can be decoded to packet. for example,
|
// @remark, not all message payload can be decoded to packet. for example,
|
||||||
// video/audio packet use raw bytes, no video/audio packet.
|
// video/audio packet use raw bytes, no video/audio packet.
|
||||||
char* payload;
|
char* payload;
|
||||||
|
|
||||||
|
SrsSample* rtp_fragments;
|
||||||
|
int nb_rtp_fragments;
|
||||||
private:
|
private:
|
||||||
class SrsSharedPtrPayload
|
class SrsSharedPtrPayload
|
||||||
{
|
{
|
||||||
|
@ -298,6 +302,8 @@ private:
|
||||||
int size;
|
int size;
|
||||||
// The reference count
|
// The reference count
|
||||||
int shared_count;
|
int shared_count;
|
||||||
|
SrsSample* rtp_fragments;
|
||||||
|
int nb_rtp_fragments;
|
||||||
public:
|
public:
|
||||||
SrsSharedPtrPayload();
|
SrsSharedPtrPayload();
|
||||||
virtual ~SrsSharedPtrPayload();
|
virtual ~SrsSharedPtrPayload();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue