diff --git a/frameworks/js/avplayer/avplayer_napi.cpp b/frameworks/js/avplayer/avplayer_napi.cpp index c94fae4474843ddee0c3d046f1d91e68c32692cf..76158fb9e9e1deddf6c6e906ee75e465855a3362 100644 --- a/frameworks/js/avplayer/avplayer_napi.cpp +++ b/frameworks/js/avplayer/avplayer_napi.cpp @@ -1982,20 +1982,40 @@ napi_value AVPlayerNapi::JsSetDataSrc(napi_env env, napi_callback_info info) CHECK_AND_RETURN_RET_LOG(status == napi_ok && ref != nullptr, result, "failed to create reference!"); std::shared_ptr autoRef = std::make_shared(env, ref); jsPlayer->dataSrcCb_->SaveCallbackReference(READAT_CALLBACK_NAME, autoRef); + jsPlayer->SetDataSource(jsPlayer); + MEDIA_LOGI("JsSetDataSrc Out"); + return result; +} - if (jsPlayer->player_ != nullptr) { - if (jsPlayer->player_->SetSource(jsPlayer->dataSrcCb_) != MSERR_OK) { - jsPlayer->OnErrorCb(MSERR_EXT_API9_INVALID_PARAMETER, "player SetSource DataSrc failed"); - } else { - jsPlayer->state_ = PlayerStates::PLAYER_INITIALIZED; - } - if (jsPlayer->dataSrcDescriptor_.fileSize == -1) { - jsPlayer->isLiveStream_ = true; +void AVPlayerNapi::SetDataSource(AVPlayerNapi *jsPlayer) +{ + MEDIA_LOGI("SetDataSource while setStateChange_ %{public}d", jsPlayer->hasSetStateChangeCb_); + if (jsPlayer->hasSetStateChangeCb_) { + if (jsPlayer->player_ != nullptr) { + if (jsPlayer->player_->SetSource(jsPlayer->dataSrcCb_) != MSERR_OK) { + jsPlayer->OnErrorCb(MSERR_EXT_API9_INVALID_PARAMETER, "player SetSource DataSrc failed"); + } else { + jsPlayer->state_ = PlayerStates::PLAYER_INITIALIZED; + } + if (jsPlayer->dataSrcDescriptor_.fileSize == -1) { + jsPlayer->isLiveStream_ = true; + } } + return; } - MEDIA_LOGI("JsSetDataSrc Out"); - return result; + auto task = std::make_shared>([jsPlayer]() { + MEDIA_LOGI("SetDataSrc Task"); + if (jsPlayer->player_ != nullptr) { + if (jsPlayer->player_->SetSource(jsPlayer->dataSrcCb_) != MSERR_OK) { + jsPlayer->OnErrorCb(MSERR_EXT_API9_INVALID_PARAMETER, "player SetSource DataSrc failed"); + } + if (jsPlayer->dataSrcDescriptor_.fileSize == -1) { + jsPlayer->isLiveStream_ = true; + } + } + }); + (void)jsPlayer->taskQue_->EnqueueTask(task); } napi_value AVPlayerNapi::JsGetDataSrc(napi_env env, napi_callback_info info) @@ -3132,6 +3152,7 @@ napi_value AVPlayerNapi::JsSetOnCallback(napi_env env, napi_callback_info info) CHECK_AND_RETURN_RET_NOLOG( VerifyExpectedType({ env, args[0], napi_string }, jsPlayer, "type should be string."), result); std::string callbackName = CommonNapi::GetStringArgument(env, args[0]); + jsPlayer->hasSetStateChangeCb_ |= (callbackName == "stateChange"); napi_ref ref = nullptr; if (argCount == ARGS_THREE) { @@ -3218,6 +3239,7 @@ napi_value AVPlayerNapi::JsClearOnCallback(napi_env env, napi_callback_info info } std::string callbackName = CommonNapi::GetStringArgument(env, args[0]); + jsPlayer->hasSetStateChangeCb_ &= (callbackName != "stateChange"); MEDIA_LOGI("0x%{public}06" PRIXPTR " set callbackName: %{public}s", FAKE_POINTER(jsPlayer), callbackName.c_str()); if (callbackName != "seiMessageReceived") { jsPlayer->MaxAmplitudeCallbackOff(jsPlayer, callbackName); diff --git a/frameworks/js/avplayer/avplayer_napi.h b/frameworks/js/avplayer/avplayer_napi.h index 66a2ab9676a236551b976fba2df3af66cae6de80..3490a49889627483255a8cc42431c9382c090267 100644 --- a/frameworks/js/avplayer/avplayer_napi.h +++ b/frameworks/js/avplayer/avplayer_napi.h @@ -320,6 +320,7 @@ private: void AddSubSource(std::string url); void SetSurface(const std::string &surfaceStr); void ResetUserParameters(); + void SetDataSource(AVPlayerNapi *jsPlayer); std::shared_ptr> PrepareTask(); std::shared_ptr> PlayTask(); @@ -440,6 +441,7 @@ private: bool getApiVersionFlag_ = true; std::atomic isReadyReleased_ = false; + bool hasSetStateChangeCb_ = false; }; } // namespace Media } // namespace OHOS diff --git a/interfaces/inner_api/native/player_framework.versionscript b/interfaces/inner_api/native/player_framework.versionscript index 5ed99716b76535ca809fa334bd2a7289df1a69e7..ba12d81f0dfff8fb130ebd94d508ab328372c9a7 100644 --- a/interfaces/inner_api/native/player_framework.versionscript +++ b/interfaces/inner_api/native/player_framework.versionscript @@ -15,6 +15,7 @@ global: extern "C++" { *OHOS::Media::PlayerFactory::CreatePlayer*; + *OHOS::Media::PlayerFactory::GetPlayerPids*; *OHOS::Media::RecorderFactory::CreateRecorder*; *OHOS::Media::TransCoderFactory::CreateTransCoder*; *OHOS::Media::VideoEncoderFactory::CreateBy*;