Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: media/mojo/common/mojo_decoder_buffer_converter_unittest.cc

Issue 2096063003: media: Add MojoDecoderBuffer{Reader|Writer} (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments addressed Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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->WriteDecoderBuffer(buffer);
28 return reader.ReadDecoderBuffer(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
OLDNEW
« no previous file with comments | « media/mojo/common/mojo_decoder_buffer_converter.cc ('k') | media/mojo/services/mojo_audio_decoder_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698