diff --git a/src/RtspMuxer/H264RtpCodec.cpp b/src/RtspMuxer/H264RtpCodec.cpp index 1bfca2d3..8c35eed3 100644 --- a/src/RtspMuxer/H264RtpCodec.cpp +++ b/src/RtspMuxer/H264RtpCodec.cpp @@ -206,27 +206,25 @@ void H264RtpEncoder::inputFrame(const Frame::Ptr &frame) { iSize = iLen - nOffset; mark = true; s_e_r_type = s_e_r_End + naluType; + } else if (bFirst) { + s_e_r_type = s_e_r_Start + naluType; } else { - if (bFirst == true) { - s_e_r_type = s_e_r_Start + naluType; - bFirst = false; - } else { - s_e_r_type = s_e_r_Mid + naluType; - } + s_e_r_type = s_e_r_Mid + naluType; } memcpy(_aucSectionBuf, &f_nri_type, 1); memcpy(_aucSectionBuf + 1, &s_e_r_type, 1); memcpy(_aucSectionBuf + 2, (unsigned char *) pcData + nOffset, iSize); nOffset += iSize; - makeH264Rtp(naluType,_aucSectionBuf, iSize + 2, mark, uiStamp); + makeH264Rtp(naluType,_aucSectionBuf, iSize + 2, mark,bFirst, uiStamp); + bFirst = false; } } else { - makeH264Rtp(naluType,pcData, iLen, true, uiStamp); + makeH264Rtp(naluType,pcData, iLen, true, true, uiStamp); } } -void H264RtpEncoder::makeH264Rtp(int nal_type,const void* data, unsigned int len, bool mark, uint32_t uiStamp) { - RtpCodec::inputRtp(makeRtp(getTrackType(),data,len,mark,uiStamp),nal_type == H264Frame::NAL_SPS); +void H264RtpEncoder::makeH264Rtp(int nal_type,const void* data, unsigned int len, bool mark, bool first_packet, uint32_t uiStamp) { + RtpCodec::inputRtp(makeRtp(getTrackType(),data,len,mark,uiStamp),first_packet && nal_type == H264Frame::NAL_IDR); } }//namespace mediakit \ No newline at end of file diff --git a/src/RtspMuxer/H264RtpCodec.h b/src/RtspMuxer/H264RtpCodec.h index d12a38e7..4a7a33d4 100644 --- a/src/RtspMuxer/H264RtpCodec.h +++ b/src/RtspMuxer/H264RtpCodec.h @@ -93,7 +93,7 @@ public: */ void inputFrame(const Frame::Ptr &frame) override; private: - void makeH264Rtp(int nal_type,const void *pData, unsigned int uiLen, bool bMark, uint32_t uiStamp); + void makeH264Rtp(int nal_type,const void *pData, unsigned int uiLen, bool bMark, bool first_packet, uint32_t uiStamp); private: unsigned char _aucSectionBuf[1600]; }; diff --git a/src/RtspMuxer/H265RtpCodec.cpp b/src/RtspMuxer/H265RtpCodec.cpp index 307f5778..7ba34c84 100644 --- a/src/RtspMuxer/H265RtpCodec.cpp +++ b/src/RtspMuxer/H265RtpCodec.cpp @@ -188,29 +188,28 @@ void H265RtpEncoder::inputFrame(const Frame::Ptr &frame) { maxSize = iLen - nOffset; mark = true; s_e_type = 1 << 6 | naluType; - } else { - if (bFirst == true) { + } else if (bFirst) { s_e_type = 1 << 7 | naluType; - bFirst = false; - } else { - s_e_type = naluType; - } + } else { + s_e_type = naluType; } + //FU type _aucSectionBuf[0] = 49 << 1; _aucSectionBuf[1] = 1; _aucSectionBuf[2] = s_e_type; memcpy(_aucSectionBuf + 3, pcData + nOffset, maxSize); nOffset += maxSize; - makeH265Rtp(naluType,_aucSectionBuf, maxSize + 3, mark, uiStamp); + makeH265Rtp(naluType,_aucSectionBuf, maxSize + 3, mark,bFirst, uiStamp); + bFirst = false; } } else { - makeH265Rtp(naluType,pcData, iLen, true, uiStamp); + makeH265Rtp(naluType,pcData, iLen, true, true, uiStamp); } } -void H265RtpEncoder::makeH265Rtp(int nal_type,const void* data, unsigned int len, bool mark, uint32_t uiStamp) { - RtpCodec::inputRtp(makeRtp(getTrackType(),data,len,mark,uiStamp),nal_type == H265Frame::NAL_VPS); +void H265RtpEncoder::makeH265Rtp(int nal_type,const void* data, unsigned int len, bool mark, bool first_packet, uint32_t uiStamp) { + RtpCodec::inputRtp(makeRtp(getTrackType(),data,len,mark,uiStamp),first_packet && H265Frame::isKeyFrame(nal_type)); } }//namespace mediakit \ No newline at end of file diff --git a/src/RtspMuxer/H265RtpCodec.h b/src/RtspMuxer/H265RtpCodec.h index 9c4fb305..1c5fe656 100644 --- a/src/RtspMuxer/H265RtpCodec.h +++ b/src/RtspMuxer/H265RtpCodec.h @@ -94,7 +94,7 @@ public: */ void inputFrame(const Frame::Ptr &frame) override; private: - void makeH265Rtp(int nal_type,const void *pData, unsigned int uiLen, bool bMark, uint32_t uiStamp); + void makeH265Rtp(int nal_type,const void *pData, unsigned int uiLen, bool bMark, bool first_packet,uint32_t uiStamp); private: unsigned char _aucSectionBuf[1600]; };