forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert of Revert of Chromecast: Play audio streams not supported by C…
…MA via default renderer (patchset chromium#1 id:1 of https://codereview.chromium.org/981473003/) Reason for revert: Hmmm... My revert did not fix the test, so I'm undoing it. :/ Original issue's description: > Revert of Chromecast: Play audio streams not supported by CMA via default renderer (patchset chromium#5 id:70001 of https://codereview.chromium.org/973633002/) > > Reason for revert: > Audio tests started failing consistently in the next build after this was checked in. See: > https://build.chromium.org/p/chromium.mac/builders/Mac10.9%20Tests/builds/3762 > > Not sure if this CL is the culprit, but seems the most likely one, so attempting a revert to see if it fixes the problem. > > Error: > [ RUN ] AudioRecorderTest.BasicRecordAndStop > ../../components/audio_modem/audio_recorder_unittest.cc:203: Failure > Value of: IsRecording() > Actual: false > Expected: true > ../../components/audio_modem/audio_recorder_unittest.cc:208: Failure > Value of: IsRecording() > Actual: false > Expected: true > ../../components/audio_modem/audio_recorder_unittest.cc:213: Failure > Value of: IsRecording() > Actual: false > Expected: true > [ FAILED ] AudioRecorderTest.BasicRecordAndStop (1292 ms) > > Original issue's description: > > Chromecast: Play audio streams not supported by CMA via default renderer > > > > For Chromecast we want to choose which media renderer to use based on > > the types of input content streams. We will use CMA media renderer for > > media types that are supported by our hardware (H264, AAC, etc) and > > will use the default media renderer for audio streams other than AAC > > or Vorbis. This will allow us support software decoding of FLAC and > > Opus via the default Chrome audio path. > > > > BUG=457959 > > > > Committed: https://crrev.com/2e583073b996e66d62f709dd2ffde9e1ef58b276 > > Cr-Commit-Position: refs/heads/master@{#318941} > > TBR=gunsch@chromium.org,lcwu@chromium.org,dalecurtis@chromium.org,servolk@chromium.org > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=457959 > > Committed: https://crrev.com/ee687fd9c6c2bc41642cd8b65de87fe548a3cf75 > Cr-Commit-Position: refs/heads/master@{#319033} TBR=gunsch@chromium.org,lcwu@chromium.org,dalecurtis@chromium.org,servolk@chromium.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=457959 Review URL: https://codereview.chromium.org/967933003 Cr-Commit-Position: refs/heads/master@{#319046}
- Loading branch information
1 parent
7626cca
commit e67565c
Showing
10 changed files
with
292 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
// Copyright 2015 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "chromecast/media/base/switching_media_renderer.h" | ||
|
||
#include "base/logging.h" | ||
#include "media/base/audio_decoder_config.h" | ||
#include "media/base/demuxer_stream.h" | ||
#include "media/base/demuxer_stream_provider.h" | ||
|
||
namespace chromecast { | ||
namespace media { | ||
|
||
SwitchingMediaRenderer::SwitchingMediaRenderer( | ||
scoped_ptr<::media::Renderer> default_renderer, | ||
scoped_ptr<::media::Renderer> cma_renderer) | ||
: default_renderer_(default_renderer.Pass()), | ||
cma_renderer_(cma_renderer.Pass()) { | ||
DCHECK(default_renderer_); | ||
DCHECK(cma_renderer_); | ||
} | ||
|
||
SwitchingMediaRenderer::~SwitchingMediaRenderer() { | ||
} | ||
|
||
void SwitchingMediaRenderer::Initialize( | ||
::media::DemuxerStreamProvider* demuxer_stream_provider, | ||
const base::Closure& init_cb, | ||
const ::media::StatisticsCB& statistics_cb, | ||
const ::media::BufferingStateCB& buffering_state_cb, | ||
const ::media::Renderer::PaintCB& paint_cb, | ||
const base::Closure& ended_cb, | ||
const ::media::PipelineStatusCB& error_cb) { | ||
// At this point the DemuxerStreamProvider should be fully initialized, so we | ||
// have enough information to decide which renderer to use. | ||
demuxer_stream_provider_ = demuxer_stream_provider; | ||
DCHECK(demuxer_stream_provider_); | ||
::media::DemuxerStream* audio_stream = | ||
demuxer_stream_provider_->GetStream(::media::DemuxerStream::AUDIO); | ||
::media::DemuxerStream* video_stream = | ||
demuxer_stream_provider_->GetStream(::media::DemuxerStream::VIDEO); | ||
if (audio_stream && !video_stream && | ||
audio_stream->audio_decoder_config().codec() != ::media::kCodecAAC && | ||
audio_stream->audio_decoder_config().codec() != ::media::kCodecVorbis) { | ||
// We'll use the default Chrome media renderer with software audio decoding | ||
cma_renderer_.reset(); | ||
} else { | ||
// We'll use the CMA-based rendering with hardware decoding | ||
default_renderer_.reset(); | ||
} | ||
|
||
return GetRenderer()->Initialize(demuxer_stream_provider, | ||
init_cb, statistics_cb, buffering_state_cb, | ||
paint_cb, ended_cb, error_cb); | ||
} | ||
|
||
::media::Renderer* SwitchingMediaRenderer::GetRenderer() const { | ||
DCHECK(default_renderer_ || cma_renderer_); | ||
if (cma_renderer_) | ||
return cma_renderer_.get(); | ||
|
||
DCHECK(default_renderer_); | ||
return default_renderer_.get(); | ||
} | ||
|
||
void SwitchingMediaRenderer::SetCdm( | ||
::media::CdmContext* cdm_context, | ||
const ::media::CdmAttachedCB& cdm_attached_cb) { | ||
GetRenderer()->SetCdm(cdm_context, cdm_attached_cb); | ||
} | ||
|
||
void SwitchingMediaRenderer::Flush(const base::Closure& flush_cb) { | ||
GetRenderer()->Flush(flush_cb); | ||
} | ||
|
||
void SwitchingMediaRenderer::StartPlayingFrom(base::TimeDelta time) { | ||
GetRenderer()->StartPlayingFrom(time); | ||
} | ||
|
||
void SwitchingMediaRenderer::SetPlaybackRate(float playback_rate) { | ||
GetRenderer()->SetPlaybackRate(playback_rate); | ||
} | ||
|
||
void SwitchingMediaRenderer::SetVolume(float volume) { | ||
GetRenderer()->SetVolume(volume); | ||
} | ||
|
||
base::TimeDelta SwitchingMediaRenderer::GetMediaTime() { | ||
return GetRenderer()->GetMediaTime(); | ||
} | ||
|
||
bool SwitchingMediaRenderer::HasAudio() { | ||
return GetRenderer()->HasAudio(); | ||
} | ||
|
||
bool SwitchingMediaRenderer::HasVideo() { | ||
return GetRenderer()->HasVideo(); | ||
} | ||
|
||
} // namespace media | ||
} // namespace chromecast |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright 2015 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef CHROMECAST_MEDIA_BASE_SWITCHING_MEDIA_RENDERER_H_ | ||
#define CHROMECAST_MEDIA_BASE_SWITCHING_MEDIA_RENDERER_H_ | ||
|
||
#include "base/macros.h" | ||
#include "base/memory/scoped_ptr.h" | ||
#include "media/base/renderer.h" | ||
|
||
namespace media { | ||
class DemuxerStreamProvider; | ||
} | ||
|
||
namespace chromecast { | ||
namespace media { | ||
|
||
// Chromecast's custom media renderer which is capable of selecting an | ||
// appropriate media renderer at runtime depending on the content. | ||
// We'll look at media types of media streams present in DemuxerStreamProvider | ||
// and will use either CMA-based renderer (for media types that are supported by | ||
// our hardware decoder - H264 and VP8 video, AAC and Vorbis audio) or the | ||
// default Chrome media renderer (this will allow us to support audio codecs | ||
// like FLAC and Opus, which are decoded in software). | ||
class SwitchingMediaRenderer : public ::media::Renderer { | ||
public: | ||
SwitchingMediaRenderer( | ||
scoped_ptr<::media::Renderer> default_renderer, | ||
scoped_ptr<::media::Renderer> cma_renderer); | ||
~SwitchingMediaRenderer() override; | ||
|
||
// ::media::Renderer implementation: | ||
void Initialize( | ||
::media::DemuxerStreamProvider* demuxer_stream_provider, | ||
const base::Closure& init_cb, | ||
const ::media::StatisticsCB& statistics_cb, | ||
const ::media::BufferingStateCB& buffering_state_cb, | ||
const ::media::Renderer::PaintCB& paint_cb, | ||
const base::Closure& ended_cb, | ||
const ::media::PipelineStatusCB& error_cb) override; | ||
void SetCdm(::media::CdmContext* cdm_context, | ||
const ::media::CdmAttachedCB& cdm_attached_cb) override; | ||
void Flush(const base::Closure& flush_cb) override; | ||
void StartPlayingFrom(base::TimeDelta time) override; | ||
void SetPlaybackRate(float playback_rate) override; | ||
void SetVolume(float volume) override; | ||
base::TimeDelta GetMediaTime() override; | ||
bool HasAudio() override; | ||
bool HasVideo() override; | ||
|
||
private: | ||
// Returns the pointer to the actual renderer being used | ||
::media::Renderer* GetRenderer() const; | ||
|
||
::media::DemuxerStreamProvider* demuxer_stream_provider_; | ||
scoped_ptr<::media::Renderer> default_renderer_; | ||
scoped_ptr<::media::Renderer> cma_renderer_; | ||
|
||
DISALLOW_COPY_AND_ASSIGN(SwitchingMediaRenderer); | ||
}; | ||
|
||
} // namespace media | ||
} // namespace chromecast | ||
|
||
#endif // CHROMECAST_MEDIA_BASE_SWITCHING_MEDIA_RENDERER_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
73 changes: 73 additions & 0 deletions
73
chromecast/renderer/media/chromecast_media_renderer_factory.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
// Copyright 2015 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "chromecast/renderer/media/chromecast_media_renderer_factory.h" | ||
|
||
#include "base/command_line.h" | ||
#include "chromecast/media/base/switching_media_renderer.h" | ||
#include "chromecast/media/cma/filters/cma_renderer.h" | ||
#include "chromecast/renderer/media/media_pipeline_proxy.h" | ||
#include "content/public/renderer/render_thread.h" | ||
#include "media/base/audio_hardware_config.h" | ||
#include "media/base/media_log.h" | ||
#include "media/renderers/default_renderer_factory.h" | ||
|
||
namespace chromecast { | ||
namespace media { | ||
|
||
ChromecastMediaRendererFactory::ChromecastMediaRendererFactory( | ||
const scoped_refptr<::media::MediaLog>& media_log, | ||
int render_frame_id) | ||
: render_frame_id_(render_frame_id), | ||
media_log_(media_log) { | ||
} | ||
|
||
ChromecastMediaRendererFactory::~ChromecastMediaRendererFactory() { | ||
} | ||
|
||
scoped_ptr<::media::Renderer> ChromecastMediaRendererFactory::CreateRenderer( | ||
const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | ||
::media::AudioRendererSink* audio_renderer_sink) { | ||
if (!default_render_factory_) { | ||
// Chromecast doesn't have input audio devices, so leave this uninitialized | ||
::media::AudioParameters input_audio_params; | ||
// TODO(servolk): Audio parameters are hardcoded for now, but in the future | ||
// either we need to obtain AudioHardwareConfig from RenderThreadImpl, | ||
// or media renderer needs to figure out optimal audio parameters itself. | ||
const int kDefaultSamplingRate = 48000; | ||
const int kDefaultBitsPerSample = 16; | ||
// About 20ms of stereo (2 channels) 16bit (2 byte) audio | ||
int buffer_size = kDefaultSamplingRate * 20 * 2 * 2 / 1000; | ||
::media::AudioParameters output_audio_params( | ||
::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | ||
::media::CHANNEL_LAYOUT_STEREO, | ||
kDefaultSamplingRate, kDefaultBitsPerSample, | ||
buffer_size, ::media::AudioParameters::NO_EFFECTS); | ||
::media::AudioHardwareConfig audio_config(input_audio_params, | ||
output_audio_params); | ||
|
||
default_render_factory_.reset(new ::media::DefaultRendererFactory( | ||
media_log_, /*gpu_factories*/ nullptr, audio_config)); | ||
} | ||
|
||
DCHECK(default_render_factory_); | ||
// TODO(erickung): crbug.com/443956. Need to provide right LoadType. | ||
LoadType cma_load_type = kLoadTypeMediaSource; | ||
scoped_ptr<MediaPipeline> cma_media_pipeline( | ||
new MediaPipelineProxy( | ||
render_frame_id_, | ||
content::RenderThread::Get()->GetIOMessageLoopProxy(), | ||
cma_load_type)); | ||
scoped_ptr<CmaRenderer> cma_renderer( | ||
new CmaRenderer(cma_media_pipeline.Pass())); | ||
scoped_ptr<::media::Renderer> default_media_render( | ||
default_render_factory_->CreateRenderer(media_task_runner, | ||
audio_renderer_sink)); | ||
scoped_ptr<SwitchingMediaRenderer> media_renderer(new SwitchingMediaRenderer( | ||
default_media_render.Pass(), cma_renderer.Pass())); | ||
return media_renderer.Pass(); | ||
} | ||
|
||
} // namespace media | ||
} // namespace chromecast |
43 changes: 43 additions & 0 deletions
43
chromecast/renderer/media/chromecast_media_renderer_factory.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// Copyright 2015 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef CHROMECAST_RENDERER_MEDIA_CHROMECAST_MEDIA_RENDERER_FACTORY_H_ | ||
#define CHROMECAST_RENDERER_MEDIA_CHROMECAST_MEDIA_RENDERER_FACTORY_H_ | ||
|
||
#include "base/macros.h" | ||
#include "base/memory/ref_counted.h" | ||
#include "media/base/renderer_factory.h" | ||
|
||
namespace media { | ||
class MediaLog; | ||
class DefaultRendererFactory; | ||
} | ||
|
||
namespace chromecast { | ||
namespace media { | ||
|
||
class ChromecastMediaRendererFactory : public ::media::RendererFactory { | ||
public: | ||
ChromecastMediaRendererFactory( | ||
const scoped_refptr<::media::MediaLog>& media_log, | ||
int render_frame_id); | ||
~ChromecastMediaRendererFactory() final; | ||
|
||
// ::media::RendererFactory implementation. | ||
scoped_ptr<::media::Renderer> CreateRenderer( | ||
const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | ||
::media::AudioRendererSink* audio_renderer_sink) final; | ||
|
||
private: | ||
int render_frame_id_; | ||
scoped_refptr<::media::MediaLog> media_log_; | ||
scoped_ptr<::media::DefaultRendererFactory> default_render_factory_; | ||
|
||
DISALLOW_COPY_AND_ASSIGN(ChromecastMediaRendererFactory); | ||
}; | ||
|
||
} // namespace media | ||
} // namespace chromecast | ||
|
||
#endif // CHROMECAST_RENDERER_MEDIA_CHROMECAST_MEDIA_RENDERER_FACTORY_H_ |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.