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

Side by Side Diff: content/common/gpu/media/video_decode_accelerator_unittest.cc

Issue 1816203003: Add an additional VDA::Flush() mode to return all allocated buffers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
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 // The bulk of this file is support code; sorry about that. Here's an overview 5 // The bulk of this file is support code; sorry about that. Here's an overview
6 // to hopefully help readers of this code: 6 // to hopefully help readers of this code:
7 // - RenderingHelper is charged with interacting with X11/{EGL/GLES2,GLX/GL} or 7 // - RenderingHelper is charged with interacting with X11/{EGL/GLES2,GLX/GL} or
8 // Win/EGL. 8 // Win/EGL.
9 // - ClientState is an enum for the state of the decode client used by the test. 9 // - ClientState is an enum for the state of the decode client used by the test.
10 // - ClientStateNotification is a barrier abstraction that allows the test code 10 // - ClientStateNotification is a barrier abstraction that allows the test code
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 // |delete_decoder_state| indicates when the underlying decoder should be 318 // |delete_decoder_state| indicates when the underlying decoder should be
319 // Destroy()'d and deleted and can take values: N<0: delete after -N Decode() 319 // Destroy()'d and deleted and can take values: N<0: delete after -N Decode()
320 // calls have been made, N>=0 means interpret as ClientState. 320 // calls have been made, N>=0 means interpret as ClientState.
321 // Both |reset_after_frame_num| & |delete_decoder_state| apply only to the 321 // Both |reset_after_frame_num| & |delete_decoder_state| apply only to the
322 // last play-through (governed by |num_play_throughs|). 322 // last play-through (governed by |num_play_throughs|).
323 // |suppress_rendering| indicates GL rendering is supressed or not. 323 // |suppress_rendering| indicates GL rendering is supressed or not.
324 // After |delay_reuse_after_frame_num| frame has been delivered, the client 324 // After |delay_reuse_after_frame_num| frame has been delivered, the client
325 // will start delaying the call to ReusePictureBuffer() for kReuseDelay. 325 // will start delaying the call to ReusePictureBuffer() for kReuseDelay.
326 // |decode_calls_per_second| is the number of VDA::Decode calls per second. 326 // |decode_calls_per_second| is the number of VDA::Decode calls per second.
327 // If |decode_calls_per_second| > 0, |num_in_flight_decodes| must be 1. 327 // If |decode_calls_per_second| > 0, |num_in_flight_decodes| must be 1.
328 // When |test_full_flush| is true, request the VDA to return all buffers it
329 // owns on Flush(), and verify that.
328 GLRenderingVDAClient(size_t window_id, 330 GLRenderingVDAClient(size_t window_id,
329 RenderingHelper* rendering_helper, 331 RenderingHelper* rendering_helper,
330 ClientStateNotification<ClientState>* note, 332 ClientStateNotification<ClientState>* note,
331 const std::string& encoded_data, 333 const std::string& encoded_data,
332 int num_in_flight_decodes, 334 int num_in_flight_decodes,
333 int num_play_throughs, 335 int num_play_throughs,
334 int reset_after_frame_num, 336 int reset_after_frame_num,
335 int delete_decoder_state, 337 int delete_decoder_state,
336 int frame_width, 338 int frame_width,
337 int frame_height, 339 int frame_height,
338 media::VideoCodecProfile profile, 340 media::VideoCodecProfile profile,
339 int fake_decoder, 341 int fake_decoder,
340 bool suppress_rendering, 342 bool suppress_rendering,
341 int delay_reuse_after_frame_num, 343 int delay_reuse_after_frame_num,
342 int decode_calls_per_second, 344 int decode_calls_per_second,
343 bool render_as_thumbnails); 345 bool render_as_thumbnails,
346 bool test_full_flush);
344 ~GLRenderingVDAClient() override; 347 ~GLRenderingVDAClient() override;
345 void CreateAndStartDecoder(); 348 void CreateAndStartDecoder();
346 349
347 // VideoDecodeAccelerator::Client implementation. 350 // VideoDecodeAccelerator::Client implementation.
348 // The heart of the Client. 351 // The heart of the Client.
349 void ProvidePictureBuffers(uint32_t requested_num_of_buffers, 352 void ProvidePictureBuffers(uint32_t requested_num_of_buffers,
350 uint32_t textures_per_buffer, 353 uint32_t textures_per_buffer,
351 const gfx::Size& dimensions, 354 const gfx::Size& dimensions,
352 uint32_t texture_target) override; 355 uint32_t texture_target) override;
353 void DismissPictureBuffer(int32_t picture_buffer_id) override; 356 void DismissPictureBuffer(int32_t picture_buffer_id) override;
(...skipping 14 matching lines...) Expand all
368 double frames_per_second(); 371 double frames_per_second();
369 // Return the median of the decode time of all decoded frames. 372 // Return the median of the decode time of all decoded frames.
370 base::TimeDelta decode_time_median(); 373 base::TimeDelta decode_time_median();
371 bool decoder_deleted() { return !decoder_.get(); } 374 bool decoder_deleted() { return !decoder_.get(); }
372 375
373 private: 376 private:
374 typedef std::map<int32_t, scoped_refptr<TextureRef>> TextureRefMap; 377 typedef std::map<int32_t, scoped_refptr<TextureRef>> TextureRefMap;
375 378
376 void SetState(ClientState new_state); 379 void SetState(ClientState new_state);
377 void FinishInitialization(); 380 void FinishInitialization();
381 void ReturnTexture(int32_t picture_buffer_id);
378 void ReturnPicture(int32_t picture_buffer_id); 382 void ReturnPicture(int32_t picture_buffer_id);
383 void CallReusePicture(int32_t picture_buffer_id);
384 void FinishFlush();
379 385
380 // Delete the associated decoder helper. 386 // Delete the associated decoder helper.
381 void DeleteDecoder(); 387 void DeleteDecoder();
382 388
383 // Compute & return the first encoded bytes (including a start frame) to send 389 // Compute & return the first encoded bytes (including a start frame) to send
384 // to the decoder, starting at |start_pos| and returning one fragment. Skips 390 // to the decoder, starting at |start_pos| and returning one fragment. Skips
385 // to the first decodable position. 391 // to the first decodable position.
386 std::string GetBytesForFirstFragment(size_t start_pos, size_t* end_pos); 392 std::string GetBytesForFirstFragment(size_t start_pos, size_t* end_pos);
387 // Compute & return the encoded bytes of next fragment to send to the decoder 393 // Compute & return the encoded bytes of next fragment to send to the decoder
388 // (based on |start_pos|). 394 // (based on |start_pos|).
(...skipping 21 matching lines...) Expand all
410 weak_vda_ptr_factory_; 416 weak_vda_ptr_factory_;
411 std::unique_ptr<GpuVideoDecodeAcceleratorFactoryImpl> vda_factory_; 417 std::unique_ptr<GpuVideoDecodeAcceleratorFactoryImpl> vda_factory_;
412 int remaining_play_throughs_; 418 int remaining_play_throughs_;
413 int reset_after_frame_num_; 419 int reset_after_frame_num_;
414 int delete_decoder_state_; 420 int delete_decoder_state_;
415 ClientState state_; 421 ClientState state_;
416 int num_skipped_fragments_; 422 int num_skipped_fragments_;
417 int num_queued_fragments_; 423 int num_queued_fragments_;
418 int num_decoded_frames_; 424 int num_decoded_frames_;
419 int num_done_bitstream_buffers_; 425 int num_done_bitstream_buffers_;
426 int num_pictures_at_decoder_;
420 base::TimeTicks initialize_done_ticks_; 427 base::TimeTicks initialize_done_ticks_;
421 media::VideoCodecProfile profile_; 428 media::VideoCodecProfile profile_;
422 int fake_decoder_; 429 int fake_decoder_;
423 GLenum texture_target_; 430 GLenum texture_target_;
424 bool suppress_rendering_; 431 bool suppress_rendering_;
425 std::vector<base::TimeTicks> frame_delivery_times_; 432 std::vector<base::TimeTicks> frame_delivery_times_;
426 int delay_reuse_after_frame_num_; 433 int delay_reuse_after_frame_num_;
427 // A map from bitstream buffer id to the decode start time of the buffer. 434 // A map from bitstream buffer id to the decode start time of the buffer.
428 std::map<int, base::TimeTicks> decode_start_time_; 435 std::map<int, base::TimeTicks> decode_start_time_;
429 // The decode time of all decoded frames. 436 // The decode time of all decoded frames.
430 std::vector<base::TimeDelta> decode_time_; 437 std::vector<base::TimeDelta> decode_time_;
431 // The number of VDA::Decode calls per second. This is to simulate webrtc. 438 // The number of VDA::Decode calls per second. This is to simulate webrtc.
432 int decode_calls_per_second_; 439 int decode_calls_per_second_;
433 bool render_as_thumbnails_; 440 bool render_as_thumbnails_;
441 bool test_full_flush_;
434 442
435 // A map of the textures that are currently active for the decoder, i.e., 443 // A map of the textures that are currently active for the decoder, i.e.,
436 // have been created via AssignPictureBuffers() and not dismissed via 444 // have been created via AssignPictureBuffers() and not dismissed via
437 // DismissPictureBuffer(). The keys in the map are the IDs of the 445 // DismissPictureBuffer(). The keys in the map are the IDs of the
438 // corresponding picture buffers, and the values are TextureRefs to the 446 // corresponding picture buffers, and the values are TextureRefs to the
439 // textures. 447 // textures.
440 TextureRefMap active_textures_; 448 TextureRefMap active_textures_;
441 449
442 // A map of the textures that are still pending in the renderer. 450 // A map of the textures that are still pending in the renderer.
443 // We check this to ensure all frames are rendered before entering the 451 // We check this to ensure all frames are rendered before entering the
(...skipping 28 matching lines...) Expand all
472 int num_play_throughs, 480 int num_play_throughs,
473 int reset_after_frame_num, 481 int reset_after_frame_num,
474 int delete_decoder_state, 482 int delete_decoder_state,
475 int frame_width, 483 int frame_width,
476 int frame_height, 484 int frame_height,
477 media::VideoCodecProfile profile, 485 media::VideoCodecProfile profile,
478 int fake_decoder, 486 int fake_decoder,
479 bool suppress_rendering, 487 bool suppress_rendering,
480 int delay_reuse_after_frame_num, 488 int delay_reuse_after_frame_num,
481 int decode_calls_per_second, 489 int decode_calls_per_second,
482 bool render_as_thumbnails) 490 bool render_as_thumbnails,
491 bool test_full_flush)
483 : window_id_(window_id), 492 : window_id_(window_id),
484 rendering_helper_(rendering_helper), 493 rendering_helper_(rendering_helper),
485 frame_size_(frame_width, frame_height), 494 frame_size_(frame_width, frame_height),
486 encoded_data_(encoded_data), 495 encoded_data_(encoded_data),
487 num_in_flight_decodes_(num_in_flight_decodes), 496 num_in_flight_decodes_(num_in_flight_decodes),
488 outstanding_decodes_(0), 497 outstanding_decodes_(0),
489 encoded_data_next_pos_to_decode_(0), 498 encoded_data_next_pos_to_decode_(0),
490 next_bitstream_buffer_id_(0), 499 next_bitstream_buffer_id_(0),
491 note_(note), 500 note_(note),
492 remaining_play_throughs_(num_play_throughs), 501 remaining_play_throughs_(num_play_throughs),
493 reset_after_frame_num_(reset_after_frame_num), 502 reset_after_frame_num_(reset_after_frame_num),
494 delete_decoder_state_(delete_decoder_state), 503 delete_decoder_state_(delete_decoder_state),
495 state_(CS_CREATED), 504 state_(CS_CREATED),
496 num_skipped_fragments_(0), 505 num_skipped_fragments_(0),
497 num_queued_fragments_(0), 506 num_queued_fragments_(0),
498 num_decoded_frames_(0), 507 num_decoded_frames_(0),
499 num_done_bitstream_buffers_(0), 508 num_done_bitstream_buffers_(0),
509 num_pictures_at_decoder_(0),
500 fake_decoder_(fake_decoder), 510 fake_decoder_(fake_decoder),
501 texture_target_(0), 511 texture_target_(0),
502 suppress_rendering_(suppress_rendering), 512 suppress_rendering_(suppress_rendering),
503 delay_reuse_after_frame_num_(delay_reuse_after_frame_num), 513 delay_reuse_after_frame_num_(delay_reuse_after_frame_num),
504 decode_calls_per_second_(decode_calls_per_second), 514 decode_calls_per_second_(decode_calls_per_second),
505 render_as_thumbnails_(render_as_thumbnails), 515 render_as_thumbnails_(render_as_thumbnails),
516 test_full_flush_(test_full_flush),
506 next_picture_buffer_id_(1), 517 next_picture_buffer_id_(1),
507 weak_this_factory_(this) { 518 weak_this_factory_(this) {
508 LOG_ASSERT(num_in_flight_decodes > 0); 519 LOG_ASSERT(num_in_flight_decodes > 0);
509 LOG_ASSERT(num_play_throughs > 0); 520 LOG_ASSERT(num_play_throughs > 0);
510 // |num_in_flight_decodes_| is unsupported if |decode_calls_per_second_| > 0. 521 // |num_in_flight_decodes_| is unsupported if |decode_calls_per_second_| > 0.
511 if (decode_calls_per_second_ > 0) 522 if (decode_calls_per_second_ > 0)
512 LOG_ASSERT(1 == num_in_flight_decodes_); 523 LOG_ASSERT(1 == num_in_flight_decodes_);
513 524
514 // Default to H264 baseline if no profile provided. 525 // Default to H264 baseline if no profile provided.
515 profile_ = (profile != media::VIDEO_CODEC_PROFILE_UNKNOWN 526 profile_ = (profile != media::VIDEO_CODEC_PROFILE_UNKNOWN
516 ? profile 527 ? profile
517 : media::H264PROFILE_BASELINE); 528 : media::H264PROFILE_BASELINE);
518 529
519 weak_this_ = weak_this_factory_.GetWeakPtr(); 530 weak_this_ = weak_this_factory_.GetWeakPtr();
520 } 531 }
521 532
522 GLRenderingVDAClient::~GLRenderingVDAClient() { 533 GLRenderingVDAClient::~GLRenderingVDAClient() {
523 DeleteDecoder(); // Clean up in case of expected error. 534 DeleteDecoder(); // Clean up in case of expected error.
524 LOG_ASSERT(decoder_deleted()); 535 LOG_ASSERT(decoder_deleted());
525 SetState(CS_DESTROYED); 536 SetState(CS_DESTROYED);
526 } 537 }
527 538
528 void GLRenderingVDAClient::CreateAndStartDecoder() { 539 void GLRenderingVDAClient::CreateAndStartDecoder() {
529 LOG_ASSERT(decoder_deleted()); 540 LOG_ASSERT(decoder_deleted());
530 LOG_ASSERT(!decoder_.get()); 541 LOG_ASSERT(!decoder_.get());
531 542
543 VideoDecodeAccelerator::Config config(profile_);
544 config.output_mode =
545 (g_test_import
546 ? media::VideoDecodeAccelerator::Config::OutputMode::IMPORT
547 : media::VideoDecodeAccelerator::Config::OutputMode::ALLOCATE);
548 config.flush_mode =
549 (test_full_flush_ ? media::VideoDecodeAccelerator::Config::FlushMode::
550 RETURN_OUTPUT_BUFFERS
551 : media::VideoDecodeAccelerator::Config::FlushMode::
552 KEEP_OUTPUT_BUFFERS);
532 if (fake_decoder_) { 553 if (fake_decoder_) {
533 decoder_.reset(new FakeVideoDecodeAccelerator( 554 decoder_.reset(new FakeVideoDecodeAccelerator(
534 frame_size_, base::Bind(&DoNothingReturnTrue))); 555 frame_size_, base::Bind(&DoNothingReturnTrue)));
535 LOG_ASSERT(decoder_->Initialize(profile_, this)); 556 LOG_ASSERT(decoder_->Initialize(config, this));
536 } else { 557 } else {
537 if (!vda_factory_) { 558 if (!vda_factory_) {
538 vda_factory_ = GpuVideoDecodeAcceleratorFactoryImpl::Create( 559 vda_factory_ = GpuVideoDecodeAcceleratorFactoryImpl::Create(
539 base::Bind(&RenderingHelper::GetGLContext, 560 base::Bind(&RenderingHelper::GetGLContext,
540 base::Unretained(rendering_helper_)), 561 base::Unretained(rendering_helper_)),
541 base::Bind(&DoNothingReturnTrue), base::Bind(&DummyBindImage)); 562 base::Bind(&DoNothingReturnTrue), base::Bind(&DummyBindImage));
542 LOG_ASSERT(vda_factory_); 563 LOG_ASSERT(vda_factory_);
543 } 564 }
544 565
545 VideoDecodeAccelerator::Config config(profile_);
546 if (g_test_import) {
547 config.output_mode =
548 media::VideoDecodeAccelerator::Config::OutputMode::IMPORT;
549 }
550 gpu::GpuPreferences gpu_preferences; 566 gpu::GpuPreferences gpu_preferences;
551 decoder_ = vda_factory_->CreateVDA(this, config, gpu_preferences); 567 decoder_ = vda_factory_->CreateVDA(this, config, gpu_preferences);
552 } 568 }
553 569
554 LOG_ASSERT(decoder_) << "Failed creating a VDA"; 570 LOG_ASSERT(decoder_) << "Failed creating a VDA";
571 weak_vda_ptr_factory_.reset(
572 new base::WeakPtrFactory<VideoDecodeAccelerator>(decoder_.get()));
573 weak_vda_ = weak_vda_ptr_factory_->GetWeakPtr();
555 574
556 decoder_->TryToSetupDecodeOnSeparateThread( 575 decoder_->TryToSetupDecodeOnSeparateThread(
557 weak_this_, base::ThreadTaskRunnerHandle::Get()); 576 weak_this_, base::ThreadTaskRunnerHandle::Get());
558 577
559 SetState(CS_DECODER_SET); 578 SetState(CS_DECODER_SET);
560 FinishInitialization(); 579 FinishInitialization();
561 } 580 }
562 581
563 namespace { 582 namespace {
564 gfx::BufferFormat VideoPixelFormatToGfxBufferFormat( 583 gfx::BufferFormat VideoPixelFormatToGfxBufferFormat(
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 int duped_fd = HANDLE_EINTR(dup(pixmap->GetDmaBufFd())); 657 int duped_fd = HANDLE_EINTR(dup(pixmap->GetDmaBufFd()));
639 ASSERT_NE(duped_fd, -1); 658 ASSERT_NE(duped_fd, -1);
640 gfx::GpuMemoryBufferHandle handle; 659 gfx::GpuMemoryBufferHandle handle;
641 handle.type = gfx::OZONE_NATIVE_PIXMAP; 660 handle.type = gfx::OZONE_NATIVE_PIXMAP;
642 handle.native_pixmap_handle.fd = base::FileDescriptor(duped_fd, true); 661 handle.native_pixmap_handle.fd = base::FileDescriptor(duped_fd, true);
643 std::vector<gfx::GpuMemoryBufferHandle> handles; 662 std::vector<gfx::GpuMemoryBufferHandle> handles;
644 handles.push_back(handle); 663 handles.push_back(handle);
645 decoder_->ImportBufferForPicture(buffer.id(), handles); 664 decoder_->ImportBufferForPicture(buffer.id(), handles);
646 } 665 }
647 } 666 }
667
668 num_pictures_at_decoder_ = buffers.size();
648 } 669 }
649 670
650 void GLRenderingVDAClient::DismissPictureBuffer(int32_t picture_buffer_id) { 671 void GLRenderingVDAClient::DismissPictureBuffer(int32_t picture_buffer_id) {
651 LOG_ASSERT(1U == active_textures_.erase(picture_buffer_id)); 672 LOG_ASSERT(1U == active_textures_.erase(picture_buffer_id));
673 EXPECT_GT(num_pictures_at_decoder_, 0);
674 --num_pictures_at_decoder_;
652 } 675 }
653 676
654 void GLRenderingVDAClient::PictureReady(const media::Picture& picture) { 677 void GLRenderingVDAClient::PictureReady(const media::Picture& picture) {
655 // We shouldn't be getting pictures delivered after Reset has completed. 678 // We shouldn't be getting pictures delivered after Reset has completed.
656 LOG_ASSERT(state_ < CS_RESET); 679 LOG_ASSERT(state_ < CS_RESET);
657 680
658 if (decoder_deleted()) 681 if (decoder_deleted())
659 return; 682 return;
660 683
684 EXPECT_GT(num_pictures_at_decoder_, 0);
685 --num_pictures_at_decoder_;
686
687 if (picture.bitstream_buffer_id() == -1) {
688 // The picture does not contain any decoded data, reuse it immediately.
689 ReturnPicture(picture.picture_buffer_id());
690 return;
691 }
692
661 base::TimeTicks now = base::TimeTicks::Now(); 693 base::TimeTicks now = base::TimeTicks::Now();
662 694
663 frame_delivery_times_.push_back(now); 695 frame_delivery_times_.push_back(now);
664 696
665 // Save the decode time of this picture. 697 // Save the decode time of this picture.
666 std::map<int, base::TimeTicks>::iterator it = 698 std::map<int, base::TimeTicks>::iterator it =
667 decode_start_time_.find(picture.bitstream_buffer_id()); 699 decode_start_time_.find(picture.bitstream_buffer_id());
668 ASSERT_NE(decode_start_time_.end(), it); 700 ASSERT_NE(decode_start_time_.end(), it);
669 decode_time_.push_back(now - it->second); 701 decode_time_.push_back(now - it->second);
670 decode_start_time_.erase(it); 702 decode_start_time_.erase(it);
(...skipping 11 matching lines...) Expand all
682 // know how to find I-frames and so on in this test. 714 // know how to find I-frames and so on in this test.
683 encoded_data_next_pos_to_decode_ = 0; 715 encoded_data_next_pos_to_decode_ = 0;
684 } 716 }
685 717
686 TextureRefMap::iterator texture_it = 718 TextureRefMap::iterator texture_it =
687 active_textures_.find(picture.picture_buffer_id()); 719 active_textures_.find(picture.picture_buffer_id());
688 ASSERT_NE(active_textures_.end(), texture_it); 720 ASSERT_NE(active_textures_.end(), texture_it);
689 721
690 scoped_refptr<VideoFrameTexture> video_frame = new VideoFrameTexture( 722 scoped_refptr<VideoFrameTexture> video_frame = new VideoFrameTexture(
691 texture_target_, texture_it->second->texture_id(), 723 texture_target_, texture_it->second->texture_id(),
692 base::Bind(&GLRenderingVDAClient::ReturnPicture, AsWeakPtr(), 724 base::Bind(&GLRenderingVDAClient::ReturnTexture, AsWeakPtr(),
693 picture.picture_buffer_id())); 725 picture.picture_buffer_id()));
694 ASSERT_TRUE(pending_textures_.insert(*texture_it).second); 726 ASSERT_TRUE(pending_textures_.insert(*texture_it).second);
695 727
696 if (render_as_thumbnails_) { 728 if (render_as_thumbnails_) {
697 rendering_helper_->RenderThumbnail(video_frame->texture_target(), 729 rendering_helper_->RenderThumbnail(video_frame->texture_target(),
698 video_frame->texture_id()); 730 video_frame->texture_id());
699 } else if (!suppress_rendering_) { 731 } else if (!suppress_rendering_) {
700 rendering_helper_->QueueVideoFrame(window_id_, video_frame); 732 rendering_helper_->QueueVideoFrame(window_id_, video_frame);
701 } 733 }
702 } 734 }
703 735
704 void GLRenderingVDAClient::ReturnPicture(int32_t picture_buffer_id) { 736 void GLRenderingVDAClient::ReturnTexture(int32_t picture_buffer_id) {
705 if (decoder_deleted()) 737 if (decoder_deleted())
706 return; 738 return;
739
707 LOG_ASSERT(1U == pending_textures_.erase(picture_buffer_id)); 740 LOG_ASSERT(1U == pending_textures_.erase(picture_buffer_id));
708 741
709 if (pending_textures_.empty() && state_ == CS_RESETTING) { 742 if (pending_textures_.empty() && state_ == CS_RESETTING) {
710 SetState(CS_RESET); 743 SetState(CS_RESET);
711 DeleteDecoder(); 744 DeleteDecoder();
712 return; 745 return;
713 } 746 }
714 747
748 ReturnPicture(picture_buffer_id);
749 }
750
751 void GLRenderingVDAClient::CallReusePicture(int32_t picture_buffer_id) {
752 if (state_ == CS_FLUSHED && test_full_flush_) {
753 // If we just got a notification from the VDA that it's flushed and are
754 // testing full flush, we want to have a chance to test that VDA really
755 // returned all buffers before NotifyFlushDone(). Delay returning the buffer
756 // so that we have a chance in FinishFlush() to test we got all the buffers.
757 base::MessageLoop::current()->PostTask(
758 FROM_HERE, base::Bind(&GLRenderingVDAClient::CallReusePicture,
759 weak_this_, picture_buffer_id));
760 return;
761 }
762
763 if (weak_vda_)
764 weak_vda_->ReusePictureBuffer(picture_buffer_id);
765 ++num_pictures_at_decoder_;
766 }
767
768 void GLRenderingVDAClient::ReturnPicture(int32_t picture_buffer_id) {
715 if (num_decoded_frames_ > delay_reuse_after_frame_num_) { 769 if (num_decoded_frames_ > delay_reuse_after_frame_num_) {
716 base::MessageLoop::current()->PostDelayedTask( 770 base::MessageLoop::current()->PostDelayedTask(
717 FROM_HERE, base::Bind(&VideoDecodeAccelerator::ReusePictureBuffer, 771 FROM_HERE, base::Bind(&GLRenderingVDAClient::CallReusePicture,
718 weak_vda_, picture_buffer_id), 772 weak_this_, picture_buffer_id),
719 kReuseDelay); 773 kReuseDelay);
720 } else { 774 } else {
721 decoder_->ReusePictureBuffer(picture_buffer_id); 775 base::MessageLoop::current()->PostTask(
776 FROM_HERE, base::Bind(&GLRenderingVDAClient::CallReusePicture,
777 weak_this_, picture_buffer_id));
722 } 778 }
723 } 779 }
724 780
725 void GLRenderingVDAClient::NotifyEndOfBitstreamBuffer( 781 void GLRenderingVDAClient::NotifyEndOfBitstreamBuffer(
726 int32_t bitstream_buffer_id) { 782 int32_t bitstream_buffer_id) {
727 // TODO(fischman): this test currently relies on this notification to make 783 // TODO(fischman): this test currently relies on this notification to make
728 // forward progress during a Reset(). But the VDA::Reset() API doesn't 784 // forward progress during a Reset(). But the VDA::Reset() API doesn't
729 // guarantee this, so stop relying on it (and remove the notifications from 785 // guarantee this, so stop relying on it (and remove the notifications from
730 // VaapiVideoDecodeAccelerator::FinishReset()). 786 // VaapiVideoDecodeAccelerator::FinishReset()).
731 ++num_done_bitstream_buffers_; 787 ++num_done_bitstream_buffers_;
732 --outstanding_decodes_; 788 --outstanding_decodes_;
733 789
734 // Flush decoder after all BitstreamBuffers are processed. 790 // Flush decoder after all BitstreamBuffers are processed.
735 if (encoded_data_next_pos_to_decode_ == encoded_data_.size()) { 791 if (encoded_data_next_pos_to_decode_ == encoded_data_.size()) {
736 // TODO(owenlin): We should not have to check the number of 792 // TODO(owenlin): We should not have to check the number of
737 // |outstanding_decodes_|. |decoder_| should be able to accept Flush() 793 // |outstanding_decodes_|. |decoder_| should be able to accept Flush()
738 // before it's done with outstanding decodes. (crbug.com/528183) 794 // before it's done with outstanding decodes. (crbug.com/528183)
739 if (outstanding_decodes_ == 0) { 795 if (outstanding_decodes_ == 0) {
740 decoder_->Flush(); 796 decoder_->Flush();
741 SetState(CS_FLUSHING); 797 SetState(CS_FLUSHING);
742 } 798 }
743 } else if (decode_calls_per_second_ == 0) { 799 } else if (decode_calls_per_second_ == 0) {
744 DecodeNextFragment(); 800 DecodeNextFragment();
745 } 801 }
746 } 802 }
747 803
748 void GLRenderingVDAClient::NotifyFlushDone() { 804 void GLRenderingVDAClient::FinishFlush() {
749 if (decoder_deleted()) 805 ASSERT_EQ(CS_FLUSHED, state_);
750 return; 806 if (test_full_flush_)
807 EXPECT_EQ(0, num_pictures_at_decoder_);
751 808
752 SetState(CS_FLUSHED);
753 --remaining_play_throughs_; 809 --remaining_play_throughs_;
754 DCHECK_GE(remaining_play_throughs_, 0); 810 DCHECK_GE(remaining_play_throughs_, 0);
755 if (decoder_deleted()) 811 if (decoder_deleted())
756 return; 812 return;
757 decoder_->Reset(); 813 decoder_->Reset();
758 SetState(CS_RESETTING); 814 SetState(CS_RESETTING);
759 } 815 }
760 816
817 void GLRenderingVDAClient::NotifyFlushDone() {
818 if (decoder_deleted())
819 return;
820
821 ASSERT_EQ(CS_FLUSHING, state_);
822 SetState(CS_FLUSHED);
823
824 // We may have already posted some ReusePictureBuffer() calls before we got
825 // here. If we are testing RETURN_OUTPUT_BUFFERS flush mode, make sure we
826 // don't execute them returning the buffers to VDA until we have a chance
827 // to verify the VDA really returned all the buffers before finishing flush.
828 // Otherwise, we don't care and can continue without holding off any pending
829 // ReusePictureBuffer() calls
830 if (test_full_flush_) {
831 base::MessageLoop::current()->PostTask(
832 FROM_HERE, base::Bind(&GLRenderingVDAClient::FinishFlush, weak_this_));
833 } else {
834 FinishFlush();
835 }
836 }
837
761 void GLRenderingVDAClient::NotifyResetDone() { 838 void GLRenderingVDAClient::NotifyResetDone() {
762 if (decoder_deleted()) 839 if (decoder_deleted())
763 return; 840 return;
764 841
765 if (reset_after_frame_num_ == MID_STREAM_RESET) { 842 if (reset_after_frame_num_ == MID_STREAM_RESET) {
766 reset_after_frame_num_ = END_OF_STREAM_RESET; 843 reset_after_frame_num_ = END_OF_STREAM_RESET;
767 DecodeNextFragment(); 844 DecodeNextFragment();
768 return; 845 return;
769 } else if (reset_after_frame_num_ == START_OF_STREAM_RESET) { 846 } else if (reset_after_frame_num_ == START_OF_STREAM_RESET) {
770 reset_after_frame_num_ = END_OF_STREAM_RESET; 847 reset_after_frame_num_ = END_OF_STREAM_RESET;
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1185 // Test parameters: 1262 // Test parameters:
1186 // - Number of concurrent decoders. The value takes effect when there is only 1263 // - Number of concurrent decoders. The value takes effect when there is only
1187 // one input stream; otherwise, one decoder per input stream will be 1264 // one input stream; otherwise, one decoder per input stream will be
1188 // instantiated. 1265 // instantiated.
1189 // - Number of concurrent in-flight Decode() calls per decoder. 1266 // - Number of concurrent in-flight Decode() calls per decoder.
1190 // - Number of play-throughs. 1267 // - Number of play-throughs.
1191 // - reset_after_frame_num: see GLRenderingVDAClient ctor. 1268 // - reset_after_frame_num: see GLRenderingVDAClient ctor.
1192 // - delete_decoder_phase: see GLRenderingVDAClient ctor. 1269 // - delete_decoder_phase: see GLRenderingVDAClient ctor.
1193 // - whether to test slow rendering by delaying ReusePictureBuffer(). 1270 // - whether to test slow rendering by delaying ReusePictureBuffer().
1194 // - whether the video frames are rendered as thumbnails. 1271 // - whether the video frames are rendered as thumbnails.
1272 // - whether to test VDA::Flush(true)
1195 class VideoDecodeAcceleratorParamTest 1273 class VideoDecodeAcceleratorParamTest
1196 : public VideoDecodeAcceleratorTest, 1274 : public VideoDecodeAcceleratorTest,
1197 public ::testing::WithParamInterface< 1275 public ::testing::WithParamInterface<
1198 base::Tuple<int, int, int, ResetPoint, ClientState, bool, bool> > { 1276 base::
1277 Tuple<int, int, int, ResetPoint, ClientState, bool, bool, bool>> {
1199 }; 1278 };
1200 1279
1201 // Wait for |note| to report a state and if it's not |expected_state| then 1280 // Wait for |note| to report a state and if it's not |expected_state| then
1202 // assert |client| has deleted its decoder. 1281 // assert |client| has deleted its decoder.
1203 static void AssertWaitForStateOrDeleted( 1282 static void AssertWaitForStateOrDeleted(
1204 ClientStateNotification<ClientState>* note, 1283 ClientStateNotification<ClientState>* note,
1205 GLRenderingVDAClient* client, 1284 GLRenderingVDAClient* client,
1206 ClientState expected_state) { 1285 ClientState expected_state) {
1207 ClientState state = note->Wait(); 1286 ClientState state = note->Wait();
1208 if (state == expected_state) return; 1287 if (state == expected_state) return;
(...skipping 10 matching lines...) Expand all
1219 // Test the most straightforward case possible: data is decoded from a single 1298 // Test the most straightforward case possible: data is decoded from a single
1220 // chunk and rendered to the screen. 1299 // chunk and rendered to the screen.
1221 TEST_P(VideoDecodeAcceleratorParamTest, TestSimpleDecode) { 1300 TEST_P(VideoDecodeAcceleratorParamTest, TestSimpleDecode) {
1222 size_t num_concurrent_decoders = base::get<0>(GetParam()); 1301 size_t num_concurrent_decoders = base::get<0>(GetParam());
1223 const size_t num_in_flight_decodes = base::get<1>(GetParam()); 1302 const size_t num_in_flight_decodes = base::get<1>(GetParam());
1224 int num_play_throughs = base::get<2>(GetParam()); 1303 int num_play_throughs = base::get<2>(GetParam());
1225 const int reset_point = base::get<3>(GetParam()); 1304 const int reset_point = base::get<3>(GetParam());
1226 const int delete_decoder_state = base::get<4>(GetParam()); 1305 const int delete_decoder_state = base::get<4>(GetParam());
1227 bool test_reuse_delay = base::get<5>(GetParam()); 1306 bool test_reuse_delay = base::get<5>(GetParam());
1228 const bool render_as_thumbnails = base::get<6>(GetParam()); 1307 const bool render_as_thumbnails = base::get<6>(GetParam());
1308 const bool test_full_flush = base::get<7>(GetParam());
1229 1309
1230 if (test_video_files_.size() > 1) 1310 if (test_video_files_.size() > 1)
1231 num_concurrent_decoders = test_video_files_.size(); 1311 num_concurrent_decoders = test_video_files_.size();
1232 1312
1233 if (g_num_play_throughs > 0) 1313 if (g_num_play_throughs > 0)
1234 num_play_throughs = g_num_play_throughs; 1314 num_play_throughs = g_num_play_throughs;
1235 1315
1236 UpdateTestVideoFileParams( 1316 UpdateTestVideoFileParams(
1237 num_concurrent_decoders, reset_point, &test_video_files_); 1317 num_concurrent_decoders, reset_point, &test_video_files_);
1238 1318
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1277 num_play_throughs, 1357 num_play_throughs,
1278 video_file->reset_after_frame_num, 1358 video_file->reset_after_frame_num,
1279 delete_decoder_state, 1359 delete_decoder_state,
1280 video_file->width, 1360 video_file->width,
1281 video_file->height, 1361 video_file->height,
1282 video_file->profile, 1362 video_file->profile,
1283 g_fake_decoder, 1363 g_fake_decoder,
1284 suppress_rendering, 1364 suppress_rendering,
1285 delay_after_frame_num, 1365 delay_after_frame_num,
1286 0, 1366 0,
1287 render_as_thumbnails); 1367 render_as_thumbnails,
1368 test_full_flush);
1288 1369
1289 clients[index] = client; 1370 clients[index] = client;
1290 helper_params.window_sizes.push_back( 1371 helper_params.window_sizes.push_back(
1291 render_as_thumbnails 1372 render_as_thumbnails
1292 ? kThumbnailsPageSize 1373 ? kThumbnailsPageSize
1293 : gfx::Size(video_file->width, video_file->height)); 1374 : gfx::Size(video_file->width, video_file->height));
1294 } 1375 }
1295 1376
1296 InitializeRenderingHelper(helper_params); 1377 InitializeRenderingHelper(helper_params);
1297 1378
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 base::Bind(&STLDeleteElements< 1513 base::Bind(&STLDeleteElements<
1433 std::vector<ClientStateNotification<ClientState>*>>, 1514 std::vector<ClientStateNotification<ClientState>*>>,
1434 &notes)); 1515 &notes));
1435 WaitUntilIdle(); 1516 WaitUntilIdle();
1436 }; 1517 };
1437 1518
1438 // Test that replay after EOS works fine. 1519 // Test that replay after EOS works fine.
1439 INSTANTIATE_TEST_CASE_P( 1520 INSTANTIATE_TEST_CASE_P(
1440 ReplayAfterEOS, VideoDecodeAcceleratorParamTest, 1521 ReplayAfterEOS, VideoDecodeAcceleratorParamTest,
1441 ::testing::Values( 1522 ::testing::Values(
1442 MakeTuple(1, 1, 4, END_OF_STREAM_RESET, CS_RESET, false, false))); 1523 MakeTuple(1, 1, 4, END_OF_STREAM_RESET, CS_RESET, false, false,
1524 false)));
1443 1525
1444 // Test that Reset() before the first Decode() works fine. 1526 // Test that Reset() before the first Decode() works fine.
1445 INSTANTIATE_TEST_CASE_P( 1527 INSTANTIATE_TEST_CASE_P(
1446 ResetBeforeDecode, VideoDecodeAcceleratorParamTest, 1528 ResetBeforeDecode, VideoDecodeAcceleratorParamTest,
1447 ::testing::Values( 1529 ::testing::Values(
1448 MakeTuple(1, 1, 1, START_OF_STREAM_RESET, CS_RESET, false, false))); 1530 MakeTuple(1, 1, 1, START_OF_STREAM_RESET, CS_RESET, false, false,
1531 false)));
1449 1532
1450 // Test Reset() immediately after Decode() containing config info. 1533 // Test Reset() immediately after Decode() containing config info.
1451 INSTANTIATE_TEST_CASE_P( 1534 INSTANTIATE_TEST_CASE_P(
1452 ResetAfterFirstConfigInfo, VideoDecodeAcceleratorParamTest, 1535 ResetAfterFirstConfigInfo, VideoDecodeAcceleratorParamTest,
1453 ::testing::Values( 1536 ::testing::Values(
1454 MakeTuple( 1537 MakeTuple(1, 1, 1, RESET_AFTER_FIRST_CONFIG_INFO, CS_RESET, false,
1455 1, 1, 1, RESET_AFTER_FIRST_CONFIG_INFO, CS_RESET, false, false))); 1538 false, false)));
1456 1539
1457 // Test that Reset() mid-stream works fine and doesn't affect decoding even when 1540 // Test that Reset() mid-stream works fine and doesn't affect decoding even when
1458 // Decode() calls are made during the reset. 1541 // Decode() calls are made during the reset.
1459 INSTANTIATE_TEST_CASE_P( 1542 INSTANTIATE_TEST_CASE_P(
1460 MidStreamReset, VideoDecodeAcceleratorParamTest, 1543 MidStreamReset, VideoDecodeAcceleratorParamTest,
1461 ::testing::Values( 1544 ::testing::Values(
1462 MakeTuple(1, 1, 1, MID_STREAM_RESET, CS_RESET, false, false))); 1545 MakeTuple(1, 1, 1, MID_STREAM_RESET, CS_RESET, false, false, false)));
1546
1547 // Test that the VDA returns all buffers to us on Flush(true).
1548 INSTANTIATE_TEST_CASE_P(
1549 FullFlush, VideoDecodeAcceleratorParamTest,
1550 ::testing::Values(
1551 MakeTuple(1, 1, 1, MID_STREAM_RESET, CS_RESET, false, false, true)));
1552
1463 1553
1464 INSTANTIATE_TEST_CASE_P( 1554 INSTANTIATE_TEST_CASE_P(
1465 SlowRendering, VideoDecodeAcceleratorParamTest, 1555 SlowRendering, VideoDecodeAcceleratorParamTest,
1466 ::testing::Values( 1556 ::testing::Values(
1467 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, true, false))); 1557 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, true, false, false)));
1468 1558
1469 // Test that Destroy() mid-stream works fine (primarily this is testing that no 1559 // Test that Destroy() mid-stream works fine (primarily this is testing that no
1470 // crashes occur). 1560 // crashes occur).
1471 INSTANTIATE_TEST_CASE_P( 1561 INSTANTIATE_TEST_CASE_P(
1472 TearDownTiming, VideoDecodeAcceleratorParamTest, 1562 TearDownTiming, VideoDecodeAcceleratorParamTest,
1473 ::testing::Values( 1563 ::testing::Values(
1474 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_DECODER_SET, false, false), 1564 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_DECODER_SET, false, false,
1475 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_INITIALIZED, false, false), 1565 false),
1476 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_FLUSHING, false, false), 1566 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_INITIALIZED, false, false,
1477 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_FLUSHED, false, false), 1567 false),
1478 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESETTING, false, false), 1568 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_FLUSHING, false, false,
1479 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, false, false), 1569 false),
1570 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_FLUSHED, false, false,
1571 false),
1572 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESETTING, false, false,
1573 false),
1574 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, false, false, false),
1480 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, 1575 MakeTuple(1, 1, 1, END_OF_STREAM_RESET,
1481 static_cast<ClientState>(-1), false, false), 1576 static_cast<ClientState>(-1), false, false, false),
1482 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, 1577 MakeTuple(1, 1, 1, END_OF_STREAM_RESET,
1483 static_cast<ClientState>(-10), false, false), 1578 static_cast<ClientState>(-10), false, false, false),
1484 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, 1579 MakeTuple(1, 1, 1, END_OF_STREAM_RESET,
1485 static_cast<ClientState>(-100), false, false))); 1580 static_cast<ClientState>(-100), false, false, false)));
1486 1581
1487 // Test that decoding various variation works with multiple in-flight decodes. 1582 // Test that decoding various variation works with multiple in-flight decodes.
1488 INSTANTIATE_TEST_CASE_P( 1583 INSTANTIATE_TEST_CASE_P(
1489 DecodeVariations, VideoDecodeAcceleratorParamTest, 1584 DecodeVariations, VideoDecodeAcceleratorParamTest,
1490 ::testing::Values( 1585 ::testing::Values(
1491 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, false, false), 1586 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, false, false, false),
1492 MakeTuple(1, 10, 1, END_OF_STREAM_RESET, CS_RESET, false, false), 1587 MakeTuple(1, 10, 1, END_OF_STREAM_RESET, CS_RESET, false, false, false),
1493 // Tests queuing. 1588 // Tests queuing.
1494 MakeTuple(1, 15, 1, END_OF_STREAM_RESET, CS_RESET, false, false))); 1589 MakeTuple(1, 15, 1, END_OF_STREAM_RESET, CS_RESET, false, false,
1590 false)));
1495 1591
1496 // Find out how many concurrent decoders can go before we exhaust system 1592 // Find out how many concurrent decoders can go before we exhaust system
1497 // resources. 1593 // resources.
1498 INSTANTIATE_TEST_CASE_P( 1594 INSTANTIATE_TEST_CASE_P(
1499 ResourceExhaustion, VideoDecodeAcceleratorParamTest, 1595 ResourceExhaustion, VideoDecodeAcceleratorParamTest,
1500 ::testing::Values( 1596 ::testing::Values(
1501 // +0 hack below to promote enum to int. 1597 // +0 hack below to promote enum to int.
1502 MakeTuple(kMinSupportedNumConcurrentDecoders + 0, 1, 1, 1598 MakeTuple(kMinSupportedNumConcurrentDecoders + 0, 1, 1,
1503 END_OF_STREAM_RESET, CS_RESET, false, false), 1599 END_OF_STREAM_RESET, CS_RESET, false, false, false),
1504 MakeTuple(kMinSupportedNumConcurrentDecoders + 1, 1, 1, 1600 MakeTuple(kMinSupportedNumConcurrentDecoders + 1, 1, 1,
1505 END_OF_STREAM_RESET, CS_RESET, false, false))); 1601 END_OF_STREAM_RESET, CS_RESET, false, false, false)));
1506 1602
1507 // Thumbnailing test 1603 // Thumbnailing test
1508 INSTANTIATE_TEST_CASE_P( 1604 INSTANTIATE_TEST_CASE_P(
1509 Thumbnail, VideoDecodeAcceleratorParamTest, 1605 Thumbnail, VideoDecodeAcceleratorParamTest,
1510 ::testing::Values( 1606 ::testing::Values(
1511 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, false, true))); 1607 MakeTuple(1, 1, 1, END_OF_STREAM_RESET, CS_RESET, false, true, false)));
1512 1608
1513 // Measure the median of the decode time when VDA::Decode is called 30 times per 1609 // Measure the median of the decode time when VDA::Decode is called 30 times per
1514 // second. 1610 // second.
1515 TEST_F(VideoDecodeAcceleratorTest, TestDecodeTimeMedian) { 1611 TEST_F(VideoDecodeAcceleratorTest, TestDecodeTimeMedian) {
1516 RenderingHelperParams helper_params; 1612 RenderingHelperParams helper_params;
1517 1613
1518 // Disable rendering by setting the rendering_fps = 0. 1614 // Disable rendering by setting the rendering_fps = 0.
1519 helper_params.rendering_fps = 0; 1615 helper_params.rendering_fps = 0;
1520 helper_params.warm_up_iterations = 0; 1616 helper_params.warm_up_iterations = 0;
1521 helper_params.render_as_thumbnails = false; 1617 helper_params.render_as_thumbnails = false;
1522 1618
1523 ClientStateNotification<ClientState>* note = 1619 ClientStateNotification<ClientState>* note =
1524 new ClientStateNotification<ClientState>(); 1620 new ClientStateNotification<ClientState>();
1525 GLRenderingVDAClient* client = 1621 GLRenderingVDAClient* client =
1526 new GLRenderingVDAClient(0, 1622 new GLRenderingVDAClient(0,
1527 &rendering_helper_, 1623 &rendering_helper_,
1528 note, 1624 note,
1529 test_video_files_[0]->data_str, 1625 test_video_files_[0]->data_str,
1530 1, 1626 1,
1531 1, 1627 1,
1532 test_video_files_[0]->reset_after_frame_num, 1628 test_video_files_[0]->reset_after_frame_num,
1533 CS_RESET, 1629 CS_RESET,
1534 test_video_files_[0]->width, 1630 test_video_files_[0]->width,
1535 test_video_files_[0]->height, 1631 test_video_files_[0]->height,
1536 test_video_files_[0]->profile, 1632 test_video_files_[0]->profile,
1537 g_fake_decoder, 1633 g_fake_decoder,
1538 true, 1634 true,
1539 std::numeric_limits<int>::max(), 1635 std::numeric_limits<int>::max(),
1540 kWebRtcDecodeCallsPerSecond, 1636 kWebRtcDecodeCallsPerSecond,
1541 false /* render_as_thumbnail */); 1637 false /* render_as_thumbnail */,
1638 false /* test_full_flush */);
1542 helper_params.window_sizes.push_back( 1639 helper_params.window_sizes.push_back(
1543 gfx::Size(test_video_files_[0]->width, test_video_files_[0]->height)); 1640 gfx::Size(test_video_files_[0]->width, test_video_files_[0]->height));
1544 InitializeRenderingHelper(helper_params); 1641 InitializeRenderingHelper(helper_params);
1545 CreateAndStartDecoder(client, note); 1642 CreateAndStartDecoder(client, note);
1546 WaitUntilDecodeFinish(note); 1643 WaitUntilDecodeFinish(note);
1547 1644
1548 base::TimeDelta decode_time_median = client->decode_time_median(); 1645 base::TimeDelta decode_time_median = client->decode_time_median();
1549 std::string output_string = 1646 std::string output_string =
1550 base::StringPrintf("Decode time median: %" PRId64 " us", 1647 base::StringPrintf("Decode time median: %" PRId64 " us",
1551 decode_time_median.InMicroseconds()); 1648 decode_time_median.InMicroseconds());
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 content::VaapiWrapper::PreSandboxInitialization(); 1746 content::VaapiWrapper::PreSandboxInitialization();
1650 #endif 1747 #endif
1651 1748
1652 content::g_env = 1749 content::g_env =
1653 reinterpret_cast<content::VideoDecodeAcceleratorTestEnvironment*>( 1750 reinterpret_cast<content::VideoDecodeAcceleratorTestEnvironment*>(
1654 testing::AddGlobalTestEnvironment( 1751 testing::AddGlobalTestEnvironment(
1655 new content::VideoDecodeAcceleratorTestEnvironment())); 1752 new content::VideoDecodeAcceleratorTestEnvironment()));
1656 1753
1657 return RUN_ALL_TESTS(); 1754 return RUN_ALL_TESTS();
1658 } 1755 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698