diff --git a/src/Common/Device.cpp b/src/Common/Device.cpp index 4e45ef07..5f450311 100644 --- a/src/Common/Device.cpp +++ b/src/Common/Device.cpp @@ -86,13 +86,14 @@ void DevChannel::inputPCM(char* pcData, int iDataLen, uint32_t uiStamp) { } #endif //ENABLE_FAAC -void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t uiStamp) { - if(uiStamp == 0){ - uiStamp = (uint32_t)_aTicker[0].elapsedTime(); +void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t dts,uint32_t pts) { + if(dts == 0){ + dts = (uint32_t)_aTicker[0].elapsedTime(); } - + if(pts == 0){ + pts = dts; + } int prefixeSize; - if (memcmp("\x00\x00\x00\x01", pcData, 4) == 0) { prefixeSize = 4; } else if (memcmp("\x00\x00\x01", pcData, 3) == 0) { @@ -100,8 +101,7 @@ void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t uiStamp) { } else { prefixeSize = 0; } - - inputFrame(std::make_shared((char *)pcData,iDataLen,uiStamp,prefixeSize)); + inputFrame(std::make_shared((char *)pcData,iDataLen,dts,pts,prefixeSize)); } void DevChannel::inputAAC(const char* pcData, int iDataLen, uint32_t uiStamp,bool withAdtsHeader) { diff --git a/src/Common/Device.h b/src/Common/Device.h index 69dc290b..e056f099 100644 --- a/src/Common/Device.h +++ b/src/Common/Device.h @@ -97,9 +97,10 @@ public: * 输入264帧 * @param pcData 264单帧数据指针 * @param iDataLen 数据指针长度 - * @param uiStamp 时间戳,单位毫秒;等于0时内部会自动生成时间戳 + * @param dts 解码时间戳,单位毫秒;等于0时内部会自动生成时间戳 + * @param pts 播放时间戳,单位毫秒;等于0时内部会赋值为dts */ - void inputH264(const char *pcData, int iDataLen, uint32_t uiStamp); + void inputH264(const char *pcData, int iDataLen, uint32_t dts,uint32_t pts = 0); /** * 输入可能带adts头的aac帧 diff --git a/src/Extension/AAC.h b/src/Extension/AAC.h index 24832f8a..c47b0a9d 100644 --- a/src/Extension/AAC.h +++ b/src/Extension/AAC.h @@ -109,11 +109,11 @@ class AACFrameNoCopyAble : public FrameNoCopyAble { public: typedef std::shared_ptr Ptr; - AACFrameNoCopyAble(char *ptr,uint32_t size,uint32_t stamp,int prefixeSize = 7){ - buffer_ptr = ptr; - buffer_size = size; - timeStamp = stamp; - iPrefixSize = prefixeSize; + AACFrameNoCopyAble(char *ptr,uint32_t size,uint32_t dts,int prefixeSize = 7){ + _ptr = ptr; + _size = size; + _dts = dts; + _prefixSize = prefixeSize; } TrackType getTrackType() const override{ diff --git a/src/Extension/Frame.h b/src/Extension/Frame.h index 7995be3c..57b72433 100644 --- a/src/Extension/Frame.h +++ b/src/Extension/Frame.h @@ -285,22 +285,33 @@ class FrameNoCopyAble : public Frame{ public: typedef std::shared_ptr Ptr; char *data() const override{ - return buffer_ptr; + return _ptr; } uint32_t size() const override { - return buffer_size; + return _size; } + uint32_t dts() const override { - return timeStamp; + return _dts; } + + uint32_t pts() const override{ + if(_pts){ + return _pts; + } + return dts(); + } + uint32_t prefixSize() const override{ - return iPrefixSize; + return _prefixSize; } -public: - char *buffer_ptr; - uint32_t buffer_size; - uint32_t timeStamp; - uint32_t iPrefixSize; + +protected: + char *_ptr; + uint32_t _size; + uint32_t _dts; + uint32_t _pts = 0; + uint32_t _prefixSize; }; diff --git a/src/Extension/H264.h b/src/Extension/H264.h index eebfec63..5f07f189 100644 --- a/src/Extension/H264.h +++ b/src/Extension/H264.h @@ -96,11 +96,12 @@ class H264FrameNoCopyAble : public FrameNoCopyAble { public: typedef std::shared_ptr Ptr; - H264FrameNoCopyAble(char *ptr,uint32_t size,uint32_t stamp,int prefixeSize = 4){ - buffer_ptr = ptr; - buffer_size = size; - timeStamp = stamp; - iPrefixSize = prefixeSize; + H264FrameNoCopyAble(char *ptr,uint32_t size,uint32_t dts , uint32_t pts ,int prefixeSize = 4){ + _ptr = ptr; + _size = size; + _dts = dts; + _pts = pts; + _prefixSize = prefixeSize; } TrackType getTrackType() const override{ @@ -112,19 +113,17 @@ public: } bool keyFrame() const override { - return H264_TYPE(buffer_ptr[iPrefixSize]) == H264Frame::NAL_IDR; + return H264_TYPE(_ptr[_prefixSize]) == H264Frame::NAL_IDR; } }; class H264FrameSubFrame : public H264FrameNoCopyAble{ public: typedef std::shared_ptr Ptr; - H264FrameSubFrame(const Frame::Ptr &strongRef, - char *ptr, - uint32_t size, - uint32_t stamp, - int prefixeSize) : H264FrameNoCopyAble(ptr,size,stamp,prefixeSize){ + char *ptr, + uint32_t size, + int prefixeSize) : H264FrameNoCopyAble(ptr,size,strongRef->dts(),strongRef->pts(),prefixeSize){ _strongRef = strongRef; } private: @@ -234,7 +233,6 @@ public: H264FrameSubFrame::Ptr sub_frame = std::make_shared(frame, frame->data(), len + frame->prefixSize(), - frame->stamp(), frame->prefixSize()); inputFrame_l(sub_frame); first_frame = false; @@ -242,7 +240,6 @@ public: H264FrameSubFrame::Ptr sub_frame = std::make_shared(frame, (char *)ptr, len , - frame->stamp(), 3); inputFrame_l(sub_frame); } diff --git a/src/Extension/H265.h b/src/Extension/H265.h index 32892ed9..d0c2469a 100644 --- a/src/Extension/H265.h +++ b/src/Extension/H265.h @@ -125,11 +125,12 @@ class H265FrameNoCopyAble : public FrameNoCopyAble { public: typedef std::shared_ptr Ptr; - H265FrameNoCopyAble(char *ptr, uint32_t size, uint32_t stamp, int prefixeSize = 4) { - buffer_ptr = ptr; - buffer_size = size; - timeStamp = stamp; - iPrefixSize = prefixeSize; + H265FrameNoCopyAble(char *ptr, uint32_t size, uint32_t dts,uint32_t pts, int prefixeSize = 4) { + _ptr = ptr; + _size = size; + _dts = dts; + _pts = pts; + _prefixSize = prefixeSize; } TrackType getTrackType() const override { @@ -141,7 +142,7 @@ public: } bool keyFrame() const override { - int type = H265_TYPE(((uint8_t *) buffer_ptr)[iPrefixSize]); + int type = H265_TYPE(((uint8_t *) _ptr)[_prefixSize]); return H265Frame::isKeyFrame(type); } }; diff --git a/src/MediaFile/MediaReader.cpp b/src/MediaFile/MediaReader.cpp index 8cdd3fae..3d2b7e22 100644 --- a/src/MediaFile/MediaReader.cpp +++ b/src/MediaFile/MediaReader.cpp @@ -221,7 +221,7 @@ inline bool MediaReader::readVideoSample(int iTimeInc,bool justSeekSyncFrame) { break; } memcpy(pBytes + iOffset, "\x0\x0\x0\x1", 4); - writeH264(pBytes + iOffset, iFrameLen + 4, (double) _video_ms * iIdx / _video_num_samples); + writeH264(pBytes + iOffset, iFrameLen + 4, (double) _video_ms * iIdx / _video_num_samples, 0); iOffset += (iFrameLen + 4); } }else if(_bSyncSample){ @@ -259,8 +259,8 @@ inline bool MediaReader::readAudioSample(int iTimeInc,bool justSeekSyncFrame) { return false; } -inline void MediaReader::writeH264(uint8_t *pucData,int iLen,uint32_t uiStamp) { - _mediaMuxer->inputFrame(std::make_shared((char*)pucData,iLen,uiStamp)); +inline void MediaReader::writeH264(uint8_t *pucData,int iLen,uint32_t dts,uint32_t pts) { + _mediaMuxer->inputFrame(std::make_shared((char*)pucData,iLen,dts,pts)); } inline void MediaReader::writeAAC(uint8_t *pucData,int iLen,uint32_t uiStamp) { diff --git a/src/MediaFile/MediaReader.h b/src/MediaFile/MediaReader.h index 2092d9fe..8b5dac5c 100644 --- a/src/MediaFile/MediaReader.h +++ b/src/MediaFile/MediaReader.h @@ -97,7 +97,7 @@ private: bool readSample(int iTimeInc, bool justSeekSyncFrame); inline bool readVideoSample(int iTimeInc,bool justSeekSyncFrame); inline bool readAudioSample(int iTimeInc,bool justSeekSyncFrame); - inline void writeH264(uint8_t *pucData,int iLen,uint32_t uiStamp); + inline void writeH264(uint8_t *pucData,int iLen,uint32_t dts,uint32_t pts); inline void writeAAC(uint8_t *pucData,int iLen,uint32_t uiStamp); private: MP4FileHandle _hMP4File = MP4_INVALID_FILE_HANDLE;