fix h264 rtp packet error

pull/1658/head
xiaozhihong 5 years ago
parent fc84f1e545
commit e2233027b8

@ -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…
Cancel
Save