diff --git a/trunk/src/app/srs_app_rtp.cpp b/trunk/src/app/srs_app_rtp.cpp index 7acbab24d..de01bc54f 100644 --- a/trunk/src/app/srs_app_rtp.cpp +++ b/trunk/src/app/srs_app_rtp.cpp @@ -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 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 diff --git a/trunk/src/app/srs_app_rtp.hpp b/trunk/src/app/srs_app_rtp.hpp index badfea443..212bf776c 100644 --- a/trunk/src/app/srs_app_rtp.hpp +++ b/trunk/src/app/srs_app_rtp.hpp @@ -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; diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 2cbd0aeeb..754aa34f1 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -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'; diff --git a/trunk/src/kernel/srs_kernel_rtp.cpp b/trunk/src/kernel/srs_kernel_rtp.cpp index 516ae89ff..414b2aad1 100644 --- a/trunk/src/kernel/srs_kernel_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtp.cpp @@ -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; +} diff --git a/trunk/src/kernel/srs_kernel_rtp.hpp b/trunk/src/kernel/srs_kernel_rtp.hpp index b348946ec..1de2269f3 100644 --- a/trunk/src/kernel/srs_kernel_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtp.hpp @@ -28,6 +28,8 @@ #include +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