diff --git a/media/base/ohos/ohos_media_decoder_bridge_impl.cc b/media/base/ohos/ohos_media_decoder_bridge_impl.cc index 3cdd090a19ab462bbbde9093a47c9bb6559caee0..f68de3f8bc5f1d900b9061ea4c7a21584229b158 100644 --- a/media/base/ohos/ohos_media_decoder_bridge_impl.cc +++ b/media/base/ohos/ohos_media_decoder_bridge_impl.cc @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "decoder_format_adapter_impl.h" #include "base/logging.h" @@ -18,6 +20,11 @@ using namespace media; using namespace OHOS::NWeb; using namespace std; +namespace { + char *DUMP_APP_DIR = "/data/storage/el2/base/"; + char* DUMP_AUDIO_PARA = "web.debug.audiodump"; +} + const std::string PRODUCT_MODEL_EMULATOR = "emulator"; void clearInputQueue(std::queue& q) { @@ -121,11 +128,19 @@ MediaCodecDecoderBridgeImpl::MediaCodecDecoderBridgeImpl( return; } cb_->on_buffers_available_cb_ = on_buffers_available_cb; + + LOG(INFO) << "DumpFileUtil::OpenDumpFile."; + time_t now = time(nullptr); + std::string dumpFrontFileName = std::to_string(now) + "input_video.mp4"; + DumpFileUtil::OpenDumpFile(dumpFrontFileName, &dumpFrontFile_); } MediaCodecDecoderBridgeImpl::~MediaCodecDecoderBridgeImpl() { LOG(INFO) << "MediaCodecDecoderBridgeImpl::~MediaCodecDecoderBridgeImpl."; ReleaseBridgeDecoder(); + + LOG(INFO) << "DumpFileUtil::CloseDumpFile."; + DumpFileUtil::CloseDumpFile(FILE **dumpFile); } DecoderAdapterCode MediaCodecDecoderBridgeImpl::ConfigureBridgeDecoder( @@ -396,6 +411,10 @@ DecoderAdapterCode MediaCodecDecoderBridgeImpl::QueueInputBuffer( DecoderAdapterCode ret = PushInbufferDec(index, inputSize, presentation_time); PopInqueueDec(); + + LOG(INFO) << "DumpFileUtil::WriteDumpFile Start"; + DumpFileUtil::WriteDumpFile(dumpFrontFile_, buffer.addr, bufferSize); + return ret; } @@ -580,3 +599,51 @@ void CodecBridgeCallback::OnNeedOutputData( signal_->outputQueue_.push(outputBuffer); on_buffers_available_cb_.Run(); } + +void DumpFileUtil::WriteDumpFile(FILE *dumpFile, void *buffer, size_t bufferSize) +{ + if (dumpFile == nullptr) { + return; + } + if (buffer == nullptr) { + LOG(WARNING) << "DumpFileUtil::WriteDumpFile buffer == nullptr"; + return; + } + size_t writeResult = fwrite(buffer, 1, bufferSize, dumpFile); + if (writeResult != bufferSize) { + LOG(WARNING) << "DumpFileUtil::WriteDumpFile writeResult != bufferSize"; + return; + } + return; +} + +void DumpFileUtil::CloseDumpFile(FILE **dumpFile) +{ + if (*dumpFile == nullptr) { + return; + } + int rc = fclose(*dumpFile); + if (rc != 0) { + LOG(WARNING) << "DumpFileUtil::CloseDumpFile err"; + } + *dumpFile = nullptr; + return; +} + +void DumpFileUtil::OpenDumpFile(std::string filename, FILE **file) +{ + std::string filePath = DUMP_APP_DIR + filename; + FILE *dumpFile = nullptr; + bool res = OHOS::NWeb::OhosAdapterHelper::GetInstance(). + GetSystemPropertiesInstance().GetBoolParameter(DUMP_AUDIO_PARA, false); + if (!res) { + return; + } + dumpFile = fopen(filePath.c_str(), "wb+"); + if (dumpFile == nullptr) { + LOG(WARNING) << "DumpFileUtil::OpenDumpFile fopen failed! filename: " << filename; + return; + } + *file = dumpFile; + return; +} diff --git a/media/base/ohos/ohos_media_decoder_bridge_impl.h b/media/base/ohos/ohos_media_decoder_bridge_impl.h index d9062b1945a383be04a73549f85838676063421a..49324fe91550990ee9c4d8c666068e89b77f4960 100644 --- a/media/base/ohos/ohos_media_decoder_bridge_impl.h +++ b/media/base/ohos/ohos_media_decoder_bridge_impl.h @@ -149,6 +149,14 @@ class MediaCodecDecoderBridgeImpl { scoped_refptr decoder_task_runner_ = nullptr; int32_t width_; int32_t height_; + FILE *dumpFrontFile_ = nullptr; +}; + +class DumpFileUtil { + public: + static void WriteDumpFile(FILE *dumpFile, void *buffer, size_t bufferSize); + static void CloseDumpFile(FILE **dumpFile); + static void OpenDumpFile(std::string filename, FILE **file); }; } // namespace media