完善对pts的支持
This commit is contained in:
parent
f6ff2172bd
commit
e36194aec3
|
|
@ -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) {
|
||||||
} 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:
|
||||||
* 输入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 {
|
||||||
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{
|
||||||
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 {
|
||||||
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:
|
||||||
}
|
}
|
||||||
|
|
||||||
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:
|
||||||
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:
|
||||||
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 {
|
||||||
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:
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
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) {
|
||||||
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:
|
||||||
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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue