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

Side by Side Diff: media/filters/audio_decoder_selector_unittest.cc

Issue 2701203003: media: Prefer decrypting pipeline when CDM is attached (Closed)
Patch Set: comments addressed Created 3 years, 10 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
« no previous file with comments | « media/base/video_decoder_config.cc ('k') | media/filters/decoder_selector.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <stddef.h> 5 #include <stddef.h>
6 #include <utility> 6 #include <utility>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 StrictMock<MockAudioDecoder>* decoder_2_; 162 StrictMock<MockAudioDecoder>* decoder_2_;
163 ScopedVector<AudioDecoder> all_decoders_; 163 ScopedVector<AudioDecoder> all_decoders_;
164 std::unique_ptr<AudioDecoder> selected_decoder_; 164 std::unique_ptr<AudioDecoder> selected_decoder_;
165 165
166 base::MessageLoop message_loop_; 166 base::MessageLoop message_loop_;
167 167
168 private: 168 private:
169 DISALLOW_COPY_AND_ASSIGN(AudioDecoderSelectorTest); 169 DISALLOW_COPY_AND_ASSIGN(AudioDecoderSelectorTest);
170 }; 170 };
171 171
172 // TODO(xhwang): Add kNoCdm tests for clear stream. 172 // Tests for clear streams.
173 173
174 // The stream is not encrypted but we have no clear decoder. No decoder can be
175 // selected.
176 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_NoClearDecoder) { 174 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_NoClearDecoder) {
177 UseClearStream(); 175 UseClearStream();
178 InitializeDecoderSelector(kNoDecryptor, 0); 176 InitializeDecoderSelector(kNoDecryptor, 0);
179 177
180 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull())); 178 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
181 179
182 SelectDecoder(); 180 SelectDecoder();
183 } 181 }
184 182
185 // The stream is not encrypted and we have one clear decoder. The decoder 183 TEST_F(AudioDecoderSelectorTest, ClearStream_NoCdm_OneClearDecoder) {
186 // will be selected.
187 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
188 UseClearStream(); 184 UseClearStream();
189 InitializeDecoderSelector(kNoDecryptor, 1); 185 InitializeDecoderSelector(kNoCdm, 1);
190 186
191 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 187 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
192 .WillOnce(RunCallback<2>(true)); 188 .WillOnce(RunCallback<2>(true));
193 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull())); 189 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
194 190
195 SelectDecoder(); 191 SelectDecoder();
196 } 192 }
197 193
194 TEST_F(AudioDecoderSelectorTest, Destroy_ClearStream_NoCdm_OneClearDecoder) {
195 UseClearStream();
196 InitializeDecoderSelector(kNoCdm, 1);
197
198 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
199
200 SelectDecoderAndDestroy();
201 }
202
203 TEST_F(AudioDecoderSelectorTest, ClearStream_NoCdm_MultipleClearDecoder) {
204 UseClearStream();
205 InitializeDecoderSelector(kNoCdm, 2);
206
207 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
208 .WillOnce(RunCallback<2>(false));
209 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
210 .WillOnce(RunCallback<2>(true));
211 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
212
213 SelectDecoder();
214 }
215
216 TEST_F(AudioDecoderSelectorTest,
217 Destroy_ClearStream_NoCdm_MultipleClearDecoder) {
218 UseClearStream();
219 InitializeDecoderSelector(kNoCdm, 2);
220
221 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
222 .WillOnce(RunCallback<2>(false));
223 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
224
225 SelectDecoderAndDestroy();
226 }
227
228 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
229 UseClearStream();
230 InitializeDecoderSelector(kNoDecryptor, 1);
231
232 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
233 .WillOnce(RunCallback<2>(false));
234 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
235
236 SelectDecoder();
237 }
238
198 TEST_F(AudioDecoderSelectorTest, 239 TEST_F(AudioDecoderSelectorTest,
199 Destroy_ClearStream_NoDecryptor_OneClearDecoder) { 240 Destroy_ClearStream_NoDecryptor_OneClearDecoder) {
200 UseClearStream(); 241 UseClearStream();
201 InitializeDecoderSelector(kNoDecryptor, 1); 242 InitializeDecoderSelector(kNoDecryptor, 1);
202 243
203 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)); 244 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _));
204 245
205 SelectDecoderAndDestroy(); 246 SelectDecoderAndDestroy();
206 } 247 }
207 248
208 // The stream is not encrypted and we have multiple clear decoders. The first
209 // decoder that can decode the input stream will be selected.
210 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) { 249 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) {
211 UseClearStream(); 250 UseClearStream();
212 InitializeDecoderSelector(kNoDecryptor, 2); 251 InitializeDecoderSelector(kNoDecryptor, 2);
213 252
214 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 253 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
215 .WillOnce(RunCallback<2>(false)); 254 .WillOnce(RunCallback<2>(false));
216 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _)) 255 EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _))
217 .WillOnce(RunCallback<2>(true)); 256 .WillOnce(RunCallback<2>(true));
218 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull())); 257 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
219 258
220 SelectDecoder(); 259 SelectDecoder();
221 } 260 }
222 261
223 TEST_F(AudioDecoderSelectorTest, 262 TEST_F(AudioDecoderSelectorTest,
224 Destroy_ClearStream_NoDecryptor_MultipleClearDecoder) { 263 Destroy_ClearStream_NoDecryptor_MultipleClearDecoder) {
225 UseClearStream(); 264 UseClearStream();
226 InitializeDecoderSelector(kNoDecryptor, 2); 265 InitializeDecoderSelector(kNoDecryptor, 2);
227 266
228 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 267 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
229 .WillOnce(RunCallback<2>(false)); 268 .WillOnce(RunCallback<2>(false));
230 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _)); 269 EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _));
231 270
232 SelectDecoderAndDestroy(); 271 SelectDecoderAndDestroy();
233 } 272 }
234 273
235 // There is a decryptor but the stream is not encrypted. The decoder will be 274 TEST_F(AudioDecoderSelectorTest, ClearStream_DecryptOnly) {
236 // selected.
237 TEST_F(AudioDecoderSelectorTest, ClearStream_HasDecryptor) {
238 UseClearStream(); 275 UseClearStream();
239 InitializeDecoderSelector(kDecryptOnly, 1); 276 InitializeDecoderSelector(kDecryptOnly, 1);
240 277
241 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 278 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
242 .WillOnce(RunCallback<2>(true)); 279 .WillOnce(RunCallback<2>(true));
243 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull())); 280 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
244 281
245 SelectDecoder(); 282 SelectDecoder();
246 } 283 }
247 284
248 TEST_F(AudioDecoderSelectorTest, Destroy_ClearStream_HasDecryptor) { 285 TEST_F(AudioDecoderSelectorTest, Destroy_ClearStream_DecryptOnly) {
249 UseClearStream(); 286 UseClearStream();
250 InitializeDecoderSelector(kDecryptOnly, 1); 287 InitializeDecoderSelector(kDecryptOnly, 1);
251 288
252 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)); 289 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
253 290
254 SelectDecoderAndDestroy(); 291 SelectDecoderAndDestroy();
255 } 292 }
256 293
257 // The stream is encrypted and there's no decryptor. The decoder only supports 294 TEST_F(AudioDecoderSelectorTest, ClearStream_DecryptAndDecode) {
258 // clear streams so no decoder can be selected. 295 UseClearStream();
296 InitializeDecoderSelector(kDecryptAndDecode, 1);
297
298 #if !defined(OS_ANDROID)
299 // A DecryptingVideoDecoder will be created and selected. The clear decoder
300 // should not be touched at all. No DecryptingDemuxerStream should be
301 // created.
302 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), IsNull()));
303 #else
304 // A DecryptingDemuxerStream will be created. The clear decoder will be
305 // initialized and returned.
306 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
307 .WillOnce(RunCallback<2>(true));
308 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull()));
309 #endif
310
311 SelectDecoder();
312 }
313
314 // Tests for encrypted streams.
315
259 TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_OneClearDecoder) { 316 TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_OneClearDecoder) {
260 UseEncryptedStream(); 317 UseEncryptedStream();
261 InitializeDecoderSelector(kNoDecryptor, 1); 318 InitializeDecoderSelector(kNoDecryptor, 1);
262 319
263 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _)) 320 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
264 .WillOnce(RunCallback<2>(false)); 321 .WillOnce(RunCallback<2>(false));
265 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull())); 322 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
266 323
267 SelectDecoder(); 324 SelectDecoder();
268 } 325 }
269 326
270 TEST_F(AudioDecoderSelectorTest, 327 TEST_F(AudioDecoderSelectorTest,
271 Destroy_EncryptedStream_NoDecryptor_OneClearDecoder) { 328 Destroy_EncryptedStream_NoDecryptor_OneClearDecoder) {
272 UseEncryptedStream(); 329 UseEncryptedStream();
273 InitializeDecoderSelector(kNoDecryptor, 1); 330 InitializeDecoderSelector(kNoDecryptor, 1);
274 331
275 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _)); 332 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _));
276 333
277 SelectDecoderAndDestroy(); 334 SelectDecoderAndDestroy();
278 } 335 }
279 336
280 // The stream is encrypted and there's no decryptor. There are multiple decoders
281 // and the first one that supports encrypted streams is selected.
282 TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_MultipleDecoders) { 337 TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor_MultipleDecoders) {
283 UseEncryptedStream(); 338 UseEncryptedStream();
284 InitializeDecoderSelector(kNoDecryptor, 2); 339 InitializeDecoderSelector(kNoDecryptor, 2);
285 340
286 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _)) 341 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
287 .WillOnce(RunCallback<2>(false)); 342 .WillOnce(RunCallback<2>(false));
288 EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _)) 343 EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _))
289 .WillOnce(RunCallback<2>(true)); 344 .WillOnce(RunCallback<2>(true));
290 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull())); 345 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
291 346
292 SelectDecoder(); 347 SelectDecoder();
293 } 348 }
294 349
295 TEST_F(AudioDecoderSelectorTest, 350 TEST_F(AudioDecoderSelectorTest,
296 Destroy_EncryptedStream_NoDecryptor_MultipleDecoders) { 351 Destroy_EncryptedStream_NoDecryptor_MultipleDecoders) {
297 UseEncryptedStream(); 352 UseEncryptedStream();
298 InitializeDecoderSelector(kNoDecryptor, 2); 353 InitializeDecoderSelector(kNoDecryptor, 2);
299 354
300 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _)) 355 EXPECT_CALL(*decoder_1_, Initialize(EncryptedConfig(), _, _, _))
301 .WillOnce(RunCallback<2>(false)); 356 .WillOnce(RunCallback<2>(false));
302 EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _)); 357 EXPECT_CALL(*decoder_2_, Initialize(EncryptedConfig(), _, _, _));
303 358
304 SelectDecoderAndDestroy(); 359 SelectDecoderAndDestroy();
305 } 360 }
306 361
307 // Decryptor can only do decryption and there's no decoder available. No decoder
308 // can be selected.
309 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_NoClearDecoder) { 362 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_NoClearDecoder) {
310 UseEncryptedStream(); 363 UseEncryptedStream();
311 InitializeDecoderSelector(kDecryptOnly, 0); 364 InitializeDecoderSelector(kDecryptOnly, 0);
312 365
313 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull())); 366 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
314 367
315 SelectDecoder(); 368 SelectDecoder();
316 } 369 }
317 370
318 // Decryptor can do decryption-only and there's a decoder available. The decoder
319 // will be selected and a DecryptingDemuxerStream will be created.
320 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) { 371 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) {
321 UseEncryptedStream(); 372 UseEncryptedStream();
322 InitializeDecoderSelector(kDecryptOnly, 1); 373 InitializeDecoderSelector(kDecryptOnly, 1);
323 374
324 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 375 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
325 .WillOnce(RunCallback<2>(true)); 376 .WillOnce(RunCallback<2>(true));
326 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull())); 377 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
327 378
328 SelectDecoder(); 379 SelectDecoder();
329 } 380 }
330 381
331 TEST_F(AudioDecoderSelectorTest, 382 TEST_F(AudioDecoderSelectorTest,
332 Destroy_EncryptedStream_DecryptOnly_OneClearDecoder) { 383 Destroy_EncryptedStream_DecryptOnly_OneClearDecoder) {
333 UseEncryptedStream(); 384 UseEncryptedStream();
334 InitializeDecoderSelector(kDecryptOnly, 1); 385 InitializeDecoderSelector(kDecryptOnly, 1);
335 386
336 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)); 387 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _));
337 388
338 SelectDecoderAndDestroy(); 389 SelectDecoderAndDestroy();
339 } 390 }
340 391
341 // Decryptor can only do decryption and there are multiple decoders available.
342 // The first decoder that can decode the input stream will be selected and
343 // a DecryptingDemuxerStream will be created.
344 TEST_F(AudioDecoderSelectorTest, 392 TEST_F(AudioDecoderSelectorTest,
345 EncryptedStream_DecryptOnly_MultipleClearDecoder) { 393 EncryptedStream_DecryptOnly_MultipleClearDecoder) {
346 UseEncryptedStream(); 394 UseEncryptedStream();
347 InitializeDecoderSelector(kDecryptOnly, 2); 395 InitializeDecoderSelector(kDecryptOnly, 2);
348 396
349 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 397 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
350 .WillOnce(RunCallback<2>(false)); 398 .WillOnce(RunCallback<2>(false));
351 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _)) 399 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _))
352 .WillOnce(RunCallback<2>(true)); 400 .WillOnce(RunCallback<2>(true));
353 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull())); 401 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull()));
354 402
355 SelectDecoder(); 403 SelectDecoder();
356 } 404 }
357 405
358 TEST_F(AudioDecoderSelectorTest, 406 TEST_F(AudioDecoderSelectorTest,
359 Destroy_EncryptedStream_DecryptOnly_MultipleClearDecoder) { 407 Destroy_EncryptedStream_DecryptOnly_MultipleClearDecoder) {
360 UseEncryptedStream(); 408 UseEncryptedStream();
361 InitializeDecoderSelector(kDecryptOnly, 2); 409 InitializeDecoderSelector(kDecryptOnly, 2);
362 410
363 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 411 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
364 .WillOnce(RunCallback<2>(false)); 412 .WillOnce(RunCallback<2>(false));
365 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _)); 413 EXPECT_CALL(*decoder_2_, Initialize(ClearConfig(), _, _, _));
366 414
367 SelectDecoderAndDestroy(); 415 SelectDecoderAndDestroy();
368 } 416 }
369 417
370 // Decryptor can do decryption and decoding.
371 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptAndDecode) { 418 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptAndDecode) {
372 UseEncryptedStream(); 419 UseEncryptedStream();
373 InitializeDecoderSelector(kDecryptAndDecode, 1); 420 InitializeDecoderSelector(kDecryptAndDecode, 1);
374 421
375 #if !defined(OS_ANDROID) 422 #if !defined(OS_ANDROID)
376 // A DecryptingVideoDecoder will be created and selected. The clear decoder 423 // A DecryptingVideoDecoder will be created and selected. The clear decoder
377 // should not be touched at all. No DecryptingDemuxerStream should to be 424 // should not be touched at all. No DecryptingDemuxerStream should to be
378 // created. 425 // created.
379 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), IsNull())); 426 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), IsNull()));
380 #else 427 #else
381 // A DecryptingDemuxerStream will be created. The clear decoder will be 428 // A DecryptingDemuxerStream will be created. The clear decoder will be
382 // initialized and returned. 429 // initialized and returned.
383 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _)) 430 EXPECT_CALL(*decoder_1_, Initialize(ClearConfig(), _, _, _))
384 .WillOnce(RunCallback<2>(true)); 431 .WillOnce(RunCallback<2>(true));
385 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull())); 432 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), NotNull()));
386 #endif 433 #endif
387 434
388 SelectDecoder(); 435 SelectDecoder();
389 } 436 }
390 437
391 } // namespace media 438 } // namespace media
OLDNEW
« no previous file with comments | « media/base/video_decoder_config.cc ('k') | media/filters/decoder_selector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698