完善对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
|
||||
|
||||
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<H264FrameNoCopyAble>((char *)pcData,iDataLen,uiStamp,prefixeSize));
|
||||
inputFrame(std::make_shared<H264FrameNoCopyAble>((char *)pcData,iDataLen,dts,pts,prefixeSize));
|
||||
}
|
||||
|
||||
void DevChannel::inputAAC(const char* pcData, int iDataLen, uint32_t uiStamp,bool withAdtsHeader) {
|
||||
|
|
|
|||
|
|
@ -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帧
|
||||
|
|
|
|||
|
|
@ -109,11 +109,11 @@ class AACFrameNoCopyAble : public FrameNoCopyAble {
|
|||
public:
|
||||
typedef std::shared_ptr<AACFrameNoCopyAble> 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{
|
||||
|
|
|
|||
|
|
@ -285,22 +285,33 @@ class FrameNoCopyAble : public Frame{
|
|||
public:
|
||||
typedef std::shared_ptr<FrameNoCopyAble> 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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -96,11 +96,12 @@ class H264FrameNoCopyAble : public FrameNoCopyAble {
|
|||
public:
|
||||
typedef std::shared_ptr<H264FrameNoCopyAble> 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<H264FrameSubFrame> 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<H264FrameSubFrame>(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<H264FrameSubFrame>(frame,
|
||||
(char *)ptr,
|
||||
len ,
|
||||
frame->stamp(),
|
||||
3);
|
||||
inputFrame_l(sub_frame);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,11 +125,12 @@ class H265FrameNoCopyAble : public FrameNoCopyAble {
|
|||
public:
|
||||
typedef std::shared_ptr<H265FrameNoCopyAble> 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);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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<H264FrameNoCopyAble>((char*)pucData,iLen,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,dts,pts));
|
||||
}
|
||||
|
||||
inline void MediaReader::writeAAC(uint8_t *pucData,int iLen,uint32_t uiStamp) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue