diff --git a/mediaPlayer/CMakeLists.txt b/mediaPlayer/CMakeLists.txt index f4e61e108..984c97e81 100644 --- a/mediaPlayer/CMakeLists.txt +++ b/mediaPlayer/CMakeLists.txt @@ -81,6 +81,8 @@ set(SOURCE_FILES native_cicada_player_def.h MediaPlayer.cpp MediaPlayerConfig.cpp + QueryListener.cpp + QueryListener.h abr/AbrManager.h abr/AbrManager.cpp abr/AbrRefererData.h diff --git a/mediaPlayer/MediaPlayer.cpp b/mediaPlayer/MediaPlayer.cpp index b59c9f890..112c7abf5 100644 --- a/mediaPlayer/MediaPlayer.cpp +++ b/mediaPlayer/MediaPlayer.cpp @@ -18,6 +18,7 @@ #include "analytics/AnalyticsQueryListener.h" #include "media_player_error_def.h" #include "PlayerCacheDataSource.h" +#include "QueryListener.h" using namespace Cicada; @@ -25,57 +26,6 @@ namespace Cicada { #define GET_PLAYER_HANDLE playerHandle* handle = (playerHandle*)mPlayerHandle; #define GET_MEDIA_PLAYER MediaPlayer* player = (MediaPlayer*)userData; - - class QueryListener : public AnalyticsQueryListener { - public: - explicit QueryListener(MediaPlayer *player) - { - mPlayer = player; - } - - ~QueryListener() override = default;; - - // analytics query interface - int64_t OnAnalyticsGetCurrentPosition() override - { - if (mPlayer) { - return mPlayer->GetCurrentPosition(); - } - - return -1; - } - - int64_t OnAnalyticsGetBufferedPosition() override - { - if (mPlayer) { - return mPlayer->GetBufferedPosition(); - } - - return -1; - } - - int64_t OnAnalyticsGetDuration() override - { - if (mPlayer) { - return mPlayer->GetDuration(); - } - - return -1; - } - - std::string OnAnalyticsGetPropertyString(PropertyKey key) override - { - if (mPlayer) { - return mPlayer->GetPropertyString(key); - } - - return ""; - } - - private: - MediaPlayer *mPlayer = nullptr; - }; - MediaPlayer::MediaPlayer(const char *opt) : MediaPlayer(*(AnalyticsCollectorFactory::Instance()), opt) { } @@ -115,6 +65,7 @@ namespace Cicada { configPlayer(mConfig); mQueryListener = new QueryListener(this); mCollector = mCollectorFactory.createAnalyticsCollector(mQueryListener); + bExternalCollector = false; mAbrManager = new AbrManager(); std::function fun = [this](int stream) -> void { return this->abrChanged(stream); @@ -125,6 +76,18 @@ namespace Cicada { mAbrManager->SetAbrAlgoStrategy(mAbrAlgo); } + + void MediaPlayer::SetAnalyticsCollector(IAnalyticsCollector * collector) { + if (mCollector && !bExternalCollector) { + mCollectorFactory.destroyAnalyticsCollector(mCollector); + // avoid be used in derivative class + mCollector = nullptr; + } + + bExternalCollector = true; + mCollector = collector; + } + void MediaPlayer::dummyFunction(bool dummy) { #ifdef ENABLE_MUXER @@ -143,7 +106,7 @@ namespace Cicada { delete mConfig; CicadaReleasePlayer(&handle); - if (mCollector) { + if (mCollector && !bExternalCollector) { mCollectorFactory.destroyAnalyticsCollector(mCollector); // avoid be used in derivative class mCollector = nullptr; diff --git a/mediaPlayer/MediaPlayer.h b/mediaPlayer/MediaPlayer.h index 10f01a0fc..254f6bb20 100644 --- a/mediaPlayer/MediaPlayer.h +++ b/mediaPlayer/MediaPlayer.h @@ -60,6 +60,9 @@ namespace Cicada { } public: + + void SetAnalyticsCollector(IAnalyticsCollector * collector); + void EnableVideoRenderedCallback(bool enable); void SetOnRenderFrameCallback(onRenderFrame cb, void *userData); @@ -401,6 +404,7 @@ namespace Cicada { MediaPlayerConfig *mConfig; AnalyticsQueryListener *mQueryListener; IAnalyticsCollector *mCollector{nullptr}; + bool bExternalCollector{false}; IAnalyticsCollectorFactory &mCollectorFactory; AbrManager *mAbrManager; AbrAlgoStrategy *mAbrAlgo; diff --git a/mediaPlayer/QueryListener.cpp b/mediaPlayer/QueryListener.cpp new file mode 100644 index 000000000..727333e3d --- /dev/null +++ b/mediaPlayer/QueryListener.cpp @@ -0,0 +1,51 @@ +// +// Created by lifujun on 2020/8/10. +// + +#include "QueryListener.h" + +using namespace Cicada; + +QueryListener::QueryListener(MediaPlayer *player) { + mPlayer = player; +} + +void QueryListener::setMediaPlayer(MediaPlayer *player) { + mPlayer = player; +} + +// analytics query interface +int64_t QueryListener::OnAnalyticsGetCurrentPosition() { + if (mPlayer) { + return mPlayer->GetCurrentPosition(); + + } + + return -1; +} + +int64_t QueryListener::OnAnalyticsGetBufferedPosition() { + if (mPlayer) { + return mPlayer->GetBufferedPosition(); + + } + + return -1; +} + +int64_t QueryListener::OnAnalyticsGetDuration() { + if (mPlayer) { + return mPlayer->GetDuration(); + + } + + return -1; +} + +std::string QueryListener::OnAnalyticsGetPropertyString(PropertyKey key) { + if (mPlayer) { + return mPlayer->GetPropertyString(key); + } + + return ""; +} diff --git a/mediaPlayer/QueryListener.h b/mediaPlayer/QueryListener.h new file mode 100644 index 000000000..6933ac0bc --- /dev/null +++ b/mediaPlayer/QueryListener.h @@ -0,0 +1,34 @@ +// +// Created by lifujun on 2020/8/10. +// + +#ifndef SOURCE_QUERYLISTENER_H +#define SOURCE_QUERYLISTENER_H + +#include "MediaPlayer.h" +#include "analytics/AnalyticsQueryListener.h" + +namespace Cicada { + class QueryListener : public AnalyticsQueryListener { + public: + explicit QueryListener(MediaPlayer *player); + + ~QueryListener() override = default; + + void setMediaPlayer(MediaPlayer *player); + + // analytics query interface + int64_t OnAnalyticsGetCurrentPosition() override; + + int64_t OnAnalyticsGetBufferedPosition() override; + + int64_t OnAnalyticsGetDuration() override; + + std::string OnAnalyticsGetPropertyString(PropertyKey key) override; + + private: + MediaPlayer *mPlayer = nullptr; + }; +} + +#endif //SOURCE_QUERYLISTENER_H