0

Chromecast: use multiple video configs in CMA

- The CL also remove space in front of ::media namespace.

BUG= internal b/18865809

Review URL: https://codereview.chromium.org/1148253006

Cr-Commit-Position: refs/heads/master@{#333225}
This commit is contained in:
erickung
2015-06-06 20:42:54 -07:00
committed by Commit bot
parent 44a0941b33
commit f4e0b8865f
20 changed files with 64 additions and 43 deletions

@ -536,7 +536,8 @@ void CmaMessageFilterHost::AudioInitialize(
}
void CmaMessageFilterHost::VideoInitialize(
int media_id, TrackId track_id, const ::media::VideoDecoderConfig& config) {
int media_id, TrackId track_id,
const std::vector<::media::VideoDecoderConfig>& configs) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
MediaPipelineHost* media_pipeline = LookupById(media_id);
if (!media_pipeline) {
@ -566,7 +567,7 @@ void CmaMessageFilterHost::VideoInitialize(
FROM_HERE,
base::Bind(&MediaPipelineHost::VideoInitialize,
base::Unretained(media_pipeline),
track_id, client, config, pipeline_status_cb));
track_id, client, configs, pipeline_status_cb));
}
void CmaMessageFilterHost::StartPlayingFrom(

@ -74,9 +74,10 @@ class CmaMessageFilterHost
void AudioInitialize(int media_id,
TrackId track_id,
const ::media::AudioDecoderConfig& config);
void VideoInitialize(int media_id,
TrackId track_id,
const ::media::VideoDecoderConfig& config);
void VideoInitialize(
int media_id,
TrackId track_id,
const std::vector<::media::VideoDecoderConfig>& configs);
void StartPlayingFrom(int media_id, base::TimeDelta time);
void Flush(int media_id);
void Stop(int media_id);

@ -118,13 +118,13 @@ void MediaPipelineHost::AudioInitialize(
void MediaPipelineHost::VideoInitialize(
TrackId track_id,
const VideoPipelineClient& client,
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
const ::media::PipelineStatusCB& status_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
CHECK(track_id == kVideoTrackId);
media_pipeline_->GetVideoPipeline()->SetClient(client);
media_pipeline_->InitializeVideo(
config, scoped_ptr<CodedFrameProvider>(), status_cb);
configs, scoped_ptr<CodedFrameProvider>(), status_cb);
}
void MediaPipelineHost::StartPlayingFrom(base::TimeDelta time) {

@ -56,7 +56,7 @@ class MediaPipelineHost {
const ::media::PipelineStatusCB& status_cb);
void VideoInitialize(TrackId track_id,
const VideoPipelineClient& client,
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
const ::media::PipelineStatusCB& status_cb);
void StartPlayingFrom(base::TimeDelta time);
void Flush(const ::media::PipelineStatusCB& status_cb);

@ -50,11 +50,12 @@ IPC_MESSAGE_CONTROL3(CmaHostMsg_CreateAvPipe,
IPC_MESSAGE_CONTROL3(CmaHostMsg_AudioInitialize,
int /* Media pipeline ID */,
chromecast::media::TrackId /* Track ID */,
media::AudioDecoderConfig /* Audio config */)
::media::AudioDecoderConfig /* Audio config */)
IPC_MESSAGE_CONTROL3(CmaHostMsg_VideoInitialize,
int /* Media pipeline ID */,
chromecast::media::TrackId /* Track ID */,
media::VideoDecoderConfig /* Video config */)
/* Video Config */
std::vector<::media::VideoDecoderConfig>)
IPC_MESSAGE_CONTROL3(CmaHostMsg_SetVolume,
int /* Media pipeline ID */,
chromecast::media::TrackId /* Track ID */,
@ -112,4 +113,4 @@ IPC_MESSAGE_CONTROL3(CmaMsg_PlaybackStatistics,
IPC_MESSAGE_CONTROL3(CmaMsg_NaturalSizeChanged,
int /* Media pipeline ID */,
chromecast::media::TrackId /* Track ID */,
gfx::Size /* Size */)
gfx::Size /* Size */)

@ -114,7 +114,7 @@ void BufferingFrameProvider::RequestBufferIfNeeded() {
return;
is_pending_request_ = true;
coded_frame_provider_->Read(BindToCurrentLoop(
coded_frame_provider_->Read(::media::BindToCurrentLoop(
base::Bind(&BufferingFrameProvider::OnNewBuffer, weak_this_)));
}

@ -323,8 +323,10 @@ void CmaRenderer::InitializeVideoPipeline() {
initial_natural_size_ = config.natural_size();
has_video_ = true;
std::vector<::media::VideoDecoderConfig> configs;
configs.push_back(config);
media_pipeline_->InitializeVideo(
config,
configs,
frame_provider.Pass(),
video_initialization_done_cb);
}

@ -114,7 +114,7 @@ void DemuxerStreamAdapter::RequestBuffer(const ReadCB& read_cb) {
void DemuxerStreamAdapter::OnNewBuffer(
const ReadCB& read_cb,
::media::DemuxerStream::Status status,
const scoped_refptr< ::media::DecoderBuffer>& input) {
const scoped_refptr<::media::DecoderBuffer>& input) {
DCHECK(thread_checker_.CalledOnValidThread());
is_pending_demuxer_read_ = false;

@ -93,7 +93,7 @@ void DummyDemuxerStream::Read(const ReadCB& read_cb) {
config_idx_.pop_front();
has_pending_read_ = false;
read_cb.Run(kConfigChanged,
scoped_refptr< ::media::DecoderBuffer>());
scoped_refptr<::media::DecoderBuffer>());
return;
}
@ -141,7 +141,7 @@ bool DummyDemuxerStream::SupportsConfigChanges() {
void DummyDemuxerStream::DoRead(const ReadCB& read_cb) {
has_pending_read_ = false;
scoped_refptr< ::media::DecoderBuffer> buffer(
scoped_refptr<::media::DecoderBuffer> buffer(
new ::media::DecoderBuffer(16));
buffer->set_timestamp(frame_count_ * base::TimeDelta::FromMilliseconds(40));
frame_count_++;

@ -109,6 +109,7 @@ void AudioPipelineImpl::Initialize(
if (frame_provider)
SetCodedFrameProvider(frame_provider.Pass());
DCHECK(audio_config.IsValidConfig());
if (!audio_device_->SetConfig(
DecoderConfigAdapter::ToCastAudioConfig(kPrimary, audio_config)) ||
!av_pipeline_impl_->Initialize()) {

@ -91,14 +91,15 @@ void AudioVideoPipelineImplTest::Initialize(
::media::CHANNEL_LAYOUT_STEREO,
44100,
NULL, 0, false);
::media::VideoDecoderConfig video_config(
std::vector<::media::VideoDecoderConfig> video_configs;
video_configs.push_back(::media::VideoDecoderConfig(
::media::kCodecH264,
::media::H264PROFILE_MAIN,
::media::VideoFrame::I420,
gfx::Size(640, 480),
gfx::Rect(0, 0, 640, 480),
gfx::Size(640, 480),
NULL, 0, false);
NULL, 0, false));
// Frame generation on the producer side.
std::vector<FrameGeneratorForTest::FrameSpec> frame_specs;
@ -135,7 +136,7 @@ void AudioVideoPipelineImplTest::Initialize(
next_task) :
base::Bind(&MediaPipeline::InitializeVideo,
base::Unretained(media_pipeline_.get()),
video_config,
video_configs,
base::Passed(&frame_provider_base),
next_task);

@ -47,7 +47,7 @@ class MediaPipeline {
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) = 0;
virtual void InitializeVideo(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) = 0;

@ -144,7 +144,7 @@ void MediaPipelineImpl::InitializeAudio(
}
void MediaPipelineImpl::InitializeVideo(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
@ -155,7 +155,7 @@ void MediaPipelineImpl::InitializeVideo(
return;
}
has_video_ = true;
video_pipeline_->Initialize(config, frame_provider.Pass(), status_cb);
video_pipeline_->Initialize(configs, frame_provider.Pass(), status_cb);
}
void MediaPipelineImpl::StartPlayingFrom(base::TimeDelta time) {

@ -45,7 +45,7 @@ class MediaPipelineImpl : public MediaPipeline {
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) override;
void InitializeVideo(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) override;
void StartPlayingFrom(base::TimeDelta time) override;
@ -83,7 +83,7 @@ class MediaPipelineImpl : public MediaPipeline {
bool has_video_;
scoped_ptr<AudioPipelineImpl> audio_pipeline_;
scoped_ptr<VideoPipelineImpl> video_pipeline_;
scoped_ptr< ::media::SerialRunner> pending_callbacks_;
scoped_ptr<::media::SerialRunner> pending_callbacks_;
// Playback rate set by the upper layer.
float target_playback_rate_;

@ -101,11 +101,10 @@ void VideoPipelineImpl::SetClient(const VideoPipelineClient& client) {
}
void VideoPipelineImpl::Initialize(
const ::media::VideoDecoderConfig& video_config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) {
CMALOG(kLogControl) << "VideoPipelineImpl::Initialize "
<< video_config.AsHumanReadableString();
CMALOG(kLogControl) << __FUNCTION__ << " config (" << configs.size() << ")";
VideoPipelineDevice::VideoClient client;
client.natural_size_changed_cb =
base::Bind(&VideoPipelineImpl::OnNaturalSizeChanged, weak_this_);
@ -113,8 +112,23 @@ void VideoPipelineImpl::Initialize(
if (frame_provider)
SetCodedFrameProvider(frame_provider.Pass());
if (!video_device_->SetConfig(
DecoderConfigAdapter::ToCastVideoConfig(kPrimary, video_config)) ||
if (configs.empty()) {
status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
return;
}
DCHECK(configs.size() <= 2);
DCHECK(configs[0].IsValidConfig());
VideoConfig video_config =
DecoderConfigAdapter::ToCastVideoConfig(kPrimary, configs[0]);
VideoConfig secondary_config;
if (configs.size() == 2) {
DCHECK(configs[1].IsValidConfig());
secondary_config = DecoderConfigAdapter::ToCastVideoConfig(kSecondary,
configs[1]);
video_config.additional_config = &secondary_config;
}
if (!video_device_->SetConfig(video_config) ||
!av_pipeline_impl_->Initialize()) {
status_cb.Run(::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
return;

@ -44,7 +44,7 @@ class VideoPipelineImpl : public VideoPipeline {
// Functions to control the state of the audio pipeline.
void Initialize(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb);
bool StartPlayingFrom(base::TimeDelta time,

@ -214,12 +214,12 @@ void MediaPipelineProxy::InitializeAudio(
}
void MediaPipelineProxy::InitializeVideo(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
has_video_ = true;
video_pipeline_->Initialize(config, frame_provider.Pass(), status_cb);
video_pipeline_->Initialize(configs, frame_provider.Pass(), status_cb);
}
void MediaPipelineProxy::StartPlayingFrom(base::TimeDelta time) {

@ -43,7 +43,7 @@ class MediaPipelineProxy : public MediaPipeline {
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) override;
void InitializeVideo(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) override;
void StartPlayingFrom(base::TimeDelta time) override;
@ -70,7 +70,7 @@ class MediaPipelineProxy : public MediaPipeline {
bool has_video_;
scoped_ptr<AudioPipelineProxy> audio_pipeline_;
scoped_ptr<VideoPipelineProxy> video_pipeline_;
scoped_ptr< ::media::SerialRunner> pending_callbacks_;
scoped_ptr<::media::SerialRunner> pending_callbacks_;
base::WeakPtr<MediaPipelineProxy> weak_this_;
base::WeakPtrFactory<MediaPipelineProxy> weak_factory_;

@ -56,7 +56,7 @@ class VideoPipelineProxyInternal {
void SetClient(const base::Closure& pipe_read_cb,
const VideoPipelineClient& client);
void CreateAvPipe(const SharedMemCB& shared_mem_cb);
void Initialize(const ::media::VideoDecoderConfig& config,
void Initialize(const std::vector<::media::VideoDecoderConfig>& configs,
const ::media::PipelineStatusCB& status_cb);
private:
@ -166,12 +166,12 @@ void VideoPipelineProxyInternal::OnAvPipeCreated(
}
void VideoPipelineProxyInternal::Initialize(
const ::media::VideoDecoderConfig& arg1,
const std::vector<::media::VideoDecoderConfig>& configs,
const ::media::PipelineStatusCB& status_cb) {
DCHECK(thread_checker_.CalledOnValidThread());
bool success = media_channel_proxy_->Send(scoped_ptr<IPC::Message>(
new CmaHostMsg_VideoInitialize(media_channel_proxy_->GetId(),
kVideoTrackId, arg1)));
kVideoTrackId, configs)));
if (!success) {
status_cb.Run( ::media::PIPELINE_ERROR_INITIALIZATION_FAILED);
return;
@ -223,7 +223,7 @@ void VideoPipelineProxy::SetClient(
}
void VideoPipelineProxy::Initialize(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb) {
CMALOG(kLogControl) << "VideoPipelineProxy::Initialize";
@ -233,12 +233,12 @@ void VideoPipelineProxy::Initialize(
VideoPipelineProxyInternal::SharedMemCB shared_mem_cb =
::media::BindToCurrentLoop(base::Bind(
&VideoPipelineProxy::OnAvPipeCreated, weak_this_,
config, status_cb));
configs, status_cb));
FORWARD_ON_IO_THREAD(CreateAvPipe, shared_mem_cb);
}
void VideoPipelineProxy::OnAvPipeCreated(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
const ::media::PipelineStatusCB& status_cb,
scoped_ptr<base::SharedMemory> shared_memory) {
CMALOG(kLogControl) << "VideoPipelineProxy::OnAvPipeCreated";
@ -260,7 +260,7 @@ void VideoPipelineProxy::OnAvPipeCreated(
video_streamer_->SetMediaMessageFifo(video_pipe.Pass());
// Now proceed to the decoder/renderer initialization.
FORWARD_ON_IO_THREAD(Initialize, config, status_cb);
FORWARD_ON_IO_THREAD(Initialize, configs, status_cb);
}
void VideoPipelineProxy::StartFeeding() {

@ -36,7 +36,7 @@ class VideoPipelineProxy : public VideoPipeline {
scoped_refptr<MediaChannelProxy> media_channel_proxy);
~VideoPipelineProxy() override;
void Initialize(const ::media::VideoDecoderConfig& config,
void Initialize(const std::vector<::media::VideoDecoderConfig>& configs,
scoped_ptr<CodedFrameProvider> frame_provider,
const ::media::PipelineStatusCB& status_cb);
void StartFeeding();
@ -50,7 +50,7 @@ class VideoPipelineProxy : public VideoPipeline {
base::ThreadChecker thread_checker_;
void OnAvPipeCreated(
const ::media::VideoDecoderConfig& config,
const std::vector<::media::VideoDecoderConfig>& configs,
const ::media::PipelineStatusCB& status_cb,
scoped_ptr<base::SharedMemory> shared_memory);
void OnPipeWrite();