summaryrefslogtreecommitdiffstats
path: root/content/common
diff options
context:
space:
mode:
authorqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-26 02:04:19 +0000
committerqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-26 02:04:19 +0000
commit31203376861a403af9e92810d03c453ad01b8f57 (patch)
tree49a81216b8f47c689479538984ae4b4c822c3786 /content/common
parent20c8b942168996a3f0345c9341dc4fa6e99f3a36 (diff)
downloadchromium_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')
-rw-r--r--content/common/gpu/media/android_video_decode_accelerator.cc12
-rw-r--r--content/common/gpu/media/android_video_decode_accelerator.h5
-rw-r--r--content/common/gpu/media/android_video_decode_accelerator_unittest.cc102
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();
+}