Commit 9a8df283 authored by Guohui Deng's avatar Guohui Deng Committed by Commit Bot

Replace ApplicationSessionIdManager

ApplicationSessionIdManager must be extended to provide more
media related information associated with application. Therefore
replace it with ApplicationMediaInfoManager.

No behavior change.

Bug: internal b/110233576
Test: Manual cast and Internal CQ.

Change-Id: I0b8a37f000d55933f740ca737ca1f88f21db5cc4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1555355
Commit-Queue: Guohui Deng <guohuideng@chromium.org>
Reviewed-by: default avatarKenneth MacKay <kmackay@chromium.org>
Reviewed-by: default avatarLuke Halliwell <halliwell@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#650404}
parent 9bcb57bf
......@@ -9,29 +9,34 @@
namespace chromecast {
namespace media {
void CreateApplicationSessionIdManager(
void CreateApplicationMediaInfoManager(
content::RenderFrameHost* render_frame_host,
std::string application_session_id,
::media::mojom::ApplicationSessionIdManagerRequest request) {
// The created CastApplicationSessionIdManager will return
// the |application_session_id| that's passed in here.
// The object will be deleted on connection error, or when the frame navigates
// away. See FrameServiceBase for details.
new CastApplicationSessionIdManager(render_frame_host, std::move(request),
std::move(application_session_id));
bool mixer_audio_enabled,
::media::mojom::CastApplicationMediaInfoManagerRequest request) {
// The created ApplicationMediaInfoManager will be deleted on connection
// error, or when the frame navigates away. See FrameServiceBase for details.
new ApplicationMediaInfoManager(render_frame_host, std::move(request),
std::move(application_session_id),
mixer_audio_enabled);
}
CastApplicationSessionIdManager::CastApplicationSessionIdManager(
ApplicationMediaInfoManager::ApplicationMediaInfoManager(
content::RenderFrameHost* render_frame_host,
::media::mojom::ApplicationSessionIdManagerRequest request,
std::string application_session_id)
::media::mojom::CastApplicationMediaInfoManagerRequest request,
std::string application_session_id,
bool mixer_audio_enabled)
: FrameServiceBase(render_frame_host, std::move(request)),
application_session_id_(std::move(application_session_id)) {}
application_session_id_(std::move(application_session_id)),
mixer_audio_enabled_(mixer_audio_enabled) {}
ApplicationMediaInfoManager::~ApplicationMediaInfoManager() = default;
void CastApplicationSessionIdManager::GetApplicationSessionId(
GetApplicationSessionIdCallback callback) {
std::move(callback).Run(application_session_id_);
void ApplicationMediaInfoManager::GetCastApplicationMediaInfo(
GetCastApplicationMediaInfoCallback callback) {
std::move(callback).Run(::media::mojom::CastApplicationMediaInfo::New(
application_session_id_, mixer_audio_enabled_));
}
} // namespace media
} // namespace chromecast
\ No newline at end of file
} // namespace chromecast
......@@ -9,7 +9,7 @@
#include "base/macros.h"
#include "content/public/browser/frame_service_base.h"
#include "media/mojo/interfaces/application_session_id_manager.mojom.h"
#include "media/mojo/interfaces/cast_application_media_info_manager.mojom.h"
namespace content {
class RenderFrameHost;
......@@ -18,28 +18,33 @@ class RenderFrameHost;
namespace chromecast {
namespace media {
class CastApplicationSessionIdManager
class ApplicationMediaInfoManager
: public ::content::FrameServiceBase<
::media::mojom::ApplicationSessionIdManager> {
::media::mojom::CastApplicationMediaInfoManager> {
public:
CastApplicationSessionIdManager(
ApplicationMediaInfoManager(
content::RenderFrameHost* render_frame_host,
::media::mojom::ApplicationSessionIdManagerRequest request,
std::string application_session_id);
::media::mojom::CastApplicationMediaInfoManagerRequest request,
std::string application_session_id,
bool mixer_audio_enabled);
~ApplicationMediaInfoManager() override;
private:
// ::media::mojom::ApplicationSessionIdManager implementation.
void GetApplicationSessionId(GetApplicationSessionIdCallback callback) final;
// ::media::mojom::CastApplicationMediaInfoManager implementation:
void GetCastApplicationMediaInfo(
GetCastApplicationMediaInfoCallback callback) final;
const std::string application_session_id_;
bool mixer_audio_enabled_;
DISALLOW_COPY_AND_ASSIGN(CastApplicationSessionIdManager);
DISALLOW_COPY_AND_ASSIGN(ApplicationMediaInfoManager);
};
void CreateApplicationSessionIdManager(
void CreateApplicationMediaInfoManager(
content::RenderFrameHost* render_frame_host,
std::string application_session_id,
::media::mojom::ApplicationSessionIdManagerRequest request);
bool mixer_audio_enabled,
::media::mojom::CastApplicationMediaInfoManagerRequest request);
} // namespace media
} // namespace chromecast
......
......@@ -805,8 +805,8 @@ void CastContentBrowserClient::ExposeInterfacesToMediaService(
CastNavigationUIData::GetSessionIdForWebContents(
content::WebContents::FromRenderFrameHost(render_frame_host));
registry->AddInterface(base::BindRepeating(
&media::CreateApplicationSessionIdManager, render_frame_host,
std::move(application_session_id)));
&media::CreateApplicationMediaInfoManager, render_frame_host,
std::move(application_session_id), true));
}
void CastContentBrowserClient::HandleServiceRequest(
......
......@@ -99,63 +99,69 @@ void CastRenderer::Initialize(::media::MediaResource* media_resource,
const ::media::PipelineStatusCB& init_cb) {
LOG(INFO) << __FUNCTION__ << ": " << this;
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(!application_session_id_manager_ptr_);
DCHECK(!application_media_info_manager_ptr_);
// Retrieve application_session_id if it is available via
// ApplicationSessionIdManager.
// If a CastRenderer is created for a purpose other than a web application,
// the ApplicationSessionIdManager interface is not available, and application
// session ID will be an empty string.
// Retrieve application_media_info_manager_ptr_ if it is available via
// CastApplicationMediaInfoManager.
if (host_interfaces_) {
service_manager::GetInterface<::media::mojom::ApplicationSessionIdManager>(
host_interfaces_, &application_session_id_manager_ptr_);
service_manager::GetInterface<
::media::mojom::CastApplicationMediaInfoManager>(
host_interfaces_, &application_media_info_manager_ptr_);
}
if (application_session_id_manager_ptr_) {
application_session_id_manager_ptr_->GetApplicationSessionId(base::BindOnce(
&CastRenderer::OnApplicationSessionIdReceived,
weak_factory_.GetWeakPtr(), media_resource, client, init_cb));
if (application_media_info_manager_ptr_) {
application_media_info_manager_ptr_->GetCastApplicationMediaInfo(
base::BindOnce(&CastRenderer::OnApplicationMediaInfoReceived,
weak_factory_.GetWeakPtr(), media_resource, client,
init_cb));
} else {
OnApplicationSessionIdReceived(media_resource, client, init_cb,
std::string());
// If a CastRenderer is created for a purpose other than a web application,
// the CastApplicationMediaInfoManager interface is not available, and
// default CastApplicationMediaInfo value below will be used.
OnApplicationMediaInfoReceived(
media_resource, client, init_cb,
::media::mojom::CastApplicationMediaInfo::New(std::string(), true));
}
}
void CastRenderer::OnApplicationSessionIdReceived(
void CastRenderer::OnApplicationMediaInfoReceived(
::media::MediaResource* media_resource,
::media::RendererClient* client,
const ::media::PipelineStatusCB& init_cb,
const std::string& application_session_id) {
::media::mojom::CastApplicationMediaInfoPtr application_media_info) {
DCHECK(task_runner_->BelongsToCurrentThread());
if (application_session_id.empty()) {
OnGetMultiroomInfo(media_resource, client, init_cb, application_session_id,
if (application_media_info->application_session_id.empty()) {
OnGetMultiroomInfo(media_resource, client, init_cb,
std::move(application_media_info),
chromecast::mojom::MultiroomInfo::New());
return;
}
connector_->BindInterface(chromecast::mojom::kChromecastServiceName,
&multiroom_manager_);
multiroom_manager_.set_connection_error_handler(
base::BindOnce(&CastRenderer::OnGetMultiroomInfo, base::Unretained(this),
media_resource, client, init_cb, application_session_id,
chromecast::mojom::MultiroomInfo::New()));
multiroom_manager_.set_connection_error_handler(base::BindOnce(
&CastRenderer::OnGetMultiroomInfo, base::Unretained(this), media_resource,
client, init_cb, application_media_info.Clone(),
chromecast::mojom::MultiroomInfo::New()));
multiroom_manager_->GetMultiroomInfo(
application_session_id,
application_media_info->application_session_id,
base::BindOnce(&CastRenderer::OnGetMultiroomInfo, base::Unretained(this),
media_resource, client, init_cb, application_session_id));
media_resource, client, init_cb,
std::move(application_media_info)));
}
void CastRenderer::OnGetMultiroomInfo(
::media::MediaResource* media_resource,
::media::RendererClient* client,
const ::media::PipelineStatusCB& init_cb,
const std::string& application_session_id,
::media::mojom::CastApplicationMediaInfoPtr application_media_info,
chromecast::mojom::MultiroomInfoPtr multiroom_info) {
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(multiroom_info);
LOG(INFO) << __FUNCTION__ << ": " << this
<< " session_id=" << application_session_id
<< " session_id=" << application_media_info->application_session_id
<< ", mixer_audio_enabled="
<< application_media_info->mixer_audio_enabled
<< ", multiroom=" << multiroom_info->multiroom
<< ", audio_channel=" << multiroom_info->audio_channel;
// Close the MultiroomManager message pipe so that a connection error does not
......@@ -185,7 +191,7 @@ void CastRenderer::OnGetMultiroomInfo(
MediaPipelineDeviceParams params(sync_type, backend_task_runner_.get(),
content_type, audio_device_id_);
params.connector = connector_;
params.session_id = application_session_id;
params.session_id = application_media_info->application_session_id;
params.multiroom = multiroom_info->multiroom;
params.audio_channel = multiroom_info->audio_channel;
params.output_delay_us = multiroom_info->output_delay.InMicroseconds();
......
......@@ -15,7 +15,7 @@
#include "chromecast/media/cma/backend/cma_backend_factory.h"
#include "media/base/renderer.h"
#include "media/base/waiting.h"
#include "media/mojo/interfaces/application_session_id_manager.mojom.h"
#include "media/mojo/interfaces/cast_application_media_info_manager.mojom.h"
#include "ui/gfx/geometry/size.h"
namespace base {
......@@ -70,16 +70,17 @@ class CastRenderer : public ::media::Renderer,
private:
enum Stream { STREAM_AUDIO, STREAM_VIDEO };
void OnApplicationSessionIdReceived(
void OnApplicationMediaInfoReceived(
::media::MediaResource* media_resource,
::media::RendererClient* client,
const ::media::PipelineStatusCB& init_cb,
const std::string& application_session_id);
void OnGetMultiroomInfo(::media::MediaResource* media_resource,
::media::RendererClient* client,
const ::media::PipelineStatusCB& init_cb,
const std::string& session_id,
chromecast::mojom::MultiroomInfoPtr multiroom_info);
::media::mojom::CastApplicationMediaInfoPtr application_media_info);
void OnGetMultiroomInfo(
::media::MediaResource* media_resource,
::media::RendererClient* client,
const ::media::PipelineStatusCB& init_cb,
::media::mojom::CastApplicationMediaInfoPtr application_media_info,
chromecast::mojom::MultiroomInfoPtr multiroom_info);
void OnError(::media::PipelineStatus status);
void OnEnded(Stream stream);
void OnStatisticsUpdate(const ::media::PipelineStatistics& stats);
......@@ -111,8 +112,8 @@ class CastRenderer : public ::media::Renderer,
bool eos_[2];
gfx::Size video_res_;
::media::mojom::ApplicationSessionIdManagerPtr
application_session_id_manager_ptr_;
::media::mojom::CastApplicationMediaInfoManagerPtr
application_media_info_manager_ptr_;
chromecast::mojom::MultiroomManagerPtr multiroom_manager_;
base::WeakPtrFactory<CastRenderer> weak_factory_;
......
......@@ -4,10 +4,19 @@
module media.mojom;
struct CastApplicationMediaInfo {
// Used by multizone Playback.
// Can be empty string if WebContents isn't for a WebApplication.
string application_session_id;
// True if WebApplication has MIXER_AUDIO feature enabled.
// This value is set in Chromecast internal code.
bool mixer_audio_enabled;
};
// This is a service attached to RenderFrameHost.
// This is only used for Chromecast.
interface ApplicationSessionIdManager {
// Returns the |application_session_id| associated with the
// RenderFrameHost.
GetApplicationSessionId() => (string application_session_id);
};
\ No newline at end of file
interface CastApplicationMediaInfoManager {
// Returns the CastApplicationMediaInfo associated with the
// RenderFrameHost, i.e., the application.
GetCastApplicationMediaInfo() =>
(CastApplicationMediaInfo cast_application_media_info);
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment