Skip to content

Commit

Permalink
feat(HLSStream): reuse the demuxer meta
Browse files Browse the repository at this point in the history
improve find stream info perf

Signed-off-by: pingkai <pingkai010@gmail.com>
  • Loading branch information
pingkai committed Feb 24, 2020
1 parent bc99600 commit fa37a8f
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 6 deletions.
3 changes: 2 additions & 1 deletion framework/demuxer/avFormatDemuxer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
29 changes: 24 additions & 5 deletions framework/demuxer/play_list/HLSStream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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<DemuxerMetaInfo>(new DemuxerMetaInfo());
mDemuxerMeta->id = mCurSeg->discontinuityNum;
needUpdateMeta = true;
}

unique_ptr<streamMeta> 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();
Expand Down
3 changes: 3 additions & 0 deletions framework/demuxer/play_list/HLSStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "AbstractStream.h"
#include "SegmentTracker.h"
#include "../demuxer_service.h"
#include "demuxer/DemuxerMetaInfo.h"
#include <condition_variable>
#include <deque>
#include <mutex>
Expand Down Expand Up @@ -209,6 +210,8 @@ namespace Cicada {

WebVttParser mWVTTParser;
int64_t mVttPtsOffSet = INT64_MIN;

std::unique_ptr<DemuxerMetaInfo> mDemuxerMeta = nullptr;
};
}

Expand Down

0 comments on commit fa37a8f

Please sign in to comment.