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

For #307, refine core structure, RTMP base on frame, RTC base on RTP. 4.0.26

This commit is contained in:
winlin 2020-05-14 10:47:21 +08:00
parent 2b1c4a188a
commit 3cb797dccd
5 changed files with 104 additions and 112 deletions

View file

@ -1759,75 +1759,18 @@ void SrsRtcPublisher::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* bu
}
}
srs_error_t SrsRtcPublisher::on_rtcp(char* data, int nb_data)
{
srs_error_t err = srs_success;
char* ph = data;
int nb_left = nb_data;
while (nb_left) {
uint8_t payload_type = ph[1];
uint16_t length_4bytes = (((uint16_t)ph[2]) << 8) | ph[3];
int length = (length_4bytes + 1) * 4;
if (length > nb_data) {
return srs_error_new(ERROR_RTC_RTCP, "invalid rtcp packet, length=%u", length);
}
srs_verbose("on rtcp, payload_type=%u", payload_type);
switch (payload_type) {
case kSR: {
err = on_rtcp_sr(ph, length);
break;
}
case kRR: {
err = on_rtcp_rr(ph, length);
break;
}
case kSDES: {
break;
}
case kBye: {
break;
}
case kApp: {
break;
}
case kRtpFb: {
err = on_rtcp_feedback(ph, length);
break;
}
case kPsFb: {
err = on_rtcp_ps_feedback(ph, length);
break;
}
case kXR: {
err = on_rtcp_xr(ph, length);
break;
}
default:{
return srs_error_new(ERROR_RTC_RTCP_CHECK, "unknown rtcp type=%u", payload_type);
break;
}
}
if (err != srs_success) {
return srs_error_wrap(err, "rtcp");
}
ph += length;
nb_left -= length;
}
return err;
}
srs_error_t SrsRtcPublisher::on_audio(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
pkt->frame_type = SrsFrameTypeAudio;
// TODO: FIXME: Error check.
source->on_rtp(pkt);
return err;
// TODO: FIXME: Directly dispatch to consumer for performance?
std::vector<SrsRtpPacket2*> frames;
if (nack_enabled_) {
@ -1850,50 +1793,13 @@ srs_error_t SrsRtcPublisher::on_audio(SrsRtpPacket2* pkt)
SrsRtpPacket2* frame = frames[i];
// TODO: FIXME: Check error.
on_audio_frame(frame);
source->on_rtp(frame);
srs_freep(frame);
}
return err;
}
srs_error_t SrsRtcPublisher::on_audio_frame(SrsRtpPacket2* frame)
{
srs_error_t err = srs_success;
SrsRtpRawPayload* payload = dynamic_cast<SrsRtpRawPayload*>(frame->payload);
if (!payload) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "OPUS payload");
}
// TODO: FIXME: Transcode OPUS to AAC.
if (!payload->nn_payload) {
return err;
}
SrsMessageHeader header;
header.message_type = RTMP_MSG_AudioMessage;
// TODO: FIXME: Maybe the tbn is not 90k.
header.timestamp = frame->rtp_header.get_timestamp() / 90;
SrsSharedPtrMessage msg;
// TODO: FIXME: Check error.
msg.create(&header, NULL, 0);
SrsSample sample;
sample.size = payload->nn_payload;
sample.bytes = new char[sample.size];
memcpy((void*)sample.bytes, payload->payload, sample.size);
msg.set_extra_payloads(&sample, 1);
// TODO: FIXME: Check error.
source->on_audio_imp(&msg);
if (nn_audio_frames++ == 0) {
SrsRtpHeader* h = &frame->rtp_header;
srs_trace("RTC got Opus seq=%u, ssrc=%u, ts=%u, %d bytes", h->get_sequence(), h->get_ssrc(), h->get_timestamp(), payload->nn_payload);
if (nn_audio_frames++ == 0) {
SrsRtpHeader* h = &frame->rtp_header;
SrsRtpRawPayload* payload = dynamic_cast<SrsRtpRawPayload*>(frame->payload);
srs_trace("RTC got Opus seq=%u, ssrc=%u, ts=%u, %d bytes", h->get_sequence(), h->get_ssrc(), h->get_timestamp(), payload->nn_payload);
}
}
return err;
@ -1901,6 +1807,20 @@ srs_error_t SrsRtcPublisher::on_audio_frame(SrsRtpPacket2* frame)
srs_error_t SrsRtcPublisher::on_video(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
pkt->frame_type = SrsFrameTypeVideo;
// TODO: FIXME: Error check.
source->on_rtp(pkt);
if (video_queue_->should_request_key_frame()) {
// TODO: FIXME: Check error.
send_rtcp_fb_pli(video_ssrc);
}
return err;
std::vector<SrsRtpPacket2*> frames;
if (nack_enabled_) {
@ -2042,6 +1962,71 @@ srs_error_t SrsRtcPublisher::on_video_frame(SrsRtpPacket2* frame)
return source->on_video(shared_video);
}
srs_error_t SrsRtcPublisher::on_rtcp(char* data, int nb_data)
{
srs_error_t err = srs_success;
char* ph = data;
int nb_left = nb_data;
while (nb_left) {
uint8_t payload_type = ph[1];
uint16_t length_4bytes = (((uint16_t)ph[2]) << 8) | ph[3];
int length = (length_4bytes + 1) * 4;
if (length > nb_data) {
return srs_error_new(ERROR_RTC_RTCP, "invalid rtcp packet, length=%u", length);
}
srs_verbose("on rtcp, payload_type=%u", payload_type);
switch (payload_type) {
case kSR: {
err = on_rtcp_sr(ph, length);
break;
}
case kRR: {
err = on_rtcp_rr(ph, length);
break;
}
case kSDES: {
break;
}
case kBye: {
break;
}
case kApp: {
break;
}
case kRtpFb: {
err = on_rtcp_feedback(ph, length);
break;
}
case kPsFb: {
err = on_rtcp_ps_feedback(ph, length);
break;
}
case kXR: {
err = on_rtcp_xr(ph, length);
break;
}
default:{
return srs_error_new(ERROR_RTC_RTCP_CHECK, "unknown rtcp type=%u", payload_type);
break;
}
}
if (err != srs_success) {
return srs_error_wrap(err, "rtcp");
}
ph += length;
nb_left -= length;
}
return err;
}
srs_error_t SrsRtcPublisher::on_rtcp_sr(char* buf, int nb_buf)
{
srs_error_t err = srs_success;