diff options
author | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-06 00:38:32 +0000 |
---|---|---|
committer | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-06 00:38:32 +0000 |
commit | 38af455b42c098bab243b4a71895e1b07809256d (patch) | |
tree | 68b479506d21d9ad0955a06e828c2418e4ba6116 /media | |
parent | daa9e38f3afbc3f048a47c4239f6e75a53fe7be3 (diff) | |
download | chromium_src-38af455b42c098bab243b4a71895e1b07809256d.zip chromium_src-38af455b42c098bab243b4a71895e1b07809256d.tar.gz chromium_src-38af455b42c098bab243b4a71895e1b07809256d.tar.bz2 |
Fix invalid use of Base::Bind(,this) in ~ReferenceAudioRender.
Also converts ~AudioOutputController to be protected and fixes an exit crash in player_x11.
BUG=107864
TEST=Ran player_x11 --audio.
Review URL: http://codereview.chromium.org/9111003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@116599 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/audio/audio_output_controller.h | 5 | ||||
-rw-r--r-- | media/filters/reference_audio_renderer.cc | 15 | ||||
-rw-r--r-- | media/filters/reference_audio_renderer.h | 5 | ||||
-rw-r--r-- | media/tools/player_x11/gl_video_renderer.h | 10 | ||||
-rw-r--r-- | media/tools/player_x11/player_x11.cc | 14 | ||||
-rw-r--r-- | media/tools/player_x11/x11_video_renderer.h | 10 |
6 files changed, 34 insertions, 25 deletions
diff --git a/media/audio/audio_output_controller.h b/media/audio/audio_output_controller.h index 274b5d3..24de175 100644 --- a/media/audio/audio_output_controller.h +++ b/media/audio/audio_output_controller.h @@ -123,8 +123,6 @@ class MEDIA_EXPORT AudioOutputController virtual bool DataReady() = 0; }; - virtual ~AudioOutputController(); - // Factory method for creating an AudioOutputController. // If successful, an audio controller thread is created. The audio device // will be created on the audio controller thread and when that is done @@ -198,6 +196,9 @@ class MEDIA_EXPORT AudioOutputController kError, }; + friend class base::RefCountedThreadSafe<AudioOutputController>; + virtual ~AudioOutputController(); + private: // We are polling sync reader if data became available. static const int kPollNumAttempts; diff --git a/media/filters/reference_audio_renderer.cc b/media/filters/reference_audio_renderer.cc index 9aa38eb..3c80ccb 100644 --- a/media/filters/reference_audio_renderer.cc +++ b/media/filters/reference_audio_renderer.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -7,6 +7,7 @@ #include <math.h> #include "base/bind.h" +#include "base/synchronization/waitable_event.h" namespace media { @@ -19,8 +20,12 @@ ReferenceAudioRenderer::ReferenceAudioRenderer(AudioManager* audio_manager) ReferenceAudioRenderer::~ReferenceAudioRenderer() { // Close down the audio device. - if (controller_) - controller_->Close(base::Bind(&ReferenceAudioRenderer::OnClose, this)); + if (controller_) { + base::WaitableEvent closed_event(true, false); + controller_->Close(base::Bind(&base::WaitableEvent::Signal, + base::Unretained(&closed_event))); + closed_event.Wait(); + } } void ReferenceAudioRenderer::SetPlaybackRate(float rate) { @@ -93,8 +98,4 @@ void ReferenceAudioRenderer::OnStop() { controller_->Pause(); } -void ReferenceAudioRenderer::OnClose() { - NOTIMPLEMENTED(); -} - } // namespace media diff --git a/media/filters/reference_audio_renderer.h b/media/filters/reference_audio_renderer.h index 409e3850..273aa0d 100644 --- a/media/filters/reference_audio_renderer.h +++ b/media/filters/reference_audio_renderer.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -51,9 +51,6 @@ class MEDIA_EXPORT ReferenceAudioRenderer virtual void OnStop() OVERRIDE; private: - // AudioOutputController::Close callback. - virtual void OnClose(); - scoped_refptr<AudioManager> audio_manager_; int bytes_per_second_; diff --git a/media/tools/player_x11/gl_video_renderer.h b/media/tools/player_x11/gl_video_renderer.h index 2ecdc0b..7403e6a 100644 --- a/media/tools/player_x11/gl_video_renderer.h +++ b/media/tools/player_x11/gl_video_renderer.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -6,6 +6,7 @@ #define MEDIA_TOOLS_PLAYER_X11_GL_VIDEO_RENDERER_H_ #include "base/basictypes.h" +#include "base/memory/ref_counted.h" #include "ui/gfx/gl/gl_bindings.h" class MessageLoop; @@ -14,13 +15,16 @@ namespace media { class VideoFrame; } -class GlVideoRenderer { +class GlVideoRenderer : public base::RefCountedThreadSafe<GlVideoRenderer> { public: GlVideoRenderer(Display* display, Window window); - ~GlVideoRenderer(); void Paint(media::VideoFrame* video_frame); + protected: + friend class base::RefCountedThreadSafe<GlVideoRenderer>; + ~GlVideoRenderer(); + private: // Initializes GL rendering for the given dimensions. void Initialize(int width, int height); diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc index 3c1fa51..ee4d9ab 100644 --- a/media/tools/player_x11/player_x11.cc +++ b/media/tools/player_x11/player_x11.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -271,16 +271,13 @@ int main(int argc, char** argv) { thread.reset(new base::Thread("PipelineThread")); thread->Start(); - // Create both our renderers but only bind the one we plan on using. - X11VideoRenderer x11_renderer(g_display, g_window); - GlVideoRenderer gl_renderer(g_display, g_window); PaintCB paint_cb; if (use_gl) { paint_cb = base::Bind( - &GlVideoRenderer::Paint, base::Unretained(&gl_renderer)); + &GlVideoRenderer::Paint, new GlVideoRenderer(g_display, g_window)); } else { paint_cb = base::Bind( - &X11VideoRenderer::Paint, base::Unretained(&x11_renderer)); + &X11VideoRenderer::Paint, new X11VideoRenderer(g_display, g_window)); } if (InitPipeline(thread->message_loop(), filename.c_str(), @@ -303,6 +300,11 @@ int main(int argc, char** argv) { message_loop_factory.reset(); thread->Stop(); + + // Release callback which releases video renderer. Do this before cleaning up + // X below since the video renderer has some X cleanup duties as well. + paint_cb.Reset(); + XDestroyWindow(g_display, g_window); XCloseDisplay(g_display); g_audio_manager = NULL; diff --git a/media/tools/player_x11/x11_video_renderer.h b/media/tools/player_x11/x11_video_renderer.h index 1ce5b62..b91c565 100644 --- a/media/tools/player_x11/x11_video_renderer.h +++ b/media/tools/player_x11/x11_video_renderer.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -8,6 +8,7 @@ #include <X11/Xlib.h> #include "base/basictypes.h" +#include "base/memory/ref_counted.h" class MessageLoop; @@ -15,13 +16,16 @@ namespace media { class VideoFrame; } -class X11VideoRenderer { +class X11VideoRenderer : public base::RefCountedThreadSafe<X11VideoRenderer> { public: X11VideoRenderer(Display* display, Window window); - ~X11VideoRenderer(); void Paint(media::VideoFrame* video_frame); + protected: + friend class base::RefCountedThreadSafe<X11VideoRenderer>; + ~X11VideoRenderer(); + private: // Initializes X11 rendering for the given dimensions. void Initialize(int width, int height); |