Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: remoting/host/screen_recorder.cc

Issue 7563026: Fix crash in ScreenRecorder (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/host/screen_recorder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/screen_recorder.h" 5 #include "remoting/host/screen_recorder.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 29 matching lines...) Expand all
40 MessageLoop* network_loop, 40 MessageLoop* network_loop,
41 Capturer* capturer, 41 Capturer* capturer,
42 Encoder* encoder) 42 Encoder* encoder)
43 : capture_loop_(capture_loop), 43 : capture_loop_(capture_loop),
44 encode_loop_(encode_loop), 44 encode_loop_(encode_loop),
45 network_loop_(network_loop), 45 network_loop_(network_loop),
46 capturer_(capturer), 46 capturer_(capturer),
47 encoder_(encoder), 47 encoder_(encoder),
48 is_recording_(false), 48 is_recording_(false),
49 network_stopped_(false), 49 network_stopped_(false),
50 encoder_stopped_(false),
50 recordings_(0), 51 recordings_(0),
51 frame_skipped_(false), 52 frame_skipped_(false),
52 max_rate_(kDefaultCaptureRate), 53 max_rate_(kDefaultCaptureRate),
53 sequence_number_(0) { 54 sequence_number_(0) {
54 DCHECK(capture_loop_); 55 DCHECK(capture_loop_);
55 DCHECK(encode_loop_); 56 DCHECK(encode_loop_);
56 DCHECK(network_loop_); 57 DCHECK(network_loop_);
57 } 58 }
58 59
59 ScreenRecorder::~ScreenRecorder() { 60 ScreenRecorder::~ScreenRecorder() {
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 encode_start_time_ = base::Time::Now(); 381 encode_start_time_ = base::Time::Now();
381 encoder()->Encode( 382 encoder()->Encode(
382 capture_data, false, 383 capture_data, false,
383 NewCallback(this, &ScreenRecorder::EncodedDataAvailableCallback)); 384 NewCallback(this, &ScreenRecorder::EncodedDataAvailableCallback));
384 TraceContext::tracer()->PrintString("Encode Done"); 385 TraceContext::tracer()->PrintString("Encode Done");
385 } 386 }
386 387
387 void ScreenRecorder::DoStopOnEncodeThread(Task* done_task) { 388 void ScreenRecorder::DoStopOnEncodeThread(Task* done_task) {
388 DCHECK_EQ(encode_loop_, MessageLoop::current()); 389 DCHECK_EQ(encode_loop_, MessageLoop::current());
389 390
391 encoder_stopped_ = true;
392
390 // When this method is being executed there are no more tasks on encode thread 393 // When this method is being executed there are no more tasks on encode thread
391 // for this object. We can then post a task to capture thread to finish the 394 // for this object. We can then post a task to capture thread to finish the
392 // stop sequence. 395 // stop sequence.
393 if (done_task) 396 if (done_task)
394 capture_loop_->PostTask(FROM_HERE, done_task); 397 capture_loop_->PostTask(FROM_HERE, done_task);
395 } 398 }
396 399
397 void ScreenRecorder::EncodedDataAvailableCallback(VideoPacket* packet) { 400 void ScreenRecorder::EncodedDataAvailableCallback(VideoPacket* packet) {
398 DCHECK_EQ(encode_loop_, MessageLoop::current()); 401 DCHECK_EQ(encode_loop_, MessageLoop::current());
399 402
403 if (encoder_stopped_)
404 return;
405
400 bool last = (packet->flags() & VideoPacket::LAST_PACKET) != 0; 406 bool last = (packet->flags() & VideoPacket::LAST_PACKET) != 0;
401 if (last) { 407 if (last) {
402 int encode_time = static_cast<int>( 408 int encode_time = static_cast<int>(
403 (base::Time::Now() - encode_start_time_).InMilliseconds()); 409 (base::Time::Now() - encode_start_time_).InMilliseconds());
404 packet->set_encode_time_ms(encode_time); 410 packet->set_encode_time_ms(encode_time);
405 } 411 }
406 412
407 network_loop_->PostTask( 413 network_loop_->PostTask(
408 FROM_HERE, 414 FROM_HERE,
409 NewTracedMethod(this, &ScreenRecorder::DoSendVideoPacket, packet)); 415 NewTracedMethod(this, &ScreenRecorder::DoSendVideoPacket, packet));
410 } 416 }
411 417
412 } // namespace remoting 418 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/screen_recorder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698