Index: media/capture/webm_muxer_unittest.cc |
diff --git a/media/capture/webm_muxer_unittest.cc b/media/capture/webm_muxer_unittest.cc |
index eac8a620a59796716a2b092eadc307a19f159a7a..8b45e1df99912efe7edf490a8797c941abff89a4 100644 |
--- a/media/capture/webm_muxer_unittest.cc |
+++ b/media/capture/webm_muxer_unittest.cc |
@@ -7,6 +7,8 @@ |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
+#include "media/audio/audio_parameters.h" |
+#include "media/base/channel_layout.h" |
#include "media/base/video_frame.h" |
#include "media/capture/webm_muxer.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -16,17 +18,25 @@ using ::testing::_; |
using ::testing::AtLeast; |
using ::testing::Mock; |
using ::testing::TestWithParam; |
-using ::testing::Values; |
+using ::testing::ValuesIn; |
using ::testing::WithArgs; |
namespace media { |
-class WebmMuxerTest : public TestWithParam<VideoCodec> { |
+struct kTestParams { |
+ VideoCodec codec; |
+ size_t num_video_tracks; |
+ size_t num_audio_tracks; |
+}; |
+ |
+class WebmMuxerTest : public TestWithParam<kTestParams> { |
public: |
WebmMuxerTest() |
- : webm_muxer_( |
- GetParam() /* codec */, |
- base::Bind(&WebmMuxerTest::WriteCallback, base::Unretained(this))), |
+ : webm_muxer_(GetParam().codec, |
+ GetParam().num_video_tracks, |
+ GetParam().num_audio_tracks, |
+ base::Bind(&WebmMuxerTest::WriteCallback, |
+ base::Unretained(this))), |
last_encoded_length_(0), |
accumulated_position_(0) { |
EXPECT_EQ(webm_muxer_.Position(), 0); |
@@ -77,6 +87,9 @@ TEST_P(WebmMuxerTest, Write) { |
// This test sends two frames and checks that the WriteCallback is called with |
// appropriate params in both cases. |
TEST_P(WebmMuxerTest, OnEncodedVideoTwoFrames) { |
+ if (GetParam().num_video_tracks == 0) |
+ return; |
+ |
const gfx::Size frame_size(160, 80); |
const scoped_refptr<VideoFrame> video_frame = |
VideoFrame::CreateBlackFrame(frame_size); |
@@ -118,6 +131,61 @@ TEST_P(WebmMuxerTest, OnEncodedVideoTwoFrames) { |
accumulated_position_); |
} |
-INSTANTIATE_TEST_CASE_P(, WebmMuxerTest, Values(kCodecVP8, kCodecVP9)); |
+TEST_P(WebmMuxerTest, OnEncodedAudioTwoFrames) { |
+ if (GetParam().num_audio_tracks == 0) |
+ return; |
+ |
+ int sample_rate = 48000; |
+ int bits_per_sample = 16; |
+ int frames_per_buffer = 480; |
+ media::AudioParameters audio_params( |
+ media::AudioParameters::Format::AUDIO_PCM_LOW_LATENCY, |
+ media::CHANNEL_LAYOUT_MONO, sample_rate, bits_per_sample, |
+ frames_per_buffer); |
+ |
+ const std::string encoded_data("abcdefghijklmnopqrstuvwxyz"); |
+ |
+ EXPECT_CALL(*this, WriteCallback(_)) |
+ .Times(AtLeast(1)) |
+ .WillRepeatedly( |
+ WithArgs<0>(Invoke(this, &WebmMuxerTest::SaveEncodedDataLen))); |
+ webm_muxer_.OnEncodedAudio(audio_params, |
+ make_scoped_ptr(new std::string(encoded_data)), |
+ base::TimeTicks::Now()); |
+ |
+ // First time around WriteCallback() is pinged a number of times to write the |
+ // Matroska header, but at the end it dumps |encoded_data|. |
+ EXPECT_EQ(last_encoded_length_, encoded_data.size()); |
+ EXPECT_EQ(GetWebmMuxerPosition(), accumulated_position_); |
+ EXPECT_GE(GetWebmMuxerPosition(), static_cast<int64_t>(last_encoded_length_)); |
+ EXPECT_EQ(GetWebmSegmentMode(), mkvmuxer::Segment::kLive); |
+ |
+ const int64_t begin_of_second_block = accumulated_position_; |
+ EXPECT_CALL(*this, WriteCallback(_)) |
+ .Times(AtLeast(1)) |
+ .WillRepeatedly( |
+ WithArgs<0>(Invoke(this, &WebmMuxerTest::SaveEncodedDataLen))); |
+ webm_muxer_.OnEncodedAudio(audio_params, |
+ make_scoped_ptr(new std::string(encoded_data)), |
+ base::TimeTicks::Now()); |
+ |
+ // The second time around the callbacks should include a SimpleBlock header, |
+ // namely the track index, a timestamp and a flags byte, for a total of 6B. |
+ EXPECT_EQ(last_encoded_length_, encoded_data.size()); |
+ EXPECT_EQ(GetWebmMuxerPosition(), accumulated_position_); |
+ const uint32_t kSimpleBlockSize = 6u; |
+ EXPECT_EQ(static_cast<int64_t>(begin_of_second_block + kSimpleBlockSize + |
+ encoded_data.size()), |
+ accumulated_position_); |
+} |
+ |
+const kTestParams kTestCases[] = { |
+ // TODO: consider not enumerating every combination by hand. |
+ {kCodecVP8, 1 /* num_video_tracks */, 0 /*num_audio_tracks*/}, |
+ {kCodecVP9, 1, 0}, |
+ {kCodecVP8, 0, 1}, |
+}; |
+ |
+INSTANTIATE_TEST_CASE_P(, WebmMuxerTest, ValuesIn(kTestCases)); |
} // namespace media |