Chromium Code Reviews| Index: remoting/protocol/host_video_dispatcher.cc |
| diff --git a/remoting/protocol/host_video_dispatcher.cc b/remoting/protocol/host_video_dispatcher.cc |
| index b9a12c0294f28ac8e95d65ca52c8e6c000e8334f..f4209624f4d0a658b72c108c947849f6c65889fe 100644 |
| --- a/remoting/protocol/host_video_dispatcher.cc |
| +++ b/remoting/protocol/host_video_dispatcher.cc |
| @@ -5,16 +5,26 @@ |
| #include "remoting/protocol/host_video_dispatcher.h" |
| #include "base/bind.h" |
| +#include "base/callback_helpers.h" |
| #include "net/socket/stream_socket.h" |
| #include "remoting/base/constants.h" |
| -#include "remoting/proto/video.pb.h" |
| +#include "remoting/protocol/errors.h" |
| #include "remoting/protocol/message_serialization.h" |
| namespace remoting { |
| namespace protocol { |
| +HostVideoDispatcher::PendingFrame::PendingFrame(int frame_id, |
| + const base::Closure& done) |
| + : frame_id(frame_id), done(done) { |
| +} |
| + |
| HostVideoDispatcher::HostVideoDispatcher() |
| - : ChannelDispatcherBase(kVideoChannelName) { |
| + : ChannelDispatcherBase(kVideoChannelName), |
| + frame_id_(0), |
| + parser_( |
| + base::Bind(&HostVideoDispatcher::OnVideoAck, base::Unretained(this)), |
| + reader()) { |
| } |
| HostVideoDispatcher::~HostVideoDispatcher() { |
| @@ -22,7 +32,35 @@ HostVideoDispatcher::~HostVideoDispatcher() { |
| void HostVideoDispatcher::ProcessVideoPacket(scoped_ptr<VideoPacket> packet, |
| const base::Closure& done) { |
| - writer()->Write(SerializeAndFrameMessage(*packet), done); |
| + // For older clients that don't send explicit video Ack message call |done| as |
| + // soon as the frame is pushed to the channel. |
| + if (channel_config().version < kVideoWithAckStreamVersion) { |
| + writer()->Write(SerializeAndFrameMessage(*packet), done); |
| + return; |
| + } |
| + |
| + pending_frames_.push_back(PendingFrame(frame_id_, done)); |
| + packet->set_frame_id(frame_id_); |
| + frame_id_++; |
| + writer()->Write(SerializeAndFrameMessage(*packet), base::Closure()); |
| +} |
| + |
| +bool HostVideoDispatcher::SupportsAcks() { |
| + return channel_config().version >= kVideoWithAckStreamVersion; |
| +} |
| + |
| +void HostVideoDispatcher::OnVideoAck(scoped_ptr<VideoAck> ack, |
| + const base::Closure& done) { |
|
Wez
2015/01/21 01:35:40
Need some kind of comment and bug # reference in h
Sergey Ulanov
2015/01/29 01:33:29
Done.
|
| + base::ScopedClosureRunner done_runner(done); |
| + |
| + if (pending_frames_.empty() || |
| + pending_frames_.front().frame_id != ack->frame_id()) { |
| + NotifyError(INCOMPATIBLE_PROTOCOL); |
| + return; |
| + } |
| + |
| + pending_frames_.front().done.Run(); |
|
Wez
2015/01/21 01:35:40
Are you guaranteed that the callback won't delete
Sergey Ulanov
2015/01/29 01:33:29
Done.
|
| + pending_frames_.pop_front(); |
| } |
| } // namespace protocol |