Index: media/formats/mp2t/es_adapter_video_unittest.cc |
diff --git a/media/formats/mp2t/es_adapter_video_unittest.cc b/media/formats/mp2t/es_adapter_video_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a5446cfd0501a2c12f52d43d3f8c3b8fe3691b2c |
--- /dev/null |
+++ b/media/formats/mp2t/es_adapter_video_unittest.cc |
@@ -0,0 +1,148 @@ |
+// Copyright 2014 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 <sstream> |
+#include <string> |
+#include <vector> |
+ |
+#include "base/bind.h" |
+#include "base/logging.h" |
+#include "base/strings/string_util.h" |
+#include "base/time/time.h" |
+#include "media/base/stream_parser_buffer.h" |
+#include "media/base/video_decoder_config.h" |
+#include "media/formats/mp2t/es_adapter_video.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace media { |
+namespace mp2t { |
+ |
+namespace { |
+ |
+VideoDecoderConfig CreateFakeVideoConfig() { |
+ gfx::Size coded_size(320, 240); |
+ gfx::Rect visible_rect(0, 0, 320, 240); |
+ gfx::Size natural_size(320, 240); |
+ return VideoDecoderConfig( |
+ kCodecH264, |
+ H264PROFILE_MAIN, |
+ VideoFrame::I420, |
+ coded_size, |
+ visible_rect, |
+ natural_size, |
+ NULL, 0, false); |
+} |
+ |
+StreamParserBuffer::BufferQueue |
+GenerateFakeBuffers(const int* frame_pts_ms, |
+ const bool* is_key_frame, |
+ size_t frame_count) { |
+ uint8 dummy_buffer[] = {0, 0, 0, 0}; |
+ |
+ StreamParserBuffer::BufferQueue buffers(frame_count); |
+ for (size_t k = 0; k < frame_count; k++) { |
+ buffers[k] = StreamParserBuffer::CopyFrom( |
+ dummy_buffer, arraysize(dummy_buffer), |
+ is_key_frame[k], DemuxerStream::VIDEO, 0); |
+ buffers[k]->set_timestamp( |
+ base::TimeDelta::FromMilliseconds(frame_pts_ms[k])); |
+ } |
+ return buffers; |
+} |
+ |
+} |
+ |
+class EsAdapterVideoTest : public testing::Test { |
+ public: |
+ EsAdapterVideoTest(); |
+ virtual ~EsAdapterVideoTest() {} |
+ |
+ protected: |
+ // Feed the ES adapter with the buffers from |buffer_queue|. |
+ // Return the durations computed by the ES adapter as well as |
+ // whether each frame emitted by the adapter is a key frame. |
+ std::string RunAdapterTest(const StreamParser::BufferQueue& buffer_queue); |
+ |
+ private: |
+ void OnNewConfig(const VideoDecoderConfig& video_config); |
+ void OnNewBuffer(scoped_refptr<StreamParserBuffer> buffer); |
+ |
+ EsAdapterVideo es_adapter_; |
+ |
+ std::stringstream buffer_descriptors_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(EsAdapterVideoTest); |
+}; |
+ |
+EsAdapterVideoTest::EsAdapterVideoTest() |
+ : es_adapter_(base::Bind(&EsAdapterVideoTest::OnNewConfig, |
+ base::Unretained(this)), |
+ base::Bind(&EsAdapterVideoTest::OnNewBuffer, |
+ base::Unretained(this))) { |
+} |
+ |
+void EsAdapterVideoTest::OnNewConfig(const VideoDecoderConfig& video_config) { |
+} |
+ |
+void EsAdapterVideoTest::OnNewBuffer( |
+ scoped_refptr<StreamParserBuffer> buffer) { |
+ buffer_descriptors_ << "(" << buffer->duration().InMilliseconds() << "," |
+ << (buffer->IsKeyframe() ? "Y" : "N") << ") "; |
+} |
+ |
+std::string EsAdapterVideoTest::RunAdapterTest( |
+ const StreamParserBuffer::BufferQueue& buffer_queue) { |
+ buffer_descriptors_.clear(); |
+ |
+ es_adapter_.OnConfigChanged(CreateFakeVideoConfig()); |
+ for (StreamParserBuffer::BufferQueue::const_iterator it = |
+ buffer_queue.begin(); it != buffer_queue.end(); ++it) { |
+ es_adapter_.OnNewBuffer(*it); |
+ } |
+ es_adapter_.Flush(); |
+ |
+ std::string s = buffer_descriptors_.str(); |
+ base::TrimWhitespaceASCII(s, base::TRIM_ALL, &s); |
+ return s; |
+} |
+ |
+TEST_F(EsAdapterVideoTest, FrameDurationSimpleGop) { |
+ // PTS for a GOP without B frames - strictly increasing. |
+ int pts_ms[] = {30, 31, 33, 36, 40, 45, 51, 58}; |
+ bool is_key_frame[] = { |
+ true, false, false, false, |
+ false, false, false, false }; |
+ StreamParserBuffer::BufferQueue buffer_queue = |
+ GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms)); |
+ |
+ EXPECT_EQ("(1,Y) (2,N) (3,N) (4,N) (5,N) (6,N) (7,N) (7,N)", |
+ RunAdapterTest(buffer_queue)); |
+} |
+ |
+TEST_F(EsAdapterVideoTest, FrameDurationComplexGop) { |
+ // PTS for a GOP with B frames. |
+ int pts_ms[] = {30, 120, 60, 90, 210, 150, 180, 300, 240, 270}; |
+ bool is_key_frame[] = { |
+ true, false, false, false, false, |
+ false, false, false, false, false }; |
+ StreamParserBuffer::BufferQueue buffer_queue = |
+ GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms)); |
+ |
+ EXPECT_EQ("(30,Y) (30,N) (30,N) (30,N) (30,N) " |
+ "(30,N) (30,N) (30,N) (30,N) (30,N)", |
+ RunAdapterTest(buffer_queue)); |
+} |
+ |
+TEST_F(EsAdapterVideoTest, LeadingNonKeyFrames) { |
+ int pts_ms[] = {30, 40, 50, 120, 150, 180}; |
+ bool is_key_frame[] = {false, false, false, true, false, false}; |
+ StreamParserBuffer::BufferQueue buffer_queue = |
+ GenerateFakeBuffers(pts_ms, is_key_frame, arraysize(pts_ms)); |
+ |
+ EXPECT_EQ("(30,Y) (30,Y) (30,Y) (30,Y) (30,N) (30,N)", |
+ RunAdapterTest(buffer_queue)); |
+} |
+ |
+} // namespace mp2t |
+} // namespace media |