From 26dd99d1593adcb7273283635426e632b3914ab0 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Mon, 19 Nov 2018 16:15:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84rtsp=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E7=A7=92=E5=BC=80=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/RtspMuxer/H264RtpCodec.cpp | 18 ++++++++---------- src/RtspMuxer/H264RtpCodec.h | 2 +- src/RtspMuxer/H265RtpCodec.cpp | 19 +++++++++---------- src/RtspMuxer/H265RtpCodec.h | 2 +- 4 files changed, 19 insertions(+), 22 deletions(-) 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]; };