Index: remoting/client/jni/jni_frame_consumer.cc |
diff --git a/remoting/client/jni/jni_frame_consumer.cc b/remoting/client/jni/jni_frame_consumer.cc |
index ee8ef947c8c175f251ec97185d1f4e575842a232..e1c23937eb4c775bceb47111f03025fa43b703e4 100644 |
--- a/remoting/client/jni/jni_frame_consumer.cc |
+++ b/remoting/client/jni/jni_frame_consumer.cc |
@@ -41,14 +41,15 @@ DirectDesktopFrame::~DirectDesktopFrame() {} |
namespace remoting { |
-JniFrameConsumer::JniFrameConsumer() |
- : provide_buffer_(true), |
- frame_producer_(NULL) { |
+JniFrameConsumer::JniFrameConsumer(ChromotingJni* jni_environment) |
+ : in_dtor_(false), |
+ frame_producer_(NULL), |
+ jni_environment_(jni_environment) { |
} |
JniFrameConsumer::~JniFrameConsumer() { |
// Stop giving the producer a buffer to work with. |
- provide_buffer_ = false; |
+ in_dtor_ = true; |
// Don't destroy the object until we've deleted the buffer. |
base::WaitableEvent done_event(true, false); |
@@ -65,10 +66,9 @@ void JniFrameConsumer::ApplyBuffer(const SkISize& view_size, |
const SkIRect& clip_area, |
webrtc::DesktopFrame* buffer, |
const SkRegion& region) { |
- DCHECK(ChromotingJni::GetInstance()-> |
- display_task_runner()->BelongsToCurrentThread()); |
+ DCHECK(jni_environment_->display_task_runner()->BelongsToCurrentThread()); |
- ChromotingJni::GetInstance()->RedrawCanvas(); |
+ jni_environment_->RedrawCanvas(); |
if (view_size.width() > view_size_.width() || |
view_size.height() > view_size_.height()) { |
@@ -79,21 +79,21 @@ void JniFrameConsumer::ApplyBuffer(const SkISize& view_size, |
} |
// Supply |frame_producer_| with a buffer to render the next frame into. |
- if (provide_buffer_) |
+ if (!in_dtor_) |
frame_producer_->DrawBuffer(buffer); |
+ else |
+ delete buffer; |
} |
void JniFrameConsumer::ReturnBuffer(webrtc::DesktopFrame* buffer) { |
- DCHECK(ChromotingJni::GetInstance()-> |
- display_task_runner()->BelongsToCurrentThread()); |
+ DCHECK(jni_environment_->display_task_runner()->BelongsToCurrentThread()); |
LOG(INFO) << "Returning image buffer"; |
delete buffer; |
} |
void JniFrameConsumer::SetSourceSize(const SkISize& source_size, |
const SkIPoint& dpi) { |
- DCHECK(ChromotingJni::GetInstance()-> |
- display_task_runner()->BelongsToCurrentThread()); |
+ DCHECK(jni_environment_->display_task_runner()->BelongsToCurrentThread()); |
// We currently render the desktop 1:1 and perform pan/zoom scaling |
// and cropping on the managed canvas. |
@@ -108,10 +108,9 @@ void JniFrameConsumer::SetSourceSize(const SkISize& source_size, |
void JniFrameConsumer::AllocateBuffer() { |
// Only do anything if we're not being destructed. |
- if (provide_buffer_) { |
- if (!ChromotingJni::GetInstance()-> |
- display_task_runner()->BelongsToCurrentThread()) { |
- ChromotingJni::GetInstance()->display_task_runner()->PostTask(FROM_HERE, |
+ if (!in_dtor_) { |
+ if (!jni_environment_->display_task_runner()->BelongsToCurrentThread()) { |
+ jni_environment_->display_task_runner()->PostTask(FROM_HERE, |
base::Bind(&JniFrameConsumer::AllocateBuffer, |
base::Unretained(this))); |
return; |
@@ -121,10 +120,9 @@ void JniFrameConsumer::AllocateBuffer() { |
view_size_.height()); |
// Update Java's reference to the buffer and record of its dimensions. |
- ChromotingJni::GetInstance()->UpdateImageBuffer( |
- view_size_.width(), |
- view_size_.height(), |
- buffer->buffer()); |
+ jni_environment_->UpdateImageBuffer(view_size_.width(), |
+ view_size_.height(), |
+ buffer->buffer()); |
frame_producer_->DrawBuffer(buffer); |
} |