1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

rtp support

This commit is contained in:
xiaozhihong 2020-03-09 00:40:30 +08:00
parent 2e68c375e3
commit 2f462775a0
4 changed files with 22 additions and 85 deletions

View file

@ -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);
} }

View file

@ -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();

View file

@ -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;
} }

View file

@ -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();