From c8d14a0297d55efeae36de6a1d4cd9dd3afbaa91 Mon Sep 17 00:00:00 2001 From: whuqincheng Date: Thu, 2 Jan 2025 21:51:17 +0800 Subject: [PATCH] adapter videoDecoderByName and multi video of html Signed-off-by: whuqincheng --- media/audio/ohos/ohos_audio_output_stream.cc | 18 ++++++++++++------ media/audio/ohos/ohos_audio_output_stream.h | 4 +++- .../ohos/ohos_media_decoder_bridge_impl.cc | 2 +- media/gpu/ohos/ohos_video_decoder.cc | 14 +++++++++----- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/media/audio/ohos/ohos_audio_output_stream.cc b/media/audio/ohos/ohos_audio_output_stream.cc index 29f662df94..2ef4818be0 100644 --- a/media/audio/ohos/ohos_audio_output_stream.cc +++ b/media/audio/ohos/ohos_audio_output_stream.cc @@ -446,6 +446,7 @@ bool OHOSAudioOutputStream::StartRender() { audio_renderer_->SetAudioSilentMode(true); LOG(INFO) << "OHOSAudioOutputStream SetAudioSilentMode true"; isSilentMode_ = true; + silentFrameNum_ = 0; } if (!audio_renderer_->Start()) { LOG(ERROR) << "ohos audio render start failed"; @@ -529,7 +530,7 @@ void OHOSAudioOutputStream::PumpSamples() { int32_t bytesSingle = audio_renderer_->Write(audio_data_[active_buffer_index_] + bytesWritten, num_filled_bytes - bytesWritten); - SetUpAudioSilentState(); + SetUpAudioSilentState(bytesSingle); if (bytesSingle <= 0) { LOG(DEBUG) << "Audio renderer write audio data failed"; if (!audio_renderer_->IsRendererStateRunning()) { @@ -595,19 +596,24 @@ void OHOSAudioOutputStream::PumpSamples() { SchedulePumpSamples(now); } -void OHOSAudioOutputStream::SetUpAudioSilentState() +void OHOSAudioOutputStream::SetUpAudioSilentState(int32_t bytesSingle) { - if(!weakMediaSession_ || !audio_renderer_) { + if (!weakMediaSession_ || !audio_renderer_) { LOG(ERROR) << "OHOSAudioOutputStream: Try to set audio silent but get mediaSession or audioRender failed!"; return; } - if(isSilentMode_) { - bool is_playing = weakMediaSession_.get()->GetPlayingState(); + if (isSilentMode_) { + bool is_playing = weakMediaSession_.get()->GetPlayingState() || silentFrameNum_ >= 1; bool is_muted = weakMediaSession_.get()->GetMuteState(); - if(is_playing && !is_muted) { + if (is_playing && !is_muted) { audio_renderer_->SetAudioSilentMode(false); LOG(INFO) << "OHOSAudioOutputStream SetAudioSilentMode false!"; isSilentMode_ = false; + silentFrameNum_ = 0; + } else { + if (bytesSingle > 0) { + silentFrameNum_++; + } } } } diff --git a/media/audio/ohos/ohos_audio_output_stream.h b/media/audio/ohos/ohos_audio_output_stream.h index 81a32606a3..3ff80ef8e7 100644 --- a/media/audio/ohos/ohos_audio_output_stream.h +++ b/media/audio/ohos/ohos_audio_output_stream.h @@ -139,7 +139,7 @@ class OHOSAudioOutputStream : public AudioOutputStream { void ReleaseAudioBuffer(); // Call to set audio_render silentMode - void SetUpAudioSilentState(); + void SetUpAudioSilentState(int32_t bytesSingle); // Call to determine whether media is preload bool IsPreloadOrMutedMediaMode(); @@ -197,6 +197,8 @@ class OHOSAudioOutputStream : public AudioOutputStream { bool isSilentMode_ = false; + size_t silentFrameNum_ = 0; + scoped_refptr main_task_runner_; std::shared_ptr outputChangeCallback_ = nullptr; diff --git a/media/base/ohos/ohos_media_decoder_bridge_impl.cc b/media/base/ohos/ohos_media_decoder_bridge_impl.cc index 164ad00bea..a88c65d432 100644 --- a/media/base/ohos/ohos_media_decoder_bridge_impl.cc +++ b/media/base/ohos/ohos_media_decoder_bridge_impl.cc @@ -115,7 +115,7 @@ MediaCodecDecoderBridgeImpl::MediaCodecDecoderBridgeImpl( } videoDecoder_ = OhosAdapterHelper::GetInstance().CreateMediaCodecDecoderAdapter(); - DecoderAdapterCode ret = CreateVideoBridgeDecoderByMime(codec_type); + DecoderAdapterCode ret = CreateVideoBridgeDecoderByName(codec_type); if (ret == DecoderAdapterCode::DECODER_ERROR) { LOG(ERROR) << "create decoder failed."; return; diff --git a/media/gpu/ohos/ohos_video_decoder.cc b/media/gpu/ohos/ohos_video_decoder.cc index 671022de2a..61c4e79360 100644 --- a/media/gpu/ohos/ohos_video_decoder.cc +++ b/media/gpu/ohos/ohos_video_decoder.cc @@ -291,13 +291,17 @@ void OhosVideoDecoder::OnCodecConfigured( OHOS::NWeb::DecoderFormat decoderFormat; decoderFormat.width = decoder_config_.coded_size().width(); decoderFormat.height = decoder_config_.coded_size().height(); - codec->ConfigureBridgeDecoder(decoderFormat, - base::SequencedTaskRunner::GetCurrentDefault()); + if (codec->ConfigureBridgeDecoder(decoderFormat, base::SequencedTaskRunner::GetCurrentDefault()) == + DecoderAdapterCode::DECODER_ERROR) { + LOG(ERROR) << "OhosVideoDecoder::ConfigureBridgeDecoder failed."; + EnterTerminalState(State::kError, "Unable to config codec"); + return; + } if (codec->SetBridgeOutputSurface(surface_bundle->GetOHOSNativeWindow()) == DecoderAdapterCode::DECODER_ERROR) { - LOG(ERROR) << "OhosVideoDecoder::SetBridgeOutputSurface failed."; - EnterTerminalState(State::kError, "Unable to initialize codec"); - return; + LOG(ERROR) << "OhosVideoDecoder::SetBridgeOutputSurface failed."; + EnterTerminalState(State::kError, "Unable to initialize codec"); + return; } codec->PrepareBridgeDecoder(); codec->StartBridgeDecoder(); -- Gitee