| Index: remoting/base/encoder_zlib.cc
|
| diff --git a/remoting/base/encoder_zlib.cc b/remoting/base/encoder_zlib.cc
|
| index 05533a92c48a2eea76c6b4797c4b3cdce01330dc..390a46ad52d79aed4f55a8a8fccaaf0b4f77ff10 100644
|
| --- a/remoting/base/encoder_zlib.cc
|
| +++ b/remoting/base/encoder_zlib.cc
|
| @@ -49,13 +49,14 @@ void EncoderZlib::EncodeRect(CompressorZlib* compressor,
|
| const int bytes_per_pixel = GetBytesPerPixel(capture_data_->pixel_format());
|
| const int row_size = bytes_per_pixel * rect.width();
|
|
|
| - ChromotingHostMessage* message = PrepareMessage(&rect);
|
| - const uint8 * in = capture_data_->data_planes().data[0] +
|
| - rect.y() * strides +
|
| - rect.x() * bytes_per_pixel;
|
| + ChromotingHostMessage* message = new ChromotingHostMessage();
|
| + RectangleUpdatePacket* update = message->mutable_rectangle_update();
|
| + PrepareUpdateStart(rect, update);
|
| + const uint8* in = capture_data_->data_planes().data[0] +
|
| + rect.y() * strides +
|
| + rect.x() * bytes_per_pixel;
|
| // TODO(hclam): Fill in the sequence number.
|
| - uint8* out = (uint8*)message->mutable_update_stream_packet()->
|
| - mutable_rect_data()->mutable_data()->data();
|
| + uint8* out = GetOutputBuffer(update, packet_size_);
|
| int filled = 0;
|
| int row_x = 0;
|
| int row_y = 0;
|
| @@ -63,9 +64,9 @@ void EncoderZlib::EncodeRect(CompressorZlib* compressor,
|
| while (compress_again) {
|
| // Prepare a message for sending out.
|
| if (!message) {
|
| - message = PrepareMessage(NULL);
|
| - out = (uint8*)(message->mutable_update_stream_packet()->
|
| - mutable_rect_data()->mutable_data()->data());
|
| + message = new ChromotingHostMessage();
|
| + update = message->mutable_rectangle_update();
|
| + out = GetOutputBuffer(update, packet_size_);
|
| filled = 0;
|
| }
|
|
|
| @@ -88,13 +89,13 @@ void EncoderZlib::EncodeRect(CompressorZlib* compressor,
|
|
|
| // We have reached the end of stream.
|
| if (!compress_again) {
|
| - message->mutable_update_stream_packet()->mutable_end_rect();
|
| + update->set_flags(update->flags() | RectangleUpdatePacket::LAST_PACKET);
|
| }
|
|
|
| // If we have filled the message or we have reached the end of stream.
|
| if (filled == packet_size_ || !compress_again) {
|
| - message->mutable_update_stream_packet()->mutable_rect_data()->
|
| - mutable_data()->resize(filled);
|
| + message->mutable_rectangle_update()->mutable_encoded_rect()->
|
| + resize(filled);
|
| SubmitMessage(message, rect_index);
|
| message = NULL;
|
| }
|
| @@ -108,33 +109,40 @@ void EncoderZlib::EncodeRect(CompressorZlib* compressor,
|
| }
|
| }
|
|
|
| -ChromotingHostMessage* EncoderZlib::PrepareMessage(const gfx::Rect* rect) {
|
| - ChromotingHostMessage* message = new ChromotingHostMessage();
|
| - UpdateStreamPacketMessage* packet = message->mutable_update_stream_packet();
|
| -
|
| - // Prepare the begin rect content.
|
| - if (rect != NULL) {
|
| - packet->mutable_begin_rect()->set_x(rect->x());
|
| - packet->mutable_begin_rect()->set_y(rect->y());
|
| - packet->mutable_begin_rect()->set_width(rect->width());
|
| - packet->mutable_begin_rect()->set_height(rect->height());
|
| - packet->mutable_begin_rect()->set_encoding(EncodingZlib);
|
| - packet->mutable_begin_rect()->set_pixel_format(
|
| - capture_data_->pixel_format());
|
| - }
|
| +void EncoderZlib::PrepareUpdateStart(const gfx::Rect& rect,
|
| + RectangleUpdatePacket* update) {
|
| +
|
| + update->set_flags(update->flags() | RectangleUpdatePacket::FIRST_PACKET);
|
| + RectangleFormat* format = update->mutable_format();
|
|
|
| - packet->mutable_rect_data()->mutable_data()->resize(packet_size_);
|
| - return message;
|
| + format->set_x(rect.x());
|
| + format->set_y(rect.y());
|
| + format->set_width(rect.width());
|
| + format->set_height(rect.height());
|
| + format->set_encoding(EncodingZlib);
|
| + format->set_pixel_format(capture_data_->pixel_format());
|
| +}
|
| +
|
| +uint8* EncoderZlib::GetOutputBuffer(RectangleUpdatePacket* update,
|
| + size_t size) {
|
| + update->mutable_encoded_rect()->resize(size);
|
| + // TODO(ajwong): Is there a better way to do this at all???
|
| + return const_cast<uint8*>(reinterpret_cast<const uint8*>(
|
| + update->mutable_encoded_rect()->data()));
|
| }
|
|
|
| void EncoderZlib::SubmitMessage(ChromotingHostMessage* message,
|
| size_t rect_index) {
|
| EncodingState state = EncodingInProgress;
|
| - if (rect_index == 0 && message->update_stream_packet().has_begin_rect())
|
| + const RectangleUpdatePacket& update = message->rectangle_update();
|
| + if (rect_index == 0 &&
|
| + (update.flags() | RectangleUpdatePacket::FIRST_PACKET)) {
|
| state |= EncodingStarting;
|
| + }
|
| if (rect_index == capture_data_->dirty_rects().size() - 1 &&
|
| - message->update_stream_packet().has_end_rect())
|
| + (update.flags() | RectangleUpdatePacket::LAST_PACKET)) {
|
| state |= EncodingEnded;
|
| + }
|
| callback_->Run(message, state);
|
| }
|
|
|
|
|