diff --git a/framework/demuxer/avFormatDemuxer.cpp b/framework/demuxer/avFormatDemuxer.cpp index 0a45e410a..6aba6ef5f 100644 --- a/framework/demuxer/avFormatDemuxer.cpp +++ b/framework/demuxer/avFormatDemuxer.cpp @@ -156,7 +156,8 @@ namespace Cicada { set_stream_meta(mCtx->streams[i], (Stream_meta *) *mMetaInfo->meta[i].get()); } - mCtx->max_ts_probe = 0; + // TODO: set it to zero can avoid read and decode more frames,but wen seek to back in hlsstream,will lead pts err + // mCtx->max_ts_probe = 0; } ret = avformat_find_stream_info(mCtx, nullptr); diff --git a/framework/demuxer/play_list/HLSStream.cpp b/framework/demuxer/play_list/HLSStream.cpp index 43ce7285d..96db4f090 100644 --- a/framework/demuxer/play_list/HLSStream.cpp +++ b/framework/demuxer/play_list/HLSStream.cpp @@ -379,6 +379,11 @@ namespace Cicada { int ret; mError = 0; mDataSourceError = 0; + + if (mDemuxerMeta && mDemuxerMeta->id != mCurSeg->discontinuityNum) { + mDemuxerMeta = nullptr; + } + ret = updateDecrypter(); if (ret < 0) { @@ -411,23 +416,37 @@ namespace Cicada { mPDemuxer->getDemuxerHandle()->setBitStreamFormat(this->mMergeVideoHeader, this->mMergerAudioHeader); } + if (mDemuxerMeta) { + mPDemuxer->getDemuxerHandle()->setMeta(mDemuxerMeta.get()); + } + ret = mPDemuxer->initOpen(); if (ret >= 0) { int nbStream = mPDemuxer->GetNbStreams(); AF_LOGI("file have %d streams\n", nbStream); - // open all stream in demuxer - Stream_meta meta{}; + bool needUpdateMeta = false; + if (!mDemuxerMeta) { + mDemuxerMeta = std::unique_ptr(new DemuxerMetaInfo()); + mDemuxerMeta->id = mCurSeg->discontinuityNum; + needUpdateMeta = true; + } + + unique_ptr meta = nullptr; + + // open all stream in demuxer for (int i = 0; i < nbStream; ++i) { - mPDemuxer->GetStreamMeta(&meta, i, false); + mPDemuxer->GetStreamMeta(meta, i, false); - if (meta.type == mPTracker->getStreamType() + if (((Stream_meta *) (*meta))->type == mPTracker->getStreamType() || mPTracker->getStreamType() == STREAM_TYPE_MIXED) { mPDemuxer->OpenStream(i); } - releaseMeta(&meta); + if (needUpdateMeta) { + mDemuxerMeta->meta.push_back(move(meta)); + } } mPacketFirstPts = getPackedStreamPTS(); diff --git a/framework/demuxer/play_list/HLSStream.h b/framework/demuxer/play_list/HLSStream.h index 498c85193..1d75b4ef6 100644 --- a/framework/demuxer/play_list/HLSStream.h +++ b/framework/demuxer/play_list/HLSStream.h @@ -12,6 +12,7 @@ #include "AbstractStream.h" #include "SegmentTracker.h" #include "../demuxer_service.h" +#include "demuxer/DemuxerMetaInfo.h" #include #include #include @@ -209,6 +210,8 @@ namespace Cicada { WebVttParser mWVTTParser; int64_t mVttPtsOffSet = INT64_MIN; + + std::unique_ptr mDemuxerMeta = nullptr; }; }