diff --git a/services/engine/histreamer/lpp/lpp_video_streamer/lpp_vdec_adapter.h b/services/engine/histreamer/lpp/lpp_video_streamer/lpp_vdec_adapter.h index 94e50594c014637746662cf8083aa6fda322aaca..5e2d1cb9521089c5c8c8cd982455e7bfdb3cf11c 100644 --- a/services/engine/histreamer/lpp/lpp_video_streamer/lpp_vdec_adapter.h +++ b/services/engine/histreamer/lpp/lpp_video_streamer/lpp_vdec_adapter.h @@ -65,6 +65,7 @@ public: void SetEventReceiver(std::shared_ptr eventReceiver); void SetSyncManager(std::shared_ptr syncMgr); void SetPlaybackSpeed(float speed); + int32_t SetTargetPts(int64_t targetPts); private: int32_t PrepareBufferQueue(); @@ -112,6 +113,9 @@ private: std::atomic speed_ {1.0f}; bool dumpBufferNeeded_ {false}; std::string dumpFileNameOutput_ {}; + + int64_t initTargetPts_ {-1}; + bool firstStarted_ {false}; }; } // namespace Media diff --git a/services/engine/histreamer/lpp/lpp_video_streamer/src/hilpp_vstreamer_impl.cpp b/services/engine/histreamer/lpp/lpp_video_streamer/src/hilpp_vstreamer_impl.cpp index b1a85d6e32ddd42ca31695fadb7433b653e3a8a7..2feef8c8406f972fdc7f1be320305223f9258154 100644 --- a/services/engine/histreamer/lpp/lpp_video_streamer/src/hilpp_vstreamer_impl.cpp +++ b/services/engine/histreamer/lpp/lpp_video_streamer/src/hilpp_vstreamer_impl.cpp @@ -348,7 +348,9 @@ int32_t HiLppVideoStreamerImpl::SetSyncAudioStreamer(int streamerId) } int32_t HiLppVideoStreamerImpl::SetTargetStartFrame(const int64_t targetPts, const int timeoutMs) { - FALSE_RETURN_V_MSG(syncMgr_ != nullptr, MSERR_UNKNOWN, "syncMgr_ nullptr"); + FALSE_RETURN_V_MSG(syncMgr_ != nullptr && vdec_ != nullptr, MSERR_INVALID_OPERATION, "syncMgr_ nullptr"); + int32_t ret = vdec_->SetTargetPts(targetPts); + FALSE_RETURN_V_MSG(ret == MSERR_OK, ret, "vdec_ SetTargetPts failed"); syncMgr_->SetTargetStartFrame(targetPts, timeoutMs); return MSERR_OK; } diff --git a/services/engine/histreamer/lpp/lpp_video_streamer/src/lpp_vdec_adapter.cpp b/services/engine/histreamer/lpp/lpp_video_streamer/src/lpp_vdec_adapter.cpp index 4880e5761489bd0832e25dd085d089b3d13448c3..6e680933b168d28bb503eee05eddb3cd6670bded 100644 --- a/services/engine/histreamer/lpp/lpp_video_streamer/src/lpp_vdec_adapter.cpp +++ b/services/engine/histreamer/lpp/lpp_video_streamer/src/lpp_vdec_adapter.cpp @@ -182,6 +182,12 @@ int32_t LppVideoDecoderAdapter::StartDecode() decodertask_->Start(); int32_t ret = videoDecoder_->Start(); FALSE_RETURN_V_MSG(ret == MediaAVCodec::AVCS_ERR_OK, AVCSErrorToMSError(ret), "StartDecode failed"); + firstStarted_ = true; + if (initTargetPts_ != -1) { + int32_t seekRes = SetTargetPts(initTargetPts_); + FALSE_RETURN_V_MSG(seekRes == MSERR_OK, seekRes, "Seek failed"); + initTargetPts_ = -1; + } return MSERR_OK; } @@ -622,5 +628,18 @@ void LppVideoDecoderAdapter::DumpBufferIfNeeded(const std::string &fileName, con DumpAVBufferToFile(DUMP_PARAM, fileName, buffer); } +int32_t LppVideoDecoderAdapter::SetTargetPts(int64_t targetPts) +{ + FALSE_RETURN_V_MSG(videoDecoder_ != nullptr, MSERR_INVALID_OPERATION, "videoDecoder_ nullptr"); + if (!firstStarted_) { + initTargetPts_ = targetPts; + return MSERR_OK; + } + Format format; + format.PutLongValue("video_seek_pts", targetPts); + auto ret = videoDecoder_->SetParameter(format); + FALSE_RETURN_V_MSG(ret == MediaAVCodec::AVCS_ERR_OK, MSERR_VID_DEC_FAILED, "Seek failed"); + return MSERR_OK; +} } // namespace Media } // namespace OHOS \ No newline at end of file diff --git a/test/unittest/lpp_unit_test/engine/lpp_video_stream_unit_test/mock/lpp_vdec_adapter.h b/test/unittest/lpp_unit_test/engine/lpp_video_stream_unit_test/mock/lpp_vdec_adapter.h index 9d9ce3b608c926a11f49a31502d2313b1a64cb72..359dd48e881e1d2b95badbb0f42635b21d92c183 100644 --- a/test/unittest/lpp_unit_test/engine/lpp_video_stream_unit_test/mock/lpp_vdec_adapter.h +++ b/test/unittest/lpp_unit_test/engine/lpp_video_stream_unit_test/mock/lpp_vdec_adapter.h @@ -68,6 +68,7 @@ public: MOCK_METHOD(void, SetEventReceiver, (std::shared_ptr eventReceiver)); MOCK_METHOD(void, SetSyncManager, (std::shared_ptr syncMgr)); MOCK_METHOD(void, SetPlaybackSpeed, (float speed)); + MOCK_METHOD(int32_t, SetTargetPts, (int64_t targetPts)); }; } // namespace Media } // namespace OHOS diff --git a/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/lpp_video_dec_adapter_unit_test.cpp b/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/lpp_video_dec_adapter_unit_test.cpp index fe33cb52e7a504b224c8618fb86e575508b8c1e0..bcc9ea9d06a6e9768b1ed2edb16c6b6b5fc24b4d 100644 --- a/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/lpp_video_dec_adapter_unit_test.cpp +++ b/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/lpp_video_dec_adapter_unit_test.cpp @@ -39,6 +39,7 @@ void LppVideoDecAdapterUnitTest::SetUp(void) void LppVideoDecAdapterUnitTest::TearDown(void) { + PipeLineThreadPool::GetInstance().DestroyThread(streamerId_); inputBufferQueueConsumer_ = nullptr; videoDecoder_ = nullptr; videoDecAdapter_ = nullptr; @@ -216,5 +217,73 @@ HWTEST_F(LppVideoDecAdapterUnitTest, OnInputBufferAvailable_002, TestSize.Level1 videoDecAdapter_->OnInputBufferAvailable(index, buffer); EXPECT_EQ(videoDecAdapter_->bufferVector_.size(), 0); } + +/** +* @tc.name : Test StartDecode API +* @tc.number : StartDecode_001 +* @tc.desc : Test StartDecode interface +* @tc.require : issueI5NZAQ +*/ +HWTEST_F(LppVideoDecAdapterUnitTest, StartDecode_001, TestSize.Level1) +{ + ASSERT_NE(nullptr, videoDecAdapter_); + videoDecAdapter_->decodertask_ + = std::make_unique("test_start_decode", streamerId_, TaskType::SINGLETON, TaskPriority::NORMAL, false); + videoDecAdapter_->videoDecoder_ = videoDecoder_; + videoDecAdapter_->initTargetPts_ = -1; + EXPECT_CALL(*videoDecoder_, Start()).WillOnce(Return(MediaAVCodec::AVCS_ERR_OK)); + int32_t res = videoDecAdapter_->StartDecode(); + EXPECT_EQ(res, 0); +} + +/** +* @tc.name : Test StartDecode API +* @tc.number : StartDecode_002 +* @tc.desc : Test StartDecode interface +* @tc.require : issueI5NZAQ +*/ +HWTEST_F(LppVideoDecAdapterUnitTest, StartDecode_002, TestSize.Level1) +{ + ASSERT_NE(nullptr, videoDecAdapter_); + videoDecAdapter_->decodertask_ + = std::make_unique("test_start_decode", streamerId_, TaskType::SINGLETON, TaskPriority::NORMAL, false); + videoDecAdapter_->videoDecoder_ = videoDecoder_; + videoDecAdapter_->initTargetPts_ = 3000; + EXPECT_CALL(*videoDecoder_, Start()).WillOnce(Return(MediaAVCodec::AVCS_ERR_OK)); + EXPECT_CALL(*videoDecoder_, SetParameter(_)).WillOnce(Return(MediaAVCodec::AVCS_ERR_OK)); + int32_t res = videoDecAdapter_->StartDecode(); + EXPECT_EQ(res, 0); +} + +/** +* @tc.name : Test SetTargetPts API +* @tc.number : SetTargetPts_001 +* @tc.desc : Test SetTargetPts interface +* @tc.require : issueI5NZAQ +*/ +HWTEST_F(LppVideoDecAdapterUnitTest, SetTargetPts_001, TestSize.Level1) +{ + ASSERT_NE(nullptr, videoDecAdapter_); + videoDecAdapter_->firstStarted_ = false; + videoDecAdapter_->videoDecoder_ = videoDecoder_; + int32_t res = videoDecAdapter_->SetTargetPts(3000); + EXPECT_EQ(res, 0); +} + +/** +* @tc.name : Test SetTargetPts API +* @tc.number : SetTargetPts_002 +* @tc.desc : Test SetTargetPts interface +* @tc.require : issueI5NZAQ +*/ +HWTEST_F(LppVideoDecAdapterUnitTest, SetTargetPts_002, TestSize.Level1) +{ + ASSERT_NE(nullptr, videoDecAdapter_); + videoDecAdapter_->firstStarted_ = true; + videoDecAdapter_->videoDecoder_ = videoDecoder_; + EXPECT_CALL(*videoDecoder_, SetParameter(_)).WillOnce(Return(MediaAVCodec::AVCS_ERR_OK)); + int32_t res = videoDecAdapter_->SetTargetPts(3000); + EXPECT_EQ(res, 0); +} } // namespace Media } // namespace OHOS \ No newline at end of file diff --git a/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/mock/lpp_vdec_adapter.h b/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/mock/lpp_vdec_adapter.h index 9032685df5300a8ba27a90086d000a68891ae46c..50b9532f2bcae8d5ce13485a1c59e3bb54e20f40 100644 --- a/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/mock/lpp_vdec_adapter.h +++ b/test/unittest/lpp_unit_test/module/lpp_video_dec_adapter_unit_test/mock/lpp_vdec_adapter.h @@ -65,6 +65,7 @@ public: void SetEventReceiver(std::shared_ptr eventReceiver); void SetSyncManager(std::shared_ptr syncMgr); void SetPlaybackSpeed(float speed); + int32_t SetTargetPts(int64_t targetPts); private: int32_t PrepareBufferQueue(); @@ -112,6 +113,9 @@ private: std::atomic speed_ {1.0f}; bool dumpBufferNeeded_ {false}; std::string dumpFileNameOutput_ {}; + + int64_t initTargetPts_ {-1}; + bool firstStarted_ {false}; }; } // namespace Media