| Index: remoting/client/rectangle_update_decoder.cc
|
| diff --git a/remoting/client/rectangle_update_decoder.cc b/remoting/client/rectangle_update_decoder.cc
|
| index c7a14046c39cc057ea4d29ce37484e9dac189c1f..3a7fddce2d46777cc41813a2540da95798023352 100644
|
| --- a/remoting/client/rectangle_update_decoder.cc
|
| +++ b/remoting/client/rectangle_update_decoder.cc
|
| @@ -6,9 +6,10 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| +#include "base/callback.h"
|
| #include "base/location.h"
|
| #include "base/logging.h"
|
| -#include "base/message_loop_proxy.h"
|
| +#include "base/single_thread_task_runner.h"
|
| #include "ppapi/cpp/image_data.h"
|
| #include "remoting/base/util.h"
|
| #include "remoting/codec/video_decoder.h"
|
| @@ -23,16 +24,6 @@ using remoting::protocol::SessionConfig;
|
|
|
| namespace remoting {
|
|
|
| -RectangleUpdateDecoder::QueuedVideoPacket::QueuedVideoPacket(
|
| - scoped_ptr<VideoPacket> packet,
|
| - const base::Closure& done)
|
| - : packet(packet.release()),
|
| - done(done) {
|
| -}
|
| -
|
| -RectangleUpdateDecoder::QueuedVideoPacket::~QueuedVideoPacket() {
|
| -}
|
| -
|
| RectangleUpdateDecoder::RectangleUpdateDecoder(
|
| scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner,
|
| @@ -45,7 +36,6 @@ RectangleUpdateDecoder::RectangleUpdateDecoder(
|
| view_size_(SkISize::Make(0, 0)),
|
| clip_area_(SkIRect::MakeEmpty()),
|
| paint_scheduled_(false),
|
| - packet_being_processed_(false),
|
| latest_sequence_number_(0) {
|
| }
|
|
|
| @@ -71,6 +61,7 @@ void RectangleUpdateDecoder::DecodePacket(scoped_ptr<VideoPacket> packet,
|
| DCHECK(decode_task_runner_->BelongsToCurrentThread());
|
|
|
| base::ScopedClosureRunner done_runner(done);
|
| +
|
| bool decoder_needs_reset = false;
|
| bool notify_size_or_dpi_change = false;
|
|
|
| @@ -262,61 +253,28 @@ void RectangleUpdateDecoder::ProcessVideoPacket(scoped_ptr<VideoPacket> packet,
|
| stats_.round_trip_ms()->Record(round_trip_latency.InMilliseconds());
|
| }
|
|
|
| - received_packets_.push_back(QueuedVideoPacket(packet.Pass(), done));
|
| - if (!packet_being_processed_)
|
| - ProcessNextPacket();
|
| -}
|
| -
|
| -int RectangleUpdateDecoder::GetPendingVideoPackets() {
|
| - DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| - return received_packets_.size();
|
| -}
|
| -
|
| -void RectangleUpdateDecoder::DropAllPackets() {
|
| - DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| -
|
| - while(!received_packets_.empty()) {
|
| - delete received_packets_.front().packet;
|
| - received_packets_.front().done.Run();
|
| - received_packets_.pop_front();
|
| - }
|
| -}
|
| -
|
| -void RectangleUpdateDecoder::ProcessNextPacket() {
|
| - DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| - CHECK(!packet_being_processed_);
|
| -
|
| - if (received_packets_.empty()) {
|
| - // Nothing to do!
|
| - return;
|
| - }
|
| -
|
| - scoped_ptr<VideoPacket> packet(received_packets_.front().packet);
|
| - received_packets_.front().packet = NULL;
|
| - packet_being_processed_ = true;
|
| -
|
| // Measure the latency between the last packet being received and presented.
|
| bool last_packet = (packet->flags() & VideoPacket::LAST_PACKET) != 0;
|
| base::Time decode_start;
|
| if (last_packet)
|
| decode_start = base::Time::Now();
|
|
|
| - base::Closure callback = base::Bind(&RectangleUpdateDecoder::OnPacketDone,
|
| - this,
|
| - last_packet,
|
| - decode_start);
|
| + base::Closure decode_done =
|
| + base::Bind(&RectangleUpdateDecoder::OnPacketDone, this,
|
| + last_packet, decode_start, done);
|
|
|
| decode_task_runner_->PostTask(FROM_HERE, base::Bind(
|
| &RectangleUpdateDecoder::DecodePacket, this,
|
| - base::Passed(&packet), callback));
|
| + base::Passed(&packet), decode_done));
|
| }
|
|
|
| void RectangleUpdateDecoder::OnPacketDone(bool last_packet,
|
| - base::Time decode_start) {
|
| + base::Time decode_start,
|
| + const base::Closure& done) {
|
| if (!main_task_runner_->BelongsToCurrentThread()) {
|
| main_task_runner_->PostTask(FROM_HERE, base::Bind(
|
| &RectangleUpdateDecoder::OnPacketDone, this,
|
| - last_packet, decode_start));
|
| + last_packet, decode_start, done));
|
| return;
|
| }
|
|
|
| @@ -327,13 +285,7 @@ void RectangleUpdateDecoder::OnPacketDone(bool last_packet,
|
| (base::Time::Now() - decode_start).InMilliseconds());
|
| }
|
|
|
| - received_packets_.front().done.Run();
|
| - received_packets_.pop_front();
|
| -
|
| - packet_being_processed_ = false;
|
| -
|
| - // Process the next video packet.
|
| - ProcessNextPacket();
|
| + done.Run();
|
| }
|
|
|
| ChromotingStats* RectangleUpdateDecoder::GetStats() {
|
|
|