diff --git a/trunk/src/app/srs_app_edge.cpp b/trunk/src/app/srs_app_edge.cpp index 8c057af51..d59393daf 100644 --- a/trunk/src/app/srs_app_edge.cpp +++ b/trunk/src/app/srs_app_edge.cpp @@ -579,7 +579,6 @@ srs_error_t SrsEdgeForwarder::do_cycle() SrsCommonMessage* msg = NULL; err = sdk->recv_message(&msg); - srs_verbose("edge loop recv message. ret=%d", ret); if (err != srs_success && srs_error_code(err) != ERROR_SOCKET_TIMEOUT) { srs_error("edge push get server control message failed. err=%s", srs_error_desc(err).c_str()); send_error_code = srs_error_code(err); diff --git a/trunk/src/app/srs_app_pithy_print.cpp b/trunk/src/app/srs_app_pithy_print.cpp index f31b44e51..9aacf3bfe 100644 --- a/trunk/src/app/srs_app_pithy_print.cpp +++ b/trunk/src/app/srs_app_pithy_print.cpp @@ -186,8 +186,8 @@ int SrsPithyPrint::enter_stage() srs_assert(stage != NULL); client_id = stage->nb_clients++; - srs_verbose("enter stage, stage_id=%d, client_id=%d, nb_clients=%d, time_ms=%d", - stage->stage_id, client_id, stage->nb_clients, stage->pithy_print_time_ms); + srs_verbose("enter stage, stage_id=%d, client_id=%d, nb_clients=%d", + stage->stage_id, client_id, stage->nb_clients); return client_id; } @@ -199,8 +199,8 @@ void SrsPithyPrint::leave_stage() stage->nb_clients--; - srs_verbose("leave stage, stage_id=%d, client_id=%d, nb_clients=%d, time_ms=%d", - stage->stage_id, client_id, stage->nb_clients, stage->pithy_print_time_ms); + srs_verbose("leave stage, stage_id=%d, client_id=%d, nb_clients=%d", + stage->stage_id, client_id, stage->nb_clients); } void SrsPithyPrint::elapse() diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 13e74f636..78df5e643 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1095,9 +1095,8 @@ srs_error_t SrsRtcSession::on_rtp(SrsUdpMuxSocket* udp_mux_skt) uint32_t timestamp = stream->read_4bytes(); uint32_t ssrc = stream->read_4bytes(); - (void)padding; (void)marker; (void)sequence; (void)timestamp; (void)ssrc; - srs_verbose("sequence=%u, timestamp=%u, ssrc=%u, padding=%d, ext=%d, cc=%u, marker=%d, payload_type=%u", - sequence, timestamp, ssrc, padding, ext, cc, marker, payload_type); + srs_verbose("sequence=%u, timestamp=%u, ssrc=%u, padding=%d, ext=%d, cc=%u, marker=%d", + sequence, timestamp, ssrc, padding, ext, cc, marker); for (uint8_t i = 0; i < cc; ++i) { /*uint32_t csrc = */stream->read_4bytes(); diff --git a/trunk/src/app/srs_app_rtp.cpp b/trunk/src/app/srs_app_rtp.cpp index de01bc54f..de8932018 100644 --- a/trunk/src/app/srs_app_rtp.cpp +++ b/trunk/src/app/srs_app_rtp.cpp @@ -79,6 +79,32 @@ srs_error_t SrsRtpMuxer::frame_to_packet(SrsSharedPtrMessage* shared_frame, SrsF uint8_t header = sample.bytes[0]; uint8_t nal_type = header & kNalTypeMask; + // TODO: Use config to determine should check avc stream. + if (nal_type == SrsAvcNaluTypeNonIDR || nal_type == SrsAvcNaluTypeDataPartitionA || nal_type == SrsAvcNaluTypeIDR) { + SrsBuffer* stream = new SrsBuffer(sample.bytes, sample.size); + SrsAutoFree(SrsBuffer, stream); + + // Skip nalu header. + stream->skip(1); + + SrsBitBuffer bitstream(stream); + int32_t first_mb_in_slice = 0; + if ((err = srs_avc_nalu_read_uev(&bitstream, first_mb_in_slice)) != srs_success) { + return srs_error_wrap(err, "nalu read uev"); + } + + int32_t slice_type = 0; + if ((err = srs_avc_nalu_read_uev(&bitstream, slice_type)) != srs_success) { + return srs_error_wrap(err, "nalu read uev"); + } + + srs_verbose("nal_type=%d, slice type=%d", nal_type, slice_type); + // TODO: Use config to determine how to process B frame + if (slice_type == SrsAvcSliceTypeB || slice_type == SrsAvcSliceTypeB1) { + 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"); @@ -112,7 +138,7 @@ srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsForma uint8_t header = sample->bytes[0]; uint8_t nal_type = header & kNalTypeMask; - if (nal_type == kIdr) { + if (nal_type == SrsAvcNaluTypeIDR) { if ((err = packet_stap_a(sps, pps, shared_frame, rtp_packet_vec)) != srs_success) { return srs_error_wrap(err, "packet stap-a"); } @@ -153,6 +179,11 @@ srs_error_t SrsRtpMuxer::packet_fu_a(SrsSharedPtrMessage* shared_frame, SrsForma p += packet_size; nb_left -= packet_size; + srs_verbose("rtp fu-a nalu, size=%u, seq=%u, timestamp=%lu, ssrc=%u, payloadtype=%u, rtp header=%s, payload=%s", + sample->size, sequence, (shared_frame->timestamp * 90), kVideoSSRC, kH264PayloadType, + srs_string_dumps_hex(stream->data(), 12).c_str(), + srs_string_dumps_hex(stream->data() + 12, stream->pos() - 12).c_str()); + SrsRtpSharedPacket* rtp_shared_pkt = new SrsRtpSharedPacket(); rtp_shared_pkt->create((shared_frame->timestamp * 90), sequence++, kVideoSSRC, kH264PayloadType, stream->data(), stream->pos()); @@ -174,7 +205,7 @@ srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, S SrsBuffer* stream = new SrsBuffer(buf, kRtpPacketSize); SrsAutoFree(SrsBuffer, stream); - if (nal_type == kIdr) { + if (nal_type == SrsAvcNaluTypeIDR) { if ((err = packet_stap_a(sps, pps, shared_frame, rtp_packet_vec)) != srs_success) { return srs_error_wrap(err, "packet stap-a"); } @@ -193,6 +224,12 @@ srs_error_t SrsRtpMuxer::packet_single_nalu(SrsSharedPtrMessage* shared_frame, S stream->write_bytes(sample->bytes, sample->size); + srs_verbose("sample=%s", srs_string_dumps_hex(sample->bytes, sample->size).c_str()); + srs_verbose("rtp single nalu, size=%u, seq=%u, timestamp=%lu, ssrc=%u, payloadtype=%u, rtp header=%s, payload=%s", + sample->size, sequence, (shared_frame->timestamp * 90), kVideoSSRC, kH264PayloadType, + srs_string_dumps_hex(stream->data(), 12).c_str(), + srs_string_dumps_hex(stream->data() + 12, stream->pos() - 12).c_str()); + SrsRtpSharedPacket* rtp_shared_pkt = new SrsRtpSharedPacket(); rtp_shared_pkt->create((shared_frame->timestamp * 90), sequence++, kVideoSSRC, kH264PayloadType, stream->data(), stream->pos()); @@ -238,6 +275,11 @@ srs_error_t SrsRtpMuxer::packet_stap_a(const string &sps, const string& pps, Srs stream->write_2bytes(pps.size()); stream->write_bytes((char*)pps.data(), pps.size()); + srs_verbose("rtp stap-a nalu, size=%u, seq=%u, timestamp=%lu, ssrc=%u, payloadtype=%u, rtp header=%s, payload=%s", + (sps.size() + pps.size()), sequence, (shared_frame->timestamp * 90), kVideoSSRC, kH264PayloadType, + srs_string_dumps_hex(stream->data(), 12).c_str(), + srs_string_dumps_hex(stream->data() + 12, stream->pos() - 12).c_str()); + SrsRtpSharedPacket* rtp_shared_pkt = new SrsRtpSharedPacket(); rtp_shared_pkt->create((shared_frame->timestamp * 90), sequence++, kVideoSSRC, kH264PayloadType, stream->data(), stream->pos()); diff --git a/trunk/src/app/srs_app_rtp.hpp b/trunk/src/app/srs_app_rtp.hpp index 212bf776c..842d82620 100644 --- a/trunk/src/app/srs_app_rtp.hpp +++ b/trunk/src/app/srs_app_rtp.hpp @@ -44,12 +44,11 @@ const uint8_t kH264PayloadType = 102; const uint8_t kNalTypeMask = 0x1F; -const uint8_t kIdr = 5; -const uint8_t kStapA = 24; -const uint8_t kFuA = 28; +const uint8_t kStapA = 24; +const uint8_t kFuA = 28; const uint8_t kStart = 0x80; -const uint8_t kEnd = 0x40; +const uint8_t kEnd = 0x40; // FIXME: ssrc can relate to source const uint32_t kVideoSSRC = 3233846889; diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index a8d674c2b..c820cbeef 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -398,6 +398,24 @@ enum SrsAvcNaluType }; std::string srs_avc_nalu2str(SrsAvcNaluType nalu_type); +/** + * Table 7-6 – Name association to slice_type + * ISO_IEC_14496-10-AVC-2012.pdf, page 105. + */ +enum SrsAvcSliceType +{ + SrsAvcSliceTypeP = 0, + SrsAvcSliceTypeB = 1, + SrsAvcSliceTypeI = 2, + SrsAvcSliceTypeSP = 3, + SrsAvcSliceTypeSI = 4, + SrsAvcSliceTypeP1 = 5, + SrsAvcSliceTypeB1 = 6, + SrsAvcSliceTypeI1 = 7, + SrsAvcSliceTypeSP1 = 8, + SrsAvcSliceTypeSI1 = 9, +}; + /** * the avc payload format, must be ibmf or annexb format. * we guess by annexb first, then ibmf for the first time,