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()) {
|
||||
sps.assign(format->vcodec->sequenceParameterSetNALUnit.data(), format->vcodec->sequenceParameterSetNALUnit.size());
|
||||
pps.assign(format->vcodec->pictureParameterSetNALUnit.data(), format->vcodec->pictureParameterSetNALUnit.size());
|
||||
// only collect SPS/PPS.
|
||||
return err;
|
||||
}
|
||||
|
||||
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 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 ((err = packet_single_nalu(shared_frame, format, &sample, rtp_packet_vec)) != srs_success) {
|
||||
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);
|
||||
|
||||
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
|
||||
stream->write_1bytes(0x80);
|
||||
// marker payloadtype
|
||||
if (i == num_of_packet - 1) {
|
||||
stream->write_1bytes(kMarker | kH264PayloadType);
|
||||
} else {
|
||||
stream->write_1bytes(kH264PayloadType);
|
||||
}
|
||||
stream->write_1bytes(kH264PayloadType);
|
||||
// sequence
|
||||
stream->write_2bytes(sequence);
|
||||
// timestamp
|
||||
|
@ -183,7 +183,7 @@ srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, S
|
|||
// v=2,p=0,x=0,cc=0
|
||||
stream->write_1bytes(0x80);
|
||||
// marker payloadtype
|
||||
stream->write_1bytes(kMarker | kH264PayloadType);
|
||||
stream->write_1bytes(kH264PayloadType);
|
||||
// sequenct
|
||||
stream->write_2bytes(sequence);
|
||||
// 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
|
||||
stream->write_1bytes(0x80);
|
||||
// marker payloadtype
|
||||
stream->write_1bytes(kMarker | kH264PayloadType);
|
||||
stream->write_1bytes(kH264PayloadType);
|
||||
// sequenct
|
||||
stream->write_2bytes(sequence);
|
||||
// timestamp
|
||||
|
|
|
@ -40,7 +40,6 @@ class SrsOriginHub;
|
|||
const int max_payload_size = 1200;
|
||||
const int kRtpPacketSize = 1500;
|
||||
|
||||
const uint8_t kMarker = 0x80;
|
||||
const uint8_t kH264PayloadType = 102;
|
||||
|
||||
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 ret;
|
||||
ret.reserve(limit * 4);
|
||||
|
||||
char tmp_buf[1024*16];
|
||||
tmp_buf[0] = '\n';
|
||||
|
|
|
@ -110,3 +110,19 @@ SrsRtpSharedPacket* SrsRtpSharedPacket::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>
|
||||
|
||||
const uint8_t kMarker = 0x80;
|
||||
|
||||
class SrsRtpSharedPacket
|
||||
{
|
||||
private:
|
||||
|
@ -57,6 +59,9 @@ public:
|
|||
public:
|
||||
srs_error_t create(int64_t t, uint16_t seq, uint32_t sc, uint16_t pt, char* p, int s);
|
||||
SrsRtpSharedPacket* copy();
|
||||
// interface to modify rtp header
|
||||
public:
|
||||
srs_error_t set_marker(bool marker);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue