OLD | NEW |
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 |
11 // to be written sequentially and wait for the decode client to see certain | 11 // to be written sequentially and wait for the decode client to see certain |
12 // state transitions. | 12 // state transitions. |
13 // - GLRenderingVDAClient is a VideoDecodeAccelerator::Client implementation | 13 // - GLRenderingVDAClient is a VideoDecodeAccelerator::Client implementation |
14 // - Finally actual TEST cases are at the bottom of this file, using the above | 14 // - Finally actual TEST cases are at the bottom of this file, using the above |
15 // infrastructure. | 15 // infrastructure. |
16 | 16 |
17 #include <fcntl.h> | 17 #include <fcntl.h> |
18 #include <stddef.h> | 18 #include <stddef.h> |
19 #include <stdint.h> | 19 #include <stdint.h> |
20 #include <sys/stat.h> | 20 #include <sys/stat.h> |
21 #include <sys/types.h> | 21 #include <sys/types.h> |
22 #include <algorithm> | 22 #include <algorithm> |
23 #include <deque> | 23 #include <deque> |
24 #include <map> | 24 #include <map> |
25 | 25 #include <utility> |
26 // Include gtest.h out of order because <X11/X.h> #define's Bool & None, which | |
27 // gtest uses as struct names (inside a namespace). This means that | |
28 // #include'ing gtest after anything that pulls in X.h fails to compile. | |
29 // This is http://code.google.com/p/googletest/issues/detail?id=371 | |
30 #include "testing/gtest/include/gtest/gtest.h" | |
31 | 26 |
32 #include "base/at_exit.h" | 27 #include "base/at_exit.h" |
33 #include "base/bind.h" | 28 #include "base/bind.h" |
34 #include "base/callback_helpers.h" | 29 #include "base/callback_helpers.h" |
35 #include "base/command_line.h" | 30 #include "base/command_line.h" |
36 #include "base/files/file.h" | 31 #include "base/files/file.h" |
37 #include "base/files/file_util.h" | 32 #include "base/files/file_util.h" |
38 #include "base/format_macros.h" | 33 #include "base/format_macros.h" |
39 #include "base/macros.h" | 34 #include "base/macros.h" |
40 #include "base/md5.h" | 35 #include "base/md5.h" |
41 #include "base/process/process_handle.h" | 36 #include "base/process/process_handle.h" |
42 #include "base/stl_util.h" | 37 #include "base/stl_util.h" |
43 #include "base/strings/string_number_conversions.h" | 38 #include "base/strings/string_number_conversions.h" |
44 #include "base/strings/string_split.h" | 39 #include "base/strings/string_split.h" |
45 #include "base/strings/stringize_macros.h" | 40 #include "base/strings/stringize_macros.h" |
46 #include "base/strings/stringprintf.h" | 41 #include "base/strings/stringprintf.h" |
47 #include "base/strings/utf_string_conversions.h" | 42 #include "base/strings/utf_string_conversions.h" |
48 #include "base/synchronization/condition_variable.h" | 43 #include "base/synchronization/condition_variable.h" |
49 #include "base/synchronization/lock.h" | 44 #include "base/synchronization/lock.h" |
50 #include "base/synchronization/waitable_event.h" | 45 #include "base/synchronization/waitable_event.h" |
51 #include "base/thread_task_runner_handle.h" | 46 #include "base/thread_task_runner_handle.h" |
52 #include "base/threading/thread.h" | 47 #include "base/threading/thread.h" |
53 #include "build/build_config.h" | 48 #include "build/build_config.h" |
54 #include "content/common/gpu/media/fake_video_decode_accelerator.h" | 49 #include "content/common/gpu/media/fake_video_decode_accelerator.h" |
55 #include "content/common/gpu/media/rendering_helper.h" | 50 #include "content/common/gpu/media/rendering_helper.h" |
56 #include "content/common/gpu/media/video_accelerator_unittest_helpers.h" | 51 #include "content/common/gpu/media/video_accelerator_unittest_helpers.h" |
57 #include "content/public/common/content_switches.h" | 52 #include "content/public/common/content_switches.h" |
58 #include "media/filters/h264_parser.h" | 53 #include "media/filters/h264_parser.h" |
| 54 #include "testing/gtest/include/gtest/gtest.h" |
59 #include "ui/gfx/codec/png_codec.h" | 55 #include "ui/gfx/codec/png_codec.h" |
60 #include "ui/gl/gl_image.h" | 56 #include "ui/gl/gl_image.h" |
61 | 57 |
62 #if defined(OS_WIN) | 58 #if defined(OS_WIN) |
63 #include "base/win/windows_version.h" | 59 #include "base/win/windows_version.h" |
64 #include "content/common/gpu/media/dxva_video_decode_accelerator_win.h" | 60 #include "content/common/gpu/media/dxva_video_decode_accelerator_win.h" |
65 #elif defined(OS_CHROMEOS) | 61 #elif defined(OS_CHROMEOS) |
66 #if defined(USE_V4L2_CODEC) | 62 #if defined(USE_V4L2_CODEC) |
67 #include "content/common/gpu/media/v4l2_device.h" | 63 #include "content/common/gpu/media/v4l2_device.h" |
68 #include "content/common/gpu/media/v4l2_slice_video_decode_accelerator.h" | 64 #include "content/common/gpu/media/v4l2_slice_video_decode_accelerator.h" |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 | 506 |
511 scoped_ptr<media::VideoDecodeAccelerator> | 507 scoped_ptr<media::VideoDecodeAccelerator> |
512 GLRenderingVDAClient::CreateFakeVDA() { | 508 GLRenderingVDAClient::CreateFakeVDA() { |
513 scoped_ptr<media::VideoDecodeAccelerator> decoder; | 509 scoped_ptr<media::VideoDecodeAccelerator> decoder; |
514 if (fake_decoder_) { | 510 if (fake_decoder_) { |
515 decoder.reset(new FakeVideoDecodeAccelerator( | 511 decoder.reset(new FakeVideoDecodeAccelerator( |
516 static_cast<gfx::GLContext*> (rendering_helper_->GetGLContextHandle()), | 512 static_cast<gfx::GLContext*> (rendering_helper_->GetGLContextHandle()), |
517 frame_size_, | 513 frame_size_, |
518 base::Bind(&DoNothingReturnTrue))); | 514 base::Bind(&DoNothingReturnTrue))); |
519 } | 515 } |
520 return decoder.Pass(); | 516 return decoder; |
521 } | 517 } |
522 | 518 |
523 scoped_ptr<media::VideoDecodeAccelerator> | 519 scoped_ptr<media::VideoDecodeAccelerator> |
524 GLRenderingVDAClient::CreateDXVAVDA() { | 520 GLRenderingVDAClient::CreateDXVAVDA() { |
525 scoped_ptr<media::VideoDecodeAccelerator> decoder; | 521 scoped_ptr<media::VideoDecodeAccelerator> decoder; |
526 #if defined(OS_WIN) | 522 #if defined(OS_WIN) |
527 if (base::win::GetVersion() >= base::win::VERSION_WIN7) | 523 if (base::win::GetVersion() >= base::win::VERSION_WIN7) |
528 decoder.reset( | 524 decoder.reset( |
529 new DXVAVideoDecodeAccelerator( | 525 new DXVAVideoDecodeAccelerator( |
530 base::Bind(&DoNothingReturnTrue), | 526 base::Bind(&DoNothingReturnTrue), |
531 rendering_helper_->GetGLContext().get())); | 527 rendering_helper_->GetGLContext().get())); |
532 #endif | 528 #endif |
533 return decoder.Pass(); | 529 return decoder; |
534 } | 530 } |
535 | 531 |
536 scoped_ptr<media::VideoDecodeAccelerator> | 532 scoped_ptr<media::VideoDecodeAccelerator> |
537 GLRenderingVDAClient::CreateV4L2VDA() { | 533 GLRenderingVDAClient::CreateV4L2VDA() { |
538 scoped_ptr<media::VideoDecodeAccelerator> decoder; | 534 scoped_ptr<media::VideoDecodeAccelerator> decoder; |
539 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) | 535 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
540 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder); | 536 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder); |
541 if (device.get()) { | 537 if (device.get()) { |
542 base::WeakPtr<VideoDecodeAccelerator::Client> weak_client = AsWeakPtr(); | 538 base::WeakPtr<VideoDecodeAccelerator::Client> weak_client = AsWeakPtr(); |
543 decoder.reset(new V4L2VideoDecodeAccelerator( | 539 decoder.reset(new V4L2VideoDecodeAccelerator( |
544 static_cast<EGLDisplay>(rendering_helper_->GetGLDisplay()), | 540 static_cast<EGLDisplay>(rendering_helper_->GetGLDisplay()), |
545 static_cast<EGLContext>(rendering_helper_->GetGLContextHandle()), | 541 static_cast<EGLContext>(rendering_helper_->GetGLContextHandle()), |
546 weak_client, base::Bind(&DoNothingReturnTrue), device, | 542 weak_client, base::Bind(&DoNothingReturnTrue), device, |
547 base::ThreadTaskRunnerHandle::Get())); | 543 base::ThreadTaskRunnerHandle::Get())); |
548 } | 544 } |
549 #endif | 545 #endif |
550 return decoder.Pass(); | 546 return decoder; |
551 } | 547 } |
552 | 548 |
553 scoped_ptr<media::VideoDecodeAccelerator> | 549 scoped_ptr<media::VideoDecodeAccelerator> |
554 GLRenderingVDAClient::CreateV4L2SliceVDA() { | 550 GLRenderingVDAClient::CreateV4L2SliceVDA() { |
555 scoped_ptr<media::VideoDecodeAccelerator> decoder; | 551 scoped_ptr<media::VideoDecodeAccelerator> decoder; |
556 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) | 552 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
557 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder); | 553 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder); |
558 if (device.get()) { | 554 if (device.get()) { |
559 base::WeakPtr<VideoDecodeAccelerator::Client> weak_client = AsWeakPtr(); | 555 base::WeakPtr<VideoDecodeAccelerator::Client> weak_client = AsWeakPtr(); |
560 decoder.reset(new V4L2SliceVideoDecodeAccelerator( | 556 decoder.reset(new V4L2SliceVideoDecodeAccelerator( |
561 device, static_cast<EGLDisplay>(rendering_helper_->GetGLDisplay()), | 557 device, static_cast<EGLDisplay>(rendering_helper_->GetGLDisplay()), |
562 static_cast<EGLContext>(rendering_helper_->GetGLContextHandle()), | 558 static_cast<EGLContext>(rendering_helper_->GetGLContextHandle()), |
563 weak_client, base::Bind(&DoNothingReturnTrue), | 559 weak_client, base::Bind(&DoNothingReturnTrue), |
564 base::ThreadTaskRunnerHandle::Get())); | 560 base::ThreadTaskRunnerHandle::Get())); |
565 } | 561 } |
566 #endif | 562 #endif |
567 return decoder.Pass(); | 563 return decoder; |
568 } | 564 } |
569 | 565 |
570 scoped_ptr<media::VideoDecodeAccelerator> | 566 scoped_ptr<media::VideoDecodeAccelerator> |
571 GLRenderingVDAClient::CreateVaapiVDA() { | 567 GLRenderingVDAClient::CreateVaapiVDA() { |
572 scoped_ptr<media::VideoDecodeAccelerator> decoder; | 568 scoped_ptr<media::VideoDecodeAccelerator> decoder; |
573 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) | 569 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
574 decoder.reset(new VaapiVideoDecodeAccelerator( | 570 decoder.reset(new VaapiVideoDecodeAccelerator( |
575 base::Bind(&DoNothingReturnTrue), | 571 base::Bind(&DoNothingReturnTrue), |
576 base::Bind(&GLRenderingVDAClient::BindImage, base::Unretained(this)))); | 572 base::Bind(&GLRenderingVDAClient::BindImage, base::Unretained(this)))); |
577 #endif | 573 #endif |
578 return decoder.Pass(); | 574 return decoder; |
579 } | 575 } |
580 | 576 |
581 void GLRenderingVDAClient::BindImage(uint32_t client_texture_id, | 577 void GLRenderingVDAClient::BindImage(uint32_t client_texture_id, |
582 uint32_t texture_target, | 578 uint32_t texture_target, |
583 scoped_refptr<gl::GLImage> image) {} | 579 scoped_refptr<gl::GLImage> image) {} |
584 | 580 |
585 void GLRenderingVDAClient::CreateAndStartDecoder() { | 581 void GLRenderingVDAClient::CreateAndStartDecoder() { |
586 LOG_ASSERT(decoder_deleted()); | 582 LOG_ASSERT(decoder_deleted()); |
587 LOG_ASSERT(!decoder_.get()); | 583 LOG_ASSERT(!decoder_.get()); |
588 | 584 |
589 VideoDecodeAccelerator::Client* client = this; | 585 VideoDecodeAccelerator::Client* client = this; |
590 | 586 |
591 scoped_ptr<media::VideoDecodeAccelerator> decoders[] = { | 587 scoped_ptr<media::VideoDecodeAccelerator> decoders[] = { |
592 CreateFakeVDA(), | 588 CreateFakeVDA(), |
593 CreateDXVAVDA(), | 589 CreateDXVAVDA(), |
594 CreateV4L2VDA(), | 590 CreateV4L2VDA(), |
595 CreateV4L2SliceVDA(), | 591 CreateV4L2SliceVDA(), |
596 CreateVaapiVDA(), | 592 CreateVaapiVDA(), |
597 }; | 593 }; |
598 | 594 |
599 for (size_t i = 0; i < arraysize(decoders); ++i) { | 595 for (size_t i = 0; i < arraysize(decoders); ++i) { |
600 if (!decoders[i]) | 596 if (!decoders[i]) |
601 continue; | 597 continue; |
602 decoder_ = decoders[i].Pass(); | 598 decoder_ = std::move(decoders[i]); |
603 weak_decoder_factory_.reset( | 599 weak_decoder_factory_.reset( |
604 new base::WeakPtrFactory<VideoDecodeAccelerator>(decoder_.get())); | 600 new base::WeakPtrFactory<VideoDecodeAccelerator>(decoder_.get())); |
605 if (decoder_->Initialize(profile_, client)) { | 601 if (decoder_->Initialize(profile_, client)) { |
606 SetState(CS_DECODER_SET); | 602 SetState(CS_DECODER_SET); |
607 FinishInitialization(); | 603 FinishInitialization(); |
608 return; | 604 return; |
609 } | 605 } |
610 } | 606 } |
611 // Decoders are all initialize failed. | 607 // Decoders are all initialize failed. |
612 LOG(ERROR) << "VideoDecodeAccelerator::Initialize() failed"; | 608 LOG(ERROR) << "VideoDecodeAccelerator::Initialize() failed"; |
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1658 content::VaapiWrapper::PreSandboxInitialization(); | 1654 content::VaapiWrapper::PreSandboxInitialization(); |
1659 #endif | 1655 #endif |
1660 | 1656 |
1661 content::g_env = | 1657 content::g_env = |
1662 reinterpret_cast<content::VideoDecodeAcceleratorTestEnvironment*>( | 1658 reinterpret_cast<content::VideoDecodeAcceleratorTestEnvironment*>( |
1663 testing::AddGlobalTestEnvironment( | 1659 testing::AddGlobalTestEnvironment( |
1664 new content::VideoDecodeAcceleratorTestEnvironment())); | 1660 new content::VideoDecodeAcceleratorTestEnvironment())); |
1665 | 1661 |
1666 return RUN_ALL_TESTS(); | 1662 return RUN_ALL_TESTS(); |
1667 } | 1663 } |
OLD | NEW |