| Index: media/base/android/media_codec_bridge_impl_unittest.cc
|
| diff --git a/media/base/android/media_codec_bridge_impl_unittest.cc b/media/base/android/media_codec_bridge_impl_unittest.cc
|
| index c24f0b638a634947dcadeca6a7c6a8e825620e2f..b8e046bef282b1af96e4cd8c710c7594b7a7e95e 100644
|
| --- a/media/base/android/media_codec_bridge_impl_unittest.cc
|
| +++ b/media/base/android/media_codec_bridge_impl_unittest.cc
|
| @@ -9,12 +9,17 @@
|
| #include <string>
|
|
|
| #include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "media/base/android/media_codec_bridge_impl.h"
|
| #include "media/base/android/media_codec_util.h"
|
| #include "media/base/decoder_buffer.h"
|
| +#include "media/base/media_util.h"
|
| #include "media/base/test_data_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
|
|
| +using testing::IsNull;
|
| +using testing::NotNull;
|
| +
|
| namespace {
|
|
|
| // The first frame of
|
| @@ -111,7 +116,7 @@ static inline const base::TimeDelta InfiniteTimeOut() {
|
| return base::TimeDelta::FromMicroseconds(-1);
|
| }
|
|
|
| -void DecodeMediaFrame(VideoCodecBridge* media_codec,
|
| +void DecodeMediaFrame(MediaCodecBridge* media_codec,
|
| const uint8_t* data,
|
| size_t data_size,
|
| const base::TimeDelta input_presentation_timestamp,
|
| @@ -146,23 +151,32 @@ void DecodeMediaFrame(VideoCodecBridge* media_codec,
|
| }
|
| }
|
|
|
| -TEST(MediaCodecBridgeTest, Initialize) {
|
| +AudioDecoderConfig NewAudioConfig(
|
| + AudioCodec codec,
|
| + std::vector<uint8_t> extra_data = std::vector<uint8_t>(),
|
| + base::TimeDelta seek_preroll = base::TimeDelta(),
|
| + int64_t codec_delay = 0) {
|
| + AudioDecoderConfig config;
|
| + config.Initialize(codec, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, 44100,
|
| + extra_data, Unencrypted(), seek_preroll, codec_delay);
|
| + return config;
|
| +}
|
| +
|
| +TEST(MediaCodecBridgeTest, CreateH264Decoder) {
|
| SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE();
|
|
|
| - std::unique_ptr<media::MediaCodecBridge> media_codec;
|
| - media_codec.reset(VideoCodecBridge::CreateDecoder(
|
| + MediaCodecBridgeImpl::CreateVideoDecoder(
|
| kCodecH264, false, gfx::Size(640, 480), nullptr, nullptr,
|
| - std::vector<uint8_t>(), std::vector<uint8_t>()));
|
| + std::vector<uint8_t>(), std::vector<uint8_t>());
|
| }
|
|
|
| TEST(MediaCodecBridgeTest, DoNormal) {
|
| SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE();
|
|
|
| - std::unique_ptr<media::AudioCodecBridge> media_codec;
|
| - media_codec.reset(AudioCodecBridge::Create(kCodecMP3));
|
| -
|
| - ASSERT_TRUE(media_codec->ConfigureAndStart(kCodecMP3, 44100, 2, nullptr, 0, 0,
|
| - 0, nullptr));
|
| + std::unique_ptr<media::MediaCodecBridge> media_codec =
|
| + MediaCodecBridgeImpl::CreateAudioDecoder(NewAudioConfig(kCodecMP3),
|
| + nullptr);
|
| + ASSERT_THAT(media_codec, NotNull());
|
|
|
| int input_buf_index = -1;
|
| MediaCodecStatus status =
|
| @@ -193,7 +207,7 @@ TEST(MediaCodecBridgeTest, DoNormal) {
|
| &output_buf_index, &unused_offset,
|
| &size, ×tamp, &eos, nullptr);
|
| switch (status) {
|
| - case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER:
|
| + case MEDIA_CODEC_TRY_AGAIN_LATER:
|
| FAIL();
|
| return;
|
|
|
| @@ -217,65 +231,53 @@ TEST(MediaCodecBridgeTest, DoNormal) {
|
| TEST(MediaCodecBridgeTest, InvalidVorbisHeader) {
|
| SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE();
|
|
|
| - std::unique_ptr<media::AudioCodecBridge> media_codec;
|
| - media_codec.reset(AudioCodecBridge::Create(kCodecVorbis));
|
| -
|
| // The first byte of the header is not 0x02.
|
| - uint8_t invalid_first_byte[] = {0x00, 0xff, 0xff, 0xff, 0xff};
|
| - EXPECT_FALSE(media_codec->ConfigureAndStart(
|
| - kCodecVorbis, 44100, 2, invalid_first_byte, sizeof(invalid_first_byte), 0,
|
| - 0, nullptr));
|
| -
|
| - // Size of the header does not match with the data we passed in.
|
| - uint8_t invalid_size[] = {0x02, 0x01, 0xff, 0x01, 0xff};
|
| - EXPECT_FALSE(
|
| - media_codec->ConfigureAndStart(kCodecVorbis, 44100, 2, invalid_size,
|
| - sizeof(invalid_size), 0, 0, nullptr));
|
| + std::vector<uint8_t> invalid_first_byte = {{0x00, 0xff, 0xff, 0xff, 0xff}};
|
| + ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder(
|
| + NewAudioConfig(kCodecVorbis, invalid_first_byte), nullptr),
|
| + IsNull());
|
|
|
| // Size of the header is too large.
|
| size_t large_size = 8 * 1024 * 1024 + 2;
|
| - uint8_t* very_large_header = new uint8_t[large_size];
|
| - very_large_header[0] = 0x02;
|
| - for (size_t i = 1; i < large_size - 1; ++i)
|
| - very_large_header[i] = 0xff;
|
| - very_large_header[large_size - 1] = 0xfe;
|
| - EXPECT_FALSE(media_codec->ConfigureAndStart(
|
| - kCodecVorbis, 44100, 2, very_large_header, 0x80000000, 0, 0, nullptr));
|
| - delete[] very_large_header;
|
| + std::vector<uint8_t> large_header(large_size, 0xff);
|
| + large_header.front() = 0x02;
|
| + large_header.back() = 0xfe;
|
| + ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder(
|
| + NewAudioConfig(kCodecVorbis, large_header), nullptr),
|
| + IsNull());
|
| }
|
|
|
| TEST(MediaCodecBridgeTest, InvalidOpusHeader) {
|
| SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE();
|
|
|
| - std::unique_ptr<media::AudioCodecBridge> media_codec;
|
| - media_codec.reset(AudioCodecBridge::Create(kCodecOpus));
|
| - if (!media_codec)
|
| - return;
|
| -
|
| - uint8_t dummy_extra_data[] = {0, 0};
|
| -
|
| - // Extra Data is NULL.
|
| - EXPECT_FALSE(media_codec->ConfigureAndStart(kCodecOpus, 48000, 2, nullptr, 0,
|
| - -1, 0, nullptr));
|
| + std::vector<uint8_t> dummy_extra_data = {{0, 0}};
|
|
|
| // Codec Delay is < 0.
|
| - EXPECT_FALSE(
|
| - media_codec->ConfigureAndStart(kCodecOpus, 48000, 2, dummy_extra_data,
|
| - sizeof(dummy_extra_data), -1, 0, nullptr));
|
| + ASSERT_THAT(
|
| + MediaCodecBridgeImpl::CreateAudioDecoder(
|
| + NewAudioConfig(kCodecOpus, dummy_extra_data, base::TimeDelta(), -1),
|
| + nullptr),
|
| + IsNull());
|
|
|
| // Seek Preroll is < 0.
|
| - EXPECT_FALSE(
|
| - media_codec->ConfigureAndStart(kCodecOpus, 48000, 2, dummy_extra_data,
|
| - sizeof(dummy_extra_data), 0, -1, nullptr));
|
| + ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder(
|
| + NewAudioConfig(kCodecOpus, dummy_extra_data,
|
| + base::TimeDelta::FromMicroseconds(-1)),
|
| + nullptr),
|
| + IsNull());
|
| }
|
|
|
| TEST(MediaCodecBridgeTest, PresentationTimestampsDoNotDecrease) {
|
| - SKIP_TEST_IF_VP8_DECODER_IS_NOT_SUPPORTED();
|
| + if (!MediaCodecUtil::IsVp8DecoderAvailable()) {
|
| + VLOG(0) << "Could not run test - VP8 not supported on device.";
|
| + return;
|
| + }
|
|
|
| - std::unique_ptr<VideoCodecBridge> media_codec(VideoCodecBridge::CreateDecoder(
|
| - kCodecVP8, false, gfx::Size(320, 240), nullptr, nullptr,
|
| - std::vector<uint8_t>(), std::vector<uint8_t>()));
|
| - EXPECT_TRUE(media_codec.get());
|
| + std::unique_ptr<MediaCodecBridge> media_codec(
|
| + MediaCodecBridgeImpl::CreateVideoDecoder(
|
| + kCodecVP8, false, gfx::Size(320, 240), nullptr, nullptr,
|
| + std::vector<uint8_t>(), std::vector<uint8_t>()));
|
| + ASSERT_THAT(media_codec, NotNull());
|
| scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("vp8-I-frame-320x240");
|
| DecodeMediaFrame(media_codec.get(), buffer->data(), buffer->data_size(),
|
| base::TimeDelta(), base::TimeDelta());
|
| @@ -298,11 +300,13 @@ TEST(MediaCodecBridgeTest, PresentationTimestampsDoNotDecrease) {
|
| }
|
|
|
| TEST(MediaCodecBridgeTest, CreateUnsupportedCodec) {
|
| - EXPECT_EQ(nullptr, AudioCodecBridge::Create(kUnknownAudioCodec));
|
| - EXPECT_EQ(nullptr,
|
| - VideoCodecBridge::CreateDecoder(
|
| - kUnknownVideoCodec, false, gfx::Size(320, 240), nullptr,
|
| - nullptr, std::vector<uint8_t>(), std::vector<uint8_t>()));
|
| + EXPECT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder(
|
| + NewAudioConfig(kUnknownAudioCodec), nullptr),
|
| + IsNull());
|
| + EXPECT_THAT(MediaCodecBridgeImpl::CreateVideoDecoder(
|
| + kUnknownVideoCodec, false, gfx::Size(320, 240), nullptr,
|
| + nullptr, std::vector<uint8_t>(), std::vector<uint8_t>()),
|
| + IsNull());
|
| }
|
|
|
| } // namespace media
|
|
|