diff --git a/config.gni b/config.gni index 75c3f26f4f7231fb6185136c0d3459cfa8340caf..1813aa0a8824265c7ae09f615793d2951d728044 100644 --- a/config.gni +++ b/config.gni @@ -44,6 +44,7 @@ declare_args() { av_codec_enable_demuxer_lrc = false av_codec_enable_demuxer_sami = false av_codec_enable_demuxer_ass = false + av_codec_support_watch_device = true av_codec_support_camera_post_processor = false if (defined(global_parts_info) && defined(global_parts_info.hdf_drivers_interface_camera_ext)) { @@ -169,4 +170,8 @@ if (av_codec_enable_demuxer_sami) { if (av_codec_enable_demuxer_ass) { av_codec_defines += [ "SUPPORT_DEMUXER_ASS" ] +} + +if (av_codec_support_watch_device) { + av_codec_defines += [ "SUPPORT_WATCH_DEVICE" ] } \ No newline at end of file diff --git a/services/media_engine/modules/demuxer/media_demuxer.cpp b/services/media_engine/modules/demuxer/media_demuxer.cpp index 7a001684d94a93d90e1ce016f5e35c682e62bd87..307ea587b40494120810bd0b604b0b54316080d6 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -902,6 +902,23 @@ int32_t MediaDemuxer::GetTargetVideoTrackId(std::vector> t return targetVideoTrackId_; } +Status MediaDemuxer::BoostReadThreadPriority() +{ + MEDIA_LOG_I("Boost read thread priority start"); + std::shared_ptr plugin = GetCurFFmpegPlugin(); + if (plugin == nullptr) { + MEDIA_LOG_W("Demuxer not available, boost read thread priority failed"); + return Status::ERROR_INVALID_PARAMETER; + } + Status ret = plugin->BoostReadThreadPriority(); + if (ret != Status::OK) { + MEDIA_LOG_W("Boost read thread priority failed, ret: " PUBLIC_LOG_D32, static_cast(ret)); + return ret; + } + MEDIA_LOG_I("Read thread priority successfully boosted"); + return Status::OK; +} + Status MediaDemuxer::SetDataSource(const std::shared_ptr &source) { MediaAVCodec::AVCODEC_SYNC_TRACE; @@ -942,6 +959,27 @@ Status MediaDemuxer::SetDataSource(const std::shared_ptr &source) eventReceiver_->OnDfxEvent({"DEMUX", DfxEventType::DFX_INFO_PLAYER_EOS_SEEK, static_cast(snifferPluginName == inferPluginName)}); } +#ifdef SUPPORT_WATCH_DEVICE + MEDIA_LOG_I("Watch device, boosting read thread priority"); + Status boostWatchRet = BoostReadThreadPriority(); + if (boostWatchRet != Status::OK) { + MEDIA_LOG_W("Failed to boost read thread priority, ret: %{public}d", + static_cast(boostWatchRet)); + } else { + MEDIA_LOG_I("Successfully boosted read thread priority for watch"); + } +#else + if (!HasVideo() && HasAudio()) { + MEDIA_LOG_I("Audio only, boosting read thread priority"); + Status boostAudioRet = BoostReadThreadPriority(); + if (boostAudioRet != Status::OK) { + MEDIA_LOG_W("Failed to boost read thread priority for audio, ret: %{public}d", + static_cast(boostAudioRet)); + } else { + MEDIA_LOG_I("Successfully boosted read thread priority for audio"); + } + } +#endif MEDIA_LOG_I("Out"); return res; } diff --git a/services/media_engine/modules/demuxer/media_demuxer.h b/services/media_engine/modules/demuxer/media_demuxer.h index 2ba5f9e167ac68dfca830e95b1ad740fbaed9d74..ef67c6035dca9ed9a34a9c0d8e93fa47efa68f1a 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.h +++ b/services/media_engine/modules/demuxer/media_demuxer.h @@ -190,6 +190,7 @@ public: return isVideoMuted_ || needRestore_; } void NotifyResumeUnMute(); + Status BoostReadThreadPriority(); private: class AVBufferQueueProducerListener; class TrackWrapper; diff --git a/test/unittest/media_demuxer_test/media_demuxer_unit_test.cpp b/test/unittest/media_demuxer_test/media_demuxer_unit_test.cpp index 1311b8fd3cb2a914e3b4d079d963f727e9dcd4ca..f874ef99f0744e991fafcaa9838fca791546855c 100644 --- a/test/unittest/media_demuxer_test/media_demuxer_unit_test.cpp +++ b/test/unittest/media_demuxer_test/media_demuxer_unit_test.cpp @@ -2255,4 +2255,47 @@ HWTEST_F(MediaDemuxerUnitTest, MediaDemuxer_SetMediaMuted, TestSize.Level1) demuxer->SetMediaMuted(Media::MediaType::MEDIA_TYPE_AUD, true); EXPECT_EQ(demuxer->isVideoMuted_, false); } + +/** + * @tc.name: MediaDemuxer_SetDataSource_BoostReadThreadPriority_WatchDevice_001 + * @tc.desc: test SetDataSource with BoostReadThreadPriority in watch device scenario + * @tc.type: FUNC + */ +HWTEST_F(MediaDemuxerUnitTest, MediaDemuxer_SetDataSource_BoostReadThreadPriority_WatchDevice_001, TestSize.Level1) +{ +#ifdef SUPPORT_WATCH_DEVICE + std::shared_ptr demuxer = std::make_shared(); + std::shared_ptr pluginMock = + std::make_shared("StatusOK"); + demuxer->demuxerPluginManager_ = std::make_shared(); + MediaStreamInfo info; + info.plugin = pluginMock; + demuxer->demuxerPluginManager_->streamInfoMap_[0] = info; + demuxer->audioTrackId_ = 0; + demuxer->demuxerPluginManager_->temp2TrackInfoMap_[0].streamID = 0; + Status ret = demuxer->SetDataSource(std::make_shared("test.mp4")); + EXPECT_TRUE(ret == Status::OK || ret == Status::ERROR_UNKNOWN); +#endif +} + +/** + * @tc.name: MediaDemuxer_SetDataSource_BoostReadThreadPriority_AudioOnly_001 + * @tc.desc: test SetDataSource with BoostReadThreadPriority in audio only scenario + * @tc.type: FUNC + */ +HWTEST_F(MediaDemuxerUnitTest, MediaDemuxer_SetDataSource_BoostReadThreadPriority_AudioOnly_001, TestSize.Level1) +{ + std::shared_ptr demuxer = std::make_shared(); + std::shared_ptr pluginMock = + std::make_shared("StatusOK"); + demuxer->demuxerPluginManager_ = std::make_shared(); + MediaStreamInfo info; + info.plugin = pluginMock; + demuxer->demuxerPluginManager_->streamInfoMap_[0] = info; + demuxer->audioTrackId_ = 0; + demuxer->videoTrackId_ = -1; + demuxer->demuxerPluginManager_->temp2TrackInfoMap_[0].streamID = 0; + Status ret = demuxer->SetDataSource(std::make_shared("test.mp3")); + EXPECT_TRUE(ret == Status::OK || ret == Status::ERROR_UNKNOWN); +} } \ No newline at end of file