diff options
author | halliwell <halliwell@chromium.org> | 2015-07-14 10:59:29 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-14 18:00:01 +0000 |
commit | 28a8654b432d0debeee9982dc2d69099e647fcf1 (patch) | |
tree | 706c3c0fe876d69c5284039b1846fff76172d8e8 /chromecast | |
parent | df391ba1d19134bb0a6e895a4a33f1af4932545d (diff) | |
download | chromium_src-28a8654b432d0debeee9982dc2d69099e647fcf1.zip chromium_src-28a8654b432d0debeee9982dc2d69099e647fcf1.tar.gz chromium_src-28a8654b432d0debeee9982dc2d69099e647fcf1.tar.bz2 |
Fix VideoFrame creation crash on Cast audio devices
On audio-only devices, there are no GpuVideoAcceleratorFactories, but
we must still create VideoFrames for the media pipeline.
BUG=internal b/22413529
Review URL: https://codereview.chromium.org/1237623005
Cr-Commit-Position: refs/heads/master@{#338714}
Diffstat (limited to 'chromecast')
-rw-r--r-- | chromecast/media/cma/filters/hole_frame_factory.cc | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/chromecast/media/cma/filters/hole_frame_factory.cc b/chromecast/media/cma/filters/hole_frame_factory.cc index 54923cc..5cca26a 100644 --- a/chromecast/media/cma/filters/hole_frame_factory.cc +++ b/chromecast/media/cma/filters/hole_frame_factory.cc @@ -25,7 +25,7 @@ HoleFrameFactory::HoleFrameFactory( use_legacy_hole_punching_( base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableLegacyHolePunching)) { - if (!use_legacy_hole_punching_) { + if (gpu_factories_ && !use_legacy_hole_punching_) { gpu::gles2::GLES2Interface* gl = gpu_factories_->GetGLES2Interface(); CHECK(gl); @@ -43,7 +43,7 @@ HoleFrameFactory::HoleFrameFactory( } HoleFrameFactory::~HoleFrameFactory() { - if (texture_ != 0) { + if (texture_) { gpu::gles2::GLES2Interface* gl = gpu_factories_->GetGLES2Interface(); gl->BindTexture(GL_TEXTURE_2D, texture_); gl->ReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id_); @@ -61,18 +61,23 @@ scoped_refptr<::media::VideoFrame> HoleFrameFactory::CreateHoleFrame( NOTREACHED(); } - scoped_refptr<::media::VideoFrame> frame = - ::media::VideoFrame::WrapNativeTexture( - ::media::PIXEL_FORMAT_XRGB, - gpu::MailboxHolder(mailbox_, GL_TEXTURE_2D, sync_point_), - ::media::VideoFrame::ReleaseMailboxCB(), - size, // coded_size - gfx::Rect(size), // visible rect - size, // natural size - base::TimeDelta()); // timestamp - frame->metadata()->SetBoolean(::media::VideoFrameMetadata::ALLOW_OVERLAY, - true); - return frame; + if (texture_) { + scoped_refptr<::media::VideoFrame> frame = + ::media::VideoFrame::WrapNativeTexture( + ::media::PIXEL_FORMAT_XRGB, + gpu::MailboxHolder(mailbox_, GL_TEXTURE_2D, sync_point_), + ::media::VideoFrame::ReleaseMailboxCB(), + size, // coded_size + gfx::Rect(size), // visible rect + size, // natural size + base::TimeDelta()); // timestamp + frame->metadata()->SetBoolean(::media::VideoFrameMetadata::ALLOW_OVERLAY, + true); + return frame; + } else { + // This case is needed for audio-only devices. + return ::media::VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); + } } } // namespace media |