| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "media/mojo/common/mojo_decoder_buffer_converter.h" |
| 6 |
| 7 #include <stdint.h> |
| 8 |
| 9 #include <memory> |
| 10 |
| 11 #include "base/macros.h" |
| 12 #include "media/base/decoder_buffer.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 |
| 15 namespace media { |
| 16 |
| 17 namespace { |
| 18 |
| 19 scoped_refptr<DecoderBuffer> ConvertDecoderBufferAndBack( |
| 20 scoped_refptr<DecoderBuffer> buffer) { |
| 21 mojo::ScopedDataPipeConsumerHandle consumer_handle; |
| 22 std::unique_ptr<MojoDecoderBufferWriter> writer = |
| 23 MojoDecoderBufferWriter::Create(DemuxerStream::AUDIO, &consumer_handle); |
| 24 MojoDecoderBufferReader reader(std::move(consumer_handle)); |
| 25 |
| 26 // Convert from and back. |
| 27 mojom::DecoderBufferPtr mojo_buffer = writer->ConvertDecoderBuffer(buffer); |
| 28 return reader.ConvertDecoderBuffer(mojo_buffer); |
| 29 } |
| 30 |
| 31 void CompareDecoderBuffer(scoped_refptr<DecoderBuffer> a, |
| 32 scoped_refptr<DecoderBuffer> b) { |
| 33 EXPECT_EQ(a->end_of_stream(), b->end_of_stream()); |
| 34 // According to DecoderBuffer API, it is illegal to call any method when |
| 35 // end_of_stream() is true. |
| 36 if (a->end_of_stream()) |
| 37 return; |
| 38 |
| 39 EXPECT_EQ(a->timestamp(), b->timestamp()); |
| 40 EXPECT_EQ(a->duration(), b->duration()); |
| 41 EXPECT_EQ(a->is_key_frame(), b->is_key_frame()); |
| 42 EXPECT_EQ(a->splice_timestamp(), b->splice_timestamp()); |
| 43 EXPECT_EQ(a->discard_padding(), b->discard_padding()); |
| 44 |
| 45 EXPECT_EQ(a->data_size(), b->data_size()); |
| 46 if (a->data_size() > 0) |
| 47 EXPECT_EQ(0, memcmp(a->data(), b->data(), a->data_size())); |
| 48 |
| 49 EXPECT_EQ(a->side_data_size(), b->side_data_size()); |
| 50 if (a->side_data_size() > 0) |
| 51 EXPECT_EQ(0, memcmp(a->side_data(), b->side_data(), a->side_data_size())); |
| 52 |
| 53 EXPECT_EQ(a->decrypt_config() == nullptr, b->decrypt_config() == nullptr); |
| 54 if (a->decrypt_config()) |
| 55 EXPECT_TRUE(a->decrypt_config()->Matches(*b->decrypt_config())); |
| 56 } |
| 57 |
| 58 } // namespace |
| 59 |
| 60 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_Normal) { |
| 61 const uint8_t kData[] = "hello, world"; |
| 62 const uint8_t kSideData[] = "sideshow bob"; |
| 63 const size_t kDataSize = arraysize(kData); |
| 64 const size_t kSideDataSize = arraysize(kSideData); |
| 65 |
| 66 // Original. |
| 67 scoped_refptr<DecoderBuffer> buffer(DecoderBuffer::CopyFrom( |
| 68 reinterpret_cast<const uint8_t*>(&kData), kDataSize, |
| 69 reinterpret_cast<const uint8_t*>(&kSideData), kSideDataSize)); |
| 70 buffer->set_timestamp(base::TimeDelta::FromMilliseconds(123)); |
| 71 buffer->set_duration(base::TimeDelta::FromMilliseconds(456)); |
| 72 buffer->set_splice_timestamp(base::TimeDelta::FromMilliseconds(200)); |
| 73 buffer->set_discard_padding( |
| 74 DecoderBuffer::DiscardPadding(base::TimeDelta::FromMilliseconds(5), |
| 75 base::TimeDelta::FromMilliseconds(6))); |
| 76 |
| 77 scoped_refptr<DecoderBuffer> result = ConvertDecoderBufferAndBack(buffer); |
| 78 CompareDecoderBuffer(buffer, result); |
| 79 } |
| 80 |
| 81 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_EOS) { |
| 82 scoped_refptr<DecoderBuffer> buffer(DecoderBuffer::CreateEOSBuffer()); |
| 83 scoped_refptr<DecoderBuffer> result = ConvertDecoderBufferAndBack(buffer); |
| 84 CompareDecoderBuffer(buffer, result); |
| 85 } |
| 86 |
| 87 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_KeyFrame) { |
| 88 const uint8_t kData[] = "hello, world"; |
| 89 const size_t kDataSize = arraysize(kData); |
| 90 |
| 91 scoped_refptr<DecoderBuffer> buffer(DecoderBuffer::CopyFrom( |
| 92 reinterpret_cast<const uint8_t*>(&kData), kDataSize)); |
| 93 buffer->set_is_key_frame(true); |
| 94 EXPECT_TRUE(buffer->is_key_frame()); |
| 95 |
| 96 scoped_refptr<DecoderBuffer> result = ConvertDecoderBufferAndBack(buffer); |
| 97 CompareDecoderBuffer(buffer, result); |
| 98 } |
| 99 |
| 100 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_EncryptedBuffer) { |
| 101 const uint8_t kData[] = "hello, world"; |
| 102 const size_t kDataSize = arraysize(kData); |
| 103 const char kKeyId[] = "00112233445566778899aabbccddeeff"; |
| 104 const char kIv[] = "0123456789abcdef"; |
| 105 |
| 106 std::vector<SubsampleEntry> subsamples; |
| 107 subsamples.push_back(SubsampleEntry(10, 20)); |
| 108 subsamples.push_back(SubsampleEntry(30, 40)); |
| 109 subsamples.push_back(SubsampleEntry(50, 60)); |
| 110 |
| 111 scoped_refptr<DecoderBuffer> buffer(DecoderBuffer::CopyFrom( |
| 112 reinterpret_cast<const uint8_t*>(&kData), kDataSize)); |
| 113 buffer->set_decrypt_config( |
| 114 base::WrapUnique(new DecryptConfig(kKeyId, kIv, subsamples))); |
| 115 |
| 116 scoped_refptr<DecoderBuffer> result = ConvertDecoderBufferAndBack(buffer); |
| 117 CompareDecoderBuffer(buffer, result); |
| 118 |
| 119 // Test empty IV. This is used for clear buffer in an encrypted stream. |
| 120 buffer->set_decrypt_config(base::WrapUnique( |
| 121 new DecryptConfig(kKeyId, "", std::vector<SubsampleEntry>()))); |
| 122 result = ConvertDecoderBufferAndBack(buffer); |
| 123 CompareDecoderBuffer(buffer, result); |
| 124 } |
| 125 |
| 126 } // namespace media |
| OLD | NEW |