| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "media/gpu/android_video_decode_accelerator.h" | 5 #include "media/gpu/android_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| 11 #include "base/android/jni_android.h" | 11 #include "base/android/jni_android.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" | 15 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
| 16 #include "media/base/android/media_codec_util.h" | 16 #include "media/base/android/media_codec_util.h" |
| 17 #include "media/base/android/media_jni_registrar.h" | 17 #include "media/base/android/media_jni_registrar.h" |
| 18 #include "media/gpu/android_copying_backing_strategy.h" | |
| 19 #include "media/gpu/android_video_decode_accelerator.h" | 18 #include "media/gpu/android_video_decode_accelerator.h" |
| 20 #include "media/video/picture.h" | 19 #include "media/video/picture.h" |
| 21 #include "media/video/video_decode_accelerator.h" | 20 #include "media/video/video_decode_accelerator.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 23 #include "ui/gl/android/surface_texture.h" | 22 #include "ui/gl/gl_context.h" |
| 23 #include "ui/gl/gl_surface.h" |
| 24 #include "ui/gl/init/gl_factory.h" |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| 26 | 27 |
| 27 bool MockMakeContextCurrent() { | 28 bool MakeContextCurrent() { |
| 28 return true; | 29 return true; |
| 29 } | 30 } |
| 30 | 31 |
| 31 static base::WeakPtr<gpu::gles2::GLES2Decoder> MockGetGLES2Decoder( | 32 base::WeakPtr<gpu::gles2::GLES2Decoder> GetGLES2Decoder( |
| 32 const base::WeakPtr<gpu::gles2::GLES2Decoder>& decoder) { | 33 const base::WeakPtr<gpu::gles2::GLES2Decoder>& decoder) { |
| 33 return decoder; | 34 return decoder; |
| 34 } | 35 } |
| 35 | 36 |
| 36 } // namespace | 37 } // namespace |
| 37 | 38 |
| 38 namespace media { | 39 namespace media { |
| 39 | 40 |
| 40 class MockVideoDecodeAcceleratorClient : public VideoDecodeAccelerator::Client { | 41 class MockVideoDecodeAcceleratorClient : public VideoDecodeAccelerator::Client { |
| 41 public: | 42 public: |
| (...skipping 16 matching lines...) Expand all Loading... |
| 58 | 59 |
| 59 class AndroidVideoDecodeAcceleratorTest : public testing::Test { | 60 class AndroidVideoDecodeAcceleratorTest : public testing::Test { |
| 60 public: | 61 public: |
| 61 ~AndroidVideoDecodeAcceleratorTest() override {} | 62 ~AndroidVideoDecodeAcceleratorTest() override {} |
| 62 | 63 |
| 63 protected: | 64 protected: |
| 64 void SetUp() override { | 65 void SetUp() override { |
| 65 JNIEnv* env = base::android::AttachCurrentThread(); | 66 JNIEnv* env = base::android::AttachCurrentThread(); |
| 66 RegisterJni(env); | 67 RegisterJni(env); |
| 67 | 68 |
| 68 // Start message loop because | 69 gl::init::ClearGLBindings(); |
| 69 // AndroidVideoDecodeAccelerator::ConfigureMediaCodec() starts a timer task. | 70 ASSERT_TRUE(gl::init::InitializeGLOneOff()); |
| 71 surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size(1024, 1024)); |
| 72 context_ = gl::init::CreateGLContext(nullptr, surface_.get(), |
| 73 gl::PreferDiscreteGpu); |
| 74 context_->MakeCurrent(surface_.get()); |
| 75 |
| 76 // Start a message loop because AVDA starts a timer task. |
| 70 message_loop_.reset(new base::MessageLoop()); | 77 message_loop_.reset(new base::MessageLoop()); |
| 78 gl_decoder_.reset(new testing::NiceMock<gpu::gles2::MockGLES2Decoder>()); |
| 79 client_.reset(new MockVideoDecodeAcceleratorClient()); |
| 71 | 80 |
| 72 std::unique_ptr<gpu::gles2::MockGLES2Decoder> decoder( | 81 vda_.reset(new AndroidVideoDecodeAccelerator( |
| 73 new gpu::gles2::MockGLES2Decoder()); | 82 base::Bind(&MakeContextCurrent), |
| 74 std::unique_ptr<MockVideoDecodeAcceleratorClient> client( | 83 base::Bind(&GetGLES2Decoder, gl_decoder_->AsWeakPtr()))); |
| 75 new MockVideoDecodeAcceleratorClient()); | |
| 76 accelerator_.reset(new AndroidVideoDecodeAccelerator( | |
| 77 base::Bind(&MockMakeContextCurrent), | |
| 78 base::Bind(&MockGetGLES2Decoder, decoder->AsWeakPtr()))); | |
| 79 } | 84 } |
| 80 | 85 |
| 81 bool Configure(VideoCodec codec) { | 86 bool Initialize(VideoCodecProfile profile) { |
| 82 AndroidVideoDecodeAccelerator* accelerator = | 87 return vda_->Initialize(VideoDecodeAccelerator::Config(profile), |
| 83 static_cast<AndroidVideoDecodeAccelerator*>(accelerator_.get()); | 88 client_.get()); |
| 84 scoped_refptr<gl::SurfaceTexture> surface_texture = | |
| 85 gl::SurfaceTexture::Create(0); | |
| 86 accelerator->codec_config_->surface_ = | |
| 87 gl::ScopedJavaSurface(surface_texture.get()); | |
| 88 accelerator->codec_config_->codec_ = codec; | |
| 89 return accelerator->ConfigureMediaCodecSynchronously(); | |
| 90 } | 89 } |
| 91 | 90 |
| 92 private: | 91 private: |
| 93 std::unique_ptr<VideoDecodeAccelerator> accelerator_; | |
| 94 std::unique_ptr<base::MessageLoop> message_loop_; | 92 std::unique_ptr<base::MessageLoop> message_loop_; |
| 93 scoped_refptr<gl::GLSurface> surface_; |
| 94 scoped_refptr<gl::GLContext> context_; |
| 95 std::unique_ptr<gpu::gles2::MockGLES2Decoder> gl_decoder_; |
| 96 std::unique_ptr<MockVideoDecodeAcceleratorClient> client_; |
| 97 |
| 98 // This must be a unique pointer to a VDA and not an AVDA to ensure the |
| 99 // the default_delete specialization that calls Destroy() will be used. |
| 100 std::unique_ptr<VideoDecodeAccelerator> vda_; |
| 95 }; | 101 }; |
| 96 | 102 |
| 97 TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureUnsupportedCodec) { | 103 TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureUnsupportedCodec) { |
| 98 EXPECT_FALSE(Configure(kUnknownVideoCodec)); | 104 ASSERT_FALSE(Initialize(VIDEO_CODEC_PROFILE_UNKNOWN)); |
| 99 } | 105 } |
| 100 | 106 |
| 101 TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureSupportedCodec) { | 107 TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureSupportedCodec) { |
| 102 if (!MediaCodecUtil::IsMediaCodecAvailable()) | 108 if (!MediaCodecUtil::IsMediaCodecAvailable()) |
| 103 return; | 109 return; |
| 104 EXPECT_TRUE(Configure(kCodecVP8)); | 110 ASSERT_TRUE(Initialize(VP8PROFILE_ANY)); |
| 105 } | 111 } |
| 106 | 112 |
| 107 } // namespace media | 113 } // namespace media |
| 108 | 114 |
| 109 int main(int argc, char** argv) { | 115 int main(int argc, char** argv) { |
| 110 testing::InitGoogleTest(&argc, argv); | 116 testing::InitGoogleTest(&argc, argv); |
| 111 return RUN_ALL_TESTS(); | 117 return RUN_ALL_TESTS(); |
| 112 } | 118 } |
| OLD | NEW |