diff options
author | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-26 02:04:19 +0000 |
---|---|---|
committer | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-26 02:04:19 +0000 |
commit | 31203376861a403af9e92810d03c453ad01b8f57 (patch) | |
tree | 49a81216b8f47c689479538984ae4b4c822c3786 /content/common | |
parent | 20c8b942168996a3f0345c9341dc4fa6e99f3a36 (diff) | |
download | chromium_src-31203376861a403af9e92810d03c453ad01b8f57.zip chromium_src-31203376861a403af9e92810d03c453ad01b8f57.tar.gz chromium_src-31203376861a403af9e92810d03c453ad01b8f57.tar.bz2 |
Add Create() function to AudioCodecBridge and VideoCodecBridge to allow return of null pointers
If codec is not supported, we should allow null pointers to be returned when trying to create a MediaCodecBridge.
BUG=233420
Review URL: https://chromiumcodereview.appspot.com/14932020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202323 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/common')
3 files changed, 114 insertions, 5 deletions
diff --git a/content/common/gpu/media/android_video_decode_accelerator.cc b/content/common/gpu/media/android_video_decode_accelerator.cc index 15d9d44..87a06f7 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.cc +++ b/content/common/gpu/media/android_video_decode_accelerator.cc @@ -104,7 +104,10 @@ bool AndroidVideoDecodeAccelerator::Initialize( surface_texture_ = new gfx::SurfaceTextureBridge(surface_texture_id_); - ConfigureMediaCodec(); + if (!ConfigureMediaCodec()) { + LOG(ERROR) << "Failed to create MediaCodec instance."; + return false; + } base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( &AndroidVideoDecodeAccelerator::NotifyInitializeDone, @@ -376,10 +379,12 @@ void AndroidVideoDecodeAccelerator::Flush() { Decode(media::BitstreamBuffer(-1, base::SharedMemoryHandle(), 0)); } -void AndroidVideoDecodeAccelerator::ConfigureMediaCodec() { +bool AndroidVideoDecodeAccelerator::ConfigureMediaCodec() { DCHECK(surface_texture_.get()); + media_codec_.reset(media::VideoCodecBridge::Create(codec_)); - media_codec_.reset(new media::VideoCodecBridge(codec_)); + if (!media_codec_) + return false; gfx::ScopedJavaSurface surface(surface_texture_.get()); // VDA does not pass the container indicated resolution in the initialization @@ -388,6 +393,7 @@ void AndroidVideoDecodeAccelerator::ConfigureMediaCodec() { media_codec_->Start( codec_, gfx::Size(1280, 720), surface.j_surface().obj()); media_codec_->GetOutputBuffers(); + return true; } void AndroidVideoDecodeAccelerator::Reset() { diff --git a/content/common/gpu/media/android_video_decode_accelerator.h b/content/common/gpu/media/android_video_decode_accelerator.h index e892999..b846831 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.h +++ b/content/common/gpu/media/android_video_decode_accelerator.h @@ -25,7 +25,6 @@ class SurfaceTextureBridge; } namespace content { - // A VideoDecodeAccelerator implementation for Android. // This class decodes the input encoded stream by using Android's MediaCodec // class. http://developer.android.com/reference/android/media/MediaCodec.html @@ -59,7 +58,7 @@ class CONTENT_EXPORT AndroidVideoDecodeAccelerator : virtual ~AndroidVideoDecodeAccelerator(); // Configures |media_codec_| with the given codec parameters from the client. - void ConfigureMediaCodec(); + bool ConfigureMediaCodec(); // Sends the current picture on the surface to the client. void SendCurrentSurfaceToClient(int32 bitstream_id); @@ -163,6 +162,8 @@ class CONTENT_EXPORT AndroidVideoDecodeAccelerator : // Used for copy the texture from |surface_texture_| to picture buffers. scoped_ptr<gpu::CopyTextureCHROMIUMResourceManager> copier_; + + friend class AndroidVideoDecodeAcceleratorTest; }; } // namespace content diff --git a/content/common/gpu/media/android_video_decode_accelerator_unittest.cc b/content/common/gpu/media/android_video_decode_accelerator_unittest.cc new file mode 100644 index 0000000..baf516d --- /dev/null +++ b/content/common/gpu/media/android_video_decode_accelerator_unittest.cc @@ -0,0 +1,102 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/common/gpu/media/android_video_decode_accelerator.h" + +#include "base/android/jni_android.h" +#include "base/bind.h" +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "content/common/gpu/media/android_video_decode_accelerator.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" +#include "media/base/android/media_codec_bridge.h" +#include "media/base/android/media_jni_registrar.h" +#include "media/video/picture.h" +#include "media/video/video_decode_accelerator.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/android/surface_texture_bridge.h" + +namespace { + +bool MockMakeContextCurrent() { + return true; +} + +} // namespace + +namespace content { + +// TODO(felipeg): Add more unit tests to test the ordinary behavior of +// AndroidVideoDecodeAccelerator. +// http://crbug.com/178647 +class MockVideoDecodeAcceleratorClient + : public media::VideoDecodeAccelerator::Client { + public: + MockVideoDecodeAcceleratorClient() {}; + virtual ~MockVideoDecodeAcceleratorClient() {}; + + // VideoDecodeAccelerator::Client implementation. + virtual void NotifyInitializeDone() OVERRIDE {}; + virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers, + const gfx::Size& dimensions, + uint32 texture_target) OVERRIDE {}; + virtual void DismissPictureBuffer(int32 picture_buffer_id) OVERRIDE {}; + virtual void PictureReady(const media::Picture& picture) OVERRIDE {}; + virtual void NotifyEndOfBitstreamBuffer( + int32 bitstream_buffer_id) OVERRIDE {}; + virtual void NotifyFlushDone() OVERRIDE {}; + virtual void NotifyResetDone() OVERRIDE {}; + virtual void NotifyError( + media::VideoDecodeAccelerator::Error error) OVERRIDE {}; +}; + +class AndroidVideoDecodeAcceleratorTest : public testing::Test { + public: + virtual ~AndroidVideoDecodeAcceleratorTest() {} + + protected: + virtual void SetUp() OVERRIDE { + JNIEnv* env = base::android::AttachCurrentThread(); + media::RegisterJni(env); + // TODO(felipeg): fix GL bindings, so that the decoder can perform GL + // calls. + scoped_ptr<gpu::gles2::MockGLES2Decoder> decoder( + new gpu::gles2::MockGLES2Decoder()); + scoped_ptr<MockVideoDecodeAcceleratorClient> client( + new MockVideoDecodeAcceleratorClient()); + accelerator_.reset(new AndroidVideoDecodeAccelerator( + client.get(), decoder->AsWeakPtr(), + base::Bind(&MockMakeContextCurrent))); + } + + bool Configure(media::VideoCodec codec) { + AndroidVideoDecodeAccelerator* accelerator = + static_cast<AndroidVideoDecodeAccelerator*>(accelerator_.get()); + accelerator->surface_texture_ = new gfx::SurfaceTextureBridge(0); + accelerator->codec_ = codec; + return accelerator->ConfigureMediaCodec(); + } + + private: + scoped_ptr<media::VideoDecodeAccelerator> accelerator_; +}; + +TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureUnsupportedCodec) { + if (!media::MediaCodecBridge::IsAvailable()) + return; + EXPECT_FALSE(Configure(media::kUnknownVideoCodec)); +} + +TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureSupportedCodec) { + if (!media::MediaCodecBridge::IsAvailable()) + return; + EXPECT_TRUE(Configure(media::kCodecVP8)); +} + +} // namespace content + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} |