diff --git a/av_transport/av_trans_engine/av_receiver/include/av_receiver_engine.h b/av_transport/av_trans_engine/av_receiver/include/av_receiver_engine.h index 8af459c12033643512c99664081773115b4764f3..9712448653ca36a12b191512a8addd54cc0d7066 100644 --- a/av_transport/av_trans_engine/av_receiver/include/av_receiver_engine.h +++ b/av_transport/av_trans_engine/av_receiver/include/av_receiver_engine.h @@ -62,6 +62,8 @@ public: int32_t CreateControlChannel(const std::vector &dstDevIds, const ChannelAttribute &attribution) override; int32_t RegisterReceiverCallback(const std::shared_ptr &callback) override; + bool StartDumpMediaData() override; + bool ReStartDumpMediaData() override; // interfaces from ISoftbusChannelListener void OnChannelEvent(const AVTransEvent &event) override; diff --git a/av_transport/av_trans_engine/av_receiver/src/av_receiver_engine.cpp b/av_transport/av_trans_engine/av_receiver/src/av_receiver_engine.cpp index 5c3395d6c5daf2dc3d881bfaf7de59eeeb4fb2f6..83241bb62357f1bab091abc9d3957eebfb6c15bf 100644 --- a/av_transport/av_trans_engine/av_receiver/src/av_receiver_engine.cpp +++ b/av_transport/av_trans_engine/av_receiver/src/av_receiver_engine.cpp @@ -402,6 +402,26 @@ int32_t AVReceiverEngine::RegisterReceiverCallback(const std::shared_ptrSetParameter(static_cast(Plugin::Tag::SECTION_USER_SPECIFIC_START), true); + return true; +} + +bool AVReceiverEngine::ReStartDumpMediaData() +{ + if (avInput_ == nullptr) { + AVTRANS_LOGE("avInput_ is nullptr."); + return false; + } + avInput_->SetParameter(static_cast(Plugin::Tag::SECTION_VIDEO_SPECIFIC_START), true); + return true; +} + int32_t AVReceiverEngine::HandleOutputBuffer(std::shared_ptr &hisBuffer) { StateId currentState = GetCurrentState(); diff --git a/av_transport/av_trans_engine/av_sender/include/av_sender_engine.h b/av_transport/av_trans_engine/av_sender/include/av_sender_engine.h index 0c73af02c39a6870cde6ba998acba3e43a77014e..a29fc406f0cd04f4273398f813ca468ab1dcf353 100644 --- a/av_transport/av_trans_engine/av_sender/include/av_sender_engine.h +++ b/av_transport/av_trans_engine/av_sender/include/av_sender_engine.h @@ -60,8 +60,10 @@ public: int32_t PushData(const std::shared_ptr &buffer) override; int32_t SendMessage(const std::shared_ptr &message) override; int32_t CreateControlChannel(const std::vector &dstDevIds, - const ChannelAttribute &attribution) override; + const ChannelAttribute &attribution) override; int32_t RegisterSenderCallback(const std::shared_ptr &callback) override; + bool StartDumpMediaData() override; + bool ReStartDumpMediaData() override; // interfaces from ISoftbusChannelListener void OnChannelEvent(const AVTransEvent &event) override; diff --git a/av_transport/av_trans_engine/av_sender/src/av_sender_engine.cpp b/av_transport/av_trans_engine/av_sender/src/av_sender_engine.cpp index 984e5c715ebbd44ced5684a68c31a1086cbe653b..cdbeb9c7a6543823bc5f295f1087178a8dac1ee2 100644 --- a/av_transport/av_trans_engine/av_sender/src/av_sender_engine.cpp +++ b/av_transport/av_trans_engine/av_sender/src/av_sender_engine.cpp @@ -464,6 +464,26 @@ int32_t AVSenderEngine::RegisterSenderCallback(const std::shared_ptrSetParameter(static_cast(Plugin::Tag::SECTION_USER_SPECIFIC_START), true); + return true; +} + +bool AVSenderEngine::ReStartDumpMediaData() +{ + if (avOutput_ == nullptr) { + AVTRANS_LOGE("avOutput_ is nullptr."); + return false; + } + avOutput_->SetParameter(static_cast(Plugin::Tag::SECTION_VIDEO_SPECIFIC_START), true); + return true; +} + void AVSenderEngine::NotifyStreamChange(EventType type) { AVTRANS_LOGI("NotifyStreamChange enter, change type=%" PRId32, type); diff --git a/av_transport/av_trans_engine/filters/av_transport_input/av_transport_input_filter.cpp b/av_transport/av_trans_engine/filters/av_transport_input/av_transport_input_filter.cpp index e0876194b69be53a4ea7b8165e2a319fc8a659f5..bf3f6158fe625178a2ff07b0114a78612b253467 100644 --- a/av_transport/av_trans_engine/filters/av_transport_input/av_transport_input_filter.cpp +++ b/av_transport/av_trans_engine/filters/av_transport_input/av_transport_input_filter.cpp @@ -513,6 +513,13 @@ ErrorCode AVInputFilter::SetPluginParams() if (paramsMap_.find(Tag::MEDIA_DESCRIPTION) != paramsMap_.end()) { plugin_->SetParameter(Tag::MEDIA_DESCRIPTION, paramsMap_[Tag::MEDIA_DESCRIPTION]); } + if (paramsMap_.find(Tag::SECTION_USER_SPECIFIC_START) != paramsMap_.end()) { + plugin_->SetParameter(Tag::SECTION_USER_SPECIFIC_START, paramsMap_[Tag::SECTION_USER_SPECIFIC_START]); + } + if (paramsMap_.find(Tag::SECTION_VIDEO_SPECIFIC_START) != paramsMap_.end()) { + plugin_->SetParameter(Tag::SECTION_VIDEO_SPECIFIC_START, paramsMap_[Tag::SECTION_VIDEO_SPECIFIC_START]); + } + return ErrorCode::SUCCESS; } diff --git a/av_transport/av_trans_engine/filters/av_transport_output/av_transport_output_filter.cpp b/av_transport/av_trans_engine/filters/av_transport_output/av_transport_output_filter.cpp index 4c46b4912b50939d5e976a3e4e6594d664eab29b..53f33d353f6f76826bdd07cbd1a9974be5cbfe65 100644 --- a/av_transport/av_trans_engine/filters/av_transport_output/av_transport_output_filter.cpp +++ b/av_transport/av_trans_engine/filters/av_transport_output/av_transport_output_filter.cpp @@ -318,6 +318,12 @@ ErrorCode AVOutputFilter::SetPluginParams() if (paramsMap_.find(Tag::AUDIO_CHANNEL_LAYOUT) != paramsMap_.end()) { plugin_->SetParameter(Tag::AUDIO_CHANNEL_LAYOUT, paramsMap_[Tag::AUDIO_CHANNEL_LAYOUT]); } + if (paramsMap_.find(Tag::SECTION_USER_SPECIFIC_START) != paramsMap_.end()) { + plugin_->SetParameter(Tag::SECTION_USER_SPECIFIC_START, paramsMap_[Tag::SECTION_USER_SPECIFIC_START]); + } + if (paramsMap_.find(Tag::SECTION_VIDEO_SPECIFIC_START) != paramsMap_.end()) { + plugin_->SetParameter(Tag::SECTION_VIDEO_SPECIFIC_START, paramsMap_[Tag::SECTION_VIDEO_SPECIFIC_START]); + } return ErrorCode::SUCCESS; } diff --git a/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.cpp b/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.cpp index 1555cf0c3a07c9a43b6731d3c89b23901d0150fe..d8f15eb32315acf5c704286e4a37b95f6b3bc691 100644 --- a/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.cpp +++ b/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.cpp @@ -15,6 +15,11 @@ #include "dsoftbus_input_plugin.h" +#include +#include +#include +#include + #include "foundation/utils/constants.h" #include "plugin/common/share_memory.h" #include "plugin/common/plugin_caps_builder.h" @@ -70,6 +75,8 @@ Status DsoftbusInputPlugin::Init() { AVTRANS_LOGI("Init"); Media::OSAL::ScopedLock lock(operationMutes_); + dumpFlag_.store(false); + reDumpFlag_.store(false); state_ = State::INITIALIZED; return Status::OK; } @@ -183,6 +190,12 @@ Status DsoftbusInputPlugin::SetParameter(Tag tag, const ValueType &value) if (tag == Tag::MEDIA_DESCRIPTION) { ParseChannelDescription(Plugin::AnyCast(value), ownerName_, peerDevId_); } + if (tag == Tag::SECTION_USER_SPECIFIC_START) { + dumpFlag_.store(Plugin::AnyCast(value)); + } + if (tag == Tag::SECTION_VIDEO_SPECIFIC_START) { + reDumpFlag_.store(Plugin::AnyCast(value)); + } paramsMap_.insert(std::pair(tag, value)); return Status::OK; } @@ -246,6 +259,12 @@ void DsoftbusInputPlugin::OnStreamReceived(const StreamData *data, const StreamD if (buffer != nullptr) { DataEnqueue(buffer); } + if (GetDumpFlag() == true || GetReDumpFlag() == true) { + DumpBufferToFile(SCREEN_FILE_NAME_BEFOREENCODING, + buffer->GetMemory()->GetWritableAddr(0,0), buffer->GetMemoryCount()); + SetDumpFlagFalse(); + SetReDumpFlagFalse(); + } } std::shared_ptr DsoftbusInputPlugin::CreateBuffer(uint32_t metaType, @@ -323,5 +342,44 @@ Status DsoftbusInputPlugin::PushData(const std::string &inPort, std::shared_ptr< AVTRANS_LOGI("Push Data"); return Status::OK; } + +bool DsoftbusInputPlugin::GetDumpFlag() +{ + return dumpFlag_; +} + +void DsoftbusInputPlugin::SetDumpFlagFalse() +{ + dumpFlag_ = false; +} + +bool DsoftbusInputPlugin::GetReDumpFlag() +{ + return reDumpFlag_; +} + +void DsoftbusInputPlugin::SetReDumpFlagFalse() +{ + reDumpFlag_ = false; +} + +void DsoftbusInputPlugin::DumpBufferToFile(std::string fileName, uint8_t *buffer, int32_t bufSize) +{ + AVTRANS_LOGE("DumpBufferToFile."); + if (GetReDumpFlag() == true) { + std::remove(fileName.c_str()); + SetReDumpFlagFalse(); + } + + std::ofstream ofs(fileName, std::ios::binary | std::ios::out | std::ios::app); + + if (!ofs.is_open()) { + AVTRANS_LOGE("open file failed."); + return; + } + AVTRANS_LOGE("open trans Hidumper SaveFile file success."); + ofs.write((const char *)buffer, bufSize); + ofs.close(); +} } } \ No newline at end of file diff --git a/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.h b/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.h index 9970d000025724c7e1046c1f3c367e0cb52d1b07..648e6d193cbf5b9f87cb8c16e96c99ffe37243b9 100644 --- a/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.h +++ b/av_transport/av_trans_engine/plugin/plugins/av_trans_input/dsoftbus_input/dsoftbus_input_plugin.h @@ -17,6 +17,7 @@ #define OHOS_AV_TRANS_ENGINE_PLUGINS_INPUT_DSOFTBUS_H #include +#include #include #include #include @@ -66,6 +67,12 @@ public: Status PushData(const std::string &inPort, std::shared_ptr buffer, int32_t offset) override; Status SetCallback(Callback *cb) override; Status SetDataCallback(AVDataCallback callback) override; + bool GetDumpFlag(); + void SetDumpFlagFalse(); + bool GetReDumpFlag(); + void SetReDumpFlagFalse(); + void DumpBufferToFile(std::string fileName, uint8_t *buffer, int32_t bufSize); + void ReDumpBufferToFile(std::string fileName, uint8_t *buffer, int32_t bufSize); // interface from ISoftbusChannelListener void OnChannelEvent(const AVTransEvent &event) override; @@ -78,6 +85,8 @@ private: std::shared_ptr CreateBuffer(uint32_t metaType, const StreamData *data, const json &resMsg); private: + std::atomic dumpFlag_ ; + std::atomic reDumpFlag_ ; std::string ownerName_; std::string sessionName_; std::string peerDevId_; @@ -90,6 +99,7 @@ private: State state_ {State::CREATED}; Callback* eventsCb_ = nullptr; AVDataCallback dataCb_; + const std::string SCREEN_FILE_NAME_BEFOREENCODING = "/data/data/dscreen/BeforeEncoding.h264"; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.cpp b/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.cpp index abcd5dc4b820624ae1e58ac74131a510222ae1f8..ad74cfb8d916d88c03f1c57e995bc5d57e83ec29 100644 --- a/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.cpp +++ b/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.cpp @@ -14,6 +14,11 @@ */ #include "dsoftbus_output_plugin.h" +#include +#include +#include +#include + #include "foundation/utils/constants.h" #include "plugin/common/plugin_caps_builder.h" #include "plugin/factory/plugin_factory.h" @@ -21,7 +26,6 @@ namespace OHOS { namespace DistributedHardware { - std::vector CreateDsoftbusOutputPluginDef() { int32_t capNum = 2; @@ -68,6 +72,8 @@ Status DsoftbusOutputPlugin::Init() { AVTRANS_LOGI("Init Dsoftbus Output Plugin."); Media::OSAL::ScopedLock lock(operationMutes_); + dumpFlag_.store(false); + reDumpFlag_.store(false); state_ = State::INITIALIZED; return Status::OK; } @@ -168,6 +174,12 @@ Status DsoftbusOutputPlugin::SetParameter(Tag tag, const ValueType &value) if (tag == Tag::MEDIA_DESCRIPTION) { ParseChannelDescription(Plugin::AnyCast(value), ownerName_, peerDevId_); } + if (tag == Tag::SECTION_USER_SPECIFIC_START) { + dumpFlag_.store(Plugin::AnyCast(value)); + } + if (tag == Tag::SECTION_VIDEO_SPECIFIC_START) { + reDumpFlag_.store(Plugin::AnyCast(value)); + } paramsMap_.insert(std::pair(tag, value)); return Status::OK; } @@ -252,6 +264,12 @@ Status DsoftbusOutputPlugin::PushData(const std::string &inPort, std::shared_ptr } dataQueue_.push(buffer); dataCond_.notify_all(); + if (GetDumpFlag() == true || GetReDumpFlag() == true) { + DumpBufferToFile(SCREEN_FILE_NAME_AFTERCODING, + buffer->GetMemory()->GetWritableAddr(0,0), buffer->GetMemoryCount()); + SetDumpFlagFalse(); + SetReDumpFlagFalse(); + } return Status::OK; } @@ -328,5 +346,44 @@ Status DsoftbusOutputPlugin::SetDataCallback(AVDataCallback callback) AVTRANS_LOGI("SetDataCallback"); return Status::OK; } + +bool DsoftbusOutputPlugin::GetDumpFlag() +{ + return dumpFlag_; +} + +void DsoftbusOutputPlugin::SetDumpFlagFalse() +{ + dumpFlag_ = false; +} + +bool DsoftbusOutputPlugin::GetReDumpFlag() +{ + return reDumpFlag_; +} + +void DsoftbusOutputPlugin::SetReDumpFlagFalse() +{ + reDumpFlag_ = false; +} + +void DsoftbusOutputPlugin::DumpBufferToFile(std::string fileName, uint8_t *buffer, int32_t bufSize) +{ + AVTRANS_LOGE("DumpBufferToFile."); + if (GetReDumpFlag() == true) { + std::remove(fileName.c_str()); + SetReDumpFlagFalse(); + } + + std::ofstream ofs(fileName, std::ios::binary | std::ios::out | std::ios::app); + + if (!ofs.is_open()) { + AVTRANS_LOGE("open file failed."); + return; + } + AVTRANS_LOGE("open trans Hidumper SaveFile file success."); + ofs.write((const char *)buffer, bufSize); + ofs.close(); +} } } \ No newline at end of file diff --git a/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.h b/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.h index 3ad6c4aa7fab39f7e7ca2eceb3feeccf169e3493..7a764af4fa83f0338e8fdf0045ec2bfb540fe3c7 100644 --- a/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.h +++ b/av_transport/av_trans_engine/plugin/plugins/av_trans_output/dsoftbus_output/dsoftbus_output_plugin.h @@ -17,6 +17,7 @@ #define OHOS_AV_TRANS_ENGINE_PLUGINS_OUTPUT_DSOFTBUS_H #include +#include #include #include #include @@ -63,6 +64,12 @@ public: Status PushData(const std::string &inPort, std::shared_ptr buffer, int32_t offset) override; Status SetCallback(Callback *cb) override; Status SetDataCallback(AVDataCallback callback) override; + bool GetDumpFlag(); + void SetDumpFlagFalse(); + bool GetReDumpFlag(); + void SetReDumpFlagFalse(); + void DumpBufferToFile(std::string fileName, uint8_t *buffer, int32_t bufSize); + void ReDumpBufferToFile(std::string fileName, uint8_t *buffer, int32_t bufSize); // interface from ISoftbusChannelListener void OnChannelEvent(const AVTransEvent &event) override; @@ -76,6 +83,8 @@ private: void FeedChannelData(); private: + std::atomic dumpFlag_ ; + std::atomic reDumpFlag_ ; std::string ownerName_; std::string sessionName_; std::string peerDevId_; @@ -87,6 +96,7 @@ private: std::map paramsMap_; State state_ {State::CREATED}; Callback* eventsCb_ = nullptr; + const std::string SCREEN_FILE_NAME_AFTERCODING = "/data/data/dscreen/AfterCoding.h264"; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/av_transport/interface/i_av_receiver_engine.h b/av_transport/interface/i_av_receiver_engine.h index 7ad79e35ce8e8e3a67c1227b353e57ab76a3dd9a..e63e2405deb9e9fe91278c7a7148e42294f99411 100644 --- a/av_transport/interface/i_av_receiver_engine.h +++ b/av_transport/interface/i_av_receiver_engine.h @@ -97,6 +97,16 @@ public: * @return Returns DH_AVT_SUCCESS(0) if successful, otherwise returns other error code. */ virtual int32_t RegisterReceiverCallback(const std::shared_ptr &callback) = 0; + /** + * @brief Send dump signal to the receiver engine. + * @return Returns BOOL(0) + */ + virtual bool StartDumpMediaData() = 0; + /** + * @brief Send redump signal to the receiver engine. + * @return Returns BOOL(0) + */ + virtual bool ReStartDumpMediaData() = 0; }; } // DistributedHardware } // OHOS diff --git a/av_transport/interface/i_av_sender_engine.h b/av_transport/interface/i_av_sender_engine.h index ac2067eb5f9b45d85370c1d22402ba53fe0d70d6..e1d23ba0b6fca45a2b28fb25c91cf751fb841de2 100644 --- a/av_transport/interface/i_av_sender_engine.h +++ b/av_transport/interface/i_av_sender_engine.h @@ -105,6 +105,16 @@ public: * @return Returns DH_AVT_SUCCESS(0) if successful, otherwise returns other error code. */ virtual int32_t RegisterSenderCallback(const std::shared_ptr &callback) = 0; + /** + * @brief Send dump signal to the receiver engine. + * @return Returns BOOL(0) + */ + virtual bool StartDumpMediaData() = 0; + /** + * @brief Send redump signal to the receiver engine. + * @return Returns BOOL(0) + */ + virtual bool ReStartDumpMediaData() = 0; }; } // DistributedHardware } // OHOS