Commit e36194ae by xiongziliang

完善对pts的支持

parent f6ff2172
...@@ -86,13 +86,14 @@ void DevChannel::inputPCM(char* pcData, int iDataLen, uint32_t uiStamp) { ...@@ -86,13 +86,14 @@ void DevChannel::inputPCM(char* pcData, int iDataLen, uint32_t uiStamp) {
} }
#endif //ENABLE_FAAC #endif //ENABLE_FAAC
void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t uiStamp) { void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t dts,uint32_t pts) {
if(uiStamp == 0){ if(dts == 0){
uiStamp = (uint32_t)_aTicker[0].elapsedTime(); dts = (uint32_t)_aTicker[0].elapsedTime();
} }
if(pts == 0){
pts = dts;
}
int prefixeSize; int prefixeSize;
if (memcmp("\x00\x00\x00\x01", pcData, 4) == 0) { if (memcmp("\x00\x00\x00\x01", pcData, 4) == 0) {
prefixeSize = 4; prefixeSize = 4;
} else if (memcmp("\x00\x00\x01", pcData, 3) == 0) { } else if (memcmp("\x00\x00\x01", pcData, 3) == 0) {
...@@ -100,8 +101,7 @@ void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t uiStamp) { ...@@ -100,8 +101,7 @@ void DevChannel::inputH264(const char* pcData, int iDataLen, uint32_t uiStamp) {
} else { } else {
prefixeSize = 0; prefixeSize = 0;
} }
inputFrame(std::make_shared<H264FrameNoCopyAble>((char *)pcData,iDataLen,dts,pts,prefixeSize));
inputFrame(std::make_shared<H264FrameNoCopyAble>((char *)pcData,iDataLen,uiStamp,prefixeSize));
} }
void DevChannel::inputAAC(const char* pcData, int iDataLen, uint32_t uiStamp,bool withAdtsHeader) { void DevChannel::inputAAC(const char* pcData, int iDataLen, uint32_t uiStamp,bool withAdtsHeader) {
......
...@@ -97,9 +97,10 @@ public: ...@@ -97,9 +97,10 @@ public:
* 输入264帧 * 输入264帧
* @param pcData 264单帧数据指针 * @param pcData 264单帧数据指针
* @param iDataLen 数据指针长度 * @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帧 * 输入可能带adts头的aac帧
......
...@@ -109,11 +109,11 @@ class AACFrameNoCopyAble : public FrameNoCopyAble { ...@@ -109,11 +109,11 @@ class AACFrameNoCopyAble : public FrameNoCopyAble {
public: public:
typedef std::shared_ptr<AACFrameNoCopyAble> Ptr; typedef std::shared_ptr<AACFrameNoCopyAble> Ptr;
AACFrameNoCopyAble(char *ptr,uint32_t size,uint32_t stamp,int prefixeSize = 7){ AACFrameNoCopyAble(char *ptr,uint32_t size,uint32_t dts,int prefixeSize = 7){
buffer_ptr = ptr; _ptr = ptr;
buffer_size = size; _size = size;
timeStamp = stamp; _dts = dts;
iPrefixSize = prefixeSize; _prefixSize = prefixeSize;
} }
TrackType getTrackType() const override{ TrackType getTrackType() const override{
......
...@@ -285,22 +285,33 @@ class FrameNoCopyAble : public Frame{ ...@@ -285,22 +285,33 @@ class FrameNoCopyAble : public Frame{
public: public:
typedef std::shared_ptr<FrameNoCopyAble> Ptr; typedef std::shared_ptr<FrameNoCopyAble> Ptr;
char *data() const override{ char *data() const override{
return buffer_ptr; return _ptr;
} }
uint32_t size() const override { uint32_t size() const override {
return buffer_size; return _size;
} }
uint32_t dts() const override { 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{ uint32_t prefixSize() const override{
return iPrefixSize; return _prefixSize;
} }
public:
char *buffer_ptr; protected:
uint32_t buffer_size; char *_ptr;
uint32_t timeStamp; uint32_t _size;
uint32_t iPrefixSize; uint32_t _dts;
uint32_t _pts = 0;
uint32_t _prefixSize;
}; };
......
...@@ -96,11 +96,12 @@ class H264FrameNoCopyAble : public FrameNoCopyAble { ...@@ -96,11 +96,12 @@ class H264FrameNoCopyAble : public FrameNoCopyAble {
public: public:
typedef std::shared_ptr<H264FrameNoCopyAble> Ptr; typedef std::shared_ptr<H264FrameNoCopyAble> Ptr;
H264FrameNoCopyAble(char *ptr,uint32_t size,uint32_t stamp,int prefixeSize = 4){ H264FrameNoCopyAble(char *ptr,uint32_t size,uint32_t dts , uint32_t pts ,int prefixeSize = 4){
buffer_ptr = ptr; _ptr = ptr;
buffer_size = size; _size = size;
timeStamp = stamp; _dts = dts;
iPrefixSize = prefixeSize; _pts = pts;
_prefixSize = prefixeSize;
} }
TrackType getTrackType() const override{ TrackType getTrackType() const override{
...@@ -112,19 +113,17 @@ public: ...@@ -112,19 +113,17 @@ public:
} }
bool keyFrame() const override { 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{ class H264FrameSubFrame : public H264FrameNoCopyAble{
public: public:
typedef std::shared_ptr<H264FrameSubFrame> Ptr; typedef std::shared_ptr<H264FrameSubFrame> Ptr;
H264FrameSubFrame(const Frame::Ptr &strongRef, H264FrameSubFrame(const Frame::Ptr &strongRef,
char *ptr, char *ptr,
uint32_t size, uint32_t size,
uint32_t stamp, int prefixeSize) : H264FrameNoCopyAble(ptr,size,strongRef->dts(),strongRef->pts(),prefixeSize){
int prefixeSize) : H264FrameNoCopyAble(ptr,size,stamp,prefixeSize){
_strongRef = strongRef; _strongRef = strongRef;
} }
private: private:
...@@ -234,7 +233,6 @@ public: ...@@ -234,7 +233,6 @@ public:
H264FrameSubFrame::Ptr sub_frame = std::make_shared<H264FrameSubFrame>(frame, H264FrameSubFrame::Ptr sub_frame = std::make_shared<H264FrameSubFrame>(frame,
frame->data(), frame->data(),
len + frame->prefixSize(), len + frame->prefixSize(),
frame->stamp(),
frame->prefixSize()); frame->prefixSize());
inputFrame_l(sub_frame); inputFrame_l(sub_frame);
first_frame = false; first_frame = false;
...@@ -242,7 +240,6 @@ public: ...@@ -242,7 +240,6 @@ public:
H264FrameSubFrame::Ptr sub_frame = std::make_shared<H264FrameSubFrame>(frame, H264FrameSubFrame::Ptr sub_frame = std::make_shared<H264FrameSubFrame>(frame,
(char *)ptr, (char *)ptr,
len , len ,
frame->stamp(),
3); 3);
inputFrame_l(sub_frame); inputFrame_l(sub_frame);
} }
......
...@@ -125,11 +125,12 @@ class H265FrameNoCopyAble : public FrameNoCopyAble { ...@@ -125,11 +125,12 @@ class H265FrameNoCopyAble : public FrameNoCopyAble {
public: public:
typedef std::shared_ptr<H265FrameNoCopyAble> Ptr; typedef std::shared_ptr<H265FrameNoCopyAble> Ptr;
H265FrameNoCopyAble(char *ptr, uint32_t size, uint32_t stamp, int prefixeSize = 4) { H265FrameNoCopyAble(char *ptr, uint32_t size, uint32_t dts,uint32_t pts, int prefixeSize = 4) {
buffer_ptr = ptr; _ptr = ptr;
buffer_size = size; _size = size;
timeStamp = stamp; _dts = dts;
iPrefixSize = prefixeSize; _pts = pts;
_prefixSize = prefixeSize;
} }
TrackType getTrackType() const override { TrackType getTrackType() const override {
...@@ -141,7 +142,7 @@ public: ...@@ -141,7 +142,7 @@ public:
} }
bool keyFrame() const override { 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); return H265Frame::isKeyFrame(type);
} }
}; };
......
...@@ -221,7 +221,7 @@ inline bool MediaReader::readVideoSample(int iTimeInc,bool justSeekSyncFrame) { ...@@ -221,7 +221,7 @@ inline bool MediaReader::readVideoSample(int iTimeInc,bool justSeekSyncFrame) {
break; break;
} }
memcpy(pBytes + iOffset, "\x0\x0\x0\x1", 4); 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); iOffset += (iFrameLen + 4);
} }
}else if(_bSyncSample){ }else if(_bSyncSample){
...@@ -259,8 +259,8 @@ inline bool MediaReader::readAudioSample(int iTimeInc,bool justSeekSyncFrame) { ...@@ -259,8 +259,8 @@ inline bool MediaReader::readAudioSample(int iTimeInc,bool justSeekSyncFrame) {
return false; return false;
} }
inline void MediaReader::writeH264(uint8_t *pucData,int iLen,uint32_t uiStamp) { inline void MediaReader::writeH264(uint8_t *pucData,int iLen,uint32_t dts,uint32_t pts) {
_mediaMuxer->inputFrame(std::make_shared<H264FrameNoCopyAble>((char*)pucData,iLen,uiStamp)); _mediaMuxer->inputFrame(std::make_shared<H264FrameNoCopyAble>((char*)pucData,iLen,dts,pts));
} }
inline void MediaReader::writeAAC(uint8_t *pucData,int iLen,uint32_t uiStamp) { inline void MediaReader::writeAAC(uint8_t *pucData,int iLen,uint32_t uiStamp) {
......
...@@ -97,7 +97,7 @@ private: ...@@ -97,7 +97,7 @@ private:
bool readSample(int iTimeInc, bool justSeekSyncFrame); bool readSample(int iTimeInc, bool justSeekSyncFrame);
inline bool readVideoSample(int iTimeInc,bool justSeekSyncFrame); inline bool readVideoSample(int iTimeInc,bool justSeekSyncFrame);
inline bool readAudioSample(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); inline void writeAAC(uint8_t *pucData,int iLen,uint32_t uiStamp);
private: private:
MP4FileHandle _hMP4File = MP4_INVALID_FILE_HANDLE; MP4FileHandle _hMP4File = MP4_INVALID_FILE_HANDLE;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论