OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/logging.h" | 5 #include "base/logging.h" |
6 #include "media/base/buffers.h" | 6 #include "media/base/buffers.h" |
7 #include "media/base/channel_layout.h" | 7 #include "media/base/channel_layout.h" |
8 #include "media/formats/webm/tracks_builder.h" | 8 #include "media/formats/webm/tracks_builder.h" |
9 #include "media/formats/webm/webm_constants.h" | 9 #include "media/formats/webm/webm_constants.h" |
10 #include "media/formats/webm/webm_tracks_parser.h" | 10 #include "media/formats/webm/webm_tracks_parser.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 class WebMTracksParserTest : public testing::Test { | 22 class WebMTracksParserTest : public testing::Test { |
23 public: | 23 public: |
24 WebMTracksParserTest() {} | 24 WebMTracksParserTest() {} |
25 }; | 25 }; |
26 | 26 |
27 static void VerifyTextTrackInfo(const uint8* buffer, | 27 static void VerifyTextTrackInfo(const uint8* buffer, |
28 int buffer_size, | 28 int buffer_size, |
29 TextKind text_kind, | 29 TextKind text_kind, |
30 const std::string& name, | 30 const std::string& name, |
31 const std::string& language) { | 31 const std::string& language) { |
32 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), false)); | 32 scoped_ptr<WebMTracksParser> parser( |
| 33 new WebMTracksParser(new MediaLog(), false)); |
33 | 34 |
34 int result = parser->Parse(buffer, buffer_size); | 35 int result = parser->Parse(buffer, buffer_size); |
35 EXPECT_GT(result, 0); | 36 EXPECT_GT(result, 0); |
36 EXPECT_EQ(result, buffer_size); | 37 EXPECT_EQ(result, buffer_size); |
37 | 38 |
38 const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks(); | 39 const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks(); |
39 EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1)); | 40 EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1)); |
40 | 41 |
41 const WebMTracksParser::TextTracks::const_iterator itr = text_tracks.begin(); | 42 const WebMTracksParser::TextTracks::const_iterator itr = text_tracks.begin(); |
42 EXPECT_EQ(itr->first, 1); // track num | 43 EXPECT_EQ(itr->first, 1); // track num |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 } | 89 } |
89 | 90 |
90 TEST_F(WebMTracksParserTest, IgnoringTextTracks) { | 91 TEST_F(WebMTracksParserTest, IgnoringTextTracks) { |
91 InSequence s; | 92 InSequence s; |
92 | 93 |
93 TracksBuilder tb; | 94 TracksBuilder tb; |
94 tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Subtitles", "fre"); | 95 tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Subtitles", "fre"); |
95 tb.AddTextTrack(2, 2, kWebMCodecSubtitles, "Commentary", "fre"); | 96 tb.AddTextTrack(2, 2, kWebMCodecSubtitles, "Commentary", "fre"); |
96 | 97 |
97 const std::vector<uint8> buf = tb.Finish(); | 98 const std::vector<uint8> buf = tb.Finish(); |
98 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 99 scoped_ptr<WebMTracksParser> parser( |
| 100 new WebMTracksParser(new MediaLog(), true)); |
99 | 101 |
100 int result = parser->Parse(&buf[0], buf.size()); | 102 int result = parser->Parse(&buf[0], buf.size()); |
101 EXPECT_GT(result, 0); | 103 EXPECT_GT(result, 0); |
102 EXPECT_EQ(result, static_cast<int>(buf.size())); | 104 EXPECT_EQ(result, static_cast<int>(buf.size())); |
103 | 105 |
104 EXPECT_EQ(parser->text_tracks().size(), 0u); | 106 EXPECT_EQ(parser->text_tracks().size(), 0u); |
105 | 107 |
106 const std::set<int64>& ignored_tracks = parser->ignored_tracks(); | 108 const std::set<int64>& ignored_tracks = parser->ignored_tracks(); |
107 EXPECT_TRUE(ignored_tracks.find(1) != ignored_tracks.end()); | 109 EXPECT_TRUE(ignored_tracks.find(1) != ignored_tracks.end()); |
108 EXPECT_TRUE(ignored_tracks.find(2) != ignored_tracks.end()); | 110 EXPECT_TRUE(ignored_tracks.find(2) != ignored_tracks.end()); |
109 | 111 |
110 // Test again w/o ignoring the test tracks. | 112 // Test again w/o ignoring the test tracks. |
111 parser.reset(new WebMTracksParser(LogCB(), false)); | 113 parser.reset(new WebMTracksParser(new MediaLog(), false)); |
112 | 114 |
113 result = parser->Parse(&buf[0], buf.size()); | 115 result = parser->Parse(&buf[0], buf.size()); |
114 EXPECT_GT(result, 0); | 116 EXPECT_GT(result, 0); |
115 | 117 |
116 EXPECT_EQ(parser->ignored_tracks().size(), 0u); | 118 EXPECT_EQ(parser->ignored_tracks().size(), 0u); |
117 EXPECT_EQ(parser->text_tracks().size(), 2u); | 119 EXPECT_EQ(parser->text_tracks().size(), 2u); |
118 } | 120 } |
119 | 121 |
120 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationUnset) { | 122 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationUnset) { |
121 // Other audio/video decoder config fields are necessary in the test | 123 // Other audio/video decoder config fields are necessary in the test |
122 // audio/video TrackEntry configurations. This method does only very minimal | 124 // audio/video TrackEntry configurations. This method does only very minimal |
123 // verification of their inclusion and parsing; the goal is to confirm | 125 // verification of their inclusion and parsing; the goal is to confirm |
124 // TrackEntry DefaultDuration defaults to -1 if not included in audio or | 126 // TrackEntry DefaultDuration defaults to -1 if not included in audio or |
125 // video TrackEntry. | 127 // video TrackEntry. |
126 TracksBuilder tb; | 128 TracksBuilder tb; |
127 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", -1, 2, 8000); | 129 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", -1, 2, 8000); |
128 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", -1, 320, 240); | 130 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", -1, 320, 240); |
129 const std::vector<uint8> buf = tb.Finish(); | 131 const std::vector<uint8> buf = tb.Finish(); |
130 | 132 |
131 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 133 scoped_ptr<WebMTracksParser> parser( |
| 134 new WebMTracksParser(new MediaLog(), true)); |
132 int result = parser->Parse(&buf[0], buf.size()); | 135 int result = parser->Parse(&buf[0], buf.size()); |
133 EXPECT_LE(0, result); | 136 EXPECT_LE(0, result); |
134 EXPECT_EQ(static_cast<int>(buf.size()), result); | 137 EXPECT_EQ(static_cast<int>(buf.size()), result); |
135 | 138 |
136 EXPECT_EQ(kNoTimestamp(), | 139 EXPECT_EQ(kNoTimestamp(), |
137 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); | 140 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); |
138 EXPECT_EQ(kNoTimestamp(), | 141 EXPECT_EQ(kNoTimestamp(), |
139 parser->GetVideoDefaultDuration(kDefaultTimecodeScaleInUs)); | 142 parser->GetVideoDefaultDuration(kDefaultTimecodeScaleInUs)); |
140 | 143 |
141 const VideoDecoderConfig& video_config = parser->video_decoder_config(); | 144 const VideoDecoderConfig& video_config = parser->video_decoder_config(); |
142 EXPECT_TRUE(video_config.IsValidConfig()); | 145 EXPECT_TRUE(video_config.IsValidConfig()); |
143 EXPECT_EQ(320, video_config.coded_size().width()); | 146 EXPECT_EQ(320, video_config.coded_size().width()); |
144 EXPECT_EQ(240, video_config.coded_size().height()); | 147 EXPECT_EQ(240, video_config.coded_size().height()); |
145 | 148 |
146 const AudioDecoderConfig& audio_config = parser->audio_decoder_config(); | 149 const AudioDecoderConfig& audio_config = parser->audio_decoder_config(); |
147 EXPECT_TRUE(audio_config.IsValidConfig()); | 150 EXPECT_TRUE(audio_config.IsValidConfig()); |
148 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); | 151 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); |
149 EXPECT_EQ(8000, audio_config.samples_per_second()); | 152 EXPECT_EQ(8000, audio_config.samples_per_second()); |
150 } | 153 } |
151 | 154 |
152 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationSet) { | 155 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationSet) { |
153 // Confirm audio or video TrackEntry DefaultDuration values are parsed, if | 156 // Confirm audio or video TrackEntry DefaultDuration values are parsed, if |
154 // present. | 157 // present. |
155 TracksBuilder tb; | 158 TracksBuilder tb; |
156 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 12345678, 2, 8000); | 159 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 12345678, 2, 8000); |
157 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", 987654321, 320, 240); | 160 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", 987654321, 320, 240); |
158 const std::vector<uint8> buf = tb.Finish(); | 161 const std::vector<uint8> buf = tb.Finish(); |
159 | 162 |
160 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 163 scoped_ptr<WebMTracksParser> parser( |
| 164 new WebMTracksParser(new MediaLog(), true)); |
161 int result = parser->Parse(&buf[0], buf.size()); | 165 int result = parser->Parse(&buf[0], buf.size()); |
162 EXPECT_LE(0, result); | 166 EXPECT_LE(0, result); |
163 EXPECT_EQ(static_cast<int>(buf.size()), result); | 167 EXPECT_EQ(static_cast<int>(buf.size()), result); |
164 | 168 |
165 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12000), | 169 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12000), |
166 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); | 170 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); |
167 EXPECT_EQ(base::TimeDelta::FromMicroseconds(985000), | 171 EXPECT_EQ(base::TimeDelta::FromMicroseconds(985000), |
168 parser->GetVideoDefaultDuration(5000.0)); // 5 ms resolution | 172 parser->GetVideoDefaultDuration(5000.0)); // 5 ms resolution |
169 EXPECT_EQ(kNoTimestamp(), parser->GetAudioDefaultDuration(12346.0)); | 173 EXPECT_EQ(kNoTimestamp(), parser->GetAudioDefaultDuration(12346.0)); |
170 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12345), | 174 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12345), |
171 parser->GetAudioDefaultDuration(12345.0)); | 175 parser->GetAudioDefaultDuration(12345.0)); |
172 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12003), | 176 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12003), |
173 parser->GetAudioDefaultDuration(1000.3)); // 1.0003 ms resolution | 177 parser->GetAudioDefaultDuration(1000.3)); // 1.0003 ms resolution |
174 } | 178 } |
175 | 179 |
176 TEST_F(WebMTracksParserTest, InvalidZeroDefaultDurationSet) { | 180 TEST_F(WebMTracksParserTest, InvalidZeroDefaultDurationSet) { |
177 // Confirm parse error if TrackEntry DefaultDuration is present, but is 0ns. | 181 // Confirm parse error if TrackEntry DefaultDuration is present, but is 0ns. |
178 TracksBuilder tb(true); | 182 TracksBuilder tb(true); |
179 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 0, 2, 8000); | 183 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 0, 2, 8000); |
180 const std::vector<uint8> buf = tb.Finish(); | 184 const std::vector<uint8> buf = tb.Finish(); |
181 | 185 |
182 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 186 scoped_ptr<WebMTracksParser> parser( |
| 187 new WebMTracksParser(new MediaLog(), true)); |
183 EXPECT_EQ(-1, parser->Parse(&buf[0], buf.size())); | 188 EXPECT_EQ(-1, parser->Parse(&buf[0], buf.size())); |
184 } | 189 } |
185 | 190 |
186 TEST_F(WebMTracksParserTest, HighTrackUID) { | 191 TEST_F(WebMTracksParserTest, HighTrackUID) { |
187 // Confirm no parse error if TrackEntry TrackUID has MSb set | 192 // Confirm no parse error if TrackEntry TrackUID has MSb set |
188 // (http://crbug.com/397067). | 193 // (http://crbug.com/397067). |
189 TracksBuilder tb(true); | 194 TracksBuilder tb(true); |
190 tb.AddAudioTrack(1, 1ULL << 31, "A_VORBIS", "audio", "", 40, 2, 8000); | 195 tb.AddAudioTrack(1, 1ULL << 31, "A_VORBIS", "audio", "", 40, 2, 8000); |
191 const std::vector<uint8> buf = tb.Finish(); | 196 const std::vector<uint8> buf = tb.Finish(); |
192 | 197 |
193 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 198 scoped_ptr<WebMTracksParser> parser( |
| 199 new WebMTracksParser(new MediaLog(), true)); |
194 EXPECT_GT(parser->Parse(&buf[0], buf.size()),0); | 200 EXPECT_GT(parser->Parse(&buf[0], buf.size()),0); |
195 } | 201 } |
196 | 202 |
197 } // namespace media | 203 } // namespace media |
OLD | NEW |