mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Detect B frame in avc stream. Fix compiler error with verbose
This commit is contained in:
parent
e2233027b8
commit
d1d16d490e
6 changed files with 71 additions and 14 deletions
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@ 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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue