From this patch, we will manage player code.
player requests codec type before prepare.
If HW codec is not being used in that time, HW codec will be assigned.
If HW codec is being used in that time, SW codec will be assigned.
(HW codec priority is higher that SW codec.)
Player returns codec type after unprepare.
Ref: https://review.tizen.org/gerrit/c/247510
Change-Id: Iace2eace6d19371d66e368083e8e1e318193a8c9
Signed-off-by: K.Y. Lee <k-y.lee@samsung.com>
}
#endif // defined(ENABLE_AUTO_ZOOM)
+#if defined(OS_TIZEN_DA_PRODUCT)
+media::PlayerCodecType BrowserMediaPlayerManagerEfl::RequestAvailableCodecType(int player_id) {
+ return media_capability_manager_.RequestAvailableCodecType(player_id);
+}
+
+void BrowserMediaPlayerManagerEfl::UnregisterPlayerCodec(int player_id) {
+ return media_capability_manager_.UnregisterPlayerCodec(player_id);
+}
+
+bool BrowserMediaPlayerManagerEfl::HasPlayingVideoPlayers() {
+ return media_capability_manager_.HasPlayingVideoPlayers();
+}
+#endif
} // namespace content
void UpdateZOrder() override;
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ media::PlayerCodecType RequestAvailableCodecType(int player_id) override;
+ void UnregisterPlayerCodec(int player_id) override;
+ bool HasPlayingVideoPlayers(void) override;
+#endif
+
// Helper function to handle IPC from RenderMediaPlayerMangaerEfl.
void OnPlay(RenderFrameHost* render_frame_host, int player_id);
void OnPause(RenderFrameHost* render_frame_host,
// when hiding
return was_not_awaiting;
}
+
+#if defined(OS_TIZEN_DA_PRODUCT)
+PlayerCodecType MediaCapabilityManagerBase::RequestAvailableCodecType(int player_id) {
+ LOG(INFO) << __func__ <<"[" << player_id << "]";
+ for (std::pair<int, PlayerCodecType> it : player_codec_map_) {
+ if (it.second == PlayerCodecType::HW_CODEC) {
+ //Allocating SW codec , as HW can only use one video.
+ player_codec_map_[player_id] = PlayerCodecType::SW_CODEC;
+ LOG(INFO) << "player [" << player_id << "] acquired [SW] codec";
+ return PlayerCodecType::SW_CODEC;
+ }
+ }
+ LOG(INFO) << "player [" << player_id << "] acquired [HW] codec";
+ player_codec_map_[player_id] = PlayerCodecType::HW_CODEC;
+ return PlayerCodecType::HW_CODEC;
+}
+
+void MediaCapabilityManagerBase::UnregisterPlayerCodec(int player_id) {
+ LOG(INFO) << __func__ <<"[" << player_id << "]";
+ //std::string codec = player_codec_map_[player_id];
+ LOG(INFO) << "player [" << player_id << "] has ["
+ << (player_codec_map_[player_id] == PlayerCodecType::HW_CODEC ? "HW" : "SW")
+ << "] codec. release it";
+ player_codec_map_.erase(player_id);
+}
+
+bool MediaCapabilityManagerBase::HasPlayingVideoPlayers() const {
+ for (auto it = players_.begin(); it != players_.end(); ++it) {
+ LOG(INFO) << "player_id : " << it->first->GetPlayerId();
+ LOG(INFO) << "ispaused : " << it->first->IsPaused();
+ if (it->first->GetMediaType() & MediaType::Video) {
+ if (!(it->first->IsPaused()) && !(it->first->IsPlayerSuspended()) ) {
+ LOG(INFO) << "There is a playing video player. So, Keep waking display lock.";
+ return true;
+ }
+ }
+ }
+ LOG(INFO) << "There is no playing video players. So, Release display lock.";
+ return false;
+}
+#endif
} // namespace media
return FindSlots<type>{}(slots_).result;
}
+#if defined(OS_TIZEN_DA_PRODUCT)
+ PlayerCodecType RequestAvailableCodecType(int player_id);
+ void UnregisterPlayerCodec(int player_id);
+ bool HasPlayingVideoPlayers() const;
+#endif
+
protected:
using PlayerList =
std::unordered_map<MediaPlayerInterfaceEfl*, platform::PlayerInfo>;
-
platform::SlotsType slots_;
PlayerList players_;
+#if defined(OS_TIZEN_DA_PRODUCT)
+ std::unordered_map<int, PlayerCodecType> player_codec_map_;
+#endif
+
bool RunPlayer(const platform::DescriptorType& descr,
MediaPlayerInterfaceEfl* player);
// Gets number of players that have all |flags| set.
unsigned PlayersCount(State flags);
+#if defined(OS_TIZEN_DA_PRODUCT)
+ PlayerCodecType RequestAvailableCodecType(int player_id);
+ void UnregisterPlayerCodec(int player_id);
+ bool HasPlayingVideoPlayers();
+#endif
+
private:
// Will make one step along the
// BARRED -VISIBLE-> PREEMPTED -ACTIVE-> RUNNINIG
});
}
+#if defined(OS_TIZEN_DA_PRODUCT)
+template <typename ConflictStrategy>
+PlayerCodecType MediaCapabilityManager<ConflictStrategy>::RequestAvailableCodecType(int player_id) {
+ return MediaCapabilityManagerBase::RequestAvailableCodecType(player_id);
+}
+
+template <typename ConflictStrategy>
+void MediaCapabilityManager<ConflictStrategy>::UnregisterPlayerCodec(int player_id) {
+ return MediaCapabilityManagerBase::UnregisterPlayerCodec(player_id);
+}
+
+template <typename ConflictStrategy>
+bool MediaCapabilityManager<ConflictStrategy>::HasPlayingVideoPlayers() {
+ return MediaCapabilityManagerBase::HasPlayingVideoPlayers();
+}
+#endif
+
} // namespace media
#endif // MEDIA_BASE_TIZEN_MEDIA_CAPABILITY_MANAGER_IMPL_H_
} else {
NotifyPlaybackState(blink::WebMediaPlayer::kPlaybackReady, GetPlayerId());
SetDisplayAtPausedState();
+#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if (RequestAvailableCodecType(GetPlayerId()) == PlayerCodecType::HW_CODEC) {
+ // this is first player. use (DEFAULT)HW codec.
+ ret = player_set_video_codec_type_ex(player_, PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT);
+ } else {
+ // this is second player. use SW codec.
+ ret = player_set_video_codec_type_ex(player_, PLAYER_VIDEO_CODEC_TYPE_EX_SW);
+ }
+ if (ret != PLAYER_ERROR_NONE)
+ RunCompleteCB(false, FROM_HERE);
#endif
ret = player_prepare_async(player_, PlayerPreparedCb, this);
#if defined(OS_TIZEN_TV_PRODUCT)
LOG_ID(INFO, GetPlayerId()) << "Release, this: " << this;
player_prepared_ = false;
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if (IsAllVideoPlayersStopped()) {
+ ReleaseDisplayLock();
+ }
+#endif
#if defined(OS_TIZEN_TV_PRODUCT)
if (player_released_) {
LOG_ID(INFO, GetPlayerId()) << "player is already released";
player_unprepare(player_) != PLAYER_ERROR_NONE)
#endif
LOG_ID(ERROR, GetPlayerId()) << "|player_unprepare| failed";
+#if defined(OS_TIZEN_DA_PRODUCT)
+ else
+ UnregisterPlayerCodec(GetPlayerId());
+#endif
#if !defined(OS_TIZEN_TV_PRODUCT)
player_destroy(player_);
<< "Pause,this:" << this
<< ",is_media_related_action : " << is_media_related_action
<< ",current_time:" << GetCurrentTime().InSecondsF();
+
if (is_resuming_ || is_seeking_ || !player_prepared_) {
PushDelayedPlayerState(PLAYER_STATE_DELAYED_PAUSE);
return;
if (!is_file_url_)
StartBufferingUpdateTimer();
+#if defined(OS_TIZEN_DA_PRODUCT)
+ is_paused_ = true;
+ if (IsAllVideoPlayersStopped())
+#else
if (GetMediaType() & MediaType::Video)
+#endif
ReleaseDisplayLock();
StopCurrentTimeUpdateTimer();
+#if !defined(OS_TIZEN_DA_PRODUCT)
is_paused_ = true;
+#endif
}
void MediaPlayerBridgeCapi::SetRate(double rate) {
mixer_player_active_audio_ = player_;
}
#endif
+
+#if defined(OS_TIZEN_DA_PRODUCT)
+PlayerCodecType MediaPlayerBridgeCapi::RequestAvailableCodecType(int player_id) {
+ return manager()->RequestAvailableCodecType(player_id);
+}
+
+void MediaPlayerBridgeCapi::UnregisterPlayerCodec(int player_id) {
+ manager()->UnregisterPlayerCodec(player_id);
+}
+#endif
+
} // namespace media
#include "media/base/video_frame.h"
#include "third_party/blink/public/platform/web_media_player.h"
+#if defined(OS_TIZEN_DA_PRODUCT)
+#include "media/base/tizen/media_capabilities.h"
+#endif
+
#if defined(TIZEN_VIDEO_HOLE)
#include "ui/gfx/geometry/rect_f.h"
#endif
#endif
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ PlayerCodecType RequestAvailableCodecType(int player_id);
+ void UnregisterPlayerCodec(int player_id);
+#endif
+
protected:
void Release() override;
void Prepare(CompleteCB cb);
state = blink::WebMediaPlayer::kNetworkStateNetworkError;
break;
}
-
manager()->OnNetworkStateChange(GetPlayerId(), state, err_info.second);
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if(IsAllVideoPlayersStopped())
+#endif
ReleaseDisplayLock();
}
}
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+bool MediaPlayerEfl::IsAllVideoPlayersStopped() const {
+ if (!(manager_->HasPlayingVideoPlayers())) {
+ return true;
+ } else {
+ return false;
+ }
+}
+#endif
} // namespace media
#endif
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ bool IsAllVideoPlayersStopped() const;
+#endif
+
protected:
explicit MediaPlayerEfl(int player_id,
MediaPlayerManager* manager,
#include "media/base/tizen/media_player_efl.h"
#include "third_party/blink/public/platform/web_media_player.h"
+#if defined(OS_TIZEN_DA_PRODUCT)
+#include "media/base/tizen/media_capabilities.h"
+#endif
+
#if defined(OS_TIZEN_TV_PRODUCT)
#include "content/browser/media/tizen/hardware_resource_helper.h"
#endif
#endif
virtual content::WebContents* GetWebContents(int player_id) = 0;
virtual void OnPlayerSuspendRequest(int player_id) = 0;
+#if defined(OS_TIZEN_DA_PRODUCT)
+ virtual PlayerCodecType RequestAvailableCodecType(int player_id) = 0;
+ virtual void UnregisterPlayerCodec(int player_id) = 0;
+ virtual bool HasPlayingVideoPlayers(void) = 0;
+#endif
};
-
} // namespace media
#endif // MEDIA_BASE_TIZEN_MEDIA_PLAYER_MANAGER_EFL_H_
is_paused_ = false;
paused_by_buffering_logic_ = false;
should_seek_after_resume_ = true;
-
+#if !defined(OS_TIZEN_DA_PRODUCT)
if (HasVideoMediaType())
WakeUpDisplayAndAcquireDisplayLock();
-
+#endif
StartCurrentTimeUpdateTimer();
}
}
LOG(INFO) << "seek time : " << seek_offset_
<< " state : " << GetString(GetPlayerState());
#if defined(OS_TIZEN_DA_PRODUCT)
- if (GetPlayerState() == PLAYER_STATE_PAUSED)
+ if (((GetPlayerState() == PLAYER_STATE_PAUSED)
+ || (GetPlayerState() == PLAYER_STATE_READY))
+ && IsAllVideoPlayersStopped()) {
ReleaseDisplayLock();
+ }
#endif
if (GetPlayerState() < PLAYER_STATE_READY || !player_prepared_) {
// Will be handled once prepare is complete.
return;
StopCurrentTimeUpdateTimer();
- if (!is_media_related_action && HasVideoMediaType()) {
- ReleaseDisplayLock();
+ if (!is_media_related_action) {
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if (IsAllVideoPlayersStopped()) {
+#else
+ if (HasVideoMediaType()) {
+#endif
+ ReleaseDisplayLock();
+ }
}
}
void MediaSourcePlayerCapi::Release() {
LOG(INFO) << "Release,this:" << (void*)this;
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if (IsAllVideoPlayersStopped()) {
+ ReleaseDisplayLock();
+ }
+#endif
#if !defined(OS_TIZEN_TV_PRODUCT)
is_paused_ = true;
#endif
// Multiple PLAY/PAUSE requests can be triggered during rapid seek.
// Reset delayed state handler to avoid moving CAPI player to an
// invalid state.
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if ((GetPlayerState() == PLAYER_STATE_PAUSED)
+ && IsAllVideoPlayersStopped())
+ ReleaseDisplayLock();
+#endif
return false;
}
// We need to destroy the player if we want to abort player_prepare
player_new_state_ = PLAYER_STATE_NONE;
player_unprepare(player_);
+#if defined(OS_TIZEN_DA_PRODUCT)
+ UnregisterPlayerCodec(GetPlayerId());
+#endif
return true;
}
HandlePlayerError(error, FROM_HERE);
return false;
}
+#if defined(OS_TIZEN_DA_PRODUCT)
+ UnregisterPlayerCodec(GetPlayerId());
+#endif
}
player_prepared_ = false;
break;
if (GetPlayerState() == PLAYER_STATE_IDLE) {
#if defined(OS_TIZEN_TV_PRODUCT)
NotifyPlaybackState(blink::WebMediaPlayer::kPlaybackReady);
+#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if (RequestAvailableCodecType(GetPlayerId()) == PlayerCodecType::HW_CODEC) {
+ // this is first player. use DEFAULT(HW) codec.
+ error = player_set_video_codec_type_ex(player_, PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT);
+ } else {
+ // this is second player. use SW codec.
+ error = player_set_video_codec_type_ex(player_, PLAYER_VIDEO_CODEC_TYPE_EX_SW);
+ }
+ if (error != PLAYER_ERROR_NONE) {
+ HandlePlayerError(error, FROM_HERE);
+ return false;
+ }
#endif
if (!SetPlayerExtraInitParams())
return false;
HandlePlayerError(error, FROM_HERE);
return false;
}
+#if defined(OS_TIZEN_DA_PRODUCT)
+ if (HasVideoMediaType())
+ WakeUpDisplayAndAcquireDisplayLock();
+#endif
#if defined(OS_TIZEN_TV_PRODUCT)
NotifyPlaybackState(blink::WebMediaPlayer::kPlaybackStart);
#endif
}
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+PlayerCodecType MediaSourcePlayerCapi::RequestAvailableCodecType(int player_id) {
+ return manager()->RequestAvailableCodecType(player_id);
+}
+
+void MediaSourcePlayerCapi::UnregisterPlayerCodec(int player_id) {
+ manager()->UnregisterPlayerCodec(player_id);
+}
+#endif
+
} // namespace media
#include "media/filters/source_buffer_stream.h"
#include "third_party/blink/public/platform/web_media_player.h"
+#if defined(OS_TIZEN_DA_PRODUCT)
+#include "media/base/tizen/media_capabilities.h"
+#endif
+
#if defined(TIZEN_VIDEO_HOLE)
namespace gfx {
class RectF;
base::Optional<PlayerStates> ReturnPlayerState() override;
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ PlayerCodecType RequestAvailableCodecType(int player_id);
+ void UnregisterPlayerCodec(int player_id);
+#endif
+
protected:
void Release() override;
void OnMediaError(std::pair<MediaError, std::string> error_info) override;
manager_->AcquireKey(player_id);
}
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+PlayerCodecType SuspendingMediaPlayer::RequestAvailableCodecType(int player_id) {
+ return manager_->RequestAvailableCodecType(player_id);
+}
+
+void SuspendingMediaPlayer::UnregisterPlayerCodec(int player_id) {
+ manager_->UnregisterPlayerCodec(player_id);
+}
+
+bool SuspendingMediaPlayer::HasPlayingVideoPlayers() {
+ return manager_->HasPlayingVideoPlayers();
+}
+#endif
MediaTypeFlags SuspendingMediaPlayer::GetMediaType() const {
return player_->GetMediaType();
void OnFocusReleased(bool resume_playing) override;
#endif
+#if defined(OS_TIZEN_DA_PRODUCT)
+ PlayerCodecType RequestAvailableCodecType(int player_id) override;
+ void UnregisterPlayerCodec(int player_id) override;
+ bool HasPlayingVideoPlayers(void) override;
+#endif
+
#if defined(TIZEN_EXTERNAL_MEDIA_EVENT)
void ReleaseKey(int player_id) override;
void AcquireKey(int player_id) override;