diff --git a/config.gni b/config.gni index 75c3f26f4f7231fb6185136c0d3459cfa8340caf..04086d90cbd07a9c325c34c485b62476aa3ff7c1 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 = false av_codec_support_camera_post_processor = false if (defined(global_parts_info) && defined(global_parts_info.hdf_drivers_interface_camera_ext)) { @@ -169,4 +170,10 @@ 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" ] +} else { + av_codec_defines += [ "UNSUPPORT_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..e12163edbedd6cdf108be13cafb0e09bf168360f 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -942,6 +942,16 @@ 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 boostRet = BoostReadThreadPriority(); + if (boostRet != Status::OK) { + MEDIA_LOGW("Failed to boost read thread priority, ret: %{public}d", + static_cast(boostRet)); + } else { + MEDIA_LOGI("Successfully boosted read thread priority for watch"); + } +#endif MEDIA_LOG_I("Out"); return res; } @@ -3971,5 +3981,24 @@ void MediaDemuxer::HandleVideoSampleQueue() FALSE_RETURN_NOLOG(ret == Status::OK); sampleQueueMap_[videoTrackId_]->ReleaseBuffer(dstBuffer); } + +#ifdef SUPPORT_WATCH_DEVICE +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; +} +#endif } // namespace Media } // namespace OHOS \ No newline at end of file diff --git a/services/media_engine/modules/demuxer/media_demuxer.h b/services/media_engine/modules/demuxer/media_demuxer.h index 2ba5f9e167ac68dfca830e95b1ad740fbaed9d74..a0abb11213a9a003642abe3c606e055ec7675340 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.h +++ b/services/media_engine/modules/demuxer/media_demuxer.h @@ -190,6 +190,9 @@ public: return isVideoMuted_ || needRestore_; } void NotifyResumeUnMute(); +#ifdef SUPPORT_WATCH_DEVICE + Status BoostReadThreadPriority(); +#endif 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..b9fc0a02fb37629ace19eca1129a3820d7c56be9 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,20 @@ HWTEST_F(MediaDemuxerUnitTest, MediaDemuxer_SetMediaMuted, TestSize.Level1) demuxer->SetMediaMuted(Media::MediaType::MEDIA_TYPE_AUD, true); EXPECT_EQ(demuxer->isVideoMuted_, false); } + + +/** + * @tc.name: MediaDemuxer_BoostReadThreadPriority_001 + * @tc.desc: Test BoostReadThreadPriority basic functionality + * @tc.type: FUNC + */ +#ifdef SUPPORT_WATCH_DEVICE +HWTEST_F(MediaDemuxerUnitTest, MediaDemuxer_BoostReadThreadPriority_001, TestSize.Level1) +{ + std::shared_ptr demuxer = std::make_shared(); + ASSERT_NE(demuxer, nullptr); + Status ret = demuxer->BoostReadThreadPriority(); + EXPECT_EQ(ret, Status::OK); +} +#endif } \ No newline at end of file diff --git a/test/unittest/media_demuxer_test/media_demuxer_unit_test.h b/test/unittest/media_demuxer_test/media_demuxer_unit_test.h index cf3cd500af790101af3072f95753ac1167ee52c7..b3a4ce4d72e705ee6d6f0501ba5b011f7a7c0d1a 100644 --- a/test/unittest/media_demuxer_test/media_demuxer_unit_test.h +++ b/test/unittest/media_demuxer_test/media_demuxer_unit_test.h @@ -192,10 +192,12 @@ public: size = 5000000; // cache for 5000000 return true; } +#ifdef SUPPORT_WATCH_DEVICE Status BoostReadThreadPriority() override { return mapStatus_[name_]; } +#endif private: std::map mapStatus_; std::string name_;