| Index: media/capture/webm_muxer_unittest.cc
|
| diff --git a/media/capture/webm_muxer_unittest.cc b/media/capture/webm_muxer_unittest.cc
|
| deleted file mode 100644
|
| index 19b1e70889f08ddb29017dfbcef01d03f6dd0ddf..0000000000000000000000000000000000000000
|
| --- a/media/capture/webm_muxer_unittest.cc
|
| +++ /dev/null
|
| @@ -1,252 +0,0 @@
|
| -// Copyright 2015 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 <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#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"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using ::testing::_;
|
| -using ::testing::AllOf;
|
| -using ::testing::AnyNumber;
|
| -using ::testing::AtLeast;
|
| -using ::testing::Eq;
|
| -using ::testing::InSequence;
|
| -using ::testing::Mock;
|
| -using ::testing::Not;
|
| -using ::testing::Sequence;
|
| -using ::testing::TestWithParam;
|
| -using ::testing::ValuesIn;
|
| -using ::testing::WithArgs;
|
| -
|
| -namespace media {
|
| -
|
| -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,
|
| - 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);
|
| - const mkvmuxer::int64 kRandomNewPosition = 333;
|
| - EXPECT_EQ(webm_muxer_.Position(kRandomNewPosition), -1);
|
| - EXPECT_FALSE(webm_muxer_.Seekable());
|
| - }
|
| -
|
| - MOCK_METHOD1(WriteCallback, void(base::StringPiece));
|
| -
|
| - void SaveEncodedDataLen(const base::StringPiece& encoded_data) {
|
| - last_encoded_length_ = encoded_data.size();
|
| - accumulated_position_ += encoded_data.size();
|
| - }
|
| -
|
| - mkvmuxer::int64 GetWebmMuxerPosition() const {
|
| - return webm_muxer_.Position();
|
| - }
|
| -
|
| - mkvmuxer::Segment::Mode GetWebmSegmentMode() const {
|
| - return webm_muxer_.segment_.mode();
|
| - }
|
| -
|
| - mkvmuxer::int32 WebmMuxerWrite(const void* buf, mkvmuxer::uint32 len) {
|
| - return webm_muxer_.Write(buf, len);
|
| - }
|
| -
|
| - WebmMuxer webm_muxer_;
|
| -
|
| - size_t last_encoded_length_;
|
| - int64_t accumulated_position_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(WebmMuxerTest);
|
| -};
|
| -
|
| -// Checks that the WriteCallback is called with appropriate params when
|
| -// WebmMuxer::Write() method is called.
|
| -TEST_P(WebmMuxerTest, Write) {
|
| - const base::StringPiece encoded_data("abcdefghijklmnopqrstuvwxyz");
|
| -
|
| - EXPECT_CALL(*this, WriteCallback(encoded_data));
|
| - WebmMuxerWrite(encoded_data.data(), encoded_data.size());
|
| -
|
| - EXPECT_EQ(GetWebmMuxerPosition(), static_cast<int64_t>(encoded_data.size()));
|
| -}
|
| -
|
| -// 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_audio_tracks > 0)
|
| - return;
|
| -
|
| - const gfx::Size frame_size(160, 80);
|
| - const scoped_refptr<VideoFrame> video_frame =
|
| - VideoFrame::CreateBlackFrame(frame_size);
|
| - const std::string encoded_data("abcdefghijklmnopqrstuvwxyz");
|
| -
|
| - EXPECT_CALL(*this, WriteCallback(_))
|
| - .Times(AtLeast(1))
|
| - .WillRepeatedly(
|
| - WithArgs<0>(Invoke(this, &WebmMuxerTest::SaveEncodedDataLen)));
|
| - webm_muxer_.OnEncodedVideo(video_frame,
|
| - make_scoped_ptr(new std::string(encoded_data)),
|
| - base::TimeTicks::Now(),
|
| - false /* keyframe */);
|
| -
|
| - // 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_.OnEncodedVideo(video_frame,
|
| - make_scoped_ptr(new std::string(encoded_data)),
|
| - base::TimeTicks::Now(),
|
| - false /* keyframe */);
|
| -
|
| - // 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_);
|
| -}
|
| -
|
| -TEST_P(WebmMuxerTest, OnEncodedAudioTwoFrames) {
|
| - if (GetParam().num_video_tracks > 0)
|
| - return;
|
| -
|
| - const int sample_rate = 48000;
|
| - const int bits_per_sample = 16;
|
| - const 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_);
|
| -}
|
| -
|
| -// This test verifies that when video data comes before audio data, we save the
|
| -// encoded video frames and add it to the video track when audio data arrives.
|
| -TEST_P(WebmMuxerTest, VideoIsStoredWhileWaitingForAudio) {
|
| - // This test is only relevant if we have both kinds of tracks.
|
| - if (GetParam().num_video_tracks == 0 || GetParam().num_audio_tracks == 0)
|
| - return;
|
| -
|
| - // First send a video keyframe
|
| - const gfx::Size frame_size(160, 80);
|
| - const scoped_refptr<VideoFrame> video_frame =
|
| - VideoFrame::CreateBlackFrame(frame_size);
|
| - const std::string encoded_video("thisisanencodedvideopacket");
|
| - webm_muxer_.OnEncodedVideo(video_frame,
|
| - make_scoped_ptr(new std::string(encoded_video)),
|
| - base::TimeTicks::Now(), true /* keyframe */);
|
| - // A few encoded non key frames.
|
| - const int kNumNonKeyFrames = 2;
|
| - for (int i = 0; i < kNumNonKeyFrames; ++i) {
|
| - webm_muxer_.OnEncodedVideo(video_frame,
|
| - make_scoped_ptr(new std::string(encoded_video)),
|
| - base::TimeTicks::Now(), false /* keyframe */);
|
| - }
|
| -
|
| - // Send some audio. The header will be written and muxing will proceed
|
| - // normally.
|
| - const int sample_rate = 48000;
|
| - const int bits_per_sample = 16;
|
| - const 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_audio("thisisanencodedaudiopacket");
|
| -
|
| - // We should first get the encoded video frames, then the encoded audio frame.
|
| - Sequence s;
|
| - EXPECT_CALL(*this, WriteCallback(Eq(encoded_video)))
|
| - .Times(1 + kNumNonKeyFrames)
|
| - .InSequence(s);
|
| - EXPECT_CALL(*this, WriteCallback(Eq(encoded_audio))).Times(1).InSequence(s);
|
| - // We'll also get lots of other header-related stuff.
|
| - EXPECT_CALL(*this, WriteCallback(
|
| - AllOf(Not(Eq(encoded_video)), Not(Eq(encoded_audio)))))
|
| - .Times(AnyNumber());
|
| - webm_muxer_.OnEncodedAudio(audio_params,
|
| - make_scoped_ptr(new std::string(encoded_audio)),
|
| - base::TimeTicks::Now());
|
| -}
|
| -
|
| -const kTestParams kTestCases[] = {
|
| - // TODO: consider not enumerating every combination by hand.
|
| - {kCodecVP8, 1 /* num_video_tracks */, 0 /*num_audio_tracks*/},
|
| - {kCodecVP8, 0, 1},
|
| - {kCodecVP8, 1, 1},
|
| - {kCodecVP9, 1, 0},
|
| - {kCodecVP9, 0, 1},
|
| - {kCodecVP9, 1, 1},
|
| -};
|
| -
|
| -INSTANTIATE_TEST_CASE_P(, WebmMuxerTest, ValuesIn(kTestCases));
|
| -
|
| -} // namespace media
|
|
|