mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
fix h264 rtp packet error
This commit is contained in:
parent
fc84f1e545
commit
e2233027b8
5 changed files with 34 additions and 15 deletions
|
@ -67,6 +67,8 @@ srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsF
|
||||||
if (format->is_avc_sequence_header()) {
|
if (format->is_avc_sequence_header()) {
|
||||||
sps.assign(format->vcodec->sequenceParameterSetNALUnit.data(), format->vcodec->sequenceParameterSetNALUnit.size());
|
sps.assign(format->vcodec->sequenceParameterSetNALUnit.data(), format->vcodec->sequenceParameterSetNALUnit.size());
|
||||||
pps.assign(format->vcodec->pictureParameterSetNALUnit.data(), format->vcodec->pictureParameterSetNALUnit.size());
|
pps.assign(format->vcodec->pictureParameterSetNALUnit.data(), format->vcodec->pictureParameterSetNALUnit.size());
|
||||||
|
// only collect SPS/PPS.
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<SrsRtpSharedPacket*> rtp_packet_vec;
|
vector<SrsRtpSharedPacket*> rtp_packet_vec;
|
||||||
|
@ -77,12 +79,6 @@ srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsF
|
||||||
uint8_t header = sample.bytes[0];
|
uint8_t header = sample.bytes[0];
|
||||||
uint8_t nal_type = header & kNalTypeMask;
|
uint8_t nal_type = header & kNalTypeMask;
|
||||||
|
|
||||||
// TODO: FIXME: Magic number? Doc?
|
|
||||||
// ignore SEI nal
|
|
||||||
if (nal_type == 0x06 || nal_type == 0x09) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sample.size <= max_payload_size) {
|
if (sample.size <= max_payload_size) {
|
||||||
if ((err = packet_single_nalu(shared_frame, format, &sample, rtp_packet_vec)) != srs_success) {
|
if ((err = packet_single_nalu(shared_frame, format, &sample, rtp_packet_vec)) != srs_success) {
|
||||||
return srs_error_wrap(err, "packet single nalu");
|
return srs_error_wrap(err, "packet single nalu");
|
||||||
|
@ -94,6 +90,14 @@ srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsF
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! rtp_packet_vec.empty()) {
|
||||||
|
// At the end of the frame, set marker bit.
|
||||||
|
// One frame may have multi nals. Set the marker bit in the last nal end, no the end of the nal.
|
||||||
|
if ((err = rtp_packet_vec.back()->set_marker(true)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "set marker");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
shared_frame->set_rtp_packets(rtp_packet_vec);
|
shared_frame->set_rtp_packets(rtp_packet_vec);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -125,11 +129,7 @@ srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsForma
|
||||||
// v=2,p=0,x=0,cc=0
|
// v=2,p=0,x=0,cc=0
|
||||||
stream->write_1bytes(0x80);
|
stream->write_1bytes(0x80);
|
||||||
// marker payloadtype
|
// marker payloadtype
|
||||||
if (i == num_of_packet - 1) {
|
stream->write_1bytes(kH264PayloadType);
|
||||||
stream->write_1bytes(kMarker | kH264PayloadType);
|
|
||||||
} else {
|
|
||||||
stream->write_1bytes(kH264PayloadType);
|
|
||||||
}
|
|
||||||
// sequence
|
// sequence
|
||||||
stream->write_2bytes(sequence);
|
stream->write_2bytes(sequence);
|
||||||
// timestamp
|
// timestamp
|
||||||
|
@ -183,7 +183,7 @@ srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, S
|
||||||
// v=2,p=0,x=0,cc=0
|
// v=2,p=0,x=0,cc=0
|
||||||
stream->write_1bytes(0x80);
|
stream->write_1bytes(0x80);
|
||||||
// marker payloadtype
|
// marker payloadtype
|
||||||
stream->write_1bytes(kMarker | kH264PayloadType);
|
stream->write_1bytes(kH264PayloadType);
|
||||||
// sequenct
|
// sequenct
|
||||||
stream->write_2bytes(sequence);
|
stream->write_2bytes(sequence);
|
||||||
// timestamp
|
// timestamp
|
||||||
|
@ -219,7 +219,7 @@ srs_error_t SrsRtpMuxer::packet_stap_a(const string &sps, const string& pps, Srs
|
||||||
// v=2,p=0,x=0,cc=0
|
// v=2,p=0,x=0,cc=0
|
||||||
stream->write_1bytes(0x80);
|
stream->write_1bytes(0x80);
|
||||||
// marker payloadtype
|
// marker payloadtype
|
||||||
stream->write_1bytes(kMarker | kH264PayloadType);
|
stream->write_1bytes(kH264PayloadType);
|
||||||
// sequenct
|
// sequenct
|
||||||
stream->write_2bytes(sequence);
|
stream->write_2bytes(sequence);
|
||||||
// timestamp
|
// timestamp
|
||||||
|
|
|
@ -40,7 +40,6 @@ class SrsOriginHub;
|
||||||
const int max_payload_size = 1200;
|
const int max_payload_size = 1200;
|
||||||
const int kRtpPacketSize = 1500;
|
const int kRtpPacketSize = 1500;
|
||||||
|
|
||||||
const uint8_t kMarker = 0x80;
|
|
||||||
const uint8_t kH264PayloadType = 102;
|
const uint8_t kH264PayloadType = 102;
|
||||||
|
|
||||||
const uint8_t kNalTypeMask = 0x1F;
|
const uint8_t kNalTypeMask = 0x1F;
|
||||||
|
|
|
@ -1201,7 +1201,6 @@ string srs_string_dumps_hex(const std::string& str, const int& limit)
|
||||||
string srs_string_dumps_hex(const char* buf, const int length, const int& limit)
|
string srs_string_dumps_hex(const char* buf, const int length, const int& limit)
|
||||||
{
|
{
|
||||||
string ret;
|
string ret;
|
||||||
ret.reserve(limit * 4);
|
|
||||||
|
|
||||||
char tmp_buf[1024*16];
|
char tmp_buf[1024*16];
|
||||||
tmp_buf[0] = '\n';
|
tmp_buf[0] = '\n';
|
||||||
|
|
|
@ -110,3 +110,19 @@ SrsRtpSharedPacket* SrsRtpSharedPacket::copy()
|
||||||
|
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsRtpSharedPacket::set_marker(bool marker)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
if (payload_ptr == NULL || payload_ptr->payload == NULL || payload_ptr->size < 1) {
|
||||||
|
return srs_error_new(ERROR_RTC_RTP_MUXER, "rtp payload incorrect");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (marker) {
|
||||||
|
payload_ptr->payload[1] |= kMarker;
|
||||||
|
} else {
|
||||||
|
payload_ptr->payload[1] &= (~kMarker);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
const uint8_t kMarker = 0x80;
|
||||||
|
|
||||||
class SrsRtpSharedPacket
|
class SrsRtpSharedPacket
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -57,6 +59,9 @@ public:
|
||||||
public:
|
public:
|
||||||
srs_error_t create(int64_t t, uint16_t seq, uint32_t sc, uint16_t pt, char* p, int s);
|
srs_error_t create(int64_t t, uint16_t seq, uint32_t sc, uint16_t pt, char* p, int s);
|
||||||
SrsRtpSharedPacket* copy();
|
SrsRtpSharedPacket* copy();
|
||||||
|
// interface to modify rtp header
|
||||||
|
public:
|
||||||
|
srs_error_t set_marker(bool marker);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue