From fbfe79517125030272795a587239b6a7e9c8935e Mon Sep 17 00:00:00 2001 From: "yying.jin" Date: Fri, 9 Jan 2026 16:42:55 +0800 Subject: [PATCH 1/6] add drm license error callback --- .../lib/src/drm_configs.dart | 9 ++++- .../tizen/src/drm_manager.cc | 40 ++++++++++++++----- .../tizen/src/drm_manager.h | 8 +++- .../tizen/src/plus_player.cc | 6 +++ 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/packages/video_player_avplay/lib/src/drm_configs.dart b/packages/video_player_avplay/lib/src/drm_configs.dart index 025237ffb..9a2cd213a 100644 --- a/packages/video_player_avplay/lib/src/drm_configs.dart +++ b/packages/video_player_avplay/lib/src/drm_configs.dart @@ -26,7 +26,14 @@ class DrmConfigs { this.type = DrmType.none, this.licenseServerUrl, this.licenseCallback, - }); + }) : assert( + (licenseServerUrl != null) ^ (licenseCallback != null), + 'Either licenseServerUrl or licenseCallback should be specified, but not both.', + ), + assert( + licenseServerUrl == null || licenseServerUrl != '', + 'License server URL cannot be empty.', + ); /// The DRM type. final DrmType type; diff --git a/packages/video_player_avplay/tizen/src/drm_manager.cc b/packages/video_player_avplay/tizen/src/drm_manager.cc index c6e3250df..51e2ba404 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.cc +++ b/packages/video_player_avplay/tizen/src/drm_manager.cc @@ -241,13 +241,16 @@ bool DrmManager::ProcessLicense(DataForLicenseProcess &data) { static_cast(drm_type_), nullptr, nullptr); if (DRM_SUCCESS != ret || nullptr == response_data || 0 == response_len) { LOG_ERROR("[DrmManager] Fail to get respone by license server url."); + UpdateHasError(); return false; } LOG_INFO("[DrmManager] Response length : %lu", response_len); - InstallKey(const_cast( - reinterpret_cast(data.session_id.c_str())), - static_cast(response_data), - reinterpret_cast(response_len)); + if (!InstallKey(const_cast(reinterpret_cast( + data.session_id.c_str())), + static_cast(response_data), + reinterpret_cast(response_len))) { + UpdateHasError(); + } free(response_data); } else if (request_license_channel_) { // Get license via the Dart callback. @@ -258,7 +261,7 @@ bool DrmManager::ProcessLicense(DataForLicenseProcess &data) { return false; } -void DrmManager::InstallKey(void *session_id, void *response_data, +bool DrmManager::InstallKey(void *session_id, void *response_data, void *response_len) { LOG_INFO("[DrmManager] Start install license."); @@ -271,6 +274,22 @@ void DrmManager::InstallKey(void *session_id, void *response_data, if (ret != DM_ERROR_NONE) { LOG_ERROR("[DrmManager] Fail to install eme key: %s", get_error_message(ret)); + return false; + } + return true; +} + +void DrmManager::SetErrorCallback(ErrorCallback callback) { + error_callback_ = callback; +} + +void DrmManager::UpdateHasError() { + if (error_callback_) { + std::string error_code = "[DrmManager] error"; + std::string error_message = + "Error: install drm key failed, please check licenseURL or network " + "connection."; + error_callback_(error_code, error_message); } } @@ -296,13 +315,16 @@ void DrmManager::RequestLicense(std::string &session_id, std::string &message) { response = std::get>(*success_value); } else { LOG_ERROR("[DrmManager] Fail to get response."); + UpdateHasError(); return; } LOG_INFO("[DrmManager] Response length : %d", response.size()); - InstallKey(const_cast( - reinterpret_cast(session_id.c_str())), - reinterpret_cast(response.data()), - reinterpret_cast(response.size())); + if (!InstallKey(const_cast(reinterpret_cast( + session_id.c_str())), + reinterpret_cast(response.data()), + reinterpret_cast(response.size()))) { + UpdateHasError(); + } }, nullptr, nullptr); request_license_channel_->InvokeMethod( diff --git a/packages/video_player_avplay/tizen/src/drm_manager.h b/packages/video_player_avplay/tizen/src/drm_manager.h index 1808e6f4f..8cafda9fa 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.h +++ b/packages/video_player_avplay/tizen/src/drm_manager.h @@ -19,6 +19,9 @@ class DrmManager { DRM_TYPE_WIDEVINECDM, } DrmType; + using ErrorCallback = + std::function; + explicit DrmManager(); ~DrmManager(); @@ -32,6 +35,8 @@ class DrmManager { unsigned char *pssh_data, void *user_data); int UpdatePsshData(const void *data, int length); void ReleaseDrmSession(); + void SetErrorCallback(ErrorCallback callback); + void UpdateHasError(); private: struct DataForLicenseProcess { @@ -43,7 +48,7 @@ class DrmManager { }; void RequestLicense(std::string &session_id, std::string &message); - void InstallKey(void *session_id, void *response_data, void *response_len); + bool InstallKey(void *session_id, void *response_data, void *response_len); int SetChallenge(const std::string &media_url); static int OnChallengeData(void *session_id, int message_type, void *message, @@ -64,6 +69,7 @@ class DrmManager { std::mutex queue_mutex_; Ecore_Pipe *license_request_pipe_ = nullptr; std::queue license_request_queue_; + ErrorCallback error_callback_; }; #endif // FLUTTER_PLUGIN_DRM_MANAGER_H_ diff --git a/packages/video_player_avplay/tizen/src/plus_player.cc b/packages/video_player_avplay/tizen/src/plus_player.cc index 53c8e348d..12cf86a78 100644 --- a/packages/video_player_avplay/tizen/src/plus_player.cc +++ b/packages/video_player_avplay/tizen/src/plus_player.cc @@ -615,6 +615,12 @@ bool PlusPlayer::SetTrackSelection(int32_t track_id, std::string track_type) { bool PlusPlayer::SetDrm(const std::string &uri, int drm_type, const std::string &license_server_url) { drm_manager_ = std::make_unique(); + DrmManager::ErrorCallback drm_error_callback = + [this](const std::string &error_code, const std::string &error_message) { + this->SendError(error_code, error_message); + }; + drm_manager_->SetErrorCallback(drm_error_callback); + if (!drm_manager_->CreateDrmSession(drm_type, true)) { LOG_ERROR("[PlusPlayer] Fail to create drm session."); return false; From 43f3c04e7a7bd876e0dd74670b180f9da442b2cd Mon Sep 17 00:00:00 2001 From: "yying.jin" Date: Mon, 12 Jan 2026 09:29:03 +0800 Subject: [PATCH 2/6] rename callback function --- packages/video_player_avplay/tizen/src/drm_manager.cc | 10 +++++----- packages/video_player_avplay/tizen/src/drm_manager.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/video_player_avplay/tizen/src/drm_manager.cc b/packages/video_player_avplay/tizen/src/drm_manager.cc index 51e2ba404..d4493237c 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.cc +++ b/packages/video_player_avplay/tizen/src/drm_manager.cc @@ -241,7 +241,7 @@ bool DrmManager::ProcessLicense(DataForLicenseProcess &data) { static_cast(drm_type_), nullptr, nullptr); if (DRM_SUCCESS != ret || nullptr == response_data || 0 == response_len) { LOG_ERROR("[DrmManager] Fail to get respone by license server url."); - UpdateHasError(); + SendInstallKeyError(); return false; } LOG_INFO("[DrmManager] Response length : %lu", response_len); @@ -249,7 +249,7 @@ bool DrmManager::ProcessLicense(DataForLicenseProcess &data) { data.session_id.c_str())), static_cast(response_data), reinterpret_cast(response_len))) { - UpdateHasError(); + SendInstallKeyError(); } free(response_data); } else if (request_license_channel_) { @@ -283,7 +283,7 @@ void DrmManager::SetErrorCallback(ErrorCallback callback) { error_callback_ = callback; } -void DrmManager::UpdateHasError() { +void DrmManager::SendInstallKeyError() { if (error_callback_) { std::string error_code = "[DrmManager] error"; std::string error_message = @@ -315,7 +315,7 @@ void DrmManager::RequestLicense(std::string &session_id, std::string &message) { response = std::get>(*success_value); } else { LOG_ERROR("[DrmManager] Fail to get response."); - UpdateHasError(); + SendInstallKeyError(); return; } LOG_INFO("[DrmManager] Response length : %d", response.size()); @@ -323,7 +323,7 @@ void DrmManager::RequestLicense(std::string &session_id, std::string &message) { session_id.c_str())), reinterpret_cast(response.data()), reinterpret_cast(response.size()))) { - UpdateHasError(); + SendInstallKeyError(); } }, nullptr, nullptr); diff --git a/packages/video_player_avplay/tizen/src/drm_manager.h b/packages/video_player_avplay/tizen/src/drm_manager.h index 8cafda9fa..e52200abd 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.h +++ b/packages/video_player_avplay/tizen/src/drm_manager.h @@ -36,7 +36,7 @@ class DrmManager { int UpdatePsshData(const void *data, int length); void ReleaseDrmSession(); void SetErrorCallback(ErrorCallback callback); - void UpdateHasError(); + void SendInstallKeyError(); private: struct DataForLicenseProcess { From 12052df370e2a265f31f5c9910b89af146462bdd Mon Sep 17 00:00:00 2001 From: "yying.jin" Date: Mon, 19 Jan 2026 10:20:33 +0800 Subject: [PATCH 3/6] add some logs --- packages/video_player_avplay/tizen/src/drm_manager.cc | 1 + packages/video_player_avplay/tizen/src/plus_player.cc | 3 +++ packages/video_player_avplay/tizen/src/video_player.cc | 2 ++ 3 files changed, 6 insertions(+) diff --git a/packages/video_player_avplay/tizen/src/drm_manager.cc b/packages/video_player_avplay/tizen/src/drm_manager.cc index d4493237c..c80e94c33 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.cc +++ b/packages/video_player_avplay/tizen/src/drm_manager.cc @@ -323,6 +323,7 @@ void DrmManager::RequestLicense(std::string &session_id, std::string &message) { session_id.c_str())), reinterpret_cast(response.data()), reinterpret_cast(response.size()))) { + LOG_INFO("*****************installKey error******************"); SendInstallKeyError(); } }, diff --git a/packages/video_player_avplay/tizen/src/plus_player.cc b/packages/video_player_avplay/tizen/src/plus_player.cc index 12cf86a78..9dde0b7ed 100644 --- a/packages/video_player_avplay/tizen/src/plus_player.cc +++ b/packages/video_player_avplay/tizen/src/plus_player.cc @@ -47,6 +47,7 @@ PlusPlayer::PlusPlayer(flutter::BinaryMessenger *messenger, } PlusPlayer::~PlusPlayer() { + LOG_INFO("**************~plusplayer start*******************"); if (player_) { Stop(player_); Close(player_); @@ -58,6 +59,7 @@ PlusPlayer::~PlusPlayer() { if (drm_manager_) { drm_manager_->ReleaseDrmSession(); } + LOG_INFO("**************~plusplayer end*******************"); } void PlusPlayer::RegisterListener() { @@ -1093,6 +1095,7 @@ bool PlusPlayer::OnLicenseAcquired(int *drm_handle, unsigned int length, } void PlusPlayer::OnPrepareDone(bool ret, void *user_data) { + LOG_INFO("**************prepare done*****************"); PlusPlayer *self = reinterpret_cast(user_data); if (!SetDisplayVisible(self->player_, true)) { diff --git a/packages/video_player_avplay/tizen/src/video_player.cc b/packages/video_player_avplay/tizen/src/video_player.cc index c64bb50a0..5a7c0b887 100644 --- a/packages/video_player_avplay/tizen/src/video_player.cc +++ b/packages/video_player_avplay/tizen/src/video_player.cc @@ -34,11 +34,13 @@ VideoPlayer::~VideoPlayer() { } void VideoPlayer::ClearUpEventChannel() { + LOG_INFO("************clearupeventchannel start*****************"); is_initialized_ = false; event_sink_ = nullptr; if (event_channel_) { event_channel_->SetStreamHandler(nullptr); } + LOG_INFO("************clearupeventchannel end*****************"); } int64_t VideoPlayer::SetUpEventChannel() { From 5df584dfc5d366a434aad1e6b7712237fdd9abf6 Mon Sep 17 00:00:00 2001 From: "yying.jin" Date: Tue, 27 Jan 2026 11:01:34 +0800 Subject: [PATCH 4/6] fix drm blocking issue --- .../tizen/src/drm_manager.cc | 29 +++++++++++++++++-- .../tizen/src/drm_manager.h | 1 + .../tizen/src/plus_player.cc | 11 +++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/video_player_avplay/tizen/src/drm_manager.cc b/packages/video_player_avplay/tizen/src/drm_manager.cc index c80e94c33..1e364c36e 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.cc +++ b/packages/video_player_avplay/tizen/src/drm_manager.cc @@ -86,7 +86,7 @@ bool DrmManager::SetChallenge(const std::string &media_url, return DM_ERROR_NONE == SetChallenge(media_url); } -void DrmManager::ReleaseDrmSession() { +void DrmManager::StopDrmSession() { if (drm_session_ == nullptr) { LOG_ERROR("[DrmManager] Already released."); return; @@ -109,8 +109,33 @@ void DrmManager::ReleaseDrmSession() { LOG_ERROR("[DrmManager] Fail to set finalize to drm session: %s", get_error_message(ret)); } +} + +void DrmManager::ReleaseDrmSession() { + if (drm_session_ == nullptr) { + LOG_ERROR("[DrmManager] Already released."); + return; + } - ret = DrmManagerProxy::GetInstance().DMGRReleaseDRMSession(drm_session_); + // SetDataParam_t challenge_data_param = {}; + // challenge_data_param.param1 = nullptr; + // challenge_data_param.param2 = nullptr; + // int ret = DrmManagerProxy::GetInstance().DMGRSetData( + // drm_session_, "eme_request_key_callback", &challenge_data_param); + // if (ret != DM_ERROR_NONE) { + // LOG_ERROR("[DrmManager] Fail to unset eme_request_key_callback: %s", + // get_error_message(ret)); + // } + + // ret = DrmManagerProxy::GetInstance().DMGRSetData(drm_session_, "Finalize", + // nullptr); + + // if (ret != DM_ERROR_NONE) { + // LOG_ERROR("[DrmManager] Fail to set finalize to drm session: %s", + // get_error_message(ret)); + // } + + int ret = DrmManagerProxy::GetInstance().DMGRReleaseDRMSession(drm_session_); if (ret != DM_ERROR_NONE) { LOG_ERROR("[DrmManager] Fail to release drm session: %s", get_error_message(ret)); diff --git a/packages/video_player_avplay/tizen/src/drm_manager.h b/packages/video_player_avplay/tizen/src/drm_manager.h index e52200abd..3eaa6534e 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.h +++ b/packages/video_player_avplay/tizen/src/drm_manager.h @@ -34,6 +34,7 @@ class DrmManager { bool SecurityInitCompleteCB(int *drm_handle, unsigned int len, unsigned char *pssh_data, void *user_data); int UpdatePsshData(const void *data, int length); + void StopDrmSession(); void ReleaseDrmSession(); void SetErrorCallback(ErrorCallback callback); void SendInstallKeyError(); diff --git a/packages/video_player_avplay/tizen/src/plus_player.cc b/packages/video_player_avplay/tizen/src/plus_player.cc index ecdab1cfe..61d9a1ec8 100644 --- a/packages/video_player_avplay/tizen/src/plus_player.cc +++ b/packages/video_player_avplay/tizen/src/plus_player.cc @@ -72,15 +72,26 @@ PlusPlayer::PlusPlayer(flutter::BinaryMessenger *messenger, PlusPlayer::~PlusPlayer() { LOG_INFO("**************~plusplayer start*******************"); if (player_) { + LOG_INFO("*****************0*******************"); + if (drm_manager_) { + drm_manager_->StopDrmSession(); + } + LOG_INFO("*****************1*******************"); Stop(player_); + LOG_INFO("*****************2*******************"); Close(player_); + LOG_INFO("*****************3*******************"); UnregisterListener(player_); + LOG_INFO("*****************4*******************"); DestroyPlayer(player_); + LOG_INFO("*****************5*******************"); player_ = nullptr; } if (drm_manager_) { + LOG_INFO("*****************6*******************"); drm_manager_->ReleaseDrmSession(); + LOG_INFO("*****************7*******************"); } LOG_INFO("**************~plusplayer end*******************"); } From e5c0ecf2a338fc61ff444abf21213491457e6294 Mon Sep 17 00:00:00 2001 From: "yying.jin" Date: Wed, 28 Jan 2026 10:18:12 +0800 Subject: [PATCH 5/6] remove unnecessary log --- .../tizen/src/drm_manager.cc | 19 ------------------- .../tizen/src/plus_player.cc | 18 +++++++----------- .../tizen/src/video_player.cc | 2 -- 3 files changed, 7 insertions(+), 32 deletions(-) diff --git a/packages/video_player_avplay/tizen/src/drm_manager.cc b/packages/video_player_avplay/tizen/src/drm_manager.cc index 1e364c36e..32ce0a7eb 100644 --- a/packages/video_player_avplay/tizen/src/drm_manager.cc +++ b/packages/video_player_avplay/tizen/src/drm_manager.cc @@ -117,24 +117,6 @@ void DrmManager::ReleaseDrmSession() { return; } - // SetDataParam_t challenge_data_param = {}; - // challenge_data_param.param1 = nullptr; - // challenge_data_param.param2 = nullptr; - // int ret = DrmManagerProxy::GetInstance().DMGRSetData( - // drm_session_, "eme_request_key_callback", &challenge_data_param); - // if (ret != DM_ERROR_NONE) { - // LOG_ERROR("[DrmManager] Fail to unset eme_request_key_callback: %s", - // get_error_message(ret)); - // } - - // ret = DrmManagerProxy::GetInstance().DMGRSetData(drm_session_, "Finalize", - // nullptr); - - // if (ret != DM_ERROR_NONE) { - // LOG_ERROR("[DrmManager] Fail to set finalize to drm session: %s", - // get_error_message(ret)); - // } - int ret = DrmManagerProxy::GetInstance().DMGRReleaseDRMSession(drm_session_); if (ret != DM_ERROR_NONE) { LOG_ERROR("[DrmManager] Fail to release drm session: %s", @@ -348,7 +330,6 @@ void DrmManager::RequestLicense(std::string &session_id, std::string &message) { session_id.c_str())), reinterpret_cast(response.data()), reinterpret_cast(response.size()))) { - LOG_INFO("*****************installKey error******************"); SendInstallKeyError(); } }, diff --git a/packages/video_player_avplay/tizen/src/plus_player.cc b/packages/video_player_avplay/tizen/src/plus_player.cc index 61d9a1ec8..652abddb7 100644 --- a/packages/video_player_avplay/tizen/src/plus_player.cc +++ b/packages/video_player_avplay/tizen/src/plus_player.cc @@ -70,30 +70,20 @@ PlusPlayer::PlusPlayer(flutter::BinaryMessenger *messenger, } PlusPlayer::~PlusPlayer() { - LOG_INFO("**************~plusplayer start*******************"); if (player_) { - LOG_INFO("*****************0*******************"); if (drm_manager_) { drm_manager_->StopDrmSession(); } - LOG_INFO("*****************1*******************"); Stop(player_); - LOG_INFO("*****************2*******************"); Close(player_); - LOG_INFO("*****************3*******************"); UnregisterListener(player_); - LOG_INFO("*****************4*******************"); DestroyPlayer(player_); - LOG_INFO("*****************5*******************"); player_ = nullptr; } if (drm_manager_) { - LOG_INFO("*****************6*******************"); drm_manager_->ReleaseDrmSession(); - LOG_INFO("*****************7*******************"); } - LOG_INFO("**************~plusplayer end*******************"); } void PlusPlayer::RegisterListener() { @@ -262,6 +252,9 @@ bool PlusPlayer::Activate() { bool PlusPlayer::Deactivate() { if (is_prebuffer_mode_) { + if (drm_manager_) { + drm_manager_->StopDrmSession(); + } Stop(player_); return true; } @@ -817,6 +810,10 @@ bool PlusPlayer::StopAndClose() { return true; } + if (drm_manager_) { + drm_manager_->StopDrmSession(); + } + if (!::Stop(player_)) { LOG_ERROR("[PlusPlayer] Player fail to stop."); return false; @@ -1129,7 +1126,6 @@ bool PlusPlayer::OnLicenseAcquired(int *drm_handle, unsigned int length, } void PlusPlayer::OnPrepareDone(bool ret, void *user_data) { - LOG_INFO("**************prepare done*****************"); PlusPlayer *self = reinterpret_cast(user_data); if (!SetDisplayVisible(self->player_, true)) { diff --git a/packages/video_player_avplay/tizen/src/video_player.cc b/packages/video_player_avplay/tizen/src/video_player.cc index 90ad92e83..da1ad5326 100644 --- a/packages/video_player_avplay/tizen/src/video_player.cc +++ b/packages/video_player_avplay/tizen/src/video_player.cc @@ -34,13 +34,11 @@ VideoPlayer::~VideoPlayer() { } void VideoPlayer::ClearUpEventChannel() { - LOG_INFO("************clearupeventchannel start*****************"); is_initialized_ = false; event_sink_ = nullptr; if (event_channel_) { event_channel_->SetStreamHandler(nullptr); } - LOG_INFO("************clearupeventchannel end*****************"); } int64_t VideoPlayer::SetUpEventChannel() { From 9fa2a2728b25bab439d39ce67ee43f2b031f5101 Mon Sep 17 00:00:00 2001 From: "yying.jin" Date: Wed, 28 Jan 2026 10:27:00 +0800 Subject: [PATCH 6/6] update version --- packages/video_player_avplay/CHANGELOG.md | 4 ++++ packages/video_player_avplay/README.md | 2 +- packages/video_player_avplay/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/video_player_avplay/CHANGELOG.md b/packages/video_player_avplay/CHANGELOG.md index c5af82f96..7d1567299 100644 --- a/packages/video_player_avplay/CHANGELOG.md +++ b/packages/video_player_avplay/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.1 + +* Update the error callback when DRM license acquisition fails. + ## 0.8.0 * Support parsing SMPE-TT subtitle attributes for DASH. diff --git a/packages/video_player_avplay/README.md b/packages/video_player_avplay/README.md index 072def95d..56f83c80b 100644 --- a/packages/video_player_avplay/README.md +++ b/packages/video_player_avplay/README.md @@ -12,7 +12,7 @@ To use this package, add `video_player_avplay` as a dependency in your `pubspec. ```yaml dependencies: - video_player_avplay: ^0.8.0 + video_player_avplay: ^0.8.1 ``` Then you can import `video_player_avplay` in your Dart code: diff --git a/packages/video_player_avplay/pubspec.yaml b/packages/video_player_avplay/pubspec.yaml index bac2c163b..db303ef61 100644 --- a/packages/video_player_avplay/pubspec.yaml +++ b/packages/video_player_avplay/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_avplay description: Flutter plugin for displaying inline video on Tizen TV devices. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/video_player_avplay -version: 0.8.0 +version: 0.8.1 environment: sdk: ">=3.1.0 <4.0.0"