Index: media/mojo/services/media_type_converters_unittest.cc |
diff --git a/media/mojo/services/media_type_converters_unittest.cc b/media/mojo/services/media_type_converters_unittest.cc |
index 38559f3c6be6ef50997628739fd93fbb031bcebd..dae82d4c86ef4137de3ad0239c6d0c93ed3d06e8 100644 |
--- a/media/mojo/services/media_type_converters_unittest.cc |
+++ b/media/mojo/services/media_type_converters_unittest.cc |
@@ -4,14 +4,87 @@ |
#include "media/mojo/services/media_type_converters.h" |
+#include <string.h> |
+ |
+#include "media/base/audio_buffer.h" |
#include "media/base/audio_decoder_config.h" |
#include "media/base/cdm_config.h" |
#include "media/base/decoder_buffer.h" |
#include "media/base/media_util.h" |
+#include "media/base/sample_format.h" |
+#include "media/base/test_helpers.h" |
+#include "media/base/video_frame.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace media { |
+namespace { |
+ |
+void CompareBytes(uint8* original_data, uint8* result_data, size_t length) { |
+ EXPECT_GT(length, 0u); |
+ EXPECT_EQ(memcmp(original_data, result_data, length), 0); |
+} |
+ |
+void CompareAudioBuffers(SampleFormat sample_format, |
+ const scoped_refptr<AudioBuffer>& original, |
+ const scoped_refptr<AudioBuffer>& result) { |
+ EXPECT_EQ(original->frame_count(), result->frame_count()); |
+ EXPECT_EQ(original->timestamp(), result->timestamp()); |
+ EXPECT_EQ(original->duration(), result->duration()); |
+ EXPECT_EQ(original->sample_rate(), result->sample_rate()); |
+ EXPECT_EQ(original->channel_count(), result->channel_count()); |
+ EXPECT_EQ(original->channel_layout(), result->channel_layout()); |
+ EXPECT_EQ(original->end_of_stream(), result->end_of_stream()); |
+ |
+ // Compare bytes in buffer. |
+ int bytes_per_channel = |
+ original->frame_count() * SampleFormatToBytesPerChannel(sample_format); |
+ if (IsPlanar(sample_format)) { |
+ for (int i = 0; i < original->channel_count(); ++i) { |
+ CompareBytes(original->channel_data()[i], result->channel_data()[i], |
+ bytes_per_channel); |
+ } |
+ return; |
+ } |
+ |
+ DCHECK(IsInterleaved(sample_format)) << sample_format; |
+ CompareBytes(original->channel_data()[0], result->channel_data()[0], |
+ bytes_per_channel * original->channel_count()); |
+} |
+ |
+void CompareVideoPlane(size_t plane, |
+ const scoped_refptr<VideoFrame>& original, |
+ const scoped_refptr<VideoFrame>& result) { |
+ EXPECT_EQ(original->stride(plane), result->stride(plane)); |
+ EXPECT_EQ(original->row_bytes(plane), result->row_bytes(plane)); |
+ EXPECT_EQ(original->rows(plane), result->rows(plane)); |
+ CompareBytes(original->data(plane), result->data(plane), |
+ original->rows(plane) * original->row_bytes(plane)); |
+} |
+ |
+void CompareVideoFrames(const scoped_refptr<VideoFrame>& original, |
+ const scoped_refptr<VideoFrame>& result) { |
+ if (original->metadata()->IsTrue(media::VideoFrameMetadata::END_OF_STREAM)) { |
+ EXPECT_TRUE( |
+ result->metadata()->IsTrue(media::VideoFrameMetadata::END_OF_STREAM)); |
+ return; |
+ } |
+ |
+ EXPECT_EQ(original->format(), result->format()); |
+ EXPECT_EQ(original->coded_size().height(), result->coded_size().height()); |
+ EXPECT_EQ(original->coded_size().width(), result->coded_size().width()); |
+ EXPECT_EQ(original->visible_rect().height(), result->visible_rect().height()); |
+ EXPECT_EQ(original->visible_rect().width(), result->visible_rect().width()); |
+ EXPECT_EQ(original->natural_size().height(), result->natural_size().height()); |
+ EXPECT_EQ(original->natural_size().width(), result->natural_size().width()); |
+ |
+ CompareVideoPlane(media::VideoFrame::kYPlane, original, result); |
+ CompareVideoPlane(media::VideoFrame::kUPlane, original, result); |
+ CompareVideoPlane(media::VideoFrame::kVPlane, original, result); |
+} |
+ |
+} // namespace |
+ |
TEST(MediaTypeConvertersTest, ConvertDecoderBuffer_Normal) { |
const uint8 kData[] = "hello, world"; |
const uint8 kSideData[] = "sideshow bob"; |
@@ -172,4 +245,88 @@ TEST(MediaTypeConvertersTest, ConvertCdmConfig) { |
EXPECT_EQ(config.use_hw_secure_codecs, result.use_hw_secure_codecs); |
} |
+TEST(MediaTypeConvertersTest, ConvertAudioBuffer_EOS) { |
+ // Original. |
+ scoped_refptr<AudioBuffer> buffer(AudioBuffer::CreateEOSBuffer()); |
+ |
+ // Convert to and back. |
+ interfaces::AudioBufferPtr ptr(interfaces::AudioBuffer::From(buffer)); |
+ scoped_refptr<AudioBuffer> result(ptr.To<scoped_refptr<AudioBuffer>>()); |
+ |
+ // Compare. |
+ EXPECT_TRUE(result->end_of_stream()); |
+} |
+ |
+TEST(MediaTypeConvertersTest, ConvertAudioBuffer_MONO) { |
+ // Original. |
+ const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_MONO; |
+ const int kSampleRate = 48000; |
+ scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>( |
+ kSampleFormatU8, kChannelLayout, |
+ ChannelLayoutToChannelCount(kChannelLayout), kSampleRate, 1, 1, |
+ kSampleRate / 100, base::TimeDelta()); |
+ |
+ // Convert to and back. |
+ interfaces::AudioBufferPtr ptr(interfaces::AudioBuffer::From(buffer)); |
+ scoped_refptr<AudioBuffer> result(ptr.To<scoped_refptr<AudioBuffer>>()); |
+ |
+ // Compare. |
+ CompareAudioBuffers(kSampleFormatU8, buffer, result); |
+} |
+ |
+TEST(MediaTypeConvertersTest, ConvertAudioBuffer_FLOAT) { |
+ // Original. |
+ const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_4_0; |
+ const int kSampleRate = 48000; |
+ const base::TimeDelta start_time = base::TimeDelta::FromSecondsD(1000.0); |
+ scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>( |
+ kSampleFormatPlanarF32, kChannelLayout, |
+ ChannelLayoutToChannelCount(kChannelLayout), kSampleRate, 0.0f, 1.0f, |
+ kSampleRate / 10, start_time); |
+ // Convert to and back. |
+ interfaces::AudioBufferPtr ptr(interfaces::AudioBuffer::From(buffer)); |
+ scoped_refptr<AudioBuffer> result(ptr.To<scoped_refptr<AudioBuffer>>()); |
+ |
+ // Compare. |
+ CompareAudioBuffers(kSampleFormatPlanarF32, buffer, result); |
+} |
+ |
+TEST(MediaTypeConvertersTest, ConvertVideoFrame_EOS) { |
+ // Original. |
+ scoped_refptr<VideoFrame> buffer(VideoFrame::CreateEOSFrame()); |
+ |
+ // Convert to and back. |
+ interfaces::VideoFramePtr ptr(interfaces::VideoFrame::From(buffer)); |
+ scoped_refptr<VideoFrame> result(ptr.To<scoped_refptr<VideoFrame>>()); |
+ |
+ // Compare. |
+ CompareVideoFrames(buffer, result); |
+} |
+ |
+TEST(MediaTypeConvertersTest, ConvertVideoFrame_BlackFrame) { |
+ // Original. |
+ scoped_refptr<VideoFrame> buffer( |
+ VideoFrame::CreateBlackFrame(gfx::Size(100, 100))); |
+ |
+ // Convert to and back. |
+ interfaces::VideoFramePtr ptr(interfaces::VideoFrame::From(buffer)); |
+ scoped_refptr<VideoFrame> result(ptr.To<scoped_refptr<VideoFrame>>()); |
+ |
+ // Compare. |
+ CompareVideoFrames(buffer, result); |
+} |
+ |
+TEST(MediaTypeConvertersTest, ConvertVideoFrame_ColorFrame) { |
+ // Original. |
+ scoped_refptr<VideoFrame> buffer(VideoFrame::CreateColorFrame( |
+ gfx::Size(50, 100), 255, 128, 128, base::TimeDelta::FromSeconds(26))); |
+ |
+ // Convert to and back. |
+ interfaces::VideoFramePtr ptr(interfaces::VideoFrame::From(buffer)); |
+ scoped_refptr<VideoFrame> result(ptr.To<scoped_refptr<VideoFrame>>()); |
+ |
+ // Compare. |
+ CompareVideoFrames(buffer, result); |
+} |
+ |
} // namespace media |