summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authordalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-06 00:38:32 +0000
committerdalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-06 00:38:32 +0000
commit38af455b42c098bab243b4a71895e1b07809256d (patch)
tree68b479506d21d9ad0955a06e828c2418e4ba6116 /media
parentdaa9e38f3afbc3f048a47c4239f6e75a53fe7be3 (diff)
downloadchromium_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.h5
-rw-r--r--media/filters/reference_audio_renderer.cc15
-rw-r--r--media/filters/reference_audio_renderer.h5
-rw-r--r--media/tools/player_x11/gl_video_renderer.h10
-rw-r--r--media/tools/player_x11/player_x11.cc14
-rw-r--r--media/tools/player_x11/x11_video_renderer.h10
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);