Index: remoting/base/codec_test.cc |
diff --git a/remoting/base/codec_test.cc b/remoting/base/codec_test.cc |
index dcc165e73fa3dadc1c7453d37a9af635b7494b99..0521b52dbefbd76d855166c5ee9a2dc4dd1dcc79 100644 |
--- a/remoting/base/codec_test.cc |
+++ b/remoting/base/codec_test.cc |
@@ -29,42 +29,6 @@ static const gfx::Rect kTestRects[] = { |
namespace remoting { |
-// A class to test that the state transition of the Encoder is correct. |
-class EncoderStateTester { |
- public: |
- EncoderStateTester() |
- : next_state_(Encoder::EncodingStarting) { |
- } |
- |
- ~EncoderStateTester() { |
- EXPECT_EQ(Encoder::EncodingStarting, next_state_); |
- } |
- |
- // Set the state output of the Encoder. |
- void ReceivedState(Encoder::EncodingState state) { |
- if (state & Encoder::EncodingStarting) { |
- EXPECT_EQ(Encoder::EncodingStarting, next_state_); |
- next_state_ = Encoder::EncodingInProgress | Encoder::EncodingEnded; |
- } else { |
- EXPECT_FALSE(next_state_ & Encoder::EncodingStarting); |
- } |
- |
- if (state & Encoder::EncodingInProgress) { |
- EXPECT_TRUE(next_state_ & Encoder::EncodingInProgress); |
- } |
- |
- if (state & Encoder::EncodingEnded) { |
- EXPECT_TRUE(next_state_ & Encoder::EncodingEnded); |
- next_state_ = Encoder::EncodingStarting; |
- } |
- } |
- |
- private: |
- Encoder::EncodingState next_state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(EncoderStateTester); |
-}; |
- |
// A class to test the message output of the encoder. |
class EncoderMessageTester { |
public: |
@@ -86,35 +50,31 @@ class EncoderMessageTester { |
} |
} |
- // Test that we received the correct message. |
- void ReceivedMessage(ChromotingHostMessage* message) { |
- EXPECT_TRUE(message->has_update_stream_packet()); |
- |
+ // Test that we received the correct packet. |
+ void ReceivedPacket(VideoPacket* packet) { |
if (state_ == kWaitingForBeginRect) { |
- EXPECT_TRUE(message->update_stream_packet().has_begin_rect()); |
+ EXPECT_TRUE((packet->flags() & VideoPacket::FIRST_PACKET) != 0); |
state_ = kWaitingForRectData; |
++begin_rect_; |
if (strict_) { |
gfx::Rect rect = rects_.front(); |
rects_.pop_front(); |
- EXPECT_EQ(rect.x(), message->update_stream_packet().begin_rect().x()); |
- EXPECT_EQ(rect.y(), message->update_stream_packet().begin_rect().y()); |
- EXPECT_EQ(rect.width(), |
- message->update_stream_packet().begin_rect().width()); |
- EXPECT_EQ(rect.height(), |
- message->update_stream_packet().begin_rect().height()); |
+ EXPECT_EQ(rect.x(), packet->format().x()); |
+ EXPECT_EQ(rect.y(), packet->format().y()); |
+ EXPECT_EQ(rect.width(), packet->format().width()); |
+ EXPECT_EQ(rect.height(), packet->format().height()); |
} |
} else { |
- EXPECT_FALSE(message->update_stream_packet().has_begin_rect()); |
+ EXPECT_FALSE((packet->flags() & VideoPacket::FIRST_PACKET) != 0); |
} |
if (state_ == kWaitingForRectData) { |
- if (message->update_stream_packet().has_rect_data()) { |
+ if (packet->has_data()) { |
++rect_data_; |
} |
- if (message->update_stream_packet().has_end_rect()) { |
+ if ((packet->flags() & VideoPacket::LAST_PACKET) != 0) { |
// Expect that we have received some data. |
EXPECT_GT(rect_data_, 0); |
rect_data_ = 0; |
@@ -155,32 +115,28 @@ class DecoderTester { |
public: |
DecoderTester(Decoder* decoder) |
: strict_(false), |
- decoder_(decoder), |
- decode_done_(false) { |
+ decoder_(decoder) { |
media::VideoFrame::CreateFrame(media::VideoFrame::RGB32, |
kWidth, kHeight, |
base::TimeDelta(), |
base::TimeDelta(), &frame_); |
EXPECT_TRUE(frame_.get()); |
+ decoder_->Initialize(frame_); |
} |
- void ReceivedMessage(ChromotingHostMessage* message) { |
- if (message->has_update_stream_packet()) { |
- EXPECT_TRUE(decoder_->PartialDecode(message)); |
- return; |
- } |
+ void Reset() { |
+ rects_.clear(); |
+ update_rects_.clear(); |
+ } |
- if (message->has_begin_update_stream()) { |
- EXPECT_TRUE(decoder_->BeginDecode( |
- frame_, &update_rects_, |
- NewRunnableMethod(this, &DecoderTester::OnPartialDecodeDone), |
- NewRunnableMethod(this, &DecoderTester::OnDecodeDone))); |
- } |
+ void ReceivedPacket(VideoPacket* packet) { |
+ Decoder::DecodeResult result = decoder_->DecodePacket(packet); |
+ |
+ ASSERT_NE(Decoder::DECODE_ERROR, result); |
- if (message->has_end_update_stream()) { |
- decoder_->EndDecode(); |
+ if (result == Decoder::DECODE_DONE) { |
+ decoder_->GetUpdatedRects(&update_rects_); |
} |
- delete message; |
} |
void set_strict(bool strict) { |
@@ -195,19 +151,16 @@ class DecoderTester { |
rects_.insert(rects_.begin() + rects_.size(), rects, rects + count); |
} |
- bool decode_done() const { return decode_done_; } |
- void reset_decode_done() { decode_done_ = false; } |
- |
- private: |
- void OnPartialDecodeDone() { |
+ void VerifyResults() { |
if (!strict_) |
return; |
+ ASSERT_TRUE(capture_data_.get()); |
+ |
// Test the content of the update rect. |
+ ASSERT_EQ(rects_.size(), update_rects_.size()); |
for (size_t i = 0; i < update_rects_.size(); ++i) { |
- EXPECT_FALSE(rects_.empty()); |
- gfx::Rect rect = rects_.front(); |
- rects_.pop_front(); |
+ gfx::Rect rect = rects_[i]; |
EXPECT_EQ(rect, update_rects_[i]); |
EXPECT_EQ(frame_->stride(0), capture_data_->data_planes().strides[0]); |
@@ -226,29 +179,13 @@ class DecoderTester { |
} |
} |
- void OnDecodeDone() { |
- decode_done_ = true; |
- if (!strict_) |
- return; |
- |
- EXPECT_TRUE(capture_data_.get()); |
- for (int i = 0; i < DataPlanes::kPlaneCount; ++i) { |
- if (!frame_->data(i) || !capture_data_->data_planes().data[i]) |
- continue; |
- // TODO(hclam): HAndle YUV. |
- int size = capture_data_->data_planes().strides[i] * kHeight; |
- EXPECT_EQ(0, memcmp(capture_data_->data_planes().data[i], |
- frame_->data(i), size)); |
- } |
- } |
- |
+ private: |
bool strict_; |
std::deque<gfx::Rect> rects_; |
UpdatedRects update_rects_; |
Decoder* decoder_; |
scoped_refptr<media::VideoFrame> frame_; |
scoped_refptr<CaptureData> capture_data_; |
- bool decode_done_; |
DISALLOW_COPY_AND_ASSIGN(DecoderTester); |
}; |
@@ -257,10 +194,8 @@ class DecoderTester { |
// message to other subprograms for validaton. |
class EncoderTester { |
public: |
- EncoderTester(EncoderMessageTester* message_tester, |
- EncoderStateTester* state_tester) |
+ EncoderTester(EncoderMessageTester* message_tester) |
: message_tester_(message_tester), |
- state_tester_(state_tester), |
decoder_tester_(NULL), |
data_available_(0) { |
} |
@@ -269,32 +204,16 @@ class EncoderTester { |
EXPECT_GT(data_available_, 0); |
} |
- void DataAvailable(ChromotingHostMessage* message, |
- Encoder::EncodingState state) { |
+ void DataAvailable(VideoPacket *packet) { |
++data_available_; |
- message_tester_->ReceivedMessage(message); |
- state_tester_->ReceivedState(state); |
+ message_tester_->ReceivedPacket(packet); |
// Send the message to the DecoderTester. |
if (decoder_tester_) { |
- if (state & Encoder::EncodingStarting) { |
- ChromotingHostMessage* begin_update = new ChromotingHostMessage(); |
- begin_update->mutable_begin_update_stream(); |
- decoder_tester_->ReceivedMessage(begin_update); |
- } |
- |
- if (state & Encoder::EncodingInProgress) { |
- decoder_tester_->ReceivedMessage(message); |
- } |
- |
- if (state & Encoder::EncodingEnded) { |
- ChromotingHostMessage* end_update = new ChromotingHostMessage(); |
- end_update->mutable_end_update_stream(); |
- decoder_tester_->ReceivedMessage(end_update); |
- } |
- } else { |
- delete message; |
+ decoder_tester_->ReceivedPacket(packet); |
} |
+ |
+ delete packet; |
} |
void AddRects(const gfx::Rect* rects, int count) { |
@@ -307,17 +226,16 @@ class EncoderTester { |
private: |
EncoderMessageTester* message_tester_; |
- EncoderStateTester* state_tester_; |
DecoderTester* decoder_tester_; |
int data_available_; |
DISALLOW_COPY_AND_ASSIGN(EncoderTester); |
}; |
-scoped_refptr<CaptureData> PrepareEncodeData(PixelFormat format, |
+scoped_refptr<CaptureData> PrepareEncodeData(media::VideoFrame::Format format, |
uint8** memory) { |
// TODO(hclam): Support also YUV format. |
- CHECK(format == PIXEL_FORMAT_RGB32); |
+ CHECK_EQ(format, media::VideoFrame::RGB32); |
int size = kWidth * kHeight * kBytesPerPixel; |
*memory = new uint8[size]; |
@@ -355,12 +273,11 @@ void TestEncoder(Encoder* encoder, bool strict) { |
EncoderMessageTester message_tester; |
message_tester.set_strict(strict); |
- EncoderStateTester state_tester; |
- EncoderTester tester(&message_tester, &state_tester); |
+ EncoderTester tester(&message_tester); |
uint8* memory; |
scoped_refptr<CaptureData> data = |
- PrepareEncodeData(PIXEL_FORMAT_RGB32, &memory); |
+ PrepareEncodeData(media::VideoFrame::RGB32, &memory); |
TestEncodingRects(encoder, &tester, data, kTestRects, 1); |
TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1); |
@@ -380,7 +297,6 @@ static void TestEncodingRects(Encoder* encoder, |
} |
encoder_tester->AddRects(rects, count); |
decoder_tester->AddRects(rects, count); |
- decoder_tester->reset_decode_done(); |
// Generate random data for the updated rects. |
srand(0); |
@@ -400,19 +316,19 @@ static void TestEncodingRects(Encoder* encoder, |
encoder->Encode(data, true, |
NewCallback(encoder_tester, &EncoderTester::DataAvailable)); |
- EXPECT_TRUE(decoder_tester->decode_done()); |
+ decoder_tester->VerifyResults(); |
+ decoder_tester->Reset(); |
} |
void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { |
EncoderMessageTester message_tester; |
message_tester.set_strict(strict); |
- EncoderStateTester state_tester; |
- EncoderTester encoder_tester(&message_tester, &state_tester); |
+ EncoderTester encoder_tester(&message_tester); |
uint8* memory; |
scoped_refptr<CaptureData> data = |
- PrepareEncodeData(PIXEL_FORMAT_RGB32, &memory); |
+ PrepareEncodeData(media::VideoFrame::RGB32, &memory); |
DecoderTester decoder_tester(decoder); |
decoder_tester.set_strict(strict); |
decoder_tester.set_capture_data(data); |