diff --git a/src/RTP/AACRtpCodec.cpp b/src/RTP/AACRtpCodec.cpp index 25b0da48..f17f5f99 100644 --- a/src/RTP/AACRtpCodec.cpp +++ b/src/RTP/AACRtpCodec.cpp @@ -78,15 +78,13 @@ void AACRtpCodec::makeAACRtp(const void *pData, unsigned int uiLen, bool bMark, void AACRtpCodec::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) { RtpCodec::inputRtp(rtppack, key_pos); - char *frame = (char *) rtppack->payload + rtppack->offset; int length = rtppack->length - rtppack->offset; - if (m_adts->aac_frame_length + length - 4 > sizeof(AdtsFrame::buffer)) { m_adts->aac_frame_length = 7; WarnL << "aac负载数据太长"; - return ; + return; } - memcpy(m_adts->buffer + m_adts->aac_frame_length, frame + 4, length - 4); + memcpy(m_adts->buffer + m_adts->aac_frame_length, rtppack->payload + rtppack->offset + 4, length - 4); m_adts->aac_frame_length += (length - 4); if (rtppack->mark == true) { m_adts->sequence = rtppack->sequence; @@ -95,11 +93,12 @@ void AACRtpCodec::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) { writeAdtsHeader(*m_adts, m_adts->buffer); onGetAdts(m_adts); } - return ; } void AACRtpCodec::onGetAdts(const AdtsFrame::Ptr &frame) { + //写入环形缓存 RtpCodec::inputFame(frame, false); + //从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象 m_adts = m_framePool.obtain(); m_adts->aac_frame_length = 7; } diff --git a/src/RTP/H264RtpCodec.cpp b/src/RTP/H264RtpCodec.cpp index f398a581..21a8cf64 100644 --- a/src/RTP/H264RtpCodec.cpp +++ b/src/RTP/H264RtpCodec.cpp @@ -60,9 +60,8 @@ void H264RtpCodec::makeH264Rtp(const void* data, unsigned int len, bool mark, ui uint16_t sq = htons(m_ui16Sequence); uint32_t sc = htonl(m_ui32Ssrc); - auto pRtppkt = obtainRtp(); - auto &rtppkt = *(pRtppkt.get()); - unsigned char *pucRtp = rtppkt.payload; + auto rtppkt = obtainRtp(); + unsigned char *pucRtp = rtppkt->payload; pucRtp[0] = '$'; pucRtp[1] = m_ui8Interleaved; pucRtp[2] = ui16RtpLen >> 8; @@ -76,18 +75,18 @@ void H264RtpCodec::makeH264Rtp(const void* data, unsigned int len, bool mark, ui //playload memcpy(&pucRtp[16], data, len); - rtppkt.PT = m_ui8PlayloadType; - rtppkt.interleaved = m_ui8Interleaved; - rtppkt.mark = mark; - rtppkt.length = len + 16; - rtppkt.sequence = m_ui16Sequence; - rtppkt.timeStamp = m_ui32TimeStamp; - rtppkt.ssrc = m_ui32Ssrc; - rtppkt.type = TrackVideo; - rtppkt.offset = 16; + rtppkt->PT = m_ui8PlayloadType; + rtppkt->interleaved = m_ui8Interleaved; + rtppkt->mark = mark; + rtppkt->length = len + 16; + rtppkt->sequence = m_ui16Sequence; + rtppkt->timeStamp = m_ui32TimeStamp; + rtppkt->ssrc = m_ui32Ssrc; + rtppkt->type = TrackVideo; + rtppkt->offset = 16; uint8_t type = ((uint8_t *) (data))[0] & 0x1F; - RtpCodec::inputRtp(pRtppkt,type == 5); + RtpCodec::inputRtp(rtppkt,type == 5); m_ui16Sequence++; } @@ -173,7 +172,9 @@ bool H264RtpCodec::decodeRtp(const RtpPacket::Ptr &rtppack, bool key_pos) { } void H264RtpCodec::onGetH264(const H264Frame::Ptr &frame) { + //写入环形缓存 RtpCodec::inputFame(frame,frame->type == 5); + //从缓存池重新申请对象,防止覆盖已经写入环形缓存的对象 m_h264frame = m_framePool.obtain(); m_h264frame->buffer.clear(); }