diff options
author | kxing@chromium.org <kxing@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-23 01:36:10 +0000 |
---|---|---|
committer | kxing@chromium.org <kxing@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-23 01:36:10 +0000 |
commit | 386098336aa778f82d5a079b9371a1c63bd46d94 (patch) | |
tree | 3f238db944ed2ac50f2224b62feb5a36193123fd /remoting/base/decoder_row_based.cc | |
parent | e7e5bc86181faa3076671af080f809944594b60d (diff) | |
download | chromium_src-386098336aa778f82d5a079b9371a1c63bd46d94.zip chromium_src-386098336aa778f82d5a079b9371a1c63bd46d94.tar.gz chromium_src-386098336aa778f82d5a079b9371a1c63bd46d94.tar.bz2 |
Moved the video encoders/decoders to the codec directory.
Review URL: https://chromiumcodereview.appspot.com/10877014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152912 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/base/decoder_row_based.cc')
-rw-r--r-- | remoting/base/decoder_row_based.cc | 225 |
1 files changed, 0 insertions, 225 deletions
diff --git a/remoting/base/decoder_row_based.cc b/remoting/base/decoder_row_based.cc deleted file mode 100644 index d98a5ca..0000000 --- a/remoting/base/decoder_row_based.cc +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "remoting/base/decoder_row_based.h" - -#include "base/logging.h" -#include "remoting/base/decompressor.h" -#include "remoting/base/decompressor_zlib.h" -#include "remoting/base/decompressor_verbatim.h" -#include "remoting/base/util.h" - -namespace remoting { - -namespace { -// Both input and output data are assumed to be RGBA32. -const int kBytesPerPixel = 4; -} - -DecoderRowBased* DecoderRowBased::CreateZlibDecoder() { - return new DecoderRowBased(new DecompressorZlib(), - VideoPacketFormat::ENCODING_ZLIB); -} - -DecoderRowBased* DecoderRowBased::CreateVerbatimDecoder() { - return new DecoderRowBased(new DecompressorVerbatim(), - VideoPacketFormat::ENCODING_VERBATIM); -} - -DecoderRowBased::DecoderRowBased(Decompressor* decompressor, - VideoPacketFormat::Encoding encoding) - : state_(kUninitialized), - clip_(SkIRect::MakeEmpty()), - decompressor_(decompressor), - encoding_(encoding), - row_pos_(0), - row_y_(0), - screen_size_(SkISize::Make(0, 0)) { -} - -DecoderRowBased::~DecoderRowBased() { -} - -bool DecoderRowBased::IsReadyForData() { - switch (state_) { - case kUninitialized: - case kError: - return false; - case kReady: - case kProcessing: - case kPartitionDone: - case kDone: - return true; - } - NOTREACHED(); - return false; -} - -void DecoderRowBased::Initialize(const SkISize& screen_size) { - decompressor_->Reset(); - updated_region_.setEmpty(); - screen_buffer_.reset(NULL); - - screen_size_ = screen_size; - // Allocate the screen buffer, if necessary. - if (!screen_size_.isEmpty()) { - screen_buffer_.reset(new uint8[ - screen_size_.width() * screen_size_.height() * kBytesPerPixel]); - } - - state_ = kReady; -} - -Decoder::DecodeResult DecoderRowBased::DecodePacket(const VideoPacket* packet) { - UpdateStateForPacket(packet); - - if (state_ == kError) { - return DECODE_ERROR; - } - - const uint8* in = reinterpret_cast<const uint8*>(packet->data().data()); - const int in_size = packet->data().size(); - const int row_size = clip_.width() * kBytesPerPixel; - - int out_stride = screen_size_.width() * kBytesPerPixel; - uint8* out = screen_buffer_.get() + out_stride * (clip_.top() + row_y_) + - kBytesPerPixel * clip_.left(); - - // Consume all the data in the message. - bool decompress_again = true; - int used = 0; - while (decompress_again && used < in_size) { - if (row_y_ >= clip_.height()) { - state_ = kError; - LOG(WARNING) << "Too much data is received for the given rectangle."; - return DECODE_ERROR; - } - - int written = 0; - int consumed = 0; - decompress_again = decompressor_->Process( - in + used, in_size - used, out + row_pos_, row_size - row_pos_, - &consumed, &written); - used += consumed; - row_pos_ += written; - - // If this row is completely filled then move onto the next row. - if (row_pos_ == row_size) { - ++row_y_; - row_pos_ = 0; - out += out_stride; - } - } - - if (state_ == kPartitionDone || state_ == kDone) { - if (row_y_ < clip_.height()) { - state_ = kError; - LOG(WARNING) << "Received LAST_PACKET, but didn't get enough data."; - return DECODE_ERROR; - } - - updated_region_.op(clip_, SkRegion::kUnion_Op); - decompressor_->Reset(); - } - - if (state_ == kDone) { - return DECODE_DONE; - } else { - return DECODE_IN_PROGRESS; - } -} - -void DecoderRowBased::UpdateStateForPacket(const VideoPacket* packet) { - if (state_ == kError) { - return; - } - - if (packet->flags() & VideoPacket::FIRST_PACKET) { - if (state_ != kReady && state_ != kDone && state_ != kPartitionDone) { - state_ = kError; - LOG(WARNING) << "Received unexpected FIRST_PACKET."; - return; - } - - // Reset the buffer location status variables on the first packet. - clip_.setXYWH(packet->format().x(), packet->format().y(), - packet->format().width(), packet->format().height()); - if (!SkIRect::MakeSize(screen_size_).contains(clip_)) { - state_ = kError; - LOG(WARNING) << "Invalid clipping area received."; - return; - } - - state_ = kProcessing; - row_pos_ = 0; - row_y_ = 0; - } - - if (state_ != kProcessing) { - state_ = kError; - LOG(WARNING) << "Received unexpected packet."; - return; - } - - if (packet->flags() & VideoPacket::LAST_PACKET) { - if (state_ != kProcessing) { - state_ = kError; - LOG(WARNING) << "Received unexpected LAST_PACKET."; - return; - } - state_ = kPartitionDone; - } - - if (packet->flags() & VideoPacket::LAST_PARTITION) { - if (state_ != kPartitionDone) { - state_ = kError; - LOG(WARNING) << "Received unexpected LAST_PARTITION."; - return; - } - state_ = kDone; - } - - return; -} - -VideoPacketFormat::Encoding DecoderRowBased::Encoding() { - return encoding_; -} - -void DecoderRowBased::Invalidate(const SkISize& view_size, - const SkRegion& region) { - updated_region_.op(region, SkRegion::kUnion_Op); -} - -void DecoderRowBased::RenderFrame(const SkISize& view_size, - const SkIRect& clip_area, - uint8* image_buffer, - int image_stride, - SkRegion* output_region) { - output_region->setEmpty(); - - // TODO(alexeypa): scaling is not implemented. - SkIRect clip_rect = SkIRect::MakeSize(screen_size_); - if (!clip_rect.intersect(clip_area)) - return; - - int screen_stride = screen_size_.width() * kBytesPerPixel; - - for (SkRegion::Iterator i(updated_region_); !i.done(); i.next()) { - SkIRect rect(i.rect()); - if (!rect.intersect(clip_rect)) - continue; - - CopyRGB32Rect(screen_buffer_.get(), screen_stride, - clip_rect, - image_buffer, image_stride, - clip_area, - rect); - output_region->op(rect, SkRegion::kUnion_Op); - } - - updated_region_.setEmpty(); -} - -} // namespace remoting |